大家好,我是anyux。本文介紹MySQL延時從庫處理演練。
演示前請確保主從數據庫運行正常,pos點保持一致,如果出現錯誤,請與主庫保持一致
<code> mysql -uroot -proot -S /data/3307/mysql.sock -e "CHANGE MASTER TO
MASTER_HOST='192.168.255.113',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_PORT=3306,
MASTER_LOG_FILE='log-bin.xxx',
MASTER_LOG_POS=xxx,
MASTER_CONNECT_RETRY=10;"/<code>
1.設置從庫延時為300秒
<code> stop slave;
change master to master_delay=300;
start slave;/<code>
主庫創建業務數據
<code> create database delay charset utf8mb4;
use delay;
create table tmp(id int);
insert into tmp values (1),(2),(3);
commit;
drop database delay;/<code>
從庫操作
2.停止從庫sql線程,獲取relay的位置點
<code> stop slave sql_thread;/<code>
查看從庫狀態
主要看sql線程是否關閉
<code> show slave status\\G/<code>
查看Relay_Log_File和Relay_Log_Pos,它們分別對應中繼日誌和sql線程讀取點
sed命令直接定位relaylog日誌起點信息
<code> cd /data/3307/data
sed -n '3p' relay-log.info/<code>
grep命令配合mysql過濾起點信息
<code> mysql -uroot -proot -S /data/3307/mysql.sock -e "show slave status\\G" | grep "Relay_Log"/<code>
下面的Relay_Log_pos:496表示為起點
3.找到relay的截取終點
mysqlbinlog 查看drop語句前的倒數第二個at數值,就是終點
<code> cd /data/3307/data
mysqlbinlog --base64-output=decode-rows db01-relay-bin.000003 | grep -B 10 "drop"/<code>
可以看到第二列Pos數值為927,此數值為截取的終點
show relaylog查看drop語句前一行,就是終點
<code> show relaylog events in 'db01-relay-bin.000003';/<code>
4.截取relaylog
截取後,打開relay.sql查看是否有drop語句,小心不要截錯
<code> cd /data/3307/data
mysqlbinlog --start-position=496 --stop-position=927 db01-relay-bin.000002 > /tmp/relay.sql/<code>
5.恢復relay到從庫
登錄從庫
<code> mysql -uroot -proot -S /data/3307/mysql.sock/<code>
關閉日誌記錄功能
<code> set sql_log_bin=0;/<code>
恢復數據
<code> source /tmp/slave.sql;/<code>
驗證數據
<code> use delay;
select * from tmp;/<code>
6.全備數據庫
<code> mysqldump -uroot -proot -S /data/3307/mysql.sock --databases delay >/tmp/delay.sql/<code>
7.恢復備份到主庫
<code> mysql -uroot -proot -e "set sql_log_bin=0;source /tmp/delay.sql;"/<code>
驗證數據
<code> use delay;
select * from tmp;/<code>
此時主庫與從庫數據狀態一致,
8.恢復業務
閱讀更多 anyux1 的文章