延时从库的应用

2022-01-25 19:13:43

配置方法

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)时,可以使用延时从库快速恢复数据。

环境:

处理思路:

  1. 及时监控故障,主库 10:05 发现故障,从库此时是 8:05 数据状态;
  2. 立即将从库的 SQL 线程关闭,对涉及 A 库的相关业务切换到 sorry server;
  3. 停止所有线程;
  4. 在延时从库恢复 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)