zoukankan      html  css  js  c++  java
  • 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条数据被恢复了!

  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/mstk/p/4273246.html
Copyright © 2011-2022 走看看