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文章
原文地址:https://www.cnblogs.com/jiujuan/p/10397362.html