配置方法
1、登入从库执行下面语句设定延迟时间为 300 秒:
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY = 300;
mysql> start slave;
2、可通过如下两个参数查看当前的延时状态:
$ mysql -e 'show slave status \G' | egrep 'SQL.*Delay'
SQL_Delay: 300 # 设定的延时时间
SQL_Remaining_Delay: NULL # 距 replay 下一条语句的剩余时间
模拟故障
主库发生了逻辑损坏(DROP,truncate)时,可以使用延时从库快速恢复数据。
环境:
- 设定了 2 小时延时;
- 在 10: 00 执行了
drop database A
; - 在 10:05 发现了主库故障;
处理思路:
- 及时监控故障,主库 10:05 发现故障,从库此时是 8:05 数据状态;
- 立即将从库的 SQL 线程关闭,对涉及 A 库的相关业务切换到 sorry server;
- 停止所有线程;
- 在延时从库恢复 A 库数据,从 8:05 的数据状态恢复到执行
drop
操作前的状态;
1、在主库执行如下操作:
mysql> create database delaydb charset utf8mb4;
mysql> use delaydb;
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> drop database delaydb;
2、停止从库的 SQL 线程:
mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.00 sec)
3、查看从库已执行到的位置点:
$ mysql -e 'show slave status\G' | grep -B1 'Relay_Log_Pos:'
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 321
当从库是延时从时,
Relay_Log_Pos
就是 relay log 执行到的位置点。
4、查看执行 drop database delaydb;
的位置点:
$ mysql -e "show relaylog events in 'relay-log.000002'" | grep 'drop database';
relay-log.000002 1007 Query 1 941 drop database delaydb
5、截取日志:
$ mysqlbinlog --start-position=321 --stop-position=1007 /data/3306/data/relay-log.000002 >/tmp/bin.sql
6、清空中继日志并恢复截取出来的日志:
mysql> stop slave;reset slave all;
mysql> set sql_log_bin=0;
mysql> source /tmp/bin.sql;
mysql> set sql_log_bin=1;
7、检查数据:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| delaydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
mysql> use delaydb;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_delaydb |
+-------------------+
| t1 |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)