国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

分析MYSQL BINLOG 二進(jìn)制格式 --準(zhǔn)備工作

2024-07-24 12:31:47
字體:
供稿:網(wǎng)友
       分析MYSQL BINLOG 二進(jìn)制格式 --準(zhǔn)備工作:

一、目的
         本系列文件主要為了說明
1、為什么說row格式較statement更占空間
2、為什么說row格式的binlog更加安全
3、INSERT/UPDATE/DELETE是生成的row binlog如何直接看懂二進(jìn)制格式
4、DDL生成的binlog是怎么樣的
5、INSERT SELECT/CREATE TABLE 如何生成的row binlog
 
二、使用版本和數(shù)字顯示
      本系列文章重要解釋MYSQL 5.6后row格式的binlog格式以及和事物有關(guān)的event,按照官方的說法
      binlog的格式經(jīng)歷了幾個階段
      v1:mysql 3.23
      v3:mysql 4.0.2 到 4.1
      v4:mysql 5.0以上
      v2版本只是短暫的存在過,當(dāng)然我們要解析當(dāng)然是v4版本的binlog
因?yàn)橐词?.6以上的binlog
關(guān)于多字節(jié)的數(shù)字顯示,一般使用 Little-endian模式,做到和OS系統(tǒng)無關(guān),除非刻意說明
關(guān)于Little-endian參考:
http://blog.itpub.net/7728585/viewspace-2124159/
三、binlog的魔法數(shù)
關(guān)于MYSQL BINLOG的作用就不做過多的解析了,在binlog中存儲的是一種稱之為event的條目,
它們以二進(jìn)制的格式存儲,平時我們使用的mysqlbinlog工具也就是對這種二進(jìn)制格式的文件
進(jìn)行解析,得到直觀的輸出。這里不用mysqlbinlog而改為直接看二進(jìn)制文件,當(dāng)然我會對比
MYSQLBINLOG的輸出和二進(jìn)制解析的過程
每一個binlog文件都有4字節(jié)的魔法數(shù),其值固定為
[root@testmy mysqld.1]# hexdump -Cv test.000005
可以看到
fe 62 69 6e .bin
 
四、binlog event的總體構(gòu)架
一個event包括了
event header
event data
其中event data又分為
fixed data(posted header)
variable data
 
event header:全部的event統(tǒng)一固定的格式
fixed data(posted header):每一類event固定
variable data:就是可以變化實(shí)際值了
 
關(guān)于event的類型比較多詳細(xì)參考末尾源碼的截取
 
五、本系列文章要討論的event
而這里我們只要討論5.6,5.7中和row binlog格式和innodb
聯(lián)系比較緊密的幾種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
 
因?yàn)檫@些語句是一個事物必須經(jīng)歷的,而Format_description_log_event是一個最重要的
說明性的event
 
六、通用頭文件(event header)解析
下面先解釋一下通用的19個字節(jié)。
每一個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             
 
七、packed interger
在binlog中部分?jǐn)?shù)字使用這種方式顯示,在后面的解析中會提到
按照文檔和源碼中的說明
如果第一個字節(jié)為0-250及0X0-0XFA那么這個字節(jié)就是實(shí)際顯示的數(shù)字值
源碼的:
  if (length < (ulonglong) LL(251))
  {
    *packet=(uchar) length;
    return packet+1;
  }
如果第一個字節(jié)為252及0XFC那么后面的2個字節(jié)的值為0XFB-0XFFFF
 
點(diǎn)擊(此處)折疊或打開
 
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,
 
  /**
    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,
  
  /* 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 */

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新绛县| 霍州市| 永和县| 佛坪县| 永仁县| 新和县| 长沙县| 宝应县| 宁河县| 广昌县| 武陟县| 化隆| 怀仁县| 东宁县| 湖南省| 扶风县| 历史| 二手房| 东兴市| 阳信县| 上高县| 房产| 常德市| 德格县| 吴桥县| 防城港市| 太仓市| 霍州市| 黎城县| 焦作市| 商水县| 蓬溪县| 岚皋县| 潜山县| 双峰县| 高雄县| 剑阁县| 平顶山市| 格尔木市| 乾安县| 柘城县|