MySQL 透過 Binary Log(二進制日誌)實現主從複寫:Master 記錄所有資料變更,Slave 透過 I/O 執行緒拉取 Relay Log,SQL 執行緒重放,達到資料同步。版本需求:Master ≥ 3.23,Slave 版本 ≥ Master 版本。
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=db_name # 僅記錄指定庫
binlog-ignore-db=mysql # 排除系統庫
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.domain.com' IDENTIFIED BY 'slavepass';
4.0.2 前版本用 GRANT FILE ON *.*。
FLUSH TABLES WITH READ LOCK;
-- 物理複製 data 目錄或 mysqldump --master-data
SHOW MASTER STATUS; -- 記錄 File 與 Position
UNLOCK TABLES;
[mysqld]
server-id=2
master-host=master_ip
master-port=3306
master-user=repl
master-password=slavepass
master-connect-retry=60
report-host=slave_ip
SLAVE STOP;
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.003', -- Master 的 File
MASTER_LOG_POS=73; -- Master 的 Position
SLAVE START;
SHOW PROCESSLIST\G 觀察 system user 執行緒狀態。SHOW SLAVE STATUS\G 關注 Seconds_Behind_Master(理想為 0)。FLUSH TABLES WITH READ LOCK;SLAVE STOP;SHOW MASTER STATUS; 記錄新 File/Position。UNLOCK TABLES;CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...;SLAVE START;PURGE BINARY LOGS TO 'new_file';升級 Master 時先升級 Slave,確保相容性;參數 innodb_table_locks(5.0.3+)預設開啟,可能導致 LOCK TABLES 死鎖,視業務調整。