mysql binlog 常识

匿名 (未验证) 提交于 2019-12-02 22:06:11

   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事件类和类型

在内部,服务器使用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 */  };

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

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

1)先执行

 
flush logs;

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


解析:

  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;


解析:

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

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


3)dml操作 插入

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



解析:

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

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

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


4)dml update

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


dml的event顺序:



转载请标明出处:mysql binlog 常识
文章来源: mysql binlog 常识
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!