MySQL 主從複製是讀寫分離、災備、分析查詢分流的基礎架構。本文提供 Linux 與 Windows 雙平台的完整配置流程,含用戶授權、數據同步、配置文件參數、狀態驗證與常見錯誤(1062 主鍵衝突)三種解決方案。
192.168.1.169(Linux) / 192.168.0.1(Windows)192.168.1.168(Linux) / 192.168.0.2(Windows)repl_user / root(演示用,生產請用專用賬號)# 進入 MySQL
mysql -uroot -p
# 創建同步賬號(僅允許從庫 IP 訪問)
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.168' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 備份主庫數據(加讀鎖保證一致性)
FLUSH TABLES WITH READ LOCK;
# 另開終端:mysqldump -uroot -p db_name > /home/db_backup.sql
UNLOCK TABLES;
# 查看主庫狀態(記錄 File 和 Position)
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000019 | 7131 | osyunweidb | mysql |
+------------------+----------+--------------+------------------+
[mysqld]
server-id = 1 # 唯一,主庫通常為 1
log_bin = mysql-bin # 啟用二進制日志
binlog-do-db = osyunweidb # 同步的數據庫(多行寫多個)
binlog-ignore-db = mysql # 忽略系統庫
# 可選:binlog_format = ROW
重啟:service mysqld restart
# 從庫創建庫並導入
mysql -uroot -p
CREATE DATABASE osyunweidb;
USE osyunweidb;
SOURCE /home/db_backup.sql;
[mysqld]
server-id = 2 # 唯一,從庫遞增
log_bin = mysql-bin # 從庫也建議開啟(支持鏈式複製)
replicate-do-db = osyunweidb # 同步的數據庫
replicate-ignore-db = mysql # 忽略系統庫
# 5.1.7+ 不再支持在配置文件寫 master-* 參數
重啟:service mysqld restart
mysql -uroot -p
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.1.169',
MASTER_USER='repl_user',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000019',
MASTER_LOG_POS=7131;
START SLAVE;
# 驗證
SHOW SLAVE STATUS\G
# 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
[mysqld]
server-id = 1
log-bin = mysql-bin
重啟:net stop mysql55 && net start mysql55
[mysqld]
server-id = 2
log-bin = mysql-bin
binlog-do-db = test
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
重啟服務。
mysql -uroot -p111111
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.0.1',
MASTER_USER='root',
MASTER_PASSWORD='111111';
START SLAVE;
SHOW SLAVE STATUS\G
# 確認 Slave_IO_Running=Yes, Slave_SQL_Running=Yes
# 主庫
USE osyunweidb;
CREATE TABLE test (id INT PRIMARY KEY, name CHAR(20));
INSERT INTO test VALUES (1, 'replication_test');
# 從庫
USE osyunweidb;
SHOW TABLES; -- 應看到 test 表
SELECT * FROM test; -- 數據同步成功
原因:從庫已存在數據、重複執行 DDL、binlog 格式不一致等。
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; -- 跳過 1 條錯誤事件
START SLAVE;
SHOW SLAVE STATUS\G
缺點:數據可能不一致,需從主庫重新同步差異數據。
# 1. 從庫 my.ini 添加
slave-skip-errors = 1062
# 2. 重啟從庫
net stop mysql55 && net start mysql55
# 3. 重置複製位點
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='root', MASTER_PASSWORD='111111';
START SLAVE;
# 4. 從主庫重新備份導入(關鍵步驟)
STOP SLAVE;
-- 主庫:mysqldump ...
-- 從庫:導入備份
-- 從庫 my.ini 註釋掉 slave-skip-errors
net stop mysql55 && net start mysql55
START SLAVE;
STOP SLAVE;
SHOW MASTER STATUS; -- 獲取主庫當前 File/Position
CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0; -- 從頭開始
START SLAVE;
Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Runningpt-table-checksum / pt-table-syncread_only=1、super_read_only=1 防止誤寫入relay_log_purge=1、relay_log_recovery=1 防止中繼日志損壞gtid_mode=ON、enforce_gtid_consistency=ON