1. 程式人生 > >MySQL 主從複製:基於二進位制檔案複製配置詳解

MySQL 主從複製:基於二進位制檔案複製配置詳解

##MySQL-主從複製:基於二進位制檔案複製詳解 ###前言 主從複製是指把一個MySQL的資料庫伺服器作為主伺服器(master),然後把master的資料複製到一個或者多個MySQL資料庫伺服器作為從伺服器(slave)。從master到slave的複製一般是非同步複製,所以從伺服器的複製可以隨時停止,也不會影響到主伺服器的使用。可以通過配置來決定只複製哪些資料庫或者哪些表的資料。 ###主從複製的優點 - 讀寫分離提高負載:master伺服器不在負載讀操作,只處理寫入和更新操作,可顯著提升主伺服器的寫操作的效能。而讀操作是通過多個slave伺服器來讀取資料,多個slave伺服器可以分散讀操作的壓力,減少對單機I/O和頻寬的依賴,也可以提升讀操作的效能。 - 資料安全:因為資料是非同步複製過來的,可以在slave伺服器上進行測試,或者進行資料分析。即不會更改master伺服器的資料,也不會影響master伺服器的效能 - 遠端資料分發:當你需要在本地使用資料時,可以通過複製功能把資料複製到本地,這樣就不需要訪問遠端master伺服器 ###基於二進位制檔案(binary log)複製 ####原理介紹 1、master伺服器把對源資料庫的寫入和更新操作以事件的方式記錄到二進位制日誌檔案(binary log)中。不同的操作方式會以不同的日誌格式記錄到檔案中 2、slave伺服器開啟一個I/O執行緒連線master伺服器去請求binary log,然後寫入到本地的中繼檔案(relay log)中 3、master的開啟一個log dump執行緒讀取binary log並傳送給slave的I/O執行緒 4、slave開啟一個SQL執行緒讀取relay log中的命令,在slave伺服器上執行
![](https://img2020.cnblogs.com/blog/2004345/202004/2004345-20200423195808976-230680873.png)
>[執行緒說明參考](https://dev.mysql.com/doc/refman/8.0/en/mysql-threads.html) ####環境準備 | 作業系統 |資料庫 |ip地址 |埠 |主/從 | | --- | --- | --- | --- |--- | | window server 2008 r2 | mysql 8.0.12 |10.119.173.98 |3006 |主| | window server 2008 r2 | mysql 8.0.12 |10.119.173.97 |3006 |從| | window server 2008 r2 | mysql 8.0.12 |10.119.173.96 |3006 |從| ####1.Master配置 1.需要設定一個唯一的 server-id ,並且設定二進位制日誌檔案 log-bin=[file_name]。 MySQL8.0之前的版本預設log_bin=OFF是關閉日誌記錄的,設定了log-bin,就會開啟記錄日誌log_bin=ON 編輯master的配置檔案my.ini,在[mysqld]下新增如下內容 ```sql [mysqld] server-id=1 #伺服器id log-bin=mysql-bin #二進位制日誌檔案的基名字 #設定需要寫日誌的資料庫的名稱,不設定預設所有資料庫。一個配置項只能配置一個數據庫,如果要設定寫多個數據庫,那麼需要寫多份配置項,用逗號來分割多個數據庫是無效。 binlog-do-db=test #binlog-do-db=test1 #binlog-do-db=test2 #設定不需要寫日誌的資料庫的名稱,一個配置項只能配置一個數據庫,如果要設定寫多個數據庫,那麼需要寫多份配置項,用逗號來分割多個數據庫是無效。 binlog-ignore-db=mysql #日誌記錄格式,預設是ROW行模式。還有STATEMENT語句模式和MIXED混合模式。不同的記錄格式會對binlog-do-db和binlog-ignore-db產生影響 #STATEMENT模式:記錄執行的SQL語句 #Row模式:記錄語句執行後對單個行做的修改,而不是記錄執行的語句 binlog-format=ROW ``` > [binlog-format的參考](https://dev.mysql.com/doc/refman/8.0/en/stored-programs-logging.html) > [binlog-do-db的說明以及和binlog-format關係的參考](https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#option_mysqld_binlog-do-db)
2、在InnoDB儲存引擎時,為了獲得最大永續性和一致性,需要增加下面兩個配置 ```sql #控制寫入二進位制日誌的頻率。 #0表示mysql伺服器依賴與作業系統來把二進位制檔案寫入到磁碟中,這種情況下效能最好。但是在斷電或者作業系統崩潰時,伺服器可能提交了未同步到二進位制檔案的事務。 #1表示在提交事務前先把二進位制檔案寫入到磁碟中,可能會對效能有印象 sync_binlog=1 #控制事物提交時ACID的遵守的嚴格性和效能之間的平衡。預設1時,表示每次事務提交時記錄日誌的同時馬上寫入磁碟 innodb_flush_log_at_trx_commit=1 ``` > [sync_binlog的參考](https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_sync_binlog) > [innodb_flush_log_at_trx_commit的參考](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit)
3、在master上給slave建立一個擁有複製許可權的賬號repl,密碼是123456 ```sql CREATE USER 'repl'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ``` ####2.Slave配置 1、需要給slave設定一個唯一的 server-id ,值不要和master和其他slave重複。如果需要只複製特定的資料庫或者排除特定的資料庫,可以使用 replicate-do-db 和 replicate-ignore-db 配置。 當啟用slave的log-bin日誌記錄,配合log-slave-updates=ON時,slave會在複製master的資料時也記錄到自己的二進位制日誌中。這樣方便以後的主從切換,資料恢復。甚至可以實現更復雜的多級複製拓撲,比如:master->slave->slave 編輯slave的配置檔案my.ini,在[mysqld]下新增如下內容 ```sql [mysqld] server-id=2 #伺服器id log-bin=mysql-bin #二進位制日誌檔案的基名字 #當開啟了log-bin時,並且log-slave-updates=ON時slave複製master的資料時也記錄到自己的二進位制日誌中,預設值ON log-slave-updates=ON #中繼日誌的基名稱 relay-log=mysql-relay #設定需要複製的資料庫的名稱,不設定預設所有資料庫。一個配置項只能配置一個數據庫,如果要設定寫多個數據庫,那麼需要寫多份配置項,用逗號來分割多個數據庫是無效,效果同binlog-do-db。 replicate-do-db=test #設定不需要複製的資料庫的名稱,一個配置項只能配置一個數據庫,如果要設定寫多個數據庫,那麼需要寫多份配置項,用逗號來分割多個數據庫是無效,效果同binlog-ignore-db。 replicate-ignore-db=mysql #告訴slave伺服器在啟動時不開啟複製功能,預設值OFF skip-slave-start=OFF ``` >*其他slave伺服器配置一樣,只有server-id不同* [slave的配置參考](https://dev.mysql.com/doc/refman/8.0/en/replication-options-slave.html#replication-optvars-slaves) ####3.配置和開啟複製功能 1、查詢master當前的狀態 因為是InnoDB,首先在master上執行```FLUSH TABLES WITH READ LOCK;```語句,關閉所有開啟的表,重新整理快取。並且用全域性讀鎖鎖住所有的表。 然後在master上執行下面sql獲取binary log的檔名稱和當前寫入的座標 ```sql SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 115 | test | mysql | +------------------+----------+--------------+------------------+ ```
2、複製master庫的資料到slave庫 如果在slave開啟複製之前,master的test庫已經有資料了,那麼需要先把master的資料快照dump下來,然後複製到slave伺服器。如果是新庫沒有資料要複製,可以跳過此步驟到下一步。 使用mysqldump工具命令如下: ```sql mysqldump -h[IP地址] -P[埠號] -u[使用者名稱] -p[密碼] --databases test > dump.sql mysqldump -h10.119.173.98 -P3006 -uroot -p123456 --databases test > dump.sql ``` >[複製資料快照參考](https://dev.mysql.com/doc/refman/8.0/en/replication-snapshot-method.html)
3、釋放master上的全域性讀鎖 ```sql UNLOCK TABLES; ```
4、匯入master的test庫資料到slave伺服器,匯入第2步中dump.sql檔案。如果是新庫沒有資料匯入,則跳過此步驟,進行到第5步。 ```sql mysql -h[IP地址] -P[埠號] -u[使用者名稱] -p[密碼] < dump.sql mysql -h10.119.173.96 -P3006 -uroot -p123456 < dump.sql ```
5、在slave伺服器上配置slave要複製的檔案和開始的座標 ```sql CHANGE MASTER TO MASTER_HOST='10.119.173.98', MASTER_PORT=3006, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=115; ``` >MASTER_LOG_FILE=3.配置複製功能第1步查詢出來的File >MASTER_LOG_POS=3.配置複製功能第1步查詢出來的Position >[CHANGE MASTER TO參考](https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html)
6.開啟複製功能 在slave伺服器上執行START SLAVE語句,開啟slave的複製功能。 ```sql START SLAVE; ```
7.檢視從庫的複製狀態資訊 ```sql SHOW SLAVE STATUS ``` Slave_IO_Running和Slave_SQL_Running都=Yes,就表明複製功能正常執行
![](https://img2020.cnblogs.com/blog/2004345/202004/2004345-20200426182749810-625515701.png) ![](https://img2020.cnblogs.com/blog/2004345/202004/2004345-20200426174840123-87112981.png)
>Slave_IO_Running:從master讀取二進位制檔案,寫入到slave的中繼日誌的I/O執行緒。yes表示正常 >Slave_SQL_Running:從中繼日誌中讀取新的命令執行到slave的庫中的SQL執行緒。yes表示正常 >Master_Log_File:表示I/O執行緒當前正在讀取的master的二進位制檔名稱 >Read_Master_Log_Pos:表示I/O執行緒當前正在讀取的master的二進位制檔案中的位置資訊 >Relay_Log_File:當前在執行的中繼日誌名稱 >Relay_Log_Pos:當前在執行的中繼日誌中執行到的位置 >Last_Errno:最後一次複製失敗的錯誤日誌號 >Last_Error:最後一次複製失敗的錯誤日誌 **當slave伺服器停止了複製功能,要重新開始時,要從停止前讀取的位置開始繼續複製命令。第5步中MASTER_LOG_FILE=Master_Log_File的值,MASTER_LOG_POS=Read_Master_Log_Pos的值** >[SHOW SLAVE STATUS參考](https://dev.mysql.com/doc/refman/8.0/en/show-slave-status.html)
這樣就配置好了一個master->slave的主從複製,多個從庫的配置可以重複【3.配置和開啟複製功能的4-7步】即可。 ###後記 如果想配置成複雜的多級複製拓撲,比如```A->B->C```,那麼先配置A作為master,B作為slave,B複製A的資料。然後在配置B作為master,C作為slave,C複製B的資料