Mysql 主從複製詳細過程
前言:之前在做mysql主從複製的筆記的時候可能做得比較倉促,後來看到一個視訊發現還有很多細節都還沒有記錄清楚,今天有時間再記錄一下覺得還是非常有作用的。
1.Mysql 主從複製原理
mysql 的主從複製是一個非同步的複製過程(雖然一般情況下感覺是實時的),資料將從一個 mysql 資料庫(我們稱之為 master)複製到另一個 mysql 資料庫(我們稱之為 slave),在 master 與 slave 之間實現整個主從複製的過程是由三個執行緒參與完成的,其中有兩個執行緒(SQL 執行緒和 IO 執行緒)在 slave 端,另外一個執行緒(I/O 執行緒)在 master 端,要實現 mysql的主從複製,首先必須開啟 master 端的 binlog 記錄功能,否則就無法實現,因為整個複製過程實際上就是 slave 從 master 端獲取 binlog 日誌,然後在 slave 上以相同順序執行獲取的binlog 日誌中所記錄的各種 SQL 操作.
1.2 主從複製原理圖
這個圖是轉載過來的,覺得這個還是比較詳細的
2.mysql 主從複製
2.1 準備工作
還是準備兩臺機器都裝上mysql, 一臺用於做主一臺用於做從
2.2 在主伺服器上操作
a.按照原理圖上面我們主伺服器上需要做以下操作:
a.1. 在配置檔案 my.cnf 中設定server-id (這個要保證唯一性)開啟binlog,我們就會在mysql安裝目錄下會生成以下幾個檔案(msyql)
a.2.在資料庫中建立一個賬戶用來給進行主從同步
a.3.全量備份資料庫並記錄binlog日誌點(等於是從備份這個日誌點以後的我們都可以進行主從同步到從庫中)
b.1 下面是實操過程先來配置my.cnf
我們可以用這條命令檢視binlog狀態資訊:mysql -uroot -e "show variables like 'log_bin%';"
b.2 在資料庫中建立同步賬戶
b.3 全量備份資料庫
--all-databases , -A
匯出全部資料庫。
--databases, -B
匯出幾個資料庫。引數後面所有名字參量都被看作資料庫名。
例:mysqldump -uroot -p --databases test mysql
簡單的說,就是主從複製在做全量備份的時候,這個選項可以自動幫我們鎖表和識別binlog臨界檔案,就不需要我們鎖表,再看臨界檔案編號,再執行CHANGE MASTER填寫binglong位置資訊到從庫master.info檔案中了,提高了從庫部署效率吧。
--master-data[=#] 在備份匯出的檔案裡追加二進位制binlog檔案的位置和名稱
如果值等於1,就會新增一個CHANGE MASTER語句
如果值等於2,就會在CHANGE MASTER語句前添加註釋
這個引數會--lock-all-tables鎖表,除非你指定了--single-transaction
這種情況下,鎖表只會在dump開始的時候持續一小段時間,照理說
在dump的時候,任何動作都會影響到binlog檔案
dump結束之後,選項會自動關閉鎖表功能
--master-data選項的作用就是將二進位制的資訊寫入到輸出檔案中,在這裡是寫入到備份的sql檔案中。
我們可以檢視一下這個備份的資料庫裡面會有這樣一條語句:
2.3 在從伺服器上操作
a 從原理圖上看我們大概需要這幾步操作:
a.1 將binlog節點之前的資料庫恢復過來
a.2 CHANGE MASTER
a.3 開啟同步(start slave)
a.4 檢視配置是否成功(show slave status)
1. 將主庫上的備份資料傳送過來,並匯入從庫中
[[email protected] ~]# scp /tmp/20181203.sql [email protected]:/tmp/
The authenticity of host '192.168.139.135 (192.168.139.135)' can't be established.
ECDSA key fingerprint is SHA256:oWZvsZbwSgQLmlEi0WFIF+R3I7UIQ0bYV1Yr6+gKNiw.
ECDSA key fingerprint is MD5:74:91:0c:c2:cc:71:31:0a:8a:cc:07:c1:7b:4b:44:0d.
Are you sure you want to continue connecting (yes/no)? ye
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.139.135' (ECDSA) to the list of known hosts.
[email protected]'s password:
20181203.sql 100% 644KB 10.5MB/s 00:00
將資料匯入從庫中
2.change master
3.開啟同步並檢視狀態
檢視master.info資訊
檢視relay-log資訊
relay-bin 檔案資訊
總結:主從複製的過程就是主伺服器上會開啟一個IO執行緒,從伺服器上開啟兩個執行緒IO執行緒和mysql執行緒。IO執行緒是用來通訊的。主伺服器上需要開啟binglog配置項,當客戶提交請求,在主伺服器上會將過程記錄在binlog中,就是我們的mysql.bin0000*這種檔案中,這個檔案裡面會記錄我們的節點位置,等一下在主從同步的時候就會用到這個節點位置。
在從伺服器上會開啟兩個執行緒IO執行緒和mysql執行緒,從伺服器上的IO執行緒用來和我們的主伺服器上的IO進行通訊,確定我們的節點位置和binlog日誌資訊,並記錄一份到我們的relaylog日誌中。從伺服器上SQL執行緒會從relaylog日誌中讀取相關sql資訊寫入從庫中並會記錄relaylog資訊,方便我們下次再查詢。
3.驗證主從複製
在主伺服器上:mysql> drop database knightlai;
在從伺服器上:
回看
[[email protected] ~]# ls /data/mysql/
131.000001 131.index ib_logfile1 mysql-bin.000001 mysql-bin.index
131.000002 auto.cnf knightlai01.err mysql-bin.000002 mysql.pid
131.000003 ibdata1 localhost.localdomain.err mysql-bin.000003 performance_schema
131.000004 ib_logfile0 mysql mysql-bin.000004 test
[[email protected] ~]# /usr/local/mysql/bin/mysqlbinlog /data/mysql/mysql-bin.000004
錯誤解決:最近在部署MySQL主從複製架構的時候,碰到了"Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work." 這個錯誤提示。即主從架構中使用了相同的UUID。
這個問題是因為我們克隆了虛擬機器才會出現這個問題