MySQL 異步複製(Replication)是高可用、讀寫分離、備份卸載的基石。本文系統講解單向異步複製原理、三線程模型、部署步驟、狀態監控、典型故障(Last_SQL_Errno: 1146)根因與修復,並給出生產級運行維護清單。
關鍵文件:master.info(記錄 Master 連接信息、Binlog 位點)、relay-log.info(記錄 Relay Log 執行位點)、relay-bin.xxxxxx、relay-bin.index。
[mysqld]
server_id=101
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=1
expire_logs_days=7
max_binlog_size=1G
[mysqld]
server_id=102
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=1
relay_log=relay-bin
relay_log_index=relay-bin.index
read_only=1
super_read_only=1
-- Master 上
CREATE USER 'repl'@'10.0.%.%' IDENTIFIED BY 'ReplPass#2024';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.%.%';
FLUSH PRIVILEGES;
-- 非 GTID 時代需 SHOW MASTER STATUS 記 File/Position
-- GTID 模式直接用 AUTO_POSITION
-- Slave 上
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='10.0.1.101',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass#2024',
MASTER_AUTO_POSITION=1; -- GTID 模式
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Retrieved_Gtid_Set: xxxx
Executed_Gtid_Set: xxxx
| 操作 | 命令 |
|---|---|
| 查看 Binlog 內容 | mysqlbinlog -v mysql-bin.000001 |
| 刷新 Binlog | FLUSH LOGS; |
| 重置 Master Binlog | RESET MASTER;(慎用,備份環境可用) |
| 暫停/恢復複製 | STOP SLAVE; / START SLAVE; |
| 跳過指定錯誤事務 | SET GLOBAL sql_slave_skip_counter=1; START SLAVE;(非 GTID) |
| 基於 Binlog 時間點恢復 | mysqlbinlog --start-datetime=... --stop-datetime=... mysql-bin.xxx | mysql -u root -p |
Last_SQL_Error: Error 'Table 'db.tbl' doesn't exist' on query.
Default database: 'db'. Query: 'ALTER TABLE tbl DISCARD TABLESPACE'
-- 或
Query: 'ALTER TABLE tbl IMPORT TABLESPACE'
Transportable Tablespace(TTS)遷移過程中,Slave SQL Thread 重放 DISCARD TABLESPACE / IMPORT TABLESPACE 時,表定義(.frm/.ibd)在 Slave 上不存在或不匹配。
典型場景:
FLUSH TABLES ... FOR EXPORT、拷貝 .ibd/.cfg 到 SlaveCREATE TABLE ...; ALTER TABLE ... DISCARD TABLESPACE(刪除 .ibd)ALTER TABLE ... IMPORT TABLESPACE若步驟 2/3/4 中斷、或 Slave 並行複製導致順序錯亂,SQL Thread 找不到表定義報 1146。
-- 1. 備份現有 .ibd(若存在)
mv /data/mysql/db/tbl.ibd /data/mysql/db/tbl.ibd.bak
-- 2. 從 Master 獲取建表語句
SHOW CREATE TABLE db.tbl\G
-- 3. Slave 重建表結構
CREATE TABLE `tbl` ( ... ) ENGINE=InnoDB;
-- 4. 執行 DISCARD TABLESPACE(清理剛建的 .ibd)
ALTER TABLE tbl DISCARD TABLESPACE;
-- 5. 恢復備份的 .ibd(或從 Master 重新拷貝)
mv /data/mysql/db/tbl.ibd.bak /data/mysql/db/tbl.ibd
-- 或 scp master:/data/mysql/db/tbl.ibd /data/mysql/db/
-- 6. 執行 IMPORT TABLESPACE
ALTER TABLE tbl IMPORT TABLESPACE;
-- 7. 啟動複製
START SLAVE SQL_THREAD;
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1; -- 或 2,視事務組大小
START SLAVE;
-- 事後必須校驗數據一致性!
CHANGE MASTER TO ... MASTER_AUTO_POSITION=1Seconds_Behind_Master、Slave_IO_Running/SQL_Running、Relay_Log_Space、主從校驗和報警slave_parallel_workers=8、slave_parallel_type=LOGICAL_CLOCK(5.7+)、slave_preserve_commit_order=1rpl_semi_sync_master_enabled=1、rpl_semi_sync_slave_enabled=1、rpl_semi_sync_master_timeout=1000pt-table-checksum + pt-table-sync 每週全量校驗