mysql主從複製配置 & 工作原理
目錄
MySQL主從複製的基本工作原理
MySQL支援兩種複製方法:基於語句的複製(from Version3.23)和基於行的複製(from Version5.1)。這兩種複製方式都是通過在主庫上記錄二進位制日誌、在備庫重放日誌的方式來實現非同步的資料複製。
複製模式
- 基於語句的複製(又稱基於邏輯的複製):主庫記錄造成資料更改的查詢,從庫讀取並重放這些事件,實際上是把主庫執行過的SQL再執行一遍。
- 優點:實現簡單;二進位制日誌緊湊,相對而言佔用頻寬少;
- 不足:無法處理帶有當前時間戳, CURRENT_USER()函式的語句;不是所有儲存引擎都支援這種複製模式;
- 基於行的複製:將實際資料記錄在二進位制日誌中。
複製如何工作
- 在主庫上把資料更改記錄到二進位制日誌(Binary Log)中。
- 從庫將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
- 從庫讀取中繼日誌中的事件,將其重放到從庫資料之上。
主從複製配置
主從配置主要分為以下幾步:
- 建立從庫訪問主庫時使用的賬號;
- 配置主庫和從庫;
- 啟動複製。
建立賬號
在MySQL主庫建立一個使用者,並賦予其REPLICATION SLAVE許可權。
mysql>CREATE USER 'mysqlsync'@'%' IDENTIFIED BY 'password';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password';
配置主庫和從庫
- 在主庫的my.cnf配置檔案,[mysqld]中增加以下內容:
log_bin=mysql-bin # [必須]啟用二進位制日誌 server-id=222 # [必須]伺服器唯一ID,預設是1,一般取IP最後一段 # [可選] [解釋部分配置項] binlog_ignore_db=mysql # 設定忽略備份的資料庫
如果之前沒有在配置檔案中制定log-bin選項,需重啟MySQL。使用show master status命令可以檢查是否已經建立二進位制檔案。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 551 | mstest | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
啟動複製
在從庫做如下配置:(不建議修改my.cnf配置檔案,以下語句可以代替修改my.cnf中的相應設定)
mysql> CHANGE MASTER TO MASTER_HOST='localhost',
-> MASTER_USER='mysql',
-> MASTER_PASSWORD='mysql',
-> MASTER_LOG_FILE='mysql-bin.00001',
-> MASTER_LOG_POS=551;
更多CHANGE MASTER語法請見: MySQL Doc CHANGE MASTER TO Syntax
其中MASTER_LOG_POS引數設定為551,表示從主庫master binlog的postition。執行完以後,可以通過以下命令檢查複製是否正確執行
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: localhost
Master_User: mysql
Master_Port: 3001
Connect_Retry: 60
Master_Log_File: mysql-bin.00001
Read_Master_Log_Pos: 4
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.00001
Slave_IO_Running: No
Slave_SQL_Running: No
這兩項引數 Slave_IO_Running: No ,Slave_SQL_Running: No顯示從庫複製尚未開始執行,使用以下命令開始複製:
mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)
再次使用SHOW SLAVE STATUS\G命令檢查: Slave_IO_Running,Slave_SQL_Running兩項引數都顯示yes即為啟動複製成功。
ps : 當兩項引數中有出現no的情況,請注意檢視log: /log/mysql.err中的詳細資訊。
擴充套件-配置GTID主從複製
配置GTID主從複製 點選連線檢視官網 。官網上給出的方式是在啟動mysql server時指定gtid-mode=on,同時指定其它相關引數。這些引數也可以在etc/my.cnf中配置。
在主從庫的etc/my.cnf中做如下配置(配置前,先設定主從庫read-only,並將主從庫shutdown):
[mysqld]
#GTID:
gtid-mode=on
enforce-gtid-consistency=on
server-id=2003306 #每個例項有唯一的server_id
#binlog
log-bin=my-sqlbin # 5.6版本 gtid-mode=on需要該引數項設定
log-slave-updates=1 # 5.6版本 gtid-mode=on需要該引數項設定為1.
# 官網描述:Whether the slave should log the updates performed by its SQL thread to its own binary log.
binlog-format=ROW #強烈建議,其他格式可能造成資料不一致
#relay log
skip_slave_start=1 #從庫配置
- 在從庫上設定(此部分預設在基礎主從配置上完成,其它設定引數請參見上文):
mysql> CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
Query OK, 0 rows affected (0.01 sec)
- 設定完成後,start slave, 並通過show slave status檢視主從複製,從庫I/O, SQL執行緒狀態。
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: mysqlsync
Master_Port: 6001
Connect_Retry: 60
Master_Log_File: mysql-bin.000033
Read_Master_Log_Pos: 151
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 361
Relay_Master_Log_File: mysql-bin.000033
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- 檢視gtid_mode
mysql> show global variables like 'gtid_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode | ON |
+---------------+-------+
1 row in set (0.00 sec)
參考
- MySQL Document 17.1 Replication Configuration
- 《高效能MySQL》 第十章 複製