MySQL 複製基於二進制日誌,採用三線程模型:

Sending binlog event to slave:正常發送事件Finished reading one binlog; switching to next binlog:切換 Binlog 檔案Has sent all binlog to slave; waiting for binlog to be updated:空閒等待新事件Connecting to master、Checking master version、Registering slave on master:連線階段Requesting binlog dump:請求 BinlogWaiting for master to send event:正常等待(主庫無寫入時長時間處於此狀態)Queueing master event to the relay log:寫入 Relay LogWaiting for slave mutex on exit:停止中Reading event from the relay log:讀取事件準備執行Has read all relay log; waiting for the slave I/O thread to update it:追上主庫,等待新事件| 檔案 | 作用 | 更新者 |
|---|---|---|
Relay Log | 儲存從主庫接收的事件(格式同 Binlog) | I/O Thread |
master.info | 記錄主庫連線資訊、已讀取的 Binlog 位置 | I/O Thread |
relay-log.info | 記錄已執行的 Relay Log 位置、對應主庫 Binlog 位置 | SQL Thread |
備份建議:備份從庫時務必包含 master.info、relay-log.info、Relay Log,以便災難恢復後無縫續傳。
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'%' IDENTIFIED BY 'logzgh'; -- 若需 LOAD DATA FROM MASTER,額外授予 SUPER、RELOAD、SELECT
mysqldump --master-data=2 -u root -p --all-databases > full.sql(較慢,含 Binlog 位置註釋)# Master [mysqld] log_bin = mysql-bin server_id = 1 # 建議 sync_binlog = 1 innodb_flush_log_at_trx_commit = 1 expire_logs_days = 7 # Slave [mysqld] server_id = 2 read_only = 1 relay_log = relay-bin relay_log_index = relay-bin.index # 可選:只同步特定庫 replicate_do_db = backup replicate_ignore_db = mysql,test
# 啟動 MySQL 但不啟動 Slave mysqld_safe --skip-slave-start & # 登入設定 CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='rep', MASTER_PASSWORD='logzgh', MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=471632; START SLAVE;
SHOW SLAVE STATUS\G -- Slave_IO_Running: Yes -- Slave_SQL_Running: Yes -- Seconds_Behind_Master: 0
| 參數 | 說明 |
|---|---|
--read-only | 從庫只允許 Slave 線程與 SUPER 用戶寫入 |
--replicate-do-db=db | 只同步指定庫(基於預設庫,跨庫語句不復制) |
--replicate-do-table=db.tbl | 只同步指定表(允許跨庫) |
--replicate-ignore-db=db | 忽略指定庫 |
--replicate-wild-do-table=db.% | 通配符匹配表名同步 |
--slave-skip-errors=1062,1053 | 跳過指定錯誤碼(謹慎使用) |
--skip-slave-start | 啟動不自動啟動 Slave |
FLUSH TABLES WITH READ LOCK → 打包 → SHOW MASTER STATUS → UNLOCK TABLES(鎖表時間極短)xtrabackup 熱備份(無鎖)CHANGE MASTER TO → START SLAVErpl_semi_sync_master=1,主庫等待至少一從庫收到 Binlog 才提交,提升資料安全。MASTER_DELAY=3600,防誤操作(Drop Table)回滾。slave_parallel_workers=N(5.6+),slave_parallel_type=LOGICAL_CLOCK(5.7+),大幅降低延遲。expire_logs_days)。SHOW SLAVE STATUS 中 Seconds_Behind_Master。FLUSH TABLES WITH READ LOCK → 記錄位置 → 從庫 SELECT MASTER_POS_WAIT('file', pos) → 主庫 UNLOCK TABLES。character_set_server、collation_server。MySQL 複製是高可用架構基石。深入理解三線程模型、Binlog/Relay Log/Info 檔案、GTID、半同步、並行複製,並建立標準化部署、監控、演練流程,才能駕馭大規模生產環境的複製集群。