美文网首页我爱编程
mysql的二进制日志

mysql的二进制日志

作者: clickdiff | 来源:发表于2018-04-11 16:39 被阅读0次

    MySQL日志文件系统的组成

    1. 错误日志:记录启动,停止MySQL时出现的问题。
    2. 通用日志:记录建立的客户端连接和执行语句。
    3. 更新日志:记录更改数据的语句。该日志在MySQL5.1中已经不宰使用。
    4. 二进制日志:记录所有更改数据的语句。还用于复制。
    5. 慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不适用索引的查询。
    6. innodb日志:innodb redo log

    缺省情况下,所有日志创建于mysqld数据目录中。
    可以通过刷新日志,来强制mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。
    当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,则日志被老化。
    对于存在MySQL复制的情形下,从复制服务器将维护更多日志文件,被称为接替日志。

    查询日志

    记录查询语句,日志存储位置:
    文件:file
    表:table (mysql.general_log)

    general_log={ON|OFF}
    general_log_file=HOSTNAME.log
    log_output={FILE|TABLE|NONE}

    慢查询日志

    慢查询:运行时间超出指定时长的查询;
    long_query_time
    存储位置:
    文件:FILE
    表:TABLE,mysql.slog_log

    log_slow_queries={ON|OFF}
    slow_query_log={ON|OFF}
    slow_query_log_file=
    log_output={FILE|TABLE|NONE}
    log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
    log_slow_rate_limit
    log_slow_verbosity

    错误日志

    记录信息:

    1. mysqld启动和关闭过程 输出的信息;
    2. mysqld运行中产生的错误信息;
    3. event scheduler运行时产生的信息;
    4. 主从复制架构中,从服务器复制线程启动时产生的日志;

    log_error=
    /var/log/mariadb/mariadb.log|OFF
    log_warnings={ON|OFF}

    二进制日志

    用于记录引起数据改变或存在引起数据改变的潜在可能性的语句(STATEMENT)或改变后的结果(ROW),也可能是二者混合;
    功用:“重放”

    binlog_format={STATEMENT|ROW|MIXED}
    STATEMENT:语句;
    ROW:行;
    MIXED:混编;

    它包含的内容及作用如下:

    • 包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)
    • 包含关于每个更新数据库(DML)的语句的执行时间信息
    • 不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能
    • 主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新
    • 用于在主复制服务器上记录所有将发送给从服务器的语句
    • 启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整。有些类似于oracle开启归档模式。

    开启二进制日志的方法及属性

    使用--log-bin[=file_name]选项或在配置文件中指定log-bin启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。

    对于未给出file_name值, 默认名为-bin后面所跟的主机名。

    在未指定绝对路径的情形下,缺省位置保存在数据目录下。

    每个二进制日志名会添加一个数字扩展名用于日志老化,因此不支持自定义的扩展名,会被mysql数字扩展名动态替换。

    若当前的日志大小达到max_binlog_size,则自动创建新的二进制日志。

    对于大的事务,二进制日志会超过max_binlog_size设定的值。也即是事务仅仅写入一个二进制日志。 由是可知,二进制日志文件大小接近,其size不是完全相等,这点不同于oracle。

    二进制日志文件会有一个对应二进制日志索引文件,该文件包含所有的二进制日志,其文件名与二进制日志相同,扩展名为.index

    二进制索引文件通过--log-bin-index[=file_name]选项来指定

    RESET MASTER语句将删除所有二进制日志文件,这将影响到从库。也可以用PURGE MASTER LOGS只删除部分二进制文件。

    查看二进制日志文件列表:
    SHOW MASTER|BINARY LOGS;

    查看当前正在使用的二进制日志文件:
    SHOW MASTER STATUS;

    查看二进制 日志文件中的事件:
    SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

    二进制文件的构成:
    两类文件
    日志文件:mysql-bin.文件名后缀 二进制格式
    索引文件:mysql-bin.index 文本格式

    服务器变量:
    log_bin=/PATH/TO/BIN_LOG_FILE 记录文件路径
    只读变量;
    session.sql_log_bin={ON|OFF}
    控制某会话中的“写”操作语句是否会被记录于日志文件中;
    max_binlog_size=1073741824
    sync_binlog={1|0}
    binlog_format=

    mysqlbinlog:
    YYYY-MM-DD hh:mm:ss

    --start-datetime=
    --stop-datetime=

    -j, --start-position=#
    --stop-position=#

    --user, --host, --password

    二进制日志事件格式:
    基于语句记录:statement
    基于行记录:row
    混合模式:mixed,让系统自行判定该基于哪种方式进行

    # at 553
    #160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0
    SET TIMESTAMP=1472608568/!/;
    BEGIN
    /*!*/;

    事件的起始位置:# at 553
    事件发生的日期时间:#160831 9:56:08
    事件发生的服务器id:ser ver id 1
    事件的结束位置:end_log_pos 624
    事件的类型:Query
    事件发生时所在服务器执行此事件的线程的ID: thread_id=2
    语句的时间戳与将其写入二进制日志文件中的时间差:exec_time=0
    错误代码:error_code=0
    事件内容:SET TIMESTAMP=1472608568/!/;

    二进制日志相关演示

    启动日志

    查看环境

    MariaDB [(none)]> show variables like '%version%'
            -> ;
        +-------------------------+---------------------+
        | Variable_name           | Value               |
        +-------------------------+---------------------+
        | innodb_version          | 5.5.52-MariaDB-38.3 |
        | protocol_version        | 10                  |
        | slave_type_conversions  |                     |
        | version                 | 5.5.56-MariaDB      |
        | version_comment         | MariaDB Server      |
        | version_compile_machine | x86_64              |
        | version_compile_os      | Linux               |
        +-------------------------+---------------------+
        7 rows in set (0.01 sec)
        
        MariaDB [(none)]> show variables like '%log_bin%';
        +---------------------------------+-------+
        | Variable_name                   | Value |
        +---------------------------------+-------+
        | log_bin                         | OFF   |--该参数用于设定是否启用二进制日志 
        | log_bin_trust_function_creators | OFF   |
        | sql_log_bin                     | ON    |
        +---------------------------------+-------+
        3 rows in set (0.01 sec)
    

    binary log相关参数

        MariaDB [(none)]> show variables like '%binlog%';
        +-----------------------------------------+----------------------+
        | Variable_name                           | Value                |
        +-----------------------------------------+----------------------+
        | binlog_annotate_row_events              | OFF                  |
        | binlog_cache_size                       | 32768                |
        | binlog_checksum                         | NONE                 |
        | binlog_direct_non_transactional_updates | OFF                  |
        | binlog_format                           | STATEMENT            |
        | binlog_optimize_thread_scheduling       | ON                   |
        | 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                    |
        +-----------------------------------------+----------------------+
        12 rows in set (0.01 sec)
    

    当前mysql服务器数据文件的缺省位置

        MariaDB [(none)]> show variables like '%datadir%';
        +---------------+-----------------+
        | Variable_name | Value           |
        +---------------+-----------------+
        | datadir       | /var/lib/mysql/ |
        +---------------+-----------------+
        1 row in set (0.00 sec)
    

    编辑my.cnf来设定binary log日志位置(注,配置二进制日志路径及文件名后,系统变量log_bin被自动置为on)
    在编辑配置文件时要把服务停止

    [mysqld]
    log_bin=/var/log/maria/mariadb.log/binarylog/binlog
    
    [root@localhost ~]# mkdir -p /var/log/maria/mariadb.log/binarylog
    [root@localhost ~]# chown -R mysql:mysql  /var/log/maria/mariadb.log/binarylog
    

    切换日志

    MariaDB [(none)]> system ls -hltr /var/log/mariadb/binarylog/*
    -rw-rw----. 1 mysql mysql 245 Oct 12 22:55 /var/log/mariadb/binarylog/binlog.000001      #日志文件
    -rw-rw----. 1 mysql mysql  41 Oct 12 22:55 /var/log/mariadb/binarylog/binlog.index     #索引文件
    

    相关文章

      网友评论

        本文标题:mysql的二进制日志

        本文链接:https://www.haomeiwen.com/subject/kkenyxtx.html