1. 程式人生 > >Mysql 主從複製詳細過程

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。

這個問題是因為我們克隆了虛擬機器才會出現這個問題