文章目录
- 一、MySQL备份恢复流程
- 二、并行恢复binlog原理
- 三、操作步骤
- 四、总结
一、MySQL备份恢复流程
MySQL数据恢复通常分为两个步骤:
-
恢复全备数据,MySQL有多种备份工具,分为物理备份和逻辑备份;具体可以参看下面这篇文章
- MySQL备份—xtrabackup&mysqldump&mydumper
-
恢复增量数据,通过binlog将数据追到指定位点:改操作利用的是MySQL自身binlog日志进行回溯指定区间的数据,但是该方式有个缺点就是单线程,导致对于大量增量数据需要恢复的场景会变的很慢。
二、并行恢复binlog原理
当我们正常主从复制的时候,可以使用MTS复制,具体可以参考这篇文章:
- MySQL从5.6到8.0复制的演进
因为relaylog和binlog本质实际上是一样的,所以我们可以通过将binlog伪装成relaylog来让MySQL认为我们的binlog是主库传过来的,那么就可以默认利用自身的MTS复制来实现并行恢复binlog的需求。
三、操作步骤
创建测试库
root@mysql 15:18: [(none)]> create database sbtest;
Query OK, 1 row affected (0.00 sec)
全备
innobackupex --defainnobackupex --defaults-file=/etc/my.cnf --user=sysbench --password='sysbench' --host=127.0.0.1 --port=3306 /data/innobackup --parallel=2 &>>/data/log
制造测试数据,删库
sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=10.0.4.13 --mysql-port=3306 --mysql-user=sysbench --mysql-password='sysbench' --mysql-db=sbtest --tables=2 --table-size=1000000 --auto_inc=off --report-interval=2 --threads=2 prepare
Database changed
root@mysql 15:26: [sbtest]> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.16 sec)root@mysql 15:26: [sbtest]> select count(*) from sbtest2;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.16 sec)root@mysql 15:26: [sbtest]> drop database sbtest;
Query OK, 2 rows affected (0.19 sec)
恢复全备
innobackupex --defaults-file=/etc/my.cnf --user=sysbench --password=sysbench --host=127.0.0.1 --port=3306 --apply-log /data/innobackup/2023-07-30_15-19-18/innobackupex --defaults-file=/etc/my.cnf --user=sysbench --password=sysbench --host=127.0.0.1 --port=3306 --copy-back /data/innobackup/2023-07-30_15-19-18/chown -R mysql.mysql /data/mysql/
传统方式binlog增量日志导入恢复
[root@VM-4-13-centos ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.42-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.root@mysql 18:47: [(none)]> use sbtest;
Database changed
root@mysql 18:48: [sbtest]> show tables;
Empty set (0.00 sec)cat xtrabackup_binlog_info
binlog.000001 319 6acb3106-2de5-11ee-8031-525400fd3257:1time mysqlbinlog --time mysqlbinlog --no-defaults binlog.000001 --start-position=319 --stop-position=381831946 | mysqlreal 0m47.843s
user 0m6.123s
sys 0m1.694s
MTS并行恢复binlog,以实现恢复测试数据且过滤删库操作
#将relay log info的repository改到file中,并生成这个文件
SET GLOBAL relay_log_info_repository='FILE';
CHANGE MASTER TO master_host='1',master_password='1',master_user='1',master_log_file='1',master_log_pos=4;
#关闭实例,将需要增量的binlog文件伪装成relaylog
rm -f /data/mysql/binlog/relaylog.000001
cp binlog.000001 /data/mysql/binlog/relaylog.000001
chown mysql:mysql -R /data/mysql/binlog
#修改relay.info文件和relay-log.index文件
将relay-log.info的第二三行改成需要执行的第一个binlog(现在是relaylog)的文件名和position:
将需要执行的relaylog写入relaylog.index
#启动实例,开启SQL_Thread
start slave sql_thread UNTIL RELAY_LOG_FILE = 'relaylog.000001', RELAY_LOG_POS = 381831946;#追binlog速度快数倍
四、总结
通过SQL_Thread的方式可以使用主从本身并行复制的能力,在binlog越多且并行度越好的场景上表现越好。
-
优点:
- 可以断点恢复,人为控制进度,比如stop slave或者遇到错误时,可以断点恢复
- 可以利用多线程复制来加快增量速度,时恢复更快
-
缺点:
- 要关闭mysqld
- 手动执行过程较mysqlbinlog方式更为复杂