(转)通过MySQL复制线程SQL_Thread加快增量恢复binlog
数据回档常常是使用全量备份+binlog增量实现的。而数据量很大的情况下,增量恢复binlog一直是一个苦恼的问题,因为恢复binlog速度十分慢,并且容易出错。
恢复binlog文件一般有两种方法:
〇 先解析成sql文件,再导入MySQL
- mysqlbinlog mysql-bin.000001 --start-position=n > /data/add.sql
- mysqlbinlog mysql-bin.000002 ... mysql-bin.n >> /data/add.sql
- mysql -u -p -S < /data/add.sql
〇 直接管道到MySQL中
- mysqlbinlog mysql-bin.000001 --start-position=n | mysql -u -p -S
- mysqlbinlog mysql-bin.000002 ... mysql-bin.n | mysql -u -p -S
关于这种方式的更多info,可以参考:
https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html
然而这两种方式原理都是一样的,通过mysqlbinlog解析成sql并导入到MySQL中。
〇 优点:
操作方便,逻辑简单。
无需关闭mysqld。
〇 缺点:
遇到ERROR难以定位位置,难以“断点恢复”。
特殊字符或字符集的问题。
max_allowed_packet问题。
恢复速度慢。
因为relaylog和binlog本质实际上是一样的,所以是否可以利用MySQL自身的sql_thread来增量binlog呢?
〇 处理思路:
1)重新初始化一个实例,恢复全量备份文件。
2)找到第一个binlog文件的position,和剩下所有的binlog。
3)将binlog伪装成relaylog,通过sql thread增量恢复。
这里只介绍核心部分,即伪装成relaylog的过程。
① 将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;
通过change命令,是为了告诉MySQL自己为一个slave实例,因为无需用到IO_Thread,故host,password,user等可以随意填写。
并且通过该步骤,生成relay.info文件。
② 关闭实例,将需要增量的binlog文件伪装成relaylog。
- cp mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007 mysql-bin.000008 mysql-bin.000009 mysql-bin.000010 $relaylogdir
- cd $relaylogdir
- rename mysql-bin. mysql-relay. mysql-bin.0000*
- chown mysql:mysql -R .
通过cp命令将binlog移动到$relaylogdir里,该变量取决于实例的选项参数,默认放在datadir下。
再将binlog批量改名成relaylog,并且给予对应的权限,否则会报错OS error code 13: Permission denied。
③ 修改relay.info文件和relay-log.index文件
将relay.info的第二三行改成需要执行的第一个binlog(现在是relaylog)的文件名和position:
- /data/mysql57/relaylog/mysql-relay.000003
- 1276895
第二三行对应Relay_log_name和Relay_log_pos,等同于:
mysqlbinlog mysql-relay.000003 --start-position=1276895 | mysql -u -p -S
修改该文件是为了告诉SQL_Thread从哪一个文件和哪一个position开始执行事务
再修改relay-log.index,清空原有信息,添加以下信息,为的是告诉SQL_Thread还有哪些relaylog是需要执行的。
- /data/mysql57/relaylog/mysql-relay.000003
- /data/mysql57/relaylog/mysql-relay.000004
- /data/mysql57/relaylog/mysql-relay.000005
- /data/mysql57/relaylog/mysql-relay.000006
- /data/mysql57/relaylog/mysql-relay.000007
- /data/mysql57/relaylog/mysql-relay.000008
- /data/mysql57/relaylog/mysql-relay.000009
- /data/mysql57/relaylog/mysql-relay.000010
④ 启动实例,开启SQL_Thread:
- START SLAVE sql_thread ;
只需要开启SQL_Thread即可
⑤ 检查复制状态:
- mysql> SHOW SLAVE STATUS\G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 1
- Master_User: 1
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: 1
- Read_Master_Log_Pos: 4
- Relay_Log_File: mysql-relay.000003 -- 已经执行到的日志名
- Relay_Log_Pos: 11529982 -- 已经执行到日志的位置
- Relay_Master_Log_File: 1
- Slave_IO_Running: No
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 11529982
- Relay_Log_Space: 5347038913
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: 274354 -- 若变为0,则表示已经增量完毕
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 0
- Master_UUID:
- Master_Info_File: /data/mysql57/master.info
- SQL_Delay: 0
- SQL_Remaining_Delay: NULL
- Slave_SQL_Running_State: Reading event from the relay log
- Master_Retry_Count: 86400
- ………………………………
该测试使用的版本为:MySQL 5.7.16
场景:可用于恢复将innodb_force_recovery设置为6仍然无法启动实例等case
效果:恢复全备文件+binlog恢复到故障前的最后一个position。
其他场景也适用,比如在某一时刻执行了错误的sql,如truncate等操作,同样也可以通过该办法。
只需要将START SLAVE sql_thread后添加一个 UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos 即可。
该选项用于控制SQL_Thread执行到的最后的position,类似于mysqlbinlog mysql-bin.n --stop-position=$log_pos 。
除了更准确的能够恢复错误之外,还有一个最大的好处是加快了binlog增量的速度。
补充一个额外的测试数据
对于同一组binlog文件增量:
通过mysqlbinlog解析+导入的时间为69min。
而通过SQL_Thread的执行时间为41min。
并且在需要增量的binlog文件越大的情况下,效果越明显。
〇 优点:
可以断点恢复,人为控制进度,比如stop slave或者遇到错误时,可以断点恢复。
性能好,在大量binlog的情况下,可以加快恢复速度。
在某些版本可以利用多线程复制来加快增量速度,时恢复更快。
〇 缺点:
需要关闭mysqld。
手动执行过程较mysqlbinlog方式更为复杂。
〇 总结:
mysqlbinlog --start-position 与 通过修改relay.info的第三行等效:
用途都是指定开始执行的第一个position。
mysqlbinlog --stop-position 与 通过在启动SQL_Thread时指定UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos等效:
用途都是指定结束执行的最后一个position。
(转)通过MySQL复制线程SQL_Thread加快增量恢复binlog的更多相关文章
- MySQL 5.7 基于复制线程SQL_Thread加快恢复的尝试
1. MySQL 数据恢复常用办法 MySQL恢复的方法一般有三种: 1. 官方推荐的基于全备+binlog , 通常做法是先恢复最近一次的全备,然后通过mysqlbiinlog --start-po ...
- MySQL复制(二)--基于二进制日志文件(binlog)配置复制
基础环境: 主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...
- MySQL复制线程状态转变
一.主库线程状态(State)值 以下列表显示了主从复制中主服务器的Binlog Dump线程的State列中可能看到的最常见状态(SHOW PROCESSLIST).如果Binlog Dump线程在 ...
- MySQL复制相关参数详解
MySQL复制相关参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.复制相关系统变量 1>.server_id 是必须设置在master和每个slave上的唯一标 ...
- MYSQL 复制详解
MySql 复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据 ...
- MySQL Replication--多线程复制MTS
多线程复制 多线程复制MTS(Mult-Threaded Slave Applier)指使用多个线程来并发应用二进制日志.在MYSQL5.6版本中,多线程复制基于schema来实现,将多个数据库下的事 ...
- 深入MySQL复制(一)
本文非常详细地介绍MySQL复制相关的内容,包括基本概念.复制原理.如何配置不同类型的复制(传统复制)等等.在此文章之后,还有几篇文章分别介绍GTID复制.半同步复制.实现MySQL的动静分离,以及M ...
- MySQL 复制介绍及搭建
MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. M ...
- MySQL复制进阶
Ⅰ.背景 搭建MySQL复制环境非常简单 你的系统是否也是像我之前那么搭建的呢? 那么,你的复制系统是否出现过以下的情况呢? 复制报错,例如:1062,1032 主从数据不一致 Ⅱ.真正高可靠复制环境 ...
随机推荐
- 基于jQuery Ajax实现无刷新文件上传
最近因项目需求更改,需要实现选择文件后即时上传至服务器,然后提交后,加载xls表格内容到jqgrid表格中,文件上传功能实现示例: 前端jsp页面: <form id="uploadF ...
- AtCoder Grand Contest 009 D:Uninity
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_d 题目翻译 定义只有一个点的树权值为\(0\),若干棵(可以是\(0\)棵)权值为\(k\) ...
- poj1325机器工作——二分图最小点覆盖
题目:http://poj.org/problem?id=1325 二分图求最大匹配,即为最小点覆盖: 一开始我写得较麻烦,求出最大匹配又去搜增广路,打标记求最小点覆盖: 然而两种方法都没写“ans= ...
- openStack vm备份
由于VM是可能存在于不同节点上,所以当一个计算节点挂掉后,可以把挂掉的节点运行的VM在新的节点上继续运行. 虽然快照功能可以做恢复使用,但是毕竟快照只能恢复固定时间的VM,所以虚拟机备份很重要!对做好 ...
- 4种方法实现C#无标题栏窗体的移动
首先C#无标题栏窗体的实现代码 在load时实现 无工具栏+无窗口标题 private void Form1_Load(object sender, EventArgs e) { this.Contr ...
- linux下使用c判断文件夹是否为空的小程序
自己写了一个 判断文件夹是否为空的小代码 //文件夹操作相关的函数的帮助$: man 3 readdir #include <stdio.h> #include <sys/types ...
- POJ 1064 Cable master (二分)
题意:给定 n 条绳子,它们的长度分别为 ai,现在要从这些绳子中切出 m 条长度相同的绳子,求最长是多少. 析:其中就是一个二分的水题,但是有一个坑,那么就是最后输出不能四舍五入,只能向下取整. 代 ...
- HDU2874【LCA(模板)】
第一题LCA,代码参考自:Ice_Crazy 思路: 这个最短路算法是想都别想了,可以看出这幅图就是树嘛,那么对于查询就是求树上两个结点最短距离. 这里就是利用LCA的tarjan离线算法. 算法的大 ...
- 3dmax tcb控制器
https://wenku.baidu.com/video/course/v/3a0e059d884c4d0b03bf85441b87311b 7.48开始 tcb控制器比较适合产生平滑动画 张力Te ...
- 关于lspci命令
lspci是一个用来查看系统中所有PCI总线以及连接到该总线上的设备的工具. 命令格式为 lspci -参数 (不加参数显示所有硬件设备) 至于有哪些参数及其详细用法可以看下这篇博客:http://w ...