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

2023-11-07

一、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方式更为复杂
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL基于复制线程实现MTS并行恢复binlog 的相关文章

  • 如何在 MySQL 中创建查询以根据日期和独特字段减去连续行?

    基于SQL根据日期和另一列减去两行 https stackoverflow com questions 12310221 sql subtract two rows based on date and another column我有一个好
  • 安装后步骤未成功完成 MySQL Mac OS Sierra

    pyEnv Anants MacBook Pro litibackend anantchandra brew postinstall mysql gt Postinstalling mysql gt usr local Cellar mys
  • 如何启用对 MySQL 服务器的外部访问? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何启用对 MySQL 服务器的外部访问 我可以在本地连接 但无法从网络上的另一个盒子进行连接 我刚刚尝试过 grant all privileges
  • 搜索多个表 (SQL)

    我需要能够有一个 SQL 查询来使用简单的搜索来搜索我的数据库 这是我的表格现在的样子 Table artists id name Table albums id artistID name Table songs id albumID n
  • 如何使用 SQL - INSERT...ON DUPLICATE KEY UPDATE?

    我有一个脚本可以捕获推文并将其放入数据库中 我将在 cronjob 上运行脚本 然后在我的网站上显示数据库中的推文 以防止达到 Twitter API 的限制 所以我不想在我的数据库中有重复的推文 我知道我可以使用 INSERT ON DU
  • 像搜索一样在mysql中包含空格

    我在某些情况下使用 mysql like 关键字时遇到问题 我的要求是这样的 首先 当我搜索时 ABC 结果应该找到ABC and ABCdef但不是xyzABCdef or xyzABC 乍一看使用起来很简单ABC 但在我搜索时的情况 h
  • 在 Java Web 应用程序中获取 DataSource 资源

    我的 context xml 文件中有以下资源标记
  • 有什么方法可以在MySQL中的表名位置使用变量吗?

    我想在表名称位置使用变量 例如 SELECT FROM targetTableName 然而它会出错 有什么方法可以在MySQL中的表名位置使用变量吗 您显示的查询不起作用有两个原因 插入到查询中的用户定义变量将被视为使用字符串文字 而不是
  • MySQL创建表中的日期格式

    我必须使用 MySql 创建一个表 它可以按以下格式存储日期 我尝试过如下 CREATE TABLE birth date DATE 但它不起作用 因为日期格式是 YYYY MM DD 我该怎么办 谢谢 MySQL 或几乎任何其他数据库 中
  • MySQL 行级锁

    我不确定行级锁是如何工作的 但这是我的问题 我有一个表 T id int balance int engine InnoDB 我想锁定 ID 1 的行 所以我开始一个像这样的事务 start transaction select from
  • 比较两个表并找到匹配的列

    我有两个表 table1 和 table2 我需要编写一个选择查询 它将列出两个表中存在的列 mysql 我需要为不同的桌子做 一次2个 这可能吗 我尝试使用INFORMATION SCHEMA COLUMNS但我无法做对 SELECT a
  • 导入mysql数据库出错

    我导出我的数据库并导出到另一台计算机使用 phpmyadmin 但它错误 静态分析 分析过程中发现2处错误 意想不到的角色 靠近位置 53 的 无法识别的语句类型 位置 1 的 div 附近 SQL查询 div class error h1
  • MYSQL 中当前行上日期之前(并包括该日期)的所有行的总和

    重要的是要知道在查询期间日期是未知的 因此我不能只硬编码 WHERE 子句 这是我的桌子 Date ID Customer Order Count 20150101 Jones 6 20150102 Jones 4 20150103 Jon
  • 选择列表包含非聚合列

    自从更新 MySQL 以来 我注意到以下查询失败 SELECT u p name as plan COUNT u id as totalprojects FROM users u LEFT JOIN plans p ON p id acce
  • 如何使用WAMP登录phpMyAdmin,用户名和密码是什么?

    根 这个词是什么意思php我的管理员 http en wikipedia org wiki PhpMyAdmin 每当我写作时localhost phpmyadmin在地址栏上 我被要求输入用户名和密码 但我不知道它们是什么 我不记得何时何
  • 从 MySQL 返回结果时的数字顺序

    我的数据库表中有以下类型的标题 Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah Topic 10 blah blah Topic 11 blah blah etc 选择查询将始终返
  • 使用 MySQL 触发器将所有表更改记录到辅助表

    我有一张桌子 CREATE TABLE data table data id INT NOT NULL AUTO INCREMENT PRIMARY KEY field1 INT NOT NULL field2 INT NOT NULL f
  • 如何在 BigQuery/SQL 中将行转置为包含大量数据的列?

    我在将 BigQuery 中的大量数据表 15 亿行 从行转置为列时遇到问题 我可以弄清楚如何在硬编码时使用少量数据来完成此操作 但是对于如此大量的数据 该表的快照如下所示 CustomerID Feature Value 1 A123 3
  • PDO 多查询“SQLSTATE[HY000]:一般错误”

    我仍在学习 PDO 所以我可能会错过一些东西 但基本上我正在尝试将一行插入表中 然后选择生成的 id 我不确定它是否喜欢一个 pdo 语句中的两个查询 这是我用来执行 SQL 的代码 public function ExecuteQuery
  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与

随机推荐

  • python批量请求(GET

    本案例为普通的测试案例 主要用于测试通过get请求和post请求产生响应是否一致 主要针对响应码为200的结果进行输出 没有什么技术含量 coding utf 8 import requests def apiRequest header
  • SLFCD的实验复现(深度学习camelyon病理)未完待续

    深度学习病理 针对精确注释病理数据集的分类方法 预处理部分 一 首先获取病理图片的标注信息 精确注释标签 利用ASAP对病理图片进行标注 会生成xml文件 可以先将xml文件转换成json文件 为什么要将xml文档转换成json json是
  • 基于Python中Tkinter库实现弹球游戏

    文章目录 前言 游戏玩法 程序设计 思路 问题修改 问题代码展示 修改后代码展示 完整代码 前言 在看一本Python书 正好有一个弹球游戏 书中的代码可以跑 就是有一个问题 若球遇到边界 就不弹回 正好发现一篇文章 解决了书中代码的问题
  • 创建新用户时PackageManager的动作

    PackageManagerService createNewUser Settings createNewUserLI for PackageSetting ps packages ps setInstalled ps isSystem
  • sql语句中case when then else函数用法

    Case具有两种格式 简单Case函数和Case搜索函数 简单Case函数 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END Case搜索函数 CASE WHEN sex 1 THEN 男 W
  • 如何使用html制作网页

    一 html简介 1 1概念 HTML即HyperText Mark up Language 意思是超文本标记语言 HTML不是一种编程语言 而是一种标记语言 超文本指的是超链接 标记指的是标签 是一种用来制作网页的语言 这种语言由一个个的
  • wget: not an http or ftp url_wget和crul命令参数使用详解

    wget是个专职的下载利器 简单 专一 极致 而curl可以下载 但是长项不在于下载 而在于模拟提交web数据 POST GET请求 调试网页 等等 在下载上 也各有所长 wget可以递归 支持断点 而curl支持URL中加入变量 因此可以
  • VS 2019社区版Microsoft账号无法登录及离线激活

    1 账号无法登录问题 VS 2019社区版使用一段时间后需要重新登录 以激活使用许可证 现象 在输入账号后点击 下一步 一直没有出现输入密码窗口 并提示 IE 浏览器版本过低 解决办法 下载 IE11 中文版64位地址 http downl
  • VS2010调试dump文件

    VC 利用PDB和dump文件定位问题并进行调试 转载 vc 调试 利用PDB和dump文件定位问题并进行调试 VS2010 woshizfs的博客 CSDN博客 转载 VC 使用pdb和dump恢复 案发现场 i chaoren的博客 C
  • 弹性计算

    弹性计算包括云服务器 云数据库 负载均衡 云服务器 整合了高性能服务器与优质网络资源 云OS统一管理集群资源 每个集群可虚拟出多个独立服务器 且可以在集群中自由迁移 数据存储在云OS 大大提高云服务器的稳定性 关系型数据库服务 一个基于高稳
  • Hex文件和bin文件以及flash大小关系

    Program Size Code 31128 RO data 6572 RW data 52 ZI data 1852 keil软件编译后会出现上面的提示 其意义如下 Code 指程序中代码的字节数 RO data 指程序中定义的常量字节
  • Oceanbase列传

    Oceanbase列传 分布式与存储技术 跳至内容 首页 关于郁白 文章列表 文章预告 正在追越狱第五季 两阶段提交的工程实践 两阶段提交 2 Phase Commit简称2PC 协议是用于在多个节点之间达成一致的通信协议 它是实现 有状态
  • 1000元一根的Type C数据线

    转自 https zhuanlan zhihu com p 179946944 苹果官方商城近日上架了一根数据线 官方名称 雷雳 3 Pro 售价 949 元 看到价格 我脑海中的第一反应是 谁会买这根近千元的数据线 是贫穷限制了我的想象力
  • spring boot自动装配之@EnableAutoConfiguration详解

    1 EnableAutoConfiguration作用 EnableAutoConfiguration用于类或接口上 在spring boot中注解位于 SpringBootApplication注解上 SpringBootConfigur
  • 【数据结构1】数据结构的基本概念

    数据结构的基本概念 数据 数据是信息的载体 是描述客观事物属性的数 字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据是计算机程序加工的原料 数据元素 数据项 数据元素是数据的基本单位 通常作为一个整体进行考虑和处理 一个
  • x = x.view(x.size(0), -1) 的理解

    之前对于pytorch的网络编程学习都是大致理解每一层的概念 有些语法语句没有从原理上弄清楚 就比如标题的x x view x size 0 1 这句话一般出现在model类的forward函数中 具体位置一般都是在调用分类器之前 分类器是
  • LogisticRegressionCV 参数使用以及含义 笔记

    第一次接触LogisticRegressionCV 记录一下 Logistic回归是分类算法 不能应用于回归中 传入模型的y值 不能是float类型 必须是int类型 正则化选择参数 penalty gt L1 L2 默认是L2的正则化 一
  • 【MySQL】MySQL高手是如何练成的?

    MySQL 什么是MySQL呢 怎样练成MySQL高手 在Linux安装MySQL 问题处理 Mysql 的用户管理 什么是MySQL呢 Mysql 是开源的 可以定制的 采用了 GPL 协议 可以根据业务需要修改源码来开发自己的 Mysq
  • 2023 年为您的网站提供 30 个免费的 CSS 加载动画

    我们将使用 Lottie 文件 Lottie 文件 毫不费力地为网络 应用程序 社交和设计带来最小的 免费的 随时可用的动态图形 立即创建 编辑 测试 协作和发布 Lottie 动画 脚步 1 在你的html中添加这个脚本 2 我们将提供一
  • MySQL基于复制线程实现MTS并行恢复binlog

    文章目录 一 MySQL备份恢复流程 二 并行恢复binlog原理 三 操作步骤 四 总结 一 MySQL备份恢复流程 MySQL数据恢复通常分为两个步骤 恢复全备数据 MySQL有多种备份工具 分为物理备份和逻辑备份 具体可以参看下面这篇