加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 通讯 > 正文

如何通过MySQL relaylog + SQL_Thread 加量恢复binlog

发布时间:2021-12-20 11:59:22 所属栏目:通讯 来源:互联网
导读:这篇文章给大家介绍如何通过MySQL relaylog + SQL_Thread 增量恢复binlog,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 数据回档常常是使用全量备份+binlog增量实现的。 而数据量很大的情况下,增量恢复binlog一直是一个苦恼的问
这篇文章给大家介绍如何通过MySQL relaylog + 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开始执行事务
  
④ 启动实例,开启SQL_Thread:
 
START SLAVE sql_thread ;
只需要开启SQL_Thread即可
 
⑤ 检查复制状态:
 
mysql> SHOW SLAVE STATUSG
*************************** 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
………………………………

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读