搜索
您的当前位置:首页正文

MySQL基于复制线程实现MTS并行恢复binlog

来源:易榕旅网

一、MySQL备份恢复流程

  MySQL数据恢复通常分为两个步骤:

  • 恢复全备数据,MySQL有多种备份工具,分为物理备份和逻辑备份;具体可以参看下面这篇文章

    • MySQL备份—xtrabackup&mysqldump&mydumper
  • 恢复增量数据,通过binlog将数据追到指定位点:改操作利用的是MySQL自身binlog日志进行回溯指定区间的数据,但是该方式有个缺点就是单线程,导致对于大量增量数据需要恢复的场景会变的很慢。

二、并行恢复binlog原理

  当我们正常主从复制的时候,可以使用MTS复制,具体可以参考这篇文章:

  因为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:1


time mysqlbinlog --time mysqlbinlog --no-defaults binlog.000001 --start-position=319 --stop-position=381831946 | mysql

real    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方式更为复杂

因篇幅问题不能全部显示,请点此查看更多更全内容

Top