1、常用命令

1.查看所有binlog日志列表
      mysql> show master logs;

    2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
      mysql> show master status;

    3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
      mysql> flush logs;
      注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

    4.重置(清空)所有binlog日志
      mysql> reset master;
5、查看二进制日志是否已开启
show variables like 'log_%';
6、查看某个binlog日志内容
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       查询总条数(不指定就是所有行)
7、读取binlog日志,分析问题


 


show binlog events in 'mysql-bin.000023';

 

选项解析:
               IN 'log_name'   指定要查询的binlog文件名(不指定就是第一个binlog文件)
               FROM pos        指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
               LIMIT [offset,] 偏移量(不指定就是0)
               row_count       查询总条数(不指定就是所有行)

 

2、mysql官网参考--binlog event

 

MySQL内部手册  /  二进制日志  /事件类和类型

20.5事件类和类型

20.5.1事件类考古笔记

在内部,服务器使用C ++类来表示二进制日志事件。原型在log_event.h。这些类的方法代码在log_event.cc

Log_event是基类。其他更具体的事件子类从它派生。类型代码与子类相关联,因为类实例内容被写入二进制或中继日志,或通过网络从主服务器发送到从服务器。在这些上下文中,事件只是一个字节序列,而不是一个类结构,所以需要一个类型代码来允许从字节序列中识别事件类型。

事件字节序列具有标题部分和数据部分。类型代码出现在每个事件的标题部分。

Log_event_type枚举 中列出了可能的事件类型代码 :

enum Log_event_type { 
  UNKNOWN_EVENT= 0, 
  START_EVENT_V3= 1, 
  QUERY_EVENT= 2, 
  STOP_EVENT= 3, 
  ROTATE_EVENT= 4, 
  INTVAR_EVENT= 5, 
  LOAD_EVENT= 6, 
  SLAVE_EVENT= 7, 
  CREATE_FILE_EVENT= 8, 
  APPEND_BLOCK_EVENT= 9, 
  EXEC_LOAD_EVENT= 10, 
  DELETE_FILE_EVENT= 11, 
  NEW_LOAD_EVENT= 12, 
  RAND_EVENT= 13, 
  USER_VAR_EVENT= 14, 
  FORMAT_DESCRIPTION_EVENT= 15, 
  XID_EVENT= 16, 
  BEGIN_LOAD_QUERY_EVENT= 17, 
  EXECUTE_LOAD_QUERY_EVENT= 18, 
  TABLE_MAP_EVENT = 19, 
  PRE_GA_WRITE_ROWS_EVENT = 20, 
  PRE_GA_UPDATE_ROWS_EVENT = 21, 
  PRE_GA_DELETE_ROWS_EVENT = 22, 
  WRITE_ROWS_EVENT = 23, 
  UPDATE_ROWS_EVENT = 24, 
  DELETE_ROWS_EVENT = 25, 
  INCIDENT_EVENT= 26, 
  HEARTBEAT_LOG_EVENT= 27, 
  IGNORABLE_LOG_EVENT= 28,
  ROWS_QUERY_LOG_EVENT= 29,
  WRITE_ROWS_EVENT = 30,
  UPDATE_ROWS_EVENT = 31,
  DELETE_ROWS_EVENT = 32,
  GTID_LOG_EVENT= 33,
  ANONYMOUS_GTID_LOG_EVENT= 34,
  PREVIOUS_GTIDS_LOG_EVENT= 35, 
  ENUM_END_EVENT 
  /* end marker */ 
};
enum Log_event_type { 
  UNKNOWN_EVENT= 0, 
  START_EVENT_V3= 1, 
  QUERY_EVENT= 2, 
  STOP_EVENT= 3, 
  ROTATE_EVENT= 4, 
  INTVAR_EVENT= 5, 
  LOAD_EVENT= 6, 
  SLAVE_EVENT= 7, 
  CREATE_FILE_EVENT= 8, 
  APPEND_BLOCK_EVENT= 9, 
  EXEC_LOAD_EVENT= 10, 
  DELETE_FILE_EVENT= 11, 
  NEW_LOAD_EVENT= 12, 
  RAND_EVENT= 13, 
  USER_VAR_EVENT= 14, 
  FORMAT_DESCRIPTION_EVENT= 15, 
  XID_EVENT= 16, 
  BEGIN_LOAD_QUERY_EVENT= 17, 
  EXECUTE_LOAD_QUERY_EVENT= 18, 
  TABLE_MAP_EVENT = 19, 
  PRE_GA_WRITE_ROWS_EVENT = 20, 
  PRE_GA_UPDATE_ROWS_EVENT = 21, 
  PRE_GA_DELETE_ROWS_EVENT = 22, 
  WRITE_ROWS_EVENT = 23, 
  UPDATE_ROWS_EVENT = 24, 
  DELETE_ROWS_EVENT = 25, 
  INCIDENT_EVENT= 26, 
  HEARTBEAT_LOG_EVENT= 27, 
  IGNORABLE_LOG_EVENT= 28,
  ROWS_QUERY_LOG_EVENT= 29,
  WRITE_ROWS_EVENT = 30,
  UPDATE_ROWS_EVENT = 31,
  DELETE_ROWS_EVENT = 32,
  GTID_LOG_EVENT= 33,
  ANONYMOUS_GTID_LOG_EVENT= 34,
  PREVIOUS_GTIDS_LOG_EVENT= 35, 
  ENUM_END_EVENT 
  /* end marker */ 
};

INTVAR_EVENT类型在Int_event_type枚举中列出了“子类型” :

enum Int_event_type { 
  INVALID_INT_EVENT = LAST_INSERT_ID_EVENT = INSERT_ID_EVENT = 2 
};
enum Int_event_type { 
  INVALID_INT_EVENT = LAST_INSERT_ID_EVENT = INSERT_ID_EVENT = 2 
};

下表总结了事件类和类型代码之间的关系。Log_event除非另有说明,否则每个类都来源于 。可以看出,在大多数情况下,事件类与单一类型代码相关联,但有一些例外:

  • 某些类不与任何类型代码关联,因为它们仅用作派生子类的基类,或者因为它们从不写入二进制文件或中继日志或从主机发送到从机。例如, Log_event没有类型代码,因为它仅用作基类。
  • 一个类可能与多个类型代码相关联: Load_log_event可能包含一个类型代码LOAD_EVENT或 NEW_LOAD_EVENT

类型代码

 

 

Log_event

  • 大多数其他类的基类

 

 

 

Muted_query_log_event

  • 在5.0.23中添加
  • 在6.0.4中删除

 

 

 

Rows_log_event

  • 在5.1.5中添加
  • 基础类 Write_rows_log_event, Update_rows_log_event, Delete_rows_log_event

 

 

 

Old_rows_log_event

  • 在5.1.22中添加
  • 基础类 Write_rows_log_event_old, Update_rows_log_event_old, Delete_rows_log_event_old

 

0

UNKNOWN_EVENT

Unknown_log_event

1

START_EVENT_V3

Start_log_event_v3

  • 在5.0.0中 重命名为 START_EVENT/Start_log_event
  • 基础类 Format_description_log_event

 

2

QUERY_EVENT

Query_log_event

  • 基础类 Execute_load_query_log_event

 

3

STOP_EVENT

Stop_log_event

4

ROTATE_EVENT

Rotate_log_event

INTVAR_EVENT

Intvar_log_event

6

LOAD_EVENT

Load_log_event

  • 基础类 Create_file_log_event

 

7

SLAVE_EVENT

Slave_log_event

  • 在4.0.0中添加

 

8

CREATE_FILE_EVENT

Create_file_log_event

  • 在4.0.0中添加
  • 派生自 Load_log_event

 

9

APPEND_BLOCK_EVENT

Append_block_log_event

  • 在4.0.0中添加
  • 基础类 Begin_load_query_log_event

 

10

EXEC_LOAD_EVENT

Execute_load_log_event

  • 在4.0.0中添加

 

11

DELETE_FILE_EVENT

Delete_file_log_event

  • 在4.0.0中添加

 

12

NEW_LOAD_EVENT

Load_log_event

  • 在4.0.0中添加

 

13

RAND_EVENT

Rand_log_event

  • 在4.0.5中添加

 

14

USER_VAR_EVENT

User_var_log_event

  • 在4.1.0中添加

 

15

FORMAT_DESCRIPTION_EVENT

Format_description_log_event

  • 在5.0.0中添加
  • 派生自 Start_log_event_v3

 

16

XID_EVENT

Xid_log_event

  • 在5.0.3中添加

 

17

BEGIN_LOAD_QUERY_EVENT

Begin_load_query_log_event

  • 在5.0.3中添加
  • 派生自 Append_block_log_event

 

18

EXECUTE_LOAD_QUERY_EVENT

Execute_load_query_log_event

  • 在5.0.3中添加
  • 派生自 Query_log_event

 

19

TABLE_MAP_EVENT

Table_map_log_event

  • 在5.1.5中添加

 

20

PRE_GA_WRITE_ROWS_EVENT

Write_rows_log_event_old

  • 在5.1.5中添加为 WRITE_ROWS_EVENTWrite_rows_log_event 和派生自Rows_log_event
  • 在5.1.18中重命名为 PRE_GA_WRITE_ROWS_EVENTWrite_rows_log_event_old 和派生自 Write_rows_log_event
  • 截至5.1.22,衍生自 Old_rows_log_event

 

21

PRE_GA_UPDATE_ROWS_EVENT

Update_rows_log_event_old

  • 在5.1.5中添加为 UPDATE_ROWS_EVENTUpdate_rows_log_event 和派生自Rows_log_event
  • 在5.1.18中重命名为 PRE_GA_UPDATE_ROWS_EVENTUpdate_rows_log_event_old 和派生自 Update_rows_log_event
  • 截至5.1.22,衍生自 Old_rows_log_event

 

22

PRE_GA_DELETE_ROWS_EVENT

Delete_rows_log_event_old

  • 在5.1.5中添加为 DELETE_ROWS_EVENTDelete_rows_log_event 和派生自Rows_log_event
  • 在5.1.18中重命名为 PRE_GA_DELETE_ROWS_EVENTDelete_rows_log_event_old 和派生自 Delete_rows_log_event
  • 截至5.1.22,衍生自 Old_rows_log_event

 

23

WRITE_ROWS_EVENT

Write_rows_log_event

  • 派生自 Rows_log_event
  • 重新编号为5.1.18,从20到23

 

24

UPDATE_ROWS_EVENT

Update_rows_log_event

  • 派生自 Rows_log_event
  • 重新编号为5.1.18,从21到24

 

25

DELETE_ROWS_EVENT

Delete_rows_log_event

  • 派生自 Rows_log_event
  • 重新编号为5.1.18,从22到25

 

26

INCIDENT_EVENT

Incident_log_event

  • 在5.1.18中添加

 

27

HEARTBEAT_LOG_EVENT

Heartbeat_log_event

  • 在6.0.5中添加

 

 

3、mysql binlog event 组成 

https://dev.mysql.com/doc/internals/en/binary-log-versions.html

https://dev.mysql.com/doc/internals/en/row-based-binary-logging.html

https://dev.mysql.com/doc/internals/en/event-classes-and-types.html

https://dev.mysql.com/doc/internals/en/event-header-fields.html

https://dev.mysql.com/doc/internals/en/event-meanings.html

https://dev.mysql.com/doc/internals/en/event-data-for-specific-event-types.html

参考事件查询https://dev.mysql.com/doc/internals/en/event-meanings.html

 日常数据的dml ,mysql到底会有哪些event那?先来试验下。

1)先执行

flush logs;

刷新log日志,自此刻开始产生一个新编号的binlog日志文件;注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

mysql自动刷新 mysql刷新binlog_mysql

解析:

  FORMAT_DESCRIPTION_EVENT:binlog文件的第一个event,记录版本号等元数据信息,该事件只会在binlog中出现一次。它通常指定了MySQL Server的版本,binlog的版本,该binlog文件的创建时间。

 previous_gtids是开启GTID模式后,每个binlog开头都会有一个PREVIOUS_GTIDS_LOG_EVENT事件,它的值是上一个binlog的PREVIOUS_GTIDS_LOG_EVENT+GTID_LOG_EVENT,实际上,在数据库重启的时候,需要重新填充gtid_executed的值,该值即是最新一个binlog的PREVIOUS_GTIDS_LOG_EVENT+GTID_LOG_EVENT。(通俗点讲,就是数据库)

 

 

2)执行创建表

CREATE TABLE `create_test` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `mark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

mysql自动刷新 mysql刷新binlog_mysql自动刷新_02

 

解析:

·)anonymous_gtid:mysql为每个事物都分配了id

2)ddl以query为结尾标志,QUERY_EVENT以文本的形式来记录事务的操作。事物开始时的标志。

 

dml insert

INSERT INTO `test`.`create_test` (`id`, `name`, `phone`, `mark`) VALUES ('1', '2', '3', '4');

mysql自动刷新 mysql刷新binlog_html_03

解析:

   3)table_map记录的是表的元数据信息,例如库名、表名、字段类型等信息。

4) WRITE_ROWS_EVENT/DELETE_ROWS_EVENT/UPDATE_ROWS_EVENT: row模式下记录对应行数据变化的记录

5)xid 生成用于修改支持XA的存储引擎的一个或多个表的事务。正常事务是通过发送一个 QUERY_EVENT包含一个 BEGIN语句和一个 QUERY_EVENT包含 COMMIT语句(或者一个ROLLBACK语句,如果该事务被回滚)来实现的。

 

4)dml update

UPDATE  create_test SET name="fsfs" where id=1

mysql自动刷新 mysql刷新binlog_mysql自动刷新_04

dml的even最终结果顺序:

mysql自动刷新 mysql刷新binlog_mysql自动刷新_05