MySQL 通过 MTS 多线程恢复增量日志备份
一、前言
当发生 DDL 误删数据时,只能通过 备份 + 增量日志 来恢复,备份恢复到新实例后,将增量日志备份进行应用,此时只能单线程效率不高,我们可以使用 MySQL 5.7 推出的 MTS 多线程复制机制,进行多线程日志回放。
二、操作案例
1. 全量备份恢复
使用备份恢复一个新的实例:
[root@db2 backup]# ls
backup_20211118 mysql-bin.000001 mysql-bin.000002 mysql-bin.index
-- xtrabackup --prepare --apply-log-only --target-dir=./
-- cp -r backup_20211118 /data/mysql_80/data
2. 将需要恢复的日志 COPY 到新目录
cp mysql-bin.* /data/mysql_80/log_relay/
修改文件名和 index 中的内容:
/data/mysql_80/log_relay/mysql-relay.000001
/data/mysql_80/log_relay/mysql-relay.000002
授权:
chown -R mysql:mysql /data/mysql_80/
3. 修改参数文件启动 MySQL
relay_log = /data/mysql_80/log_relay/mysql-relay
relay_log_index = /data/mysql_80/log_relay/mysql-relay.index
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=16
relay_log_recovery=off
skip_slave_start
修改 server_id 如果不修改 MySQL 回放会认为是自己生成的,会直接跳过。也可以使用 --replicate-same-server-id 启动数据库。
4. 创建复制通道
change master to
master_host='localhost',
master_port=3306,
MASTER_AUTO_POSITION=0,
RELAY_LOG_FILE='mysql-relay.000001',
RELAY_LOG_POS=4;
启动复制,如果想在某个事物上面停下,可以使用 slave until
语法。
start slave sql_thread;
start slave until SQL_BEFORE_GTIDS ='00024731-1111-1111-1111-111111111111:22';
5. 监控回放情况
show slave status\G Retrieved_Gtid_Set: dcd7886c-4844-11ec-8c2f-faec3ea1f200:1-2900 Executed_Gtid_Set: dcd7886c-4844-11ec-8c2f-faec3ea1f200:1-201