“如果因错误操作或程序逻辑错误,造成数据误删除(如drop/truncate table),怎么快速的进行数据恢复呢?
”
延迟复制
延迟复制[1]能让从库拉取Binlog事件后,延迟SQL线程进行事件的应用,当发现数据错误操作后,可以从Slave快速的进行数据恢复,避免从备份文件中进行恢复,以及应用binlog事件,提高了RTO(Recovery Time Objective)。
使用延迟复制可以解决以下问题:
- 防止数据操作错误
- 使用延迟复制模拟Slave延迟,以测试业务的容错情况
在MySQL 5.6之前需要借助pt-slave-delay工具[2]才能实现延迟复制,通过控制SQL线程的启停来实现。5.6开始原生支持延迟复制,使用CHANGE MASTER TO MASTER_DELAY=N;
来设置延迟N秒。
使用show slave status
可以查看延迟复制的状态:
SQL_Delay
,指示延迟多少秒SQL_Remaining_Delay
,当SQL线程状态为Waiting until MASTER_DELAY seconds after master executed event
时,表示到指定延迟时间还剩多少秒Slave_SQL_Running_State
,指示SQL线程的状态
使用mysqld_exporter进行MySQL监控时,指标mysql_slave_status_sql_delay
表示设定的延迟时间是多少秒,在监控延迟时可以减掉这个设定值。
8.0
MySQL 8.0在binlog事件的每个事务增加了两个时间戳,用来进行延迟复制的判断:
immediate_commit_timestamp
,事务提交时,写到级联源的时间戳original_commit_timestamp
,事务提交时,写到起始源的时间戳
![d99fad0e493a09eb0f46565f6d5b0aff.png](https://i-blog.csdnimg.cn/blog_migrate/e4843129e964639f6369a4da158bc9dd.png)
可以使用Performance Schema的相关表来监控复制状态:
replication_connection_status
,提供连接状态信息replication_applier_status_by_coordinator
,提供协调线程的信息replication_applier_status_by_worker
,提供worker线程的信息replication_applier_configuration
的DESIRED_DELAY表明设定为延迟多少秒
总结
MySQL有了原生的延迟复制支持,就不需要使用额外的工具来搭建延迟复制,使用上延迟复制就可以避免数据误操作的灾难恢复场景了,需要延迟多长时间需要结合业务需求进行评估,但是备份策略还是不能少的咯。
参考资料
[1]Delayed Replication: https://dev.mysql.com/doc/refman/8.0/en/replication-delayed.html
[2]pt-slave-delay: https://www.percona.com/doc/percona-toolkit/LATEST/pt-slave-delay.html