`
青.年
  • 浏览: 378 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql单表恢复工具binlogback

阅读更多
在维护mysql的经验中,很多时候我们需要进行单表恢复,以应对误操作 或者sql注入引起的故障,本人也在实际的工作中遇到若干次开发误操作需要恢复数据的情况。
为了方便的恢复数据,所以写了一个逆向解析binlog的工具,能够方便的进行单表恢复操作。目前仅支持5.5,binlog格式必须为row格式
工具下载地址:https://github.com/visician/binlogback,具体的限制以及使用方法请查看README

使用演示:
创建表unit.t1
    create table t1(c1 int not null primary key,c2 varchar(50),c3 datetime)
插入部分数据:

点击(此处)折叠或打开

    unit> insert into t1 values (1,"xxxx",now());
    Query OK, 1 row affected (0.00 sec)

    unit> insert into t1 values (2,"a",now());
    Query OK, 1 row affected (0.00 sec)

    unit> insert into t1 values (3,"b",now());
    Query OK, 1 row affected (0.00 sec)

    unit> select * from t1;
    +----+------+---------------------+
    | c1 | c2 | c3 |
    +----+------+---------------------+
    | 1 | xxxx | 2015-06-10 20:33:34 |
    | 2 | a | 2015-06-10 20:33:40 |
    | 3 | b | 2015-06-10 20:33:46 |
    +----+------+---------------------+
    3 rows in set (0.00 sec)

这时候我们模拟一个误操作,删除所有的数据:

点击(此处)折叠或打开

    unit> delete from t1;
    Query OK, 3 rows affected (0.00 sec)

查看binlog:

    # at 4573
    #150610 20:33:34 server id 5295721 end_log_pos 4649 Query thread_id=909740 exec_time=0 error_code=0
    SET TIMESTAMP=1433939614/*!*/;
    SET @@session.time_zone='SYSTEM'/*!*/;
    BEGIN
    /*!*/;
    # at 4649
    # at 4694
    #150610 20:33:34 server id 5295721 end_log_pos 4694 Table_map: `unit`.`t1` mapped to number 83
    #150610 20:33:34 server id 5295721 end_log_pos 4741 Write_rows: table id 83 flags: STMT_END_F

    BINLOG '
    ni54VRNpzlAALQAAAFYSAAAAAFMAAAAAAAEABHVuaXQAAnQxAAMDDwwClgAG
    ni54VRdpzlAALwAAAIUSAAAAAFMAAAAAAAEAA//4AQAAAAR4eHh4xpL2rVMSAAA=
    '/*!*/;
    ### INSERT INTO unit.t1
    ### SET
    ### @1=1 /* INT meta=0 nullable=0 is_null=0 */
    ### @2='xxxx' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
    ### @3=2015-06-10 20:33:34 /* DATETIME meta=0 nullable=1 is_null=0 */
    # at 4741
    #150610 20:33:34 server id 5295721 end_log_pos 4768 Xid = 3484054
    COMMIT/*!*/;
    # at 4768
    #150610 20:33:40 server id 5295721 end_log_pos 4844 Query thread_id=909740 exec_time=0 error_code=0
    SET TIMESTAMP=1433939620/*!*/;
    BEGIN
    /*!*/;
    # at 4844
    # at 4889
    #150610 20:33:40 server id 5295721 end_log_pos 4889 Table_map: `unit`.`t1` mapped to number 83
    #150610 20:33:40 server id 5295721 end_log_pos 4933 Write_rows: table id 83 flags: STMT_END_F

    BINLOG '
    pC54VRNpzlAALQAAABkTAAAAAFMAAAAAAAEABHVuaXQAAnQxAAMDDwwClgAG
    pC54VRdpzlAALAAAAEUTAAAAAFMAAAAAAAEAA//4AgAAAAFhzJL2rVMSAAA=
    '/*!*/;
    ### INSERT INTO unit.t1
    ### SET
    ### @1=2 /* INT meta=0 nullable=0 is_null=0 */
    ### @2='a' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
    ### @3=2015-06-10 20:33:40 /* DATETIME meta=0 nullable=1 is_null=0 */
    # at 4933
    #150610 20:33:40 server id 5295721 end_log_pos 4960 Xid = 3484055
    COMMIT/*!*/;
    # at 4960
    #150610 20:33:46 server id 5295721 end_log_pos 5036 Query thread_id=909740 exec_time=0 error_code=0
    SET TIMESTAMP=1433939626/*!*/;
    BEGIN
    /*!*/;
    # at 5036
    # at 5081
    #150610 20:33:46 server id 5295721 end_log_pos 5081 Table_map: `unit`.`t1` mapped to number 83
    #150610 20:33:46 server id 5295721 end_log_pos 5125 Write_rows: table id 83 flags: STMT_END_F

    BINLOG '
    qi54VRNpzlAALQAAANkTAAAAAFMAAAAAAAEABHVuaXQAAnQxAAMDDwwClgAG
    qi54VRdpzlAALAAAAAUUAAAAAFMAAAAAAAEAA//4AwAAAAFi0pL2rVMSAAA=
    '/*!*/;
    ### INSERT INTO unit.t1
    ### SET
    ### @1=3 /* INT meta=0 nullable=0 is_null=0 */
    ### @2='b' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
    ### @3=2015-06-10 20:33:46 /* DATETIME meta=0 nullable=1 is_null=0 */
    # at 5125
    #150610 20:33:46 server id 5295721 end_log_pos 5152 Xid = 3484056
    COMMIT/*!*/;
    # at 5152
    #150610 20:35:52 server id 5295721 end_log_pos 5220 Query thread_id=909740 exec_time=0 error_code=0
    SET TIMESTAMP=1433939752/*!*/;
    BEGIN
    /*!*/;
    # at 5220
    # at 5265
    #150610 20:35:52 server id 5295721 end_log_pos 5265 Table_map: `unit`.`t1` mapped to number 83
    #150610 20:35:52 server id 5295721 end_log_pos 5342 Delete_rows: table id 83 flags: STMT_END_F

    BINLOG '
    KC94VRNpzlAALQAAAJEUAAAAAFMAAAAAAAEABHVuaXQAAnQxAAMDDwwClgAG
    KC94VRlpzlAATQAAAN4UAAAAAFMAAAAAAAEAA//4AQAAAAR4eHh4xpL2rVMSAAD4AgAAAAFhzJL2
    rVMSAAD4AwAAAAFi0pL2rVMSAAA=
    '/*!*/;
    ### DELETE FROM unit.t1
    ### WHERE
    ### @1=1 /* INT meta=0 nullable=0 is_null=0 */
    ### @2='xxxx' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
    ### @3=2015-06-10 20:33:34 /* DATETIME meta=0 nullable=1 is_null=0 */
    ### DELETE FROM unit.t1
    ### WHERE
    ### @1=2 /* INT meta=0 nullable=0 is_null=0 */
    ### @2='a' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
    ### @3=2015-06-10 20:33:40 /* DATETIME meta=0 nullable=1 is_null=0 */
    ### DELETE FROM unit.t1
    ### WHERE
    ### @1=3 /* INT meta=0 nullable=0 is_null=0 */
    ### @2='b' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */
    ### @3=2015-06-10 20:33:46 /* DATETIME meta=0 nullable=1 is_null=0 */
    # at 5342
    #150610 20:35:52 server id 5295721 end_log_pos 5369 Xid = 3484242
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/

可以看到我们的insert操作和delete操作,在时间2015-06-10 20:35:52 我们做了delete误操作。现在我们要恢复到这个时间点

    [root@centos mysql_6302_binlog]# python binlogback.py -f ./mysql-bin.000022 -B unit -m desc -t t1 -c "c1,c2,c3" --begin-datetime="2015-06-10 20:35:52"
    #pos:5342
    BEGIN;
    insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 3, 'b', '2015-06-10 20:33:46');
    insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 2, 'a', '2015-06-10 20:33:40');
    insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 1, 'xxxx', '2015-06-10 20:33:34');
    COMMIT

可以看到工具把delete语句按照反序转换成了insert语句,把生成的语句执行:

    unit> BEGIN;
    Query OK, 0 rows affected (0.00 sec)

    unit> insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 3, 'b', '2015-06-10 20:33:46');
    Query OK, 1 row affected (0.00 sec)

    unit> insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 2, 'a', '2015-06-10 20:33:40');
    Query OK, 1 row affected (0.00 sec)

    unit> insert into `unit`.`t1`(`c1`,`c2`,`c3`)values ( 1, 'xxxx', '2015-06-10 20:33:34');
    Query OK, 1 row affected (0.00 sec)

    unit> COMMIT;
    Query OK, 0 rows affected (0.00 sec)

    unit> select * from t1;
    +----+------+---------------------+
    | c1 | c2 | c3 |
    +----+------+---------------------+
    | 1 | xxxx | 2015-06-10 20:33:34 |
    | 2 | a | 2015-06-10 20:33:40 |
    | 3 | b | 2015-06-10 20:33:46 |
    +----+------+---------------------+
    3 rows in set (0.00 sec)


可以看到表t1已经恢复到了我们删除前的状态。

工具限制:
1、要恢复的表必须有主键,不然恢复可能会引起严重的数据错误
2、目前仅支持mysql5.5,以及5.5的衍生版本,只要binlog协议没有发生改变,原理上都适用
3、只支持row格式的binlog
4、time类型解析有问题,如果time类型的值小于“00:00:00”那么会解析出错误的值
5、因为工作时间问题,暂时没有支持设置binlog position来恢复数据,后续会支持
优点:
1、方便快捷,单表恢复
2、修复了5.5的mysqlbinlog工具的一些BUG
3、使用python,没有依赖,下载即可使用

该工具是博主最近研究binlog协议生产出来的一个小工具,欢迎大家试用,多提BUG,多多交流。代码没有经过严格的构思,请勿吐槽代码水平。
分享到:
评论

相关推荐

    MYSQL ibdata文件恢复工具 2.1

    MYSQL数据库碎片恢复工具,已经完工。专门针对MYSQL的ibdata1 引擎 编写,支持MYSQL 3 4 5 6版本,任意平台的IBDATA文件恢复。支持误删除 ,所在分区被格式化,支持黑客故意破坏等情况,自动侦测半页。提取合成。

    Mysql8.0 数据库恢复工具

    文件级别数据库恢复工具软件,本软件适合于操作系统崩溃后将mysql数据目录拷贝出进行恢复,在恢复前需要使用之前备份的数据库结构新建空库,然后将还原文件的数据恢复到新库,目前只能恢复InnoDB引擎、MyISAM引擎 表...

    mysql innodb恢复数据工具.rar

    这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...

    mysql数据库结构对比工具

    支持的数据库:MS SQL Server、 PosgresSql、MySQL 数据库数据对比工具:可以针对两个数据进行表结构和数据的对比。1、结构对比:如开发库和正式库之间的结构和数据同步,此工具可以告诉您哪个表结构有字段的增加...

    mysql数据表导出为word文档工具

    MySQL 数据表导出为 Word 文档工具 MySQL 数据表导出为 Word 文档工具是软件开发中一个重要的工具,能够将 MySQL 数据库中的数据表导出为 Word 文档,使得数据库的记录和管理更加方便。 MySQL 数据库连接 在使用...

    mysql数据库备份和恢复工具

    本文将深入探讨MySQL数据库的备份与恢复策略,并提供相关工具的使用指南。 一、MySQL备份的重要性 数据库备份是防止数据丢失的关键步骤。无论是系统故障、硬件损坏、恶意攻击还是人为错误,都有可能导致数据丢失。...

    mysql导出到word格式表结构工具

    这个“mysql导出到word格式表结构工具”提供了一个便捷的解决方案,使得开发者和非技术用户能够清晰地查看和理解数据库架构。 MySQL是一种流行的开源关系型数据库管理系统,它支持SQL语言,提供了强大的数据存储和...

    MySQL异常恢复-drop表恢复.docx

    MySQL 异常恢复-drop 表恢复 MySQL 异常恢复是指在 MySQL 数据库出现异常情况时,恢复数据库的操作。drop 表恢复是指在 MySQL 数据库中删除表后,恢复被删除的表的操作。undrop-for-innodb 是一种恢复被删除的表的...

    mysql数据库备份工具

    1. 快速备份:工具能够快速扫描并打包MySQL数据库中的所有表,生成SQL脚本或者二进制文件,从而实现快速备份。 2. 自动化调度:可能支持定时备份功能,用户可以设置定时任务,让工具自动在指定时间执行备份,确保...

    C#编写的MYSQL数据库备份恢复工具(源代码)

    本篇将详细介绍由C#编写的MYSQL数据库备份恢复工具,以及其中涉及的关键技术和实现方式。 首先,C#是一种面向对象的编程语言,由微软公司推出,它具有丰富的类库和强大的.NET框架支持,适用于开发Windows桌面应用、...

    mysql binlog日志恢复【亲测有效,有例子实测】

    5. **查看binlog事件并恢复数据**:通过`show binlog events in 'mysql-bin.000002'`查看binlog文件中的事件,然后使用`mysqlbinlog`工具指定开始和结束位置恢复特定数据,例如: ``` mysqlbinlog --start-...

    PHP版 MYSQL单文件在线管理工具

    MYSQL 单文件管理工具,这是PHP版本的哦,虚拟主机上也可以使用的,应急还不错

    MySQL掌握备份恢复工具mysqldump实践

    ### MySQL掌握备份恢复工具mysqldump实践 在数据库管理领域,备份与恢复是一项至关重要的工作,它确保了数据的安全性和系统的连续性。MySQL作为一款广泛使用的开源关系型数据库管理系统,提供了多种备份与恢复工具...

    Mysql 数据库表结构导出工具 DBExportDoc V1.0 For MySQL

    Mysql 数据库表结构导出工具,带教程

    Oracle|Sqlserver|MySql数据库表结构一键生成工具

    "Oracle|Sqlserver|MySql数据库表结构一键生成工具" 提供了一种高效的方法来自动化这个过程,大大减轻了手动编写文档的工作量。这款工具能够支持三种主流的关系型数据库管理系统:Oracle、SQL Server和MySQL。 ...

    Go-go-mydumper一个多线程的MySQL备份和恢复工具

    【标题】"Go-go-mydumper:一个多线程的MySQL备份和恢复工具" 【正文】 在MySQL数据库管理中,数据备份和恢复是至关重要的环节,它确保了数据的安全性和业务连续性。`go-mydumper`是这样一款工具,它是用Go语言编写...

    MySQL数据库表导出Word工具,生成数据库说明文档

    "MySQL数据库表导出Word工具"提供了一种便捷的方式,将数据库结构和内容转换为易于理解的Word文档,这对于开发、运维以及非技术背景的团队成员都非常有帮助。 首先,这个工具的主要功能是将MySQL数据库中的表结构和...

    mysql可视化工具

    6. 用户和权限管理:可视化工具通常包含管理MySQL用户的界面,可以设置用户权限,控制谁可以访问哪些数据库或表。 7. 图形化展示:有些工具提供了ER图(实体关系图)功能,帮助用户理解数据库结构,以及各表之间的...

    MySQL基础数据生成工具

    9. **备份与恢复**:了解如何使用MySQL的备份和恢复机制,比如使用mysqldump工具进行数据导出,或者使用source命令导入数据。 10. **安全性**:学习如何设置用户权限,理解GRANT和REVOKE命令,以及如何创建和管理...

Global site tag (gtag.js) - Google Analytics