MySQL数据库如何使用时间点实现快速恢复数据

  介绍

这篇文章给大家介绍MySQL数据库如何使用时间点实现快速恢复数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

,之所以有这样一篇文章,是因为在前几天的一个晚上,要下班的时候,业务方忽然有一个需求,是需要恢复一个表里面的数据,当时问了下情况,大概是这样的:业务方不小心在一个表里面做了一个更新的操作,可能是哪条件没有写对,导致表里面的数据被写坏了,但是数据目前还没有落盘,只是在内存中的值修改了,现在要求恢复到之前的数据。万幸,这份数据是平台上某些商品的价格,基本上是有限个商品,然后价格值也都是固定的,之前有对这个价格表进行备份,于是给他直接重新导入了一份价格表的数据,这个问题也算是解决了。

,,,当时我在想,如果我没有备份,只有binlog,这个时候如果这个问题让我来恢复,那么有什么更好的办法么?新建一个实例,全库还原,然后应用备份的binlog,一直去追,追到数据被该坏的时间点。

<强>,使用mysqlbinlog工具重放事务,这种方法会有很多陷阱,比如:

,,,,1,只能每次运行一个mysqlbinlog命令,一次对一个binlog文件执行重放,无法并行多命令运行,因为在执行重放的时候会产生一个临时表,会有冲突,造成失败。

,,,,2,它是一个原子操作。如果它在运行到半途中间的时候失败,将很难知道它在哪失败,也很难基于先前的时间点重新开始。导致失败的理由会有很多:一些并发事务引起的Innodb锁等待超时,服务器和客户端设置的max_allowed_packet不同,以及查询过程中失去跟mysql服务器的连接,等等。

,,,于是翻了翻percona的博客,找到一种方法,看了看精髓,就大概记录了下来,这儿方法我还没有亲自实现,只是记录在这里,以后有时间了可以亲自操作一把,看看是否能够比较高效的解决这个问题。

<强>,,,大体思路如下:

, 2台额外机器,第1台用于做备份结果数据的恢复,另外1台用于将原主的binlog拷贝至该实例然后模拟原主,然后第一台与第二台建立主从关系,改变主第二台,位置点位备份结果(xtrabackup_binlog_info中的binlog名和pos),然后同步至误操作点停止,将恢复的表,导出,然后恢复至生产原主。

<强>,,,具体的步骤如下:

1,准备一台机器,用于将该实例的最新备份的结果数据,进行备份还原

2,准备另外一台机器了,新实例,将原主人的binlog文件,拷贝至该实例的数据目录下,启动一个空实例(服务器id跟原主一致,——log_bin=master-bin binlog文件名保持跟原主一致,),然后停掉它,删除所有它自动创建的binlogs,解压缩并拷贝所有需要的binlogs(来自于原生产实例)到它的数据目录下,然后重新启动它。

,,,最新备份数据的位置:

 MySQL数据库如何使用时间点实现快速恢复数据

,,,如果启动正常,则连接mysql,查看binlog相关信息:

 mysql数据库如何使用时间点实现快速恢复数据

3,建立同步关系,并同步到误操作动作的位置前停止

修改主
  
  MASTER_HOST=& # 39; 127.0.0.1 # 39;
  
  MASTER_PORT=3307,
  
  MASTER_USER=& # 39;根# 39;
  
  MASTER_PASSWORD=& # 39;秘密# 39;
  
  MASTER_LOG_FILE=& # 39; master-bin.000007& # 39;, MASTER_LOG_POS=1518932;
  
  开始的奴隶,直到
  
  MASTER_LOG_FILE=& # 39; log_name& # 39;
  
  MASTER_LOG_POS=log_pos 

或者

奴隶SQL_THREAD直到开始
  
  SQL_AFTER_GTIDS=3 e11fa47 - 71 - ca - 11 - e1 - 9 - e33 c80aa9429562:11 - 56
  
  显示奴隶STATUSG; 

,,,相当于多用了一台实例,提高二进制日志的利用速率,提高二进制日志的利用的成功率。这个方法是否可行,还有待验证,按照文章中作者讲述的思想来看,是比单实例应用binlog的方法好,因为一旦发生了应用binlog过程中的错误,它能够快速确定实在那个点位发生的错误,有助于我们快速解决问题。

关于MySQL数据库如何使用时间点实现快速恢复数据就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

MySQL数据库如何使用时间点实现快速恢复数据