• MySQL使用二进制日志恢复数据库


    一、二进制日志简介

    MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复。

    在my.ini文件中设置了log-bin,重新启动MySQL后就开启了二进制日志。数据库每次重新启动(或执行flush logs命令)后,都会生成一个新的二进制日志,如在在my.ini文件中设置了

    log-bin=F:mysqlloglogbin

    则数据库第一次启动会生成logbin.000001,第二次启动会生成logbin.000002,第三次启动会生成logbin.000003,......,以此类推。

    二、数据恢复实例

    1. 为了便于说明,执行flush logs命令,生成一个新的二进制文件;

    2. 打开bookstore数据库中的authors表,里面已经有3条数据,在里面新插入两条数据,即第4条和第5条数据;

    3. 假设由于操作失误,将第4条和第5条数据删除了;

    4. 这时就考虑用二进制文件恢复第4条和第5条数据了,打开二进制文件的路径,发现有很多二进制日志文件,

    其中编号最大的000030是最新的,记录了前面所述的记录插入和删除操作;

    5. 首先查看一下这个文件,运行以下命令将其转换成文本文件,

    打开文本文件,可以看见记录下了记录的插入和删除操作。

    复制代码
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #150204 20:24:10 server id 1  end_log_pos 107     Start: binlog v 4, server v 5.5.25-log created 150204 20:24:10
    # Warning: this binlog is either in use or was not closed properly.
    BINLOG '
    ag/SVA8BAAAAZwAAAGsAAAABAAQANS41LjI1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
    '/*!*/;
    # at 107
    #150204 20:25:40 server id 1  end_log_pos 180     Query    thread_id=8    exec_time=0    error_code=0
    SET TIMESTAMP=1423052740/*!*/;
    SET @@session.pseudo_thread_id=8/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1344274432/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    BEGIN
    /*!*/;
    # at 180
    #150204 20:25:40 server id 1  end_log_pos 369     Query    thread_id=8    exec_time=0    error_code=0
    use bookstore/*!*/;
    SET TIMESTAMP=1423052740/*!*/;
    INSERT INTO `bookstore`.`authors` (`author_id`, `author_last`, `author_first`, `country`) VALUES (4, 'Li', 'Si', 'China')
    /*!*/;
    # at 369
    #150204 20:25:40 server id 1  end_log_pos 557     Query    thread_id=8    exec_time=0    error_code=0
    SET TIMESTAMP=1423052740/*!*/;
    INSERT INTO `bookstore`.`authors` (`author_id`, `author_last`, `author_first`, `country`) VALUES (5, 'Wang', 'Wu', 'US')
    /*!*/;
    # at 557
    #150204 20:25:40 server id 1  end_log_pos 584     Xid = 391
    COMMIT/*!*/;
    # at 584
    #150204 20:45:31 server id 1  end_log_pos 657     Query    thread_id=8    exec_time=0    error_code=0
    SET TIMESTAMP=1423053931/*!*/;
    BEGIN
    /*!*/;
    # at 657
    #150204 20:45:31 server id 1  end_log_pos 780     Query    thread_id=8    exec_time=0    error_code=0
    SET TIMESTAMP=1423053931/*!*/;
    DELETE FROM `bookstore`.`authors` WHERE `author_id`='4'
    /*!*/;
    # at 780
    #150204 20:45:31 server id 1  end_log_pos 903     Query    thread_id=8    exec_time=0    error_code=0
    SET TIMESTAMP=1423053931/*!*/;
    DELETE FROM `bookstore`.`authors` WHERE `author_id`='5'
    /*!*/;
    # at 903
    #150204 20:45:31 server id 1  end_log_pos 930     Xid = 407
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    复制代码

    6. 开始恢复数据,执行以下命令,

    之所以要有一个--stop-pos=584参数,是因为从584开始,就在删除记录了,所以在584就应该停止。执行命令以后,再次打开authors表,可以看见第4、5条数据被恢复了!

  • 相关阅读:
    垂死挣扎-3
    垂死挣扎-2
    垂死挣扎-1
    【互联网考试系列-1】进程与线程
    【iOS基础学习随笔-2】SQLite的使用
    【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)
    docker
    给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
    621. 任务调度器
    204. 计数质数
  • 原文地址:https://www.cnblogs.com/holdon521/p/4274808.html
Copyright © 2020-2023  润新知