Master(寫入) → Binlog → Slave(中継日誌 → SQL 線程重放)
192.168.145.222,Server ID:222192.168.145.226,Server ID:226/etc/my.cnf[mysqld] log-bin=mysql-bin server-id=222
重啟:service mysqld restart
/etc/my.cnf[mysqld] log-bin=mysql-bin server-id=226
重啟。
GRANT REPLICATION SLAVE ON *.* TO 'mysync'@'%' IDENTIFIED BY 'q123456'; FLUSH PRIVILEGES;
建議: @'192.168.145.226' 限定 Slave IP,提升安全性。
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 308 | | | +------------------+----------+--------------+------------------+
關鍵: 此後**不要在 Master 執行任何寫操作**,直到 Slave 同步啟動,防止坐標漂移。
CHANGE MASTER TO MASTER_HOST='192.168.145.222', MASTER_USER='mysync', MASTER_PASSWORD='q123456', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=308; START SLAVE;
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.145.222 Master_User: mysync Master_Port: 3306 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 600 Relay_Log_File: slave-relay-bin.000003 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes
核心判斷: Slave_IO_Running=Yes 且 Slave_SQL_Running=Yes → **同步正常**。任一 No 需檢查 Last_IO_Error/Last_SQL_Error。
-- Master CREATE DATABASE hi_db; USE hi_db; CREATE TABLE hi_tb(id INT, name CHAR(10)); INSERT INTO hi_tb VALUES(1, 'bobu'); -- Slave SHOW DATABASES; -- 見 hi_db USE hi_db; SELECT * FROM hi_tb; -- 見 (1, 'bobu')
#!/bin/bash
# check_mysql_slave.sh
STATUS=$(mysql -uroot -p'xxx' -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running" | awk '{print $2}')
IO=$(echo "$STATUS" | sed -n 1p)
SQL=$(echo "$STATUS" | sed -n 2p)
if [ "$IO" = "Yes" ] && [ "$SQL" = "Yes" ]; then
echo "OK - Slave running"
exit 0
else
echo "CRITICAL - IO:$IO SQL:$SQL"
exit 2
fi
加入 Cron 每分鐘執行,異常發送告警。
| 現象 | 可能原因 | 處理 |
|---|---|---|
IO_Running=No | 網絡不通/賬號密碼錯/MASTER_LOG_FILE/POS 錯 | 檢查防火牆、CHANGE MASTER TO 重新指定坐標 |
SQL_Running=No | 主從表結構不一致/主鍵衝突/觸發器報錯 | 查 Last_SQL_Error,手動修正數據後 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; |
| Seconds_Behind_Master 偏大 | Slave 機器性能弱/大事務/長 SQL/並行複寫未開 | 開啟 slave_parallel_workers(5.7+)、優化慢 SQL、升級硬件 |