【MySQL】如何快速执行 binlog

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

【方法一】
常见的办法是用mysqlbinlog解析binlog,将解析出来的内容重定向到mysql命令行执行。
#start是mysql-bin后面的数字

点击(此处)折叠或打开

  1. 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,写入如下内容


点击(此处)折叠或打开

  1. 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. 0
  12. 0.000


  13. 0


  14. EOF
这里的内容需要符合规则,只要不指向slave 就好,避免应用slave的sql。
3. 修改slave-relay-log.info, 把$STAET, $START_BINLOG_POS替换成你需要开始执行的binlog的文件名和start-position

点击(此处)折叠或打开

  1. cat > $BINLOG_DIR/relay-log.info <<EOF
  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列表都放进去。

点击(此处)折叠或打开

  1. #head slave-relay-log.index
  2. /home/mysql/restore_1031/mysql-bin.000588
  3. /home/mysql/restore_1031/mysql-bin.000589
  4. /home/mysql/restore_1031/mysql-bin.000590
  5. /home/mysql/restore_1031/mysql-bin.000591
  6. /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,你会选择哪种方式?

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22664653/viewspace-775778/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22664653/viewspace-775778/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果MySQL没有开启binlog,一般情况下是无法恢复已经执行的删除操作的。binlogMySQL的二进制日志,记录了MySQL服务器上的所有修改操作,包括删除、修改和插入等。它可以用于恢复数据库的某个特定时间点的状态或回滚某些错误操作。 如果MySQL没有开启binlog,即使进行了删除操作,也无法通过binlog来还原数据。在没有备份的情况下,这些被删除的数据将无法恢复。因此,在没有binlog的情况下,建议在进行任何重要的数据库操作之前,先进行数据备份,以避免数据丢失的情况发生。 然而,如果有其他方式可用于恢复数据,例如通过时间点恢复到某个特定的数据库备份,或者通过物理备份恢复数据库的数据文件,那么可能有机会恢复删除操作。但这通常需要特定的技术和工具,并且对数据库的操作要求非常谨慎。 总的来说,没有开启binlog时,恢复删除操作的难度较大,因此强烈建议在数据库中开启binlog并定期进行数据备份,以确保数据的安全和可恢复性。 ### 回答2: MySQL是一种开源的关系型数据库管理系统,Binlog(二进制日志)是MySQL的一个重要特性,用于记录数据库的所有写操作,包括删除操作。如果MySQL没有开启Binlog,即没有记录删除操作,恢复删除操作可能会变得非常困难。 通常情况下,如果没有启用BinlogMySQL不会记录删除操作的详细信息,包括删除的具体数据和时间戳等。在没有备份的情况下,如果发生了误删除操作,很难恢复被删除的数据。 不过,即使没有Binlog,仍然有一些方法来恢复删除操作。以下是一些常见的方法: 1. 使用Undo日志:MySQL中的InnoDB存储引擎支持事务的回滚操作,可以使用Undo日志将数据库恢复到删除操作之前的状态。这是在数据仍然在磁盘上存在的情况下才能使用的方法。 2. 使用文件恢复工具:在磁盘上删除的数据仍然可以通过文件恢复工具来恢复。这类工具可以扫描硬盘上的被删除文件,并尝试将其恢复到原始状态。但这种方法并不保证恢复的成功,并且可能会损坏其他数据。 总的来说,如果MySQL没有开启Binlog,恢复删除操作是一项非常困难的任务。为了更好地保护数据的安全性和可恢复性,建议及时开启并定期备份Binlog,并且定期备份数据库,以便在发生误操作时能够快速恢复数据。 ### 回答3: 在MySQL中,如果没有开启二进制日志(binlog),是很难恢复已删除操作的。 二进制日志是MySQL的一种日志文件,它记录了数据库中所有的数据操作,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)等操作。通过分析binlog,可以对数据库进行恢复操作。 如果没有开启binlog,那么就无法通过binlog进行恢复操作了。因此,对于没有开启binlogMySQL数据库,一旦数据被删除,是无法直接通过日志进行恢复的。 但是,即使没有开启binlog,有时仍然有一些方法可以尝试恢复已删除的数据。比如,可以通过备份文件进行恢复,如果数据库在删除操作之前进行过备份,那么可以使用备份文件将数据还原到删除操作之前的状态。 另外,如果数据库使用了事务,可以尝试使用"回滚"操作来恢复已删除的数据。事务能够将一系列相关的数据库操作组合起来,如果删除操作发生在一个事务中,那么可以使用回滚操作将事务撤销,从而恢复已删除的数据。 总而言之,如果没有开启binlog,恢复已删除操作会变得非常困难,无法直接通过日志进行恢复。但是,根据具体情况,可以尝试使用备份文件或事务回滚等方法,来尽可能地恢复已删除的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值