mysql快速产生binlog_【MySQL】如何快速执行 binlog-阿里云开发者社区

【背景】

维护mysql的时候,总会遇到数据库恢复的例子。如果把备份集恢复出来相对比较简单。然而如果遇到恢复到时间点的例子,把一个MySQL实例恢复出来之后,需要执行binlog做增量恢复。

【方法一】

常见的办法是用mysqlbinlog解析binlog,将解析出来的内容重定向到mysql命令行执行。

#start是mysql-bin后面的数字

i=start

2.while [ $i -lt end ]

3. do

4. mysqlbinlog mysql-bin.$i | mysql -h 127.0.0.1 -P 4001 -uroot > 0550.log 2>&1

5. done

这样做确实可以,而且row模式的binlog,也可以通过这种方式来执行。但是这样做有几个缺点

1. 如果解析出来的binlog在执行的过程中报错,如何处理?直接加 -f 强制执行吗?

2. 执行中途如何停下来,下次接着跑? 比如我想调整一下MySQL的参数(需要重启)后继续跑?

3. 只能单线程执行。而且mysqlbinlog解析再通过管道执行,有比较高的性能开销。

鉴于上面的缺点 下面隆重推出执行大量binlog的另外一种方法

【方法二】

我们都知道relay-log的内容和binlog的内容其实都是一样的,那么我是否能把binlog作为relay-log来执行呢?

答案是肯定的,屡试不爽。

详细的步骤:

0. 先把实例正常shutdown

1. 把binlog上传到mysql服务器本地磁盘,放到一个固定的目录,如/home/mysql/restore_1031

2. 如果是M-S 架构,则需要修改master.info,写入如下内容

cat > $BINLOG_DIR/master.info<

2. 18

3. dummy.binlog

4. 0

5. dummy.host

6. repl

7. repl

8. 3306

9. 60

10. 0

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21. 0

22. 0.000

23.

24.

25. 0

26.

27.

28. EOF

这里的内容需要符合规则,只要不指向slave 就好,避免应用slave的sql。

3. 修改slave-relay-log.info, 把$STAET, $START_BINLOG_POS替换成你需要开始执行的binlog的文件名和start-position

cat > $BINLOG_DIR/relay-log.info <

2. /home/mysql/restore_1031/mysql-bin.$STAET

3. $START_BINLOG_POS

4. dummy-binlog.1

5. 0

6. EOF

4. 修改slave-relay-log.index, 把你需要执行的binlog列表都放进去。

#head slave-relay-log.index

/home/mysql/restore_1031/mysql-bin.000588

/home/mysql/restore_1031/mysql-bin.000589

/home/mysql/restore_1031/mysql-bin.000590

/home/mysql/restore_1031/mysql-bin.000591

/home/mysql/restore_1031/mysql-bin.000592

5. 启动mysql实例,执行start slave sql_thread。

使用方法二的好处:

解决了上面用mysqlbinlog解析再管道给mysql执行的各个缺陷。

1 可以随时stop slave,调整一些参数,再start slave。

2 可以选择忽略一些slave执行报错。

3 如果你的mysql版本支持多线程复制,你还可以使用它 start slave multi_sql_thread 而且这么做性能更好,在一个数据恢复的场景中,

性能对比:

使用mysqlbinlog 加管道的方式,每秒只能执行3000不到IUD,

使用mysql原生slave执行的方式,每秒可以执行8000 IUD。

缺点:修改master.info slave-relay-log.info等文件,需要重启实例才会生效。

下一次,如果你需要恢复大量binlog,你会选择哪种方式?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值