热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL误删数据?试试数据闪回工具binlog2sql

MySQL误删数据?试试数据闪回工具binlog2sql一、前置条件二、软件部署三、参数项四、命令示例五、案例测试六、其他七、参考八、帮助一、前置条件log_bin为


MySQL 误删数据?试试数据闪回工具binlog2sql

  • 一、前置条件
  • 二、软件部署
  • 三、参数项
  • 四、命令示例
  • 五、案例测试
  • 六、其他
  • 七、参考
  • 八、帮助


一、前置条件


  • log_bin 为 ON , binlog_format 为 ROW(Mixed也可以),且 binlog_row_image 为 full 或 noblog,默认为 full ;

    mysql> show variables where variable_name in ('log_bin','binlog_format','binlog_row_image');+------------------+-------+| Variable_name | Value |+------------------+-------+| log_bin | ON || binlog_format | ROW || binlog_row_image | FULL |+------------------+-------+

  • 必须开启 MySQL Server ,离线模式无法解析;

  • 用来闪回数据的 user 需要的最小权限集合。
    select, super/replication client, replication slave
    select:读取 server 端 information_schema.COLUMNS 表,获取表结构的元信息,拼接成可视化的sql语句。
    super/replication client:两个权限都可以,需要执行 SHOW MASTER STATUS , 获取 server 端的 binlog 列表。
    replication slave:通过 BINLOG_DUMP 协议获取 binlog 内容的权限。

    授权命令如下:

    mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO [user]@'%' identified by '[password]';


二、软件部署


  1. 下载软件包
    binlog2sql.tar.gz

  2. 安装

    tar -zxvf binlog2sql.tar.gz
    cd binlog2sql/binlog2sql_dependencies/
    tar -zxvf setuptools-0.6c11.tar.gz
    cd setuptools-0.6c11
    python setup.py install
    cd ..
    tar -zxvf pip-9.0.1.tar.gz
    cd pip-9.0.1
    python setup.py install
    cd ..
    pip install *.whl mysql-replication-0.9.tar.gz


三、参数项


  1. mysql 连接配置

    -h host; -P port; -u user; -p password

  2. 解析模式

    --stop-never 持续解析 binlog 。可选,默认 False ,同步至执行命令时最新的binlog位置-K, --no-primary-key 对 INSERT 语句去除主键。可选,默认False-B, --flashback 生成回滚 SQL,可解析大文件,不受内存限制。可选,默认 False 。注意,与 stop-never 或 no-primary-key 不能同时添加--back-interval -B 模式下,每打印一千行回滚 SQL,加一句 SLEEP 多少秒,如不想加 SLEEP,请设为 0。可选,默认 1.0

  3. 解析范围控制

    --start-file 起始解析文件,只需文件名,无需全路径。--start-position/--start-pos 起始解析位置。可选。默认为 start-file 的起始位置。--stop-file/--end-file 终止解析文件。可选。默认为 start-file 同一个文件。若解析模式为 stop-never ,此选项失效。--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置。若解析模式为 stop-never ,此选项失效。--start-datetime 起始解析时间,格式 '%Y-%m-%d %H:%M:%S' 。可选,默认不过滤。--stop-datetime 终止解析时间,格式 '%Y-%m-%d %H:%M:%S' 。可选,默认不过滤。

  4. 对象过滤

    -d, --databases 只解析目标 db 的 sql ,多个库用空格隔开,如 -d db1 db2 。可选,默认为空。-t, --tables 只解析目标 table 的 sql ,多张表用空格隔开,如 -t tbl1 tbl2 。可选,默认为空。--only-dml 只解析 dml,忽略ddl 。可选,默认 TRUE。--sql-type 只解析指定类型,支持 INSERT, UPDATE, DELETE 。多个类型用空格隔开,可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。


四、命令示例


  1. 查看某个时间段内对某表的 sql 执行记录

    python binlog2sql.py -h[host] -P[port] -u[user] -p'[password]' --start-file='[binlog_file_name]' -d[table_schema] -t[table_name] --start-datetime='[%Y-%m-%d %H:%M:%S]' --stop-datetime='[%Y-%m-%d %H:%M:%S]'

  2. 结合1命令确定事务及其提交 position ,并生产目标事务的回滚 sql

    python binlog2sql.py -h[host] -P[port] -u[user] -p'[password]' --start-file='[binlog_file_name]' -d[table_schema] -t[table_name] --start-position='[position]' --stop-position='[position]' -B


五、案例测试

# 创建测试表 t1
mysql> show create table t1\G
*************************** 1. row ***************************Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`employee` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_employee` (`employee`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)# 插入测试数据
mysql> insert into t1 (employee) values ('111'),('222'),('333');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0# 查看 t1 表当前数据
mysql> select * from t1;
+----+----------+
| id | employee |
+----+----------+
| 1 | 111 |
| 2 | 222 |
| 3 | 333 |
+----+----------+
3 rows in set (0.01 sec)# 刷新 binlog 日志,生成新的日志
mysql> flush logs;
Query OK, 0 rows affected (0.10 sec)# 删除 t1 表所有数据
mysql> delete from t1;
Query OK, 3 rows affected (0.00 sec)# 查看 t1 表数据
mysql> select * from t1;
Empty set (0.00 sec)# 查看 binlog 文件
mysql> show master status\G
*************************** 1. row ***************************File: mysql-bin.000013Position: 520Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 7c54e776-807d-11eb-b035-fa163ee04d48:1-1331,
7d5edd3b-807d-11eb-ae54-fa163ee4c1f8:1
1 row in set (0.00 sec)# 使用前文的命令示例,补全信息,查看对 t1 表的 sql 执行记录
[root@dbtest01 binlog2sql]# python binlog2sql.py -h127.1 -P3306 -uroot -p'******' --start-file='mysql-bin.000013' -ddbtest01 -tt1 --start-datetime='2021-08-18 14:00:00' --stop-datetime='2021-08-18 15:00:00'
DELETE FROM `dbtest01`.`t1` WHERE `employee`='111' AND `id`=1 LIMIT 1; #start 299 end 489 time 2021-08-18 14:21:26
DELETE FROM `dbtest01`.`t1` WHERE `employee`='222' AND `id`=2 LIMIT 1; #start 299 end 489 time 2021-08-18 14:21:26
DELETE FROM `dbtest01`.`t1` WHERE `employee`='333' AND `id`=3 LIMIT 1; #start 299 end 489 time 2021-08-18 14:21:26# 根据执行记录中的 position 生成回滚 sql
[root@dbtest01 binlog2sql]# python binlog2sql.py -h127.1 -P3306 -uroot -p'******' --start-file='mysql-bin.000013' -ddbtest01 -tt1 --start-position='299' --stop-position='489' -B
INSERT INTO `dbtest01`.`t1`(`employee`, `id`) VALUES ('333', 3); #start 299 end 489 time 2021-08-18 14:21:26
INSERT INTO `dbtest01`.`t1`(`employee`, `id`) VALUES ('222', 2); #start 299 end 489 time 2021-08-18 14:21:26
INSERT INTO `dbtest01`.`t1`(`employee`, `id`) VALUES ('111', 1); #start 299 end 489 time 2021-08-18 14:21:26# 根据误删时间范围生成回滚 sql
[root@dbtest01 binlog2sql]# python binlog2sql.py -h127.1 -P3306 -uroot -p'******' --start-file='mysql-bin.000013' -ddbtest01 -tt1 --start-datetime='2021-08-18 14:00:00' --stop-datetime='2021-08-18 15:00:00' -B
INSERT INTO `dbtest01`.`t1`(`employee`, `id`) VALUES ('333', 3); #start 299 end 489 time 2021-08-18 14:21:26
INSERT INTO `dbtest01`.`t1`(`employee`, `id`) VALUES ('222', 2); #start 299 end 489 time 2021-08-18 14:21:26
INSERT INTO `dbtest01`.`t1`(`employee`, `id`) VALUES ('111', 1); #start 299 end 489 time 2021-08-18 14:21:26# 将上述回滚 sql 导出文件 rollback.sql,导入数据库
mysql>source /backup/rollback.sql;# 查看 t1 表数据
mysql> select * from t1;
+----+----------+
| id | employee |
+----+----------+
| 1 | 111 |
| 2 | 222 |
| 3 | 333 |
+----+----------+
3 rows in set (0.01 sec)

六、其他


  1. 它本身的核心代码比较少,主要是在 pymysqlreplication 的基础上进行了二次开发。
    pymysqlreplication 实现了 MySQL 复制协议,可捕捉不同类型的EVENT事件。
    具体可参考:https://github.com/noplay/python-mysql-replication

  2. 注意事项

    1) binlog2sql 强烈依赖于 MySQL 复制协议,如果复制协议发生改变,则该工具将不可用。虽然,复制协议发生改变的可能性很小(一般都会保持向前兼容),但相对而言,自带的 mysqlbinlog 肯定更懂 binlog ,基于 mysqlbinlog 解析后的结果进行处理,可完全屏蔽复制协议等底层细节。
    2)用 python 来解析文本格式的 binlog ,本身也不是件难事。比如, update 语句在 binlog 中的对应的文本,在得到表结构的情况下,基本上可离线解析。


七、参考

MySQL下实现闪回的设计思路 (MySQL Flashback Feature)


八、帮助

python binlog2sql.py --help
usage: binlog2sql.py [-h HOST] [-u USER] [-p PASSWORD] [-P PORT][--start-file STARTFILE] [--start-position STARTPOS][--stop-file ENDFILE] [--stop-position ENDPOS][--start-datetime STARTTIME] [--stop-datetime STOPTIME][--stop-never] [--help] [-d [DATABASES [DATABASES ...]]][-t [TABLES [TABLES ...]]] [-K] [-B]Parse MySQL binlog to SQL you wantoptional arguments:
--stop-never Wait for more data from the server. default: stopreplicate at the last binlog when you start binlog2sql
--help help infomation
-K, --no-primary-key Generate insert sql without primary key if exists
-B, --flashback Flashback data to start_postition of start_fileconnect setting:
-h HOST, --host HOST Host the MySQL database server located
-u USER, --user USER MySQL Username to log in as
-p PASSWORD, --password PASSWORDMySQL Password to use
-P PORT, --port PORT MySQL port to userange filter:
--start-file STARTFILEStart binlog file to be parsed
--start-position STARTPOS, --start-pos STARTPOSStart position of the --start-file
--stop-file ENDFILE, --end-file ENDFILEStop binlog file to be parsed. default: '--start-file'
--stop-position ENDPOS, --end-pos ENDPOSStop position of --stop-file. default: latest positionof '--stop-file'
--start-datetime STARTTIMEStart reading the binlog at first event having adatetime equal or posterior to the argument; theargument must be a date and time in the local timezone, in any format accepted by the MySQL server forDATETIME and TIMESTAMP types, for example: 2004-12-2511:25:56 (you should probably use quotes for yourshell to set it properly).
--stop-datetime STOPTIMEStop reading the binlog at first event having adatetime equal or posterior to the argument; theargument must be a date and time in the local timezone, in any format accepted by the MySQL server forDATETIME and TIMESTAMP types, for example: 2004-12-2511:25:56 (you should probably use quotes for yourshell to set it properly).schema filter:
-d [DATABASES [DATABASES ...]], --databases [DATABASES [DATABASES ...]]dbs you want to process
-t [TABLES [TABLES ...]], --tables [TABLES [TABLES ...]]tables you want to process

推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
zjy396999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有