DROP TABLE、DELETE 無 WHERE,延遲從庫尚未重放,可在上面找回數據。| 角色 | IP | 說明 |
|---|---|---|
| Master | 192.168.1.11 | 寫入 |
| Slave-RealTime | 192.168.1.18 | 實時同步,業務讀取 |
| Slave-Delayed | 192.168.1.19 | 延遲 3 分鐘,防誤刪 |
確保兩個 Slave 均已 START SLAVE 且 Seconds_Behind_Master=0。
yum install -y percona-toolkit
# 或下載 rpm: percona-toolkit-2.1.7-1.noarch.rpm
GRANT ALL ON *.* TO 'rep'@'192.168.1.%' IDENTIFIED BY 'larry';
FLUSH PRIVILEGES;
pt-slave-delay --user=rep --password=larry \
--delay=3m --interval=20s --run-time=30m \
--daemonize --log=/var/log/mysql-delay.log \
h=192.168.1.19
參數說明:
--delay=3m:目標延遲 3 分鐘。--interval=20s:每 20 秒檢查一次是否需 STOP/START SLAVE。--run-time=30m:工具運行 30 分鐘後自動退出(生產建議加 --daemonize 常駐)。--daemonize:後台守護進程模式。--log:記錄操作日誌。
# Master 建表
CREATE TABLE test (id INT);
INSERT INTO test VALUES (1);
# RealTime Slave 立即可見
SELECT * FROM test; -- 1 行
# Delayed Slave 3 分鐘內報錯
SELECT * FROM test; -- ERROR 1146: Table doesn't exist
# 3 分鐘後自動同步,可見數據
# /etc/systemd/system/mysql-delayed-slave.service
[Unit]
Description=MySQL Delayed Slave (pt-slave-delay)
After=network.target mysqld.service
[Service]
Type=simple
User=mysql
ExecStart=/usr/bin/pt-slave-delay --user=rep --password=larry \
--delay=10m --interval=30s --daemonize --log=/var/log/mysql-delay.log \
h=192.168.1.19
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable mysql-delayed-slave
systemctl start mysql-delayed-slave
STOP SLAVE 在 Delayed Slave(防止繼續重放錯誤 Binlog)。mysqldump 導出誤刪對象。START SLAVE 恢復 Delayed Slave 同步。expire_logs_days 超過延遲時間,避免 Master 清理 Binlog 導致 Slave 斷檔。read-only=1 防止誤寫入。Seconds_Behind_Master 是否接近設定延遲值。pt-slave-delay 是低成本實現「後悔藥」的標準工具,配合實時從庫構成「雙從一主」高可用架構。