zoukankan      html  css  js  c++  java
  • MySQL Binlog详解

    一个数据库必须拥有完善的日志系统,MySQL的日志系统组成如下:

    • 错误日志(error log):记录启动、运行或停止mysqld时出现的问题。
    • 通用日志(general log):记录建立的客户端连接和执行的语句。
    • 二进制日志(binary log):记录所有对数据库的更改,还用于复制。
    • 慢查询日志(slow query log):记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。
    • Innodb事务日志:事务日志或者叫redo log/undo log

    缺省情况下,MySQL只打开错误日志,并且默认所有日志创建于mysqld数据目录中。
    可以通过刷新日志,来强制mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。
    当你执行一个FLUSH
    LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,则日志被刷新。

    本文只是对binary log做一个详细解释。

    二进制日志基础

    1. binlog包含的内容和作用:

    对数据库的所有DML以及一些DDL更改操作都会记录在二进制日志中
    主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含数据库的所有更新

    binlog日志属于二进制文件,我们可以从binlog提取出来生成可阅读的SQL语句来重建当前数据库以及根据需要实现时点恢复(Point-In-Time)或不完全恢复。
    用于在主从复制(mysql
    replication),
    启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整。有些类似于oracle开启归档模式。

    2. binlog相关变量和参数
    • 命令行参数

    --log-bin [=file_name]

    设置此参数表示启用binlog功能,并制定路径名称。

    --log-bin-index[=file]

    设置此参数是指定二进制索引文件的路径与名称。

    --max_binlog_size

    binlog最大值,最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束。

      --binlog-do-db=db_name

    此参数表示只记录指定数据库的二进制日志

    --binlog-ignore-db=db_name

    此参数表示不记录指定的数据库的二进制日志

    • 系统变量

    log_bin

    binlog_cache_size

    此参数表示binlog使用的内存大小,可以通过状态变量binlog_cache_use和binlog_cache_disk_use来帮助测试。

    max_binlog_cache_size

    此参数表示binlog使用的内存最大的尺寸

    binlog_cache_use

    使用二进制日志缓存的事务数量

    binlog_cache_disk_use

    使用二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量。

    binlog_do_db

    binlog_ignore_db

    sync_binlog

    这个参数直接影响mysql的性能和完整性。

    sync_binlog=0:

    mysql中默认的设置是sync_binlog=0,即不做任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。当事务提交后,mysql仅仅是将binlog_cache中的数据写入binlog文件,但不执行fsync之类的磁盘同步,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。但是一旦系统Crash,在文件系统缓存中的所有Binlog信息都会丢失。

    3. 日志格式

    • 基于SQL语句的复制(statement-based replication,SBR),
    • 基于行的复制(row-based replication,RBR),
    • 混合模式复制(mixed-based replication,MBR)。

    之前的MySQL一直都只有基于statement的复制模式,直到5.1.5版本的MySQL才开始支持row level的复制。

    从5.0开始,MySQL的复制已经解决了大量老版本中出现的无法正确复制的问题。

    但是由于存储过程的出现,给MySQL Replication复制又带来了更大的新挑战。

    另外,看到官方文档说,从5.1.8版本开始,MySQL提供了除Statement Level和Row
    Level之外的第三种复制模式:Mixed,实际上就前两种模式的结合。

    在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

    新版本中的Statement Level还是和以前一样,仅仅记录执行的语句。

    而新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row
    level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,
    那么还是会记录所有行的变更。

    静态设置binlog格式:

    vi my.cnf
      log-bin = mysql-bin
      #binlog_format = "STATEMENT"
      #binlog_format = "ROW"
      binlog_format = "MIXED"

    动态修改binlog格式:

      mysql> SET SESSION binlog_format = 'STATEMENT';
      mysql> SET SESSION binlog_format = 'ROW';
      mysql> SET SESSION binlog_format = 'MIXED';
      mysql> SET GLOBAL binlog_format = 'STATEMENT';
      mysql> SET GLOBAL binlog_format = 'ROW';
      mysql> SET GLOBAL binlog_format = 'MIXED';

    4. 日志切换策略

      使用索引来循环记录文件,在以下条件将循环至下一个索引

    a.服务器重启

    b.服务器被更新

    c.日志达到了最大日志长度max_binlog_size

    d.日志被手动刷新mysql> flush logs;

    5. 清除binlog

    PURGE {MASTER|BINARY} LOGS TO 'log_name' ; //log_name不会被清除

    PURGE {MASTER|BINARY} LOGS BEFORE 'date' ; //date不会被清除

    RESET MASTER; //删除之前所有的binlog,并重新生成新的binlog,后缀从000001开始。

    二进制日志操作演示

    a、启用二进制日志
    --当前环境
    root@localhost[(none)]> show variables like '%version%';
    +-------------------------+------------------------------+
    | Variable_name           | Value                        |
    +-------------------------+------------------------------+
    | innodb_version          | 5.5.39                       |
    | protocol_version        | 10                           |
    | slave_type_conversions  |                              |
    | version                 | 5.5.39                       |
    | version_comment         | MySQL Community Server (GPL) |
    | version_compile_machine | x86_64                       |
    | version_compile_os      | Linux                        |
    +-------------------------+------------------------------+
    
    root@localhost[(none)]> show variables like '%log_bin%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin                         | OFF   | --该参数用于设定是否启用二进制日志
    | log_bin_trust_function_creators | OFF   |
    | sql_log_bin                     | ON    |
    +---------------------------------+-------+
    
    --以下为binary log相关参数
    root@localhost[(none)]> show variables like '%binlog%';
    +-----------------------------------------+----------------------+
    | Variable_name                           | Value                |
    +-----------------------------------------+----------------------+
    | binlog_cache_size                       | 32768                |
    | binlog_direct_non_transactional_updates | OFF                  |
    | binlog_format                           | STATEMENT            |
    | binlog_stmt_cache_size                  | 32768                |
    | innodb_locks_unsafe_for_binlog          | OFF                  |
    | max_binlog_cache_size                   | 18446744073709547520 |
    | max_binlog_size                         | 1073741824           |
    | max_binlog_stmt_cache_size              | 18446744073709547520 |
    | sync_binlog                             | 0                    |
    +-----------------------------------------+----------------------+
    
    --当前mysql服务器数据文件的缺省位置
    root@localhost[(none)]> show variables like '%datadir%';
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | datadir       | /var/lib/mysql/ |
    +---------------+-----------------+
    
    --停止mysql服务器
    suse11b:~ # service mysql stop
    Shutting down MySQL....                                               done
    
    --编辑my.cnf来设定binary log日志位置(注,配置二进制日志路径及文件名后,系统变量log_bin被自动置为on)
    suse11b:~ # vi /etc/my.cnf
    suse11b:~ # grep -v ^# /etc/my.cnf
    [mysqld]
    log-error=/tmp/suse11b.err
    log_bin=/var/lib/mysql/binarylog/binlog
    suse11b:~ # mkdir -p /var/lib/mysql/binarylog
    suse11b:~ # chown -R mysql:mysql /var/lib/mysql/binarylog
    
    suse11b:~ # /etc/init.d/mysql start
    Starting MySQL..                                                      done
    suse11b:~ # ls -hltr /var/lib/mysql/binarylog/*
    -rw-rw---- 1 mysql mysql  39 Oct  3 13:41 /var/lib/mysql/binarylog/binlog.index  #索引文件
    -rw-rw---- 1 mysql mysql 107 Oct  3 13:41 /var/lib/mysql/binarylog/binlog.000001 #日志文件
    
    b、切换日志
    suse11b:~ # mysql -uroot -pxxx
    root@localhost[(none)]> flush logs;
    Query OK, 0 rows affected (0.04 sec)
    
    root@localhost[(none)]> system ls -hltr /var/lib/mysql/binarylog/*
    -rw-rw---- 1 mysql mysql  78 Oct  3 13:43 /var/lib/mysql/binarylog/binlog.index
    -rw-rw---- 1 mysql mysql 107 Oct  3 13:43 /var/lib/mysql/binarylog/binlog.000002  #切换后产生了000002
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:43 /var/lib/mysql/binarylog/binlog.000001
    
    root@localhost[(none)]> system mysqladmin flush-logs    #使用mysqladmin命令行工具flush-logs方式切换日志
    root@localhost[(none)]> system ls -hltr /var/lib/mysql/binarylog/*
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:43 /var/lib/mysql/binarylog/binlog.000001
    -rw-rw---- 1 mysql mysql 117 Oct  3 13:45 /var/lib/mysql/binarylog/binlog.index
    -rw-rw---- 1 mysql mysql 107 Oct  3 13:45 /var/lib/mysql/binarylog/binlog.000003  #切换后产生了000003
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:45 /var/lib/mysql/binarylog/binlog.000002
    
    root@localhost[(none)]> system mysqladmin refresh       #使用mysqladmin命令行工具refresh方式切换日志
    root@localhost[(none)]> system ls -hltr /var/lib/mysql/binarylog/*
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:43 /var/lib/mysql/binarylog/binlog.000001
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:45 /var/lib/mysql/binarylog/binlog.000002
    -rw-rw---- 1 mysql mysql 156 Oct  3 13:46 /var/lib/mysql/binarylog/binlog.index
    -rw-rw---- 1 mysql mysql 107 Oct  3 13:46 /var/lib/mysql/binarylog/binlog.000004  #切换后产生了000004
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:46 /var/lib/mysql/binarylog/binlog.000003 
    
    c、模拟产生二进制日志及查看内容
    root@localhost[(none)]> create database tempdb;
    Query OK, 1 row affected (0.00 sec)
    
    root@localhost[(none)]> use tempdb
    Database changed
    root@localhost[tempdb]> create table tb1(id smallint,val varchar(10));
    Query OK, 0 rows affected (0.00 sec)
    
    root@localhost[tempdb]> insert into tb1 values(1,'jack');
    Query OK, 1 row affected (0.01 sec)
    
    root@localhost[tempdb]> system strings /var/lib/mysql/binarylog/binlog.000004
    bin?8.T
    5.5.39-log
    z=.T
    tempdb
    create database tempdb
    tempdb
    create table tb1(id smallint,val varchar(10))
    tempdb
    BEGIN
    tempdb
    insert into tb1 values(1,'jack')
    
    root@localhost[tempdb]> system more /var/lib/mysql/binarylog/binlog.index
    /var/lib/mysql/binarylog/binlog.000001
    /var/lib/mysql/binarylog/binlog.000002
    /var/lib/mysql/binarylog/binlog.000003
    /var/lib/mysql/binarylog/binlog.000004
    
    --使用命令行工具mysqlbinlog直接提取二进制日志的内容
    root@localhost[tempdb]> system mysqlbinlog /var/lib/mysql/binarylog/binlog.000004
    /*!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
    #141003 13:46:39 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.39-log created 141003 13:46:39
    # Warning: this binlog is either in use or was not closed properly.
    BINLOG '
    PzguVA8BAAAAZwAAAGsAAAABAAQANS41LjM5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
    '/*!*/;
    # at 107
    #141003 14:08:58 server id 1  end_log_pos 194   Query   thread_id=1     exec_time=0     error_code=0
    SET TIMESTAMP=1412316538/*!*/;
    SET @@session.pseudo_thread_id=1/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=0/*!*/;
    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=8/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    create database tempdb
    /*!*/;
    # at 194
    #141003 14:09:36 server id 1  end_log_pos 304   Query   thread_id=1     exec_time=0     error_code=0
    use `tempdb`/*!*/;
    SET TIMESTAMP=1412316576/*!*/;
    create table tb1(id smallint,val varchar(10))
    /*!*/;
    # at 304
    #141003 14:09:56 server id 1  end_log_pos 374   Query   thread_id=1     exec_time=0     error_code=0
    SET TIMESTAMP=1412316596/*!*/;
    BEGIN
    /*!*/;
    # at 374
    #141003 14:09:56 server id 1  end_log_pos 471   Query   thread_id=1     exec_time=0     error_code=0
    SET TIMESTAMP=1412316596/*!*/;
    insert into tb1 values(1,'jack')
    /*!*/;
    # at 471
    #141003 14:09:56 server id 1  end_log_pos 498   Xid = 25
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    --从以上的内容可以看出二进制日志记录了所有操作的DML语句及其开销,以及一些系统环境变量的信息。
    
    d、管理二进制日志
    --对于二进制日志,应尽可能保存在安全的位置,与数据分开存储
    --使用show binary logs获取二进制日志相关信息
    root@localhost[(none)]> help show binary logs;
    Name: 'SHOW BINARY LOGS'
    Description:
    Syntax:
    SHOW BINARY LOGS
    SHOW MASTER LOGS
    
    Lists the binary log files on the server. This statement is used as
    part of the procedure described in [HELP PURGE BINARY LOGS], that shows
    how to determine which logs can be purged.
    
    root@localhost[tempdb]> show binary logs;
    +---------------+-----------+
    | Log_name      | File_size |
    +---------------+-----------+
    | binlog.000001 |       147 |
    | binlog.000002 |       147 |
    | binlog.000003 |       147 |
    | binlog.000004 |       498 |
    +---------------+-----------+
    
    show binlog events用于在二进制日志中显示事件。如果未指定'log_name',则显示第一个二进制日志。
    root@localhost[(none)]> help show binlog events;  --获取帮助信息
    Name: 'SHOW BINLOG EVENTS'
    Description:
    Syntax:
    SHOW BINLOG EVENTS
       [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
    
    Shows the events in the binary log. If you do not specify 'log_name',
    the first binary log is displayed.
    
    root@localhost[(none)]> show binlog events;
    +---------------+-----+-------------+-----------+-------------+---------------------------------------+
    | Log_name      | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
    +---------------+-----+-------------+-----------+-------------+---------------------------------------+
    | binlog.000001 |   4 | Format_desc |         1 |         107 | Server ver: 5.5.39-log, Binlog ver: 4 |
    | binlog.000001 | 107 | Rotate      |         1 |         147 | binlog.000002;pos=4                   |
    +---------------+-----+-------------+-----------+-------------+---------------------------------------+
    
    root@localhost[(none)]> show binlog events in 'binlog.000005';  --binlog.000005不存在,所以报错
    ERROR 1220 (HY000): Error when executing command SHOW BINLOG EVENTS: Could not find target log
    
    --下面的这个查询中,前面执行的DML在这里均可以看到
    root@localhost[tempdb]> show binlog events in 'binlog.000004';
    +---------------+-----+-------------+-----------+-------------+-------------------------------------------------------------+
    | Log_name      | Pos | Event_type  | Server_id | End_log_pos | Info                                                        |
    +---------------+-----+-------------+-----------+-------------+-------------------------------------------------------------+
    | binlog.000004 |   4 | Format_desc |         1 |         107 | Server ver: 5.5.39-log, Binlog ver: 4                       |
    | binlog.000004 | 107 | Query       |         1 |         194 | create database tempdb                                      |
    | binlog.000004 | 194 | Query       |         1 |         304 | use `tempdb`; create table tb1(id smallint,val varchar(10)) |
    | binlog.000004 | 304 | Query       |         1 |         374 | BEGIN                                                       |
    | binlog.000004 | 374 | Query       |         1 |         471 | use `tempdb`; insert into tb1 values(1,'jack')              |
    | binlog.000004 | 471 | Xid         |         1 |         498 | COMMIT /* xid=25 */                                         |
    +---------------+-----+-------------+-----------+-------------+-------------------------------------------------------------+
    
    root@localhost[tempdb]> show binlog events in 'binlog.000004' from 374;
    +---------------+-----+------------+-----------+-------------+------------------------------------------------+
    | Log_name      | Pos | Event_type | Server_id | End_log_pos | Info                                           |
    +---------------+-----+------------+-----------+-------------+------------------------------------------------+
    | binlog.000004 | 374 | Query      |         1 |         471 | use `tempdb`; insert into tb1 values(1,'jack') |
    | binlog.000004 | 471 | Xid        |         1 |         498 | COMMIT /* xid=25 */                            |
    +---------------+-----+------------+-----------+-------------+------------------------------------------------+
    
    root@localhost[tempdb]> show binlog events in 'binlog.000004' from 374 limit 1;
    +---------------+-----+------------+-----------+-------------+------------------------------------------------+
    | Log_name      | Pos | Event_type | Server_id | End_log_pos | Info                                           |
    +---------------+-----+------------+-----------+-------------+------------------------------------------------+
    | binlog.000004 | 374 | Query      |         1 |         471 | use `tempdb`; insert into tb1 values(1,'jack') |
    +---------------+-----+------------+-----------+-------------+------------------------------------------------+
    
    d、删除历史日志
    --使用purge手动删除指定日志
    --使用expire-log-days删除失效日志,设置变量expire_logs_days,删除超出这个变量保留期之前的所有日志被删除
    --自动日志删除通常发生在服务器启动以及日志flush
    --reset master方式
    root@localhost[(none)]> help purge;
    Name: 'PURGE BINARY LOGS'
    Description:
    Syntax:
    PURGE { BINARY | MASTER } LOGS
        { TO 'log_name' | BEFORE datetime_expr }
    
    Examples:
    PURGE BINARY LOGS TO 'mysql-bin.010';
    PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';
    
    root@localhost[tempdb]> purge binary logs to 'binlog.000003';
    Query OK, 0 rows affected (0.12 sec)
    
    root@localhost[tempdb]> show binary logs;
    +---------------+-----------+
    | Log_name      | File_size |
    +---------------+-----------+
    | binlog.000003 |       147 |
    | binlog.000004 |       498 |
    +---------------+-----------+
    
    root@localhost[tempdb]> system ls -hltr /var/lib/mysql/binarylog/*
    -rw-rw---- 1 mysql mysql 147 Oct  3 13:46 /var/lib/mysql/binarylog/binlog.000003
    -rw-rw---- 1 mysql mysql 498 Oct  3 14:09 /var/lib/mysql/binarylog/binlog.000004
    -rw-rw---- 1 mysql mysql  78 Oct  3 14:23 /var/lib/mysql/binarylog/binlog.index
    
    --使用before子句purge日志,binlog.000003被删除
    root@localhost[tempdb]> purge binary logs before '2014-10-03 14:09:56';
    Query OK, 0 rows affected (0.02 sec)
    
    root@localhost[tempdb]> show binary logs;
    +---------------+-----------+
    | Log_name      | File_size |
    +---------------+-----------+
    | binlog.000004 |       498 |
    +---------------+-----------+
    
    --重置所有日志
    --reset master将删除在索引文件中列出所有的日志文件并重置索引文件,最后生成一个新的binlog文件。
    --该操作之前先备份binlog至其它位置以备以后需要。
    root@localhost[tempdb]> help reset master;
    Name: 'RESET MASTER'
    Description:
    Syntax:
    RESET MASTER
    
    Deletes all binary log files listed in the index file, resets the
    binary log index file to be empty, and creates a new binary log file.
    This statement is intended to be used only when the master is started
    for the first time.
    
    root@localhost[tempdb]> reset master;
    Query OK, 0 rows affected (0.13 sec)
    
    root@localhost[tempdb]> show binary logs;
    +---------------+-----------+
    | Log_name      | File_size |
    +---------------+-----------+
    | binlog.000001 |       107 |  --reset之后,从000001开始生成全新空日志
    +---------------+-----------+
    
    --expire_log系统变量控制二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
    root@localhost[tempdb]> show variables like 'expire_log%';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | expire_logs_days | 0     |
    +------------------+-------+
    
    root@localhost[tempdb]> set expire_logs_days=7;   --提示次系统变量为全局变量
    ERROR 1229 (HY000): Variable 'expire_logs_days' is a GLOBAL variable and should be set with SET GLOBAL
    root@localhost[tempdb]> set global expire_logs_days=7;  --设置
    Query OK, 0 rows affected (0.01 sec)
    
    root@localhost[tempdb]> select @@expire_logs_days;
    +--------------------+
    | @@expire_logs_days |
    +--------------------+
    |                  7 |
    +--------------------+

    mysqlbinlog解析提取binlog

    1、提取mysqlbinlog的几种方式

    a、使用show binlog events方式可以获取当前以及指定binlog的日志,不适宜提取大量日志。

    b、使用mysqlbinlog命令行提取(适宜批量提取日志)。

    2、演示show binlog events方式

    mysql> show variables like 'version';
    +---------------+------------+
    | Variable_name | Value      |
    +---------------+------------+
    | version       | 5.6.12-log |
    +---------------+------------+
    
    mysql> show binary logs;
    +-----------------+-----------+
    | Log_name        | File_size |
    +-----------------+-----------+
    | APP01bin.000001 |       120 |
    +-----------------+-----------+
    
    a、只查看第一个binlog文件的内容(show binlog events)
    mysql> use replication;
    Database changed
    mysql> select * from tb;
    +------+-------+
    | id   | val   |
    +------+-------+
    |    1 | robin |
    +------+-------+
    
    mysql> insert into tb values(2,'jack');
    Query OK, 1 row affected (0.02 sec)
    
    mysql> flush logs;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into tb values(3,'fred');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> show binary logs;
    +-----------------+-----------+
    | Log_name        | File_size |
    +-----------------+-----------+
    | APP01bin.000001 |       409 |
    | APP01bin.000002 |       363 |
    +-----------------+-----------+
    
    mysql> show binlog events;
    +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
    | Log_name        | Pos | Event_type  | Server_id | End_log_pos | Info                                               |
    +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
    | APP01bin.000001 |   4 | Format_desc |        11 |         120 | Server ver: 5.6.12-log, Binlog ver: 4              |
    | APP01bin.000001 | 120 | Query       |        11 |         213 | BEGIN                                              |
    | APP01bin.000001 | 213 | Query       |        11 |         332 | use `replication`; insert into tb values(2,'jack') |
    | APP01bin.000001 | 332 | Xid         |        11 |         363 | COMMIT /* xid=382 */                               |
    | APP01bin.000001 | 363 | Rotate      |        11 |         409 | APP01bin.000002;pos=4                              |
    +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
    -- 在上面的结果中第3行可以看到我们执行的SQL语句,第4行为自动提交
    
    b、查看指定binlog文件的内容(show binlog events in 'binname.xxxxx')
    mysql> show binlog events in 'APP01bin.000002';
    +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
    | Log_name        | Pos | Event_type  | Server_id | End_log_pos | Info                                               |
    +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
    | APP01bin.000002 |   4 | Format_desc |        11 |         120 | Server ver: 5.6.12-log, Binlog ver: 4              |
    | APP01bin.000002 | 120 | Query       |        11 |         213 | BEGIN                                              |
    | APP01bin.000002 | 213 | Query       |        11 |         332 | use `replication`; insert into tb values(3,'fred') |
    | APP01bin.000002 | 332 | Xid         |        11 |         363 | COMMIT /* xid=394 */                               |
    +-----------------+-----+-------------+-----------+-------------+----------------------------------------------------+
    
    c、查看当前正在写入的binlog文件(show master statusG)
    mysql> show master statusG
    *************************** 1. row ***************************
                 File: APP01bin.000002
             Position: 363
         Binlog_Do_DB:
     Binlog_Ignore_DB:
    Executed_Gtid_Set:
    1 row in set (0.00 sec)
    
    d、获取指定位置binlog的内容(show binlog events from)
    mysql> show binlog events from 213;
    +-----------------+-----+------------+-----------+-------------+----------------------------------------------------+
    | Log_name        | Pos | Event_type | Server_id | End_log_pos | Info                                               |
    +-----------------+-----+------------+-----------+-------------+----------------------------------------------------+
    | APP01bin.000001 | 213 | Query      |        11 |         332 | use `replication`; insert into tb values(2,'jack') |
    | APP01bin.000001 | 332 | Xid        |        11 |         363 | COMMIT /* xid=382 */                               |
    | APP01bin.000001 | 363 | Rotate     |        11 |         409 | APP01bin.000002;pos=4                              |
    +-----------------+-----+------------+-----------+-------------+----------------------------------------------------+

    3、演示mysqlbinlog方式提取binlog

    a、提取指定的binlog日志
    # mysqlbinlog /opt/data/APP01bin.000001
    # mysqlbinlog /opt/data/APP01bin.000001|grep insert
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    insert into tb values(2,'jack')
    
    b、提取指定position位置的binlog日志
    # mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001
    
    c、提取指定position位置的binlog日志并输出到压缩文件
    # mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 |gzip >extra_01.sql.gz
    
    d、提取指定position位置的binlog日志导入数据库
    # mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 | mysql -uroot -p
    
    e、提取指定开始时间的binlog并输出到日志文件
    # mysqlbinlog --start-datetime="2014-12-15 20:15:23" /opt/data/APP01bin.000002 --result-file=extra02.sql
    
    f、提取指定位置的多个binlog日志文件
    # mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 /opt/data/APP01bin.000002|more
    
    g、提取指定数据库binlog并转换字符集到UTF8
    # mysqlbinlog --database=test --set-charset=utf8 /opt/data/APP01bin.000001 /opt/data/APP01bin.000002 >test.sql
    
    h、远程提取日志,指定结束时间
    # mysqlbinlog -urobin -p -h192.168.1.116 -P3306 --stop-datetime="2014-12-15 20:30:23" --read-from-remote-server mysql-bin.000033 |more
    
    i、远程提取使用row格式的binlog日志并输出到本地文件
    # mysqlbinlog -urobin -p -P3606 -h192.168.1.177 --read-from-remote-server -vv inst3606bin.000005 >row.sql

    4、获取mysqlbinlog的帮助信息(仅列出常用选项)

    -?, --help
       显示帮助消息并退出。

    -d, --database=name
       只列出该数据库的条目(只适用本地日志)。

    -f, --force-read
      
    使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。

    -h, --host=name
       获取给定主机上的MySQL服务器的二进制日志。

    -l, --local-load=name
       为指定目录中的LOAD DATA INFILE预处理本地临时文件。
    -o,
    --offset=#
       跳过前N个条目。

    -p, --password[=name]
       当连接服务器时使用的密码。如果使用短选项形式(-p),选项和密码之间不能有空格。
      
    如果在命令行中–password或-p选项后面没有密码值,则提示输入一个密码。

    -P, --port=#
       用于连接远程服务器的TCP/IP端口号。

    --protocol=name
       使用的连接协议。

    -R, --read-from-remote-server|--read-from-remote-master=name
      
    从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略,即连接到本地。
      
    这些选项是–host、–password、–port、–protocol、–socket和–user。

    -r, --result-file=name
       将输出指向给定的文件。

    -s, --short-form
       只显示日志中包含的语句,不显示其它信息,该方式可以缩小生成sql文件的尺寸。

    -S, --socket=name
       用于连接的套接字文件。

    --start-datetime=name
      
    从二进制日志中读取等于或晚于datetime参量的事件,datetime值相对于运行mysqlbinlog的机器上的本地时区。
      
    该值格式应符合DATETIME或TIMESTAMP数据类型。例如:2004-12-25 11:25:56 ,建议使用引号标识。

    --stop-datetime=name
      
    从二进制日志中读取小于或等于datetime的所有日志事件。关于datetime值的描述参见--start-datetime选项。

    -j, --start-position=#
      
    从二进制日志中第1个位置等于N参量时的事件开始读。
    --stop-position=#
      
    从二进制日志中第1个位置等于和大于N参量时的事件起停止读。

    --server-id=#  
       仅仅提取指定server_id的binlog日志

    --set-charset=name
       添加SET NAMES character_set到输出     
    -t,
    --to-last-log
       在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。
      
    如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求–read-from-remote-server。

    -D, --disable-log-bin
      
    禁用二进制日志。如果使用–to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。
      
    该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。

    -u, --user=name
       连接远程服务器时使用的MySQL用户名。

    -v, --verbose
       用于输出基于row模式的binlog日志,-vv为列数据类型添加注释

    -V, --version
       显示版本信息并退出。

    5、小结

    a、可以通过show binlog events以及mysqlbinlog方式来提取binlog日志。

    b、show binlog events 参数有限不适宜批量提取,mysqlbinlog可用于批量提取来建立恢复数据库的SQL。

    c、mysqlbinlog可以基于时间点,position等方式实现不完全恢复或时点恢复。

    d、mysqlbinlog可以从支持本地或远程方式提取binlog日志。

    e、mysqlbinlog可以基于server_id,以及基于数据库级别提取日志,不支持表级别。

  • 相关阅读:
    王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019【华为云技术分享】
    华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】
    【华为云实战开发】9.如何进行PHP项目的快速搭建并实现CICD?【华为云技术分享】
    Linux入侵痕迹检测方案【华为云技术分享】
    【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】
    Python如何爬取实时变化的WebSocket数据【华为云技术分享】
    遍历json
    选中文字弹出提示
    基本动画函数
    动画的基本原理
  • 原文地址:https://www.cnblogs.com/chgxtony/p/4919563.html
Copyright © 2011-2022 走看看