zoukankan      html  css  js  c++  java
  • MySQL的binlog日志

    一:MySQL的4种不同日志


    • 1:error log,错误日志。

    记录了系统启动,运行以及停止过程中遇到的一些问题

    • 2:general log,普通日志

    记录了MySQL执行的所有语句以及语句开始执行的时间等信息,用户可以选择打开它

    • 3:slow log,慢日志

    记录了MySQL所有慢查询相关的信息。一般用来查询慢sql。

    • 4:binlog,二进制日志

    二进制日志则以事件event的形式记录了MySQL的库表结构以及表数据的所有变更信息

     

    二:简介


    binlog是记录了所欲数据表结构变更(例如create、alter table..)以及数据表修改(insert、update、delete...)的二进制日志。 binlog不会记录select和show这样的操作,因为这类操作对数据本身并没有修改。

    从宏观上看,binlog由一系列的binlog文件和一个index文件组成。数据库所有的变更都是以事件的形式记录在binlog文件中,index文件记录当前使用了那些binlog文件。binlog文件以一个4字节的常量作为开头(标识这是一个binlog文件),后面跟着一系列的binlog事件。对于不同的binlog格式,相同语句记录在binlog文件中的事件也有所不同。

    2.1 binlog的作用

    binlog主要有几种主要作用,恢复、复制、审计

    • 恢复(recovery):某些数据的恢复需要二进制日志。通过mysqlbinlog工具来恢复数据。
    • 复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL(slave)与一台MySQL数据(master)进行实时同步。
    • 审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击。

    除了上面介绍的几个作用外,binlog对于事务存储引擎的崩溃恢复也有非常重要的作用。在开启binlog的情况下,为了保证binlog与redo的一致性,MySQL将采用事务的两阶段提交协议。当MySQL系统发生崩溃时,事务在存储引擎内部的状态可能为prepared和commit两种。对于prepared状态的事务,是进行提交操作还是进行回滚操作,这时需要参考binlog:如果事务在binlog中存在,那么将其提交;如果不在binlog中存在,那么将其回滚,这样就保证了数据在主库和从库之间的一致性

    mysql安装在centos上

     

    三:binlog的使用


    3.1 开启binlog日志

    找到mysql的配置文件my.cnf,用vi打开, vi my.cnf 在 [mysqld] 下面加上:

    log-bin=mysql-bin
    

    然后重启mysql使配置生效

    /usr/local/mysql/bin/mysqld_safe --user=mysql &
    

    3.2 查看binlog是否开启

    登录mysql数据库,使用下面命令查看binlog是否开启:

    show variables like "log_%"; 
    
    mysql> show variables like "log_%";
    +----------------------------------------+--------------------------------+
    | Variable_name                          | Value                          |
    +----------------------------------------+--------------------------------+
    | log_bin                                | ON                             |
    | log_bin_basename                       | /var/lib/mysql/mysql-bin       |
    | log_bin_index                          | /var/lib/mysql/mysql-bin.index |
    | log_bin_trust_function_creators        | ON                             |
    | log_bin_use_v1_row_events              | OFF                            |
    | log_error                              | /var/lib/mysql/mysql_error.log |
    | log_output                             | FILE                           |
    | log_queries_not_using_indexes          | OFF                            |
    | log_slave_updates                      | OFF                            |
    | log_slow_admin_statements              | OFF                            |
    | log_slow_slave_statements              | OFF                            |
    | log_throttle_queries_not_using_indexes | 0                              |
    | log_warnings                           | 1                              |
    +----------------------------------------+--------------------------------+
    

    log_bin 为 ON ,表示已经开启

    3.2 常用binlog操作命令

    命 令
    1、show master logs; 
    查看所有binlog日志列表
    3、show master status; 
    查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
    3、flush logs; 
    刷新log日志,自此刻开始产生一个新编号的binlog日志文件;注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
    4、reset master; 
    重置(清空)所有binlog日志

     

    四:查看binlog日志内容


    4.1 使用mysqlbinlog自带查看命令

    # /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000013
            下面截取一个片段分析:
    
             ...............................................................................
             # at 552
             #131128 17:50:46 server id 1  end_log_pos 665   Query   thread_id=11    exec_time=0     error_code=0 ---->执行时间:17:50:46;pos点:665
             SET TIMESTAMP=1385632246/*!*/;
             update zyyshop.stu set name='李四' where id=4              ---->执行的SQL
             /*!*/;
             # at 665
             #131128 17:50:46 server id 1  end_log_pos 692   Xid = 1454 ---->执行时间:17:50:46;pos点:692 
             ...............................................................................
    
             注: server id 1     数据库主机的服务号;
                 end_log_pos 665 pos点
                 thread_id=11    线程号
    

    4.2:上面这种办法读取出binlog日志的全文内容较多,不容易分辨查看pos点信息,这里介绍一种更为方便的查询命令:

    mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
    
                 选项解析:
                   IN 'log_name'   指定要查询的binlog文件名(不指定就是第一个binlog文件)
                   FROM pos        指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
                   LIMIT [offset,] 偏移量(不指定就是0)
                   row_count       查询总条数(不指定就是所有行)
    
                 截取部分查询结果:
                 *************************** 20. row ***************************
                    Log_name: mysql-bin.000021  ----------------------------------------------> 查询的binlog日志文件名
                         Pos: 11197 ----------------------------------------------------------> pos起始点:
                  Event_type: Query ----------------------------------------------------------> 事件类型:Query
                   Server_id: 1 --------------------------------------------------------------> 标识是由哪台服务器执行的
                 End_log_pos: 11308 ----------------------------------------------------------> pos结束点:11308(即:下行的pos起始点)
                        Info: use `zyyshop`; INSERT INTO `team2` VALUES (0,345,'asdf8er5') ---> 执行的sql语句
                 *************************** 21. row ***************************
                    Log_name: mysql-bin.000021
                         Pos: 11308 ----------------------------------------------------------> pos起始点:11308(即:上行的pos结束点)
                  Event_type: Query
                   Server_id: 1
                 End_log_pos: 11417
                        Info: use `zyyshop`; /*!40000 ALTER TABLE `team2` ENABLE KEYS */
                 *************************** 22. row ***************************
                    Log_name: mysql-bin.000021
                         Pos: 11417
                  Event_type: Query
                   Server_id: 1
                 End_log_pos: 11510
                        Info: use `zyyshop`; DROP TABLE IF EXISTS `type`
    

    这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数;

    A.查询第一个(最早)的binlog日志:
        mysql> show binlog eventsG; 
    
    B.指定查询 mysql-bin.000021 这个文件:
        mysql> show binlog events in 'mysql-bin.000021'G;
    
    C.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起:
        mysql> show binlog events in 'mysql-bin.000021' from 8224G;
    
    D.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,查询10条
        mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 10G;
    
    E.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,偏移2行,查询10条
        mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 2,10G;




    参考: https://www.cnblogs.com/martinzhang/p/3454358.html 写的很好的一篇关于binlog文章
  • 相关阅读:
    background image position问题
    yii 验证器和验证码
    laravel 模板 blade
    tbody添加垂直滚动条
    转:jquery选择器总结
    jquery ajax传递数组给php
    jquery serialize()、serializearray()已经$.param方法
    php stdClass Object 问题
    Codeforces Round #274 (Div. 2) E. Riding in a Lift(DP)
    HTTP协议具体解释
  • 原文地址:https://www.cnblogs.com/jiujuan/p/10397362.html
Copyright © 2011-2022 走看看