搜索
首页数据库mysql教程MySQL根据离线binlog快速“闪回”的详情介绍

昨天突然有个客户说误操作,自己删除了大量数据,CTO直接将我拉到一个讨论组里,说要帮他们恢复数据。他们自己挖的坑,打算让开发那边根据业务日志去恢复,被告知只记录的删除主键这样的信息,物理删除,无能为力。

上服务器看了下记录的日志,发现好几台上面都有被误删的记录输出。阿里RDS虽然可以克隆一个恢复到删除时间点前的实例,但这散落的几万个id找起来费力,还有就是几个表之间关联的数据也要恢复,觉得麻烦。

想到 MySQL 的闪回方案。以前看过好几篇相关文章,甚至差点自己用python撸一个来解析binlog,反转得到回滚sql,实在没空,这下要急用了。赶紧找了下网上“现成的方案”。

正文开始


MySQL(含阿里RDS)快速闪回可以说是对数据库误操作的后悔药,flashback功能可以将数据库返回到误操作之前。但是即使oracle数据库也只支持短时间内的闪回。

网上现有开源的MySQL闪回实现,原理都是解析binlog,生成反向sql: (必须为row模式)

  1. 对于 delete 操作,生成insert (DELETE_ROWS_EVENT)

  2. 对于 update 操作,交换binlog里面值的顺序 (UPDATE_ROWS_EVENT)

  3. 对于 insert 操作,反向生成delete (WRITE_ROWS_EVENT)

  4. 对于多个event,要逆向生成sql

上面两种实现方式,都是通过 python-mysql-replication 包,模拟出原库的一个从库,然后 show binary logs 来获取binlog,发起同步binlog的请求,再解析EVENT。但是阿里云 RDS 的binlog在同步给从库之后, 很快就被 purge 掉了 。如果要恢复 昨天 部分数据 ,两种方案都是拿不到binlog的。也就是闪回的时间有限。

还有一些比较简单的实现,就是解析 binlog 物理文件,实现回滚,如 binlog-rollback.pl ,试过,但是速度太慢。

为了不影响速度,又想使用比较成熟的闪回方案,我们可以这样做:

  1. 借助一个自建的 mysqld 实例,将已purge掉的binlog拷贝到该实例的目录下

  2. 在自建实例里,提前创建好需要恢复的表(结构),因为工具需要连接上来从 information_schema.columns 获取元数据信息

  3. 拷贝的时候,可以替换掉mysql实例自己的binlog文件名,保持连续

  4. 可能要修改 mysql-bin.index,确保文件名还能被mysqld识别到

  5. 重启mysql实例,show binary logs 看一下是否在列表里面

  6. 接下来就可以使用上面任何一种工具,模拟从库,指定一个binlog文件,开始时间,结束时间,得到回滚SQL

  7. 再根据业务逻辑,筛选出需要的sql

fc430c7db1eecf4621f4fc8a5479f894
总之就是借助另外一个mysql,把binlog event传输过来。温馨提示:

  1. 两个实例间版本不要跨度太大

  2. 注意文件权限

  3. 如果原库开启了gtid,这个自建实例也要开启gtid

示例:

python mysqlbinlog_back.py --host="localhost" --username="ecuser" --password="ecuser" --port=3306 \
--schema=dbname --tables="t_xx1,t_xx2,t_xx3" -S "mysql-bin.000019" -E "2017-03-02 13:00:00" -N "2017-03-02 14:09:00" -I -U

===log will also  write to .//mysqlbinlog_flashback.log===
parameter={'start_binlog_file': 'mysql-bin.000019', 'stream': None, 'keep_data': True,
 'file': {'data_create': None, 'flashback': None, 'data': None}, 'add_schema_name': False, 'start_time': None, 
 'keep_current_data': False, 'start_to_timestamp': 1488430800,
 'mysql_setting': {'passwd': 'ecuser', 'host': 'localhost', 'charset': 'utf8', 'port': 3306, 'user': 'ecuser'},
 'table_name': 't_xx1,t_xx2,t_xx3', 'skip_delete': False, 'schema': 'dbname', 'stat': {'flash_sql': {}},
 'table_name_array': ['t_xx1', 't_xx2', 't_xx3'],
 'one_binlog_file': False, 'output_file_path': './log', 'start_position': 4, 'skip_update': True,
 'dump_event': False, 'end_to_timestamp': 1488434940, 'skip_insert': True, 'schema_array': ['dbname']
}
scan 10000 events ....from binlogfile=mysql-bin.000019,timestamp=2017-03-02T11:42:14
scan 20000 events ....from binlogfile=mysql-bin.000019,timestamp=2017-03-02T11:42:29
...

提示:
binlog为ROW格式,dml影响的每一行都会记录两个event:Table_map和Row_log。而table_map里面的table_id并不会影响它在哪个实例上应用,这个id可以认为是逻辑上,记录表结构版本的机制 —— 当它在 table_definition_cache 没有找到表定义时,id自增1,分配给要记录到binlog的表。

mysqlbinlog_back.py 使用经验

  • 务必指定库名、表明,开始的binlog文件名,起始时间,结束时间。可以加快scan的速度。

  • 根据恢复的需要,选择 -I, -U, -D,指定回滚哪些类型的操作。

  • 如果只是恢复部分表数据(非完全闪回),做不到关联表的正确恢复。比如需要恢复delete数据,但无法恢复业务里因为delete引起其它表更新的数据,除非完全闪回。

  • 不支持表字段是 enum 类型的,比如 t_xx3 的f_do_type字段。可以把自建实例上的enum定义改成int。

以上是MySQL根据离线binlog快速“闪回”的详情介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何识别和优化MySQL中的慢速查询? (慢查询日志,performance_schema)如何识别和优化MySQL中的慢速查询? (慢查询日志,performance_schema)Apr 10, 2025 am 09:36 AM

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL:开发人员的基本技能MySQL和SQL:开发人员的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

描述MySQL异步主奴隶复制过程。描述MySQL异步主奴隶复制过程。Apr 10, 2025 am 09:30 AM

MySQL异步主从复制通过binlog实现数据同步,提升读性能和高可用性。1)主服务器记录变更到binlog;2)从服务器通过I/O线程读取binlog;3)从服务器的SQL线程应用binlog同步数据。

mysql:简单的概念,用于轻松学习mysql:简单的概念,用于轻松学习Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

MySQL:数据库的用户友好介绍MySQL:数据库的用户友好介绍Apr 10, 2025 am 09:27 AM

MySQL的安装和基本操作包括:1.下载并安装MySQL,设置根用户密码;2.使用SQL命令创建数据库和表,如CREATEDATABASE和CREATETABLE;3.执行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.创建索引和存储过程以优化性能和实现复杂逻辑。通过这些步骤,你可以从零开始构建和管理MySQL数据库。

InnoDB缓冲池如何工作,为什么对性能至关重要?InnoDB缓冲池如何工作,为什么对性能至关重要?Apr 09, 2025 am 12:12 AM

InnoDBBufferPool通过将数据和索引页加载到内存中来提升MySQL数据库的性能。1)数据页加载到BufferPool中,减少磁盘I/O。2)脏页被标记并定期刷新到磁盘。3)LRU算法管理数据页淘汰。4)预读机制提前加载可能需要的数据页。

MySQL:初学者的数据管理易用性MySQL:初学者的数据管理易用性Apr 09, 2025 am 12:07 AM

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。

与MySQL中使用索引相比,全表扫描何时可以更快?与MySQL中使用索引相比,全表扫描何时可以更快?Apr 09, 2025 am 12:05 AM

全表扫描在MySQL中可能比使用索引更快,具体情况包括:1)数据量较小时;2)查询返回大量数据时;3)索引列不具备高选择性时;4)复杂查询时。通过分析查询计划、优化索引、避免过度索引和定期维护表,可以在实际应用中做出最优选择。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中