日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

intvar mysql_mysql binlog格式解析(一)

發布時間:2024/1/23 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 intvar mysql_mysql binlog格式解析(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該樓層疑似違規已被系統折疊?隱藏此樓查看此樓

參考源:

1、源碼log_event.h log_event.cc pack.c

2、internals-en.epub

一、目的

本系列文件主要為了說明

1、為什么說row格式較statement更占空間

2、為什么說row格式的binlog更加安全

3、INSERT/UPDATE/DELETE是生成的row binlog如何直接看懂二進制格式

4、DDL生成的binlog是怎么樣的

5、INSERT SELECT/CREATE TABLE 如何生成的row binlog

二、使用版本和數字顯示

本系列文章重要解釋MYSQL 5.6后row格式的binlog格式以及和事物有關的event,按照官方的說法

binlog的格式經歷了幾個階段

v1:mysql 3.23

v3:mysql 4.0.2 到 4.1

v4:mysql 5.0以上

v2版本只是短暫的存在過,當然我們要解析當然是v4版本的binlog

因為要看是5.6以上的binlog

關于多字節的數字顯示,一般使用 Little-endian模式,做到和OS系統無關,除非刻意說明

關于Little-endian參考:

http://blog.itpub.net/7728585/viewspace-2124159/

三、binlog的魔法數

關于MYSQL BINLOG的作用就不做過多的解析了,在binlog中存儲的是一種稱之為event的條目,

它們以二進制的格式存儲,平時我們使用的mysqlbinlog工具也就是對這種二進制格式的文件

進行解析,得到直觀的輸出。這里不用mysqlbinlog而改為直接看二進制文件,當然我會對比

MYSQLBINLOG的輸出和二進制解析的過程

每一個binlog文件都有4字節的魔法數,其值固定為

[root@testmy mysqld.1]# hexdump -Cv test.000005

可以看到

fe 62 69 6e .bin

四、binlog event的總體構架

一個event包括了

event header

event data

其中event data又分為

fixed data(posted header)

variable data

event header:全部的event統一固定的格式

fixed data(posted header):每一類event固定

variable data:就是可以變化實際值了

關于event的類型比較多詳細參考末尾源碼的截取

五、本系列文章要討論的event

而這里我們只要討論5.6,5.7中和row binlog格式和innodb

聯系比較緊密的幾種event如下:

query_log_event/QUERY_EVENT typecode=02

Format_description_log_event/FORMAT_DESCRIPTION_EVENT typecode=15

Xid_log_event/XID_EVENT typecode=16

Table_map_log_event/TABLE_MAP_EVENT typecode=19

Write_rows_log_event/WRITE_ROW_EVENT typecode=30

Update_rows_log_event/UPDATE_ROW_EVENT typecode=31

Delele_rows_log_event/DELETE_ROW_EVENT typecode=32

因為這些語句是一個事物必須經歷的,而Format_description_log_event是一個最重要的

說明性的event

六、通用頭文件(event header)解析

下面先解釋一下通用的19個字節。

每一個event有一個固定的頭信息叫做event header:

event header

timestamp 0:4

type_code 4:1

server_id 5:4

event_length 9:4

next_position 13:4

flags 17:2

timestamp:固定4字節展示是新紀元(epoch time)以來的秒數

type_code:固定1字節event事件的編碼,在源碼中是一個enum類型負載最后源碼處

server_id:固定4字節就是 show variables like '%server_id';出來的值

event_length:固定4字節整個event的長度,包含固定和非固定長度

next_position:固定4字節下一個event的開始位置(2^32為4G)

flags:固定2字節 event flags

LOG_EVENT_BINLOG_IN_USE_F 0x1 這個flags表示是否binlog正確的關閉了,這個標示只出現在Format_description_log_event中

LOG_EVENT_THREAD_SPECIFIC_F 0x4 是否查詢基于了臨時表,如果基于了臨時表MYSQLBINLOG必須設置 @@PSEUDO_THREAD_ID=xx

LOG_EVENT_SUPPRESS_USE_F 0x8 和--binlog-do-db 、 --replicated-do-db有關

其他還有很多

LOG_EVENT_ARTIFICIAL_F 0x20 LOG_EVENT_RELAY_LOG_F 0x40 LOG_EVENT_IGNORABLE_F 0x80 LOG_EVENT_NO_FILTER_F 0x100 。。。

可以自行參考log_event.h源碼頭文件中的詳細解釋

七、packed interger

在binlog中部分數字使用這種方式顯示,在后面的解析中會提到

按照文檔和源碼中的說明

如果第一個字節為0-250及0X0-0XFA那么這個字節就是實際顯示的數字值

源碼的:

if (length < (ulonglong) LL(251))

{

*packet=(uchar) length;

return packet+1;

}

如果第一個字節為252及0XFC那么后面的2個字節的值為0XFB-0XFFFF

源碼的:

if (length < (ulonglong) LL(65536))

{

*packet++=252;

int2store(packet,(uint) length);

return packet+2;

}

如果第一個字節為253及0XFD那么后面的3個字節的值為0XFFFF-0XFFFFFF

源碼的:

if (length < (ulonglong) LL(16777216))

{

*packet++=253;

int3store(packet,(ulong) length);

return packet+3;

}

如果第一個字節為254及0XFE那么后面的8個字節的值為0XFFFFFF-0XFFFFFFFFFFFFFFFF

*packet++=254;

int8store(packet,length);

可以自行參考源碼接口,函數返回值為一個下一個位置的指針

uchar *net_store_length(uchar *packet, ulonglong length)

點擊(此處)折疊或打開

enum Log_event_type

{

/**

Every time you update this enum (when you add a type), you have to

fix Format_description_event::Format_description_event().

*/

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 is like LOAD_EVENT except that it has a longer

sql_ex, allowing multibyte TERMINATED BY etc; both types share the

same class (Load_event)

*/

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,

/**

The PRE_GA event numbers were used for 5.1.0 to 5.1.15 and are

therefore obsolete.

*/

PRE_GA_WRITE_ROWS_EVENT = 20,

PRE_GA_UPDATE_ROWS_EVENT = 21,

PRE_GA_DELETE_ROWS_EVENT = 22,

/**

The V1 event numbers are used from 5.1.16 until mysql-trunk-xx

*/

WRITE_ROWS_EVENT_V1 = 23,

UPDATE_ROWS_EVENT_V1 = 24,

DELETE_ROWS_EVENT_V1 = 25,

/**

Something out of the ordinary happened on the master

*/

INCIDENT_EVENT= 26,

/**

Heartbeat event to be send by master at its idle time

to ensure master's online status to slave

*/

HEARTBEAT_LOG_EVENT= 27,

/**

In some situations, it is necessary to send over ignorable

data to the slave: data that a slave can handle in case there

is code for handling it, but which can be ignored if it is not

recognized.

*/

IGNORABLE_LOG_EVENT= 28,

ROWS_QUERY_LOG_EVENT= 29,

/** Version 2 of the Row events */

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,

TRANSACTION_CONTEXT_EVENT= 36,

VIEW_CHANGE_EVENT= 37,

/* Prepared XA transaction terminal event similar to Xid */

XA_PREPARE_LOG_EVENT= 38,

/**

Add new events here - right above this

Existing events (except ENUM_END_EVENT) should never change their numbers

*/

ENUM_END_EVENT /* end marker */

};

總結

以上是生活随笔為你收集整理的intvar mysql_mysql binlog格式解析(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。