之所以有这样一篇文章,是因为在前几天的一个晚上,要下班的时候,业务方忽然有一个需求,是需要恢复一个表里面的数据,当时问了下情况,大概是这样的:业务方不小心在一个表里面做了一个update的操作,可能是where条件没有写对,导致表里面的数据被写坏了,但是数据目前还没有落盘,只是在内存中的值修改了,现在要求恢复到之前的数据。万幸,这份数据是平台上某些商品的价格,基本上是有限个商品,然后价格值也都是固定的,之前有对这个价格表进行备份,于是给他直接重新导入了一份价格表的数据,这个问题也算是解决了。
当时我在想,如果我没有备份,只有binlog,这个时候如果这个问题让我来恢复,那么有什么更好的办法么?新建一个实例,全库还原,然后应用备份的binlog,一直去追,追到数据被该坏的时间点。
使用mysqlbinlog工具重放事务,这种方法会有很多陷阱,比如:
1、只能每次运行一个mysqlbinlog命令,一次对一个binlog文件执行重放,无法并行多命令运行,因为在执行重放的时候会产生一个临时表,会有冲突,造成失败。
2、它是一个原子操作。如果它在运行到半途中间的时候失败,将很难知道它在哪失败,也很难基于先前的时间点重新开始。导致失败的理由会有很多:一些并发事务引起的Innodb lock wait timeout ,server和client设置的max_allowed_packet不同,以及查询过程中失去跟mysql server的连接,等等。
于是翻了翻percona的博客,找到一种方法,看了看精髓,就大概记录了下来,这儿方法我还没有亲自实现,只是记录在这里,以后有时间了可以亲自操作一把,看看是否能够比较高效的解决这个问题。
大体思路如下:
2台额外机器,第1台用于做备份结果数据的恢复,另外1台用于将原主的binlog拷贝至该实例然后模拟原主,然后第一台与第二台建立主从关系,change master to 第二台,位置点位备份结果(xtrabackup_binlog_info中的binlog名和pos),然后同步至误操作点停止,将恢复的表,导出,然后恢复至生产原主。
具体的步骤如下:
1、准备一台机器,用于将该实例的最新备份的结果数据,进行备份还原
2、准备另外一台机器了,新实例,将原master的binlog文件,拷贝至该实例的数据目录下, 启动一个空实例(server-id跟原主一致, --log_bin=master-bin binlog文件名保持跟原主一致;),然后停掉它,删除所有它自动创建的binlogs,解压缩并拷贝所有需要的binlogs(来自于原生产实例)到它的数据目录下,然后重新启动它。
最新备份数据的位置:
如果启动正常,则连接mysql,查看binlog相关信息:
3、建立同步关系,并同步到误操作动作的位置前停止
CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307, MASTER_USER='root', MASTER_PASSWORD='secret', MASTER_LOG_FILE='master-bin.000007', MASTER_LOG_POS=1518932; START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
或者
START SLAVE SQL_THREAD UNTIL SQL_AFTER_GTIDS = 3E11FA47-71CA-11E1-9E33-C80AA9429562:11-56 SHOW SLAVE STATUSG;
相当于多用了一台实例,提高二进制日志的利用速率,提高二进制日志的利用的成功率。这个方法是否可行,还有待验证,按照文章中作者讲述的思想来看,是比单实例应用binlog的方法好,因为一旦发生了应用binlog过程中的错误,它能够快速确定实在那个点位发生的错误,有助于我们快速解决问题。
以上就是MySQL 基于时间点的快速恢复方案的详细内容,更多关于MySQL 快速恢复的资料请关注小牛知识库其它相关文章!
环境准备 初始化一个有 Delayed Secondary 节点的分片集群 1. 创建一个分片集群,其中单分片中 mongod 的数量为 4 mlaunch --config 1 --mongos 1 --replicaset --nodes 4 --sharded sh_1 2. 连接到分片主节点,配置一个 Delayed Secondary 节点,设定延迟的时间为 3 分钟 mongo --
问题内容: 考虑一下elasticsearch.yml中的以下设置 当前设置:说,我有3个数据节点。现在,如果我决定重新启动数据节点(由于设置上的微小更改),则根据期望的data_nodes设置,恢复将在节点重新启动后立即开始。将有许多未分配的分片,这些分片将根据包含的数据缓慢分配。 为了避免这种情况,有没有办法将所有未分配的分片分配到特定节点?(在我的情况下是重新启动的节点),一旦完成,ES应该
主要内容:使用日志记录恢复DBMS基于日志的恢复 - 日志是一系列记录。 每个事务的日志都保存在一些稳定的存储中,以便在发生任何故障时,可以从那里恢复。 如果对数据库执行任何操作,则它将记录在日志中。 但是,应该在数据库中应用实际事务之前完成存储日志的过程。 假设有一项事务,它执行修改学生所在的城市。 为此事务编写以下日志。 启动事务时,它会写入“启动”日志。 当事务城市从“Haikou”修改为“Shanghai”时,则会
问题内容: 我正在开发游戏,我想创建一个暂停菜单。这是我的代码: 但 仍在运行… 我想在玩家单击暂停菜单时暂停计时器,并在玩家返回游戏时继续运行计时器,但是我如何暂停?请帮帮我。 问题答案: 您需要使其无效并重新创建。然后,如果您使用相同的按钮暂停和恢复计时器,则可以使用bool来跟踪状态:
我有一个关于计算时间复杂度的非常普遍的问题(大O符号)。当人们说QuickSort最差的时间复杂度是O(n^2)(每次都选择数组的第一个元素作为轴心,并且数组是反向排序的)时,他们考虑了哪个操作来获得O(n^2)?人们会计算if/else语句所做的比较吗?或者他们只计算其进行的互换的总数?一般来说,你如何知道计算大O符号需要计算哪些“步骤”。 我知道这是一个非常基本的问题,但我已经阅读了谷歌上几乎
问题内容: 题: 我需要比较2次-当前时间和设定时间。如果设定的时间是将来的时间,请找出剩余的分钟数,直到所说的未来时间为止。 其他资讯: 我目前正在使用 我从关于SO的另一个答案中窃取了有关如何以Int格式获取当前时间的信息。然后,我将未来时间分为小时(Int)和分钟(Int)并进行比较…但是,当您越过小时障碍时,这变得很奇怪。 问题答案: 您具有比较功能来比较2个NSDate来知道哪个是最新的