zoukankan      html  css  js  c++  java
  • binlog_format不同模式下,对mysqlbinlog恢复的影响

     
    binlog_format='mixed'
    (root@g1-db-test-v01:3306)[(none)]>use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    (root@g1-db-test-v01:3306)[test]>update db1.t2 set name='haha' where id=105;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    (root@g1-db-test-v01:3306)[test]>use db1;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    (root@g1-db-test-v01:3306)[db1]>delete from test.t1 where id=11;
    Query OK, 1 row affected (0.02 sec)
     
    假如使用mysqlbinlog恢复db1的数据,命令加上参加 -d :
    mysqlbinlog -d db1 test-mysql-bin.000115 > 115d.sql
     
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #170809 15:38:35 server id 1882073306  end_log_pos 120 CRC32 0x9c11ffa3         Start: binlog v 4, server v 5.6.23-72.1-log created 170809 15:38:35
    # Warning: this binlog is either in use or was not closed properly.
    BINLOG '
    +7uKWQ/aKC5wdAAAAHgAAAABAAQANS42LjIzLTcyLjEtbG9nAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAaP/
    EZw=
    '/*!*/;
    # at 120
    #170809 15:39:20 server id 1882073306  end_log_pos 198 CRC32 0x58ea2e3a         Query   thread_id=75    exec_time=0     error_code=0
    SET TIMESTAMP=1502264360/*!*/;
    SET @@session.pseudo_thread_id=75/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1073741824/*!*/;
    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 198
    # at 313
    #170809 15:39:20 server id 1882073306  end_log_pos 344 CRC32 0xb2671190         Xid = 32389
    COMMIT/*!*/;
    # at 344
    #170809 15:41:05 server id 1882073306  end_log_pos 422 CRC32 0x4befc6fe         Query   thread_id=75    exec_time=0     error_code=0
    SET TIMESTAMP=1502264465/*!*/;
    BEGIN
    /*!*/;
    # at 422
    #170809 15:41:05 server id 1882073306  end_log_pos 526 CRC32 0x2b0ef4d4         Query   thread_id=75    exec_time=0     error_code=0
    use `db1`/*!*/;
    SET TIMESTAMP=1502264465/*!*/;
    delete from test.t1 where id=11
    /*!*/;
    # at 526
    #170809 15:41:05 server id 1882073306  end_log_pos 557 CRC32 0xb34d26a0         Xid = 32473
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    (END) 

    上面的binlog只记录了 delete from test.t1 where id=11

     
    描述这样一种场景,上述案例本想恢复update那一条数据,结果只能恢复delete那一条。
    而delete的却是test库的表,如果在测试环境进行恢复,因只需恢复db1,没有创建test库,则恢复时会报错,恢复终止。
     
    也就是说,在binlog_format='statement/mix'时,如果mysqlbinlog 不加 --database(-d)参数,解析的binlog里记录所有变更sql。但如果增加了 --database db1,则只记录use db1后面的变更sql
     
    这样有一个问题,如果db1里的一张表 t1被删除了,我们想恢复。按照一般方法,是先使用最近备份恢复db1所有数据(因为按库备份),然后使用mysqlbinlog恢复db1的数据到drop t1前一刻,此时使用mysqlbinlog 如果加了 --databae=db1,那在有跨库操作的情况下,会遗漏部分sql;而如果不加 --database=db1,那就更没法恢复了,因为之前只使用了db1的备份先恢复的,也就是只恢复了db1。综上,不加--database的话,就要将所库都先恢复一遍,然后使用mysqlbinlog不加参数继续恢复。
     
    当设置row模式时,则不存在这种问题。
    binlog_format='row'
     
    (root@g1-db-test-v01:3306)[(none)]>use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    (root@g1-db-test-v01:3306)[test]>update db1.t2 set name='hehe' where id=105;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    (root@g1-db-test-v01:3306)[test]>use db1;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    (root@g1-db-test-v01:3306)[db1]>delete from test.t1 where id=10;
    Query OK, 1 row affected (0.02 sec)
     
    mysqlbinlog --base64-output=decode-rows -vv -d db1 test-mysql-bin.000116 > 116d.sql
     
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #170809 16:28:12 server id 1882073306  end_log_pos 120 CRC32 0x6c11777a         Start: binlog v 4, server v 5.6.23-72.1-log created 170809 16:28:12
    # Warning: this binlog is either in use or was not closed properly.
    # at 120
    #170809 16:28:51 server id 1882073306  end_log_pos 192 CRC32 0x256a9f3c         Query   thread_id=78    exec_time=0     error_code=0
    SET TIMESTAMP=1502267331/*!*/;
    SET @@session.pseudo_thread_id=78/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1073741824/*!*/;
    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 192
    #170809 16:28:51 server id 1882073306  end_log_pos 246 CRC32 0x285d8d5d         Table_map: `db1`.`t2` mapped to number 395
    # at 246
    #170809 16:28:51 server id 1882073306  end_log_pos 366 CRC32 0xb84daa2e         Update_rows: table id 395 flags: STMT_END_F
    ### UPDATE `db1`.`t2`
    ### WHERE
    ###   @1=105 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2='haha' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
    ###   @3='57747ab889255af96b48d65e505382' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
    ###   @4='' /* VARSTRING(72) meta=72 nullable=0 is_null=0 */
    ###   @5=NULL /* VARSTRING(72) meta=0 nullable=1 is_null=1 */
    ### SET
    ###   @1=105 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2='hehe' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
    ###   @3='57747ab889255af96b48d65e505382' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
    ###   @4='' /* VARSTRING(72) meta=72 nullable=0 is_null=0 */
    ###   @5=NULL /* VARSTRING(72) meta=0 nullable=1 is_null=1 */
    # at 366
    #170809 16:28:51 server id 1882073306  end_log_pos 397 CRC32 0x74a5b1df         Xid = 32558
    COMMIT/*!*/;
    # at 397
    #170809 16:29:07 server id 1882073306  end_log_pos 468 CRC32 0x66079b66         Query   thread_id=78    exec_time=0     error_code=0
    SET TIMESTAMP=1502267347/*!*/;
    BEGIN
    /*!*/;
    # at 468
    # at 519
    # at 567
    #170809 16:29:07 server id 1882073306  end_log_pos 598 CRC32 0xb3ffd246         Xid = 32583
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    (END) 
     



  • 相关阅读:
    shell脚本中执行python脚本并接收其返回值的例子
    linux查找所有文件中某个字符串
    Shell脚本中单引号(‘)和双引号(“)的使用区别
    第一个shell脚本
    shell 比较符号
    source ~/.bash_profile是什么意思
    bash shell:获取当前脚本的绝对路径(pwd/readlink)
    poj 3307 Smart Sister 打表解因子生成数问题
    Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
    UISegmentedControl的具体使用
  • 原文地址:https://www.cnblogs.com/jerry-rock/p/7412178.html
Copyright © 2011-2022 走看看