有關binlog的那點事(二)(mysql5.7.13)

来源:http://www.cnblogs.com/onlyac/archive/2016/11/08/6043595.html
-Advertisement-
Play Games

上次,我們僅僅把binlog做了一個概述,並沒有去深入探索(1)binlog file究竟是怎麼構成的?(2)binlog file的單元binlog events是怎麼構成的?(3)我們能不能偽造出一個mysqlbinlog識別的binlog file? 當然,第三個問題看起來很cool,蠻有挑戰 ...


上次,我們僅僅把binlog做了一個概述,並沒有去深入探索(1)binlog file究竟是怎麼構成的?(2)binlog file的單元binlog events是怎麼構成的?(3)我們能不能偽造出一個mysqlbinlog識別的binlog file? 當然,第三個問題看起來很cool,蠻有挑戰性的。

這次我們討論的是第4版本的binlogfile, 一般5.0.x以上的mysql使用該版本的binlogfile。

首先回答第一個問題

一、binlog file的構成

(1)binlog file的大致構成

這個問題其實之前也回答過,但是很不深入。這次,我會深度探索它,首先我們扒一扒官方的說法;

http://dev.mysql.com/doc/internals/en/binlog-file.html

這塊就說了一句話:binlog file是由binlog file header和binlog events構成的,至於binlog file header其實就是0xfe62696e。換言之,binlog file先寫了個0xfe62696e,然後後面跟著許多binlog event 。官方的文檔還是很給力的,我們可以打開任意一個binlog file,以16進位形式打開,開頭就是0xfe62696e。

(2)binlog events的組織方式

許多binlog event是否存在著自己的組織方式呢?答案是肯定的,跟在binlog file header後面的一般先是Binlog::FORMAT_DESCRIPTION_EVENT,這是第4版本的binlog event的開頭,這個會在本文的"二、binlog events的構成"中詳細提到。

緊接著一般是事務性的binlog events,要強調的是,在binlog file里所有的update, delete, insert語句都是存在於一組事務性的binlog event。

事務性的binlog events的格式如下(SQL代表任一SQL語句,當然一般只包含select,update, delete, insert語句,不包括ddl語句):

sql語句形式 statement格式   row格式
/ Anonymous_gtid_event     Anonymous_gtid_event    
BEGIN      Query_event(BEGIN)  Query_event(BEGIN) 
SQL Query_event(SQL)    Table_map_event & Rows_event      
SQL Query_event(SQL)     Table_map_event & Rows_event
...... ...... ......
COMMIT                      Xid_event   Xid_event 

 

 

 

 

 

至於mixed格式就是statement格式 和row格式交替出現,三種格式的不同也就在這個上面,至於上面看到的binlog events的格式,我們將在本文的"二、binlog events的構成"中詳細提到。

最後會以STOP_EVENT或者ROTATE_EVENT結尾,這兩個也會在本文的"二、binlog events的構成"中詳細提到。

其他的一些binlog event不是特別重要,有興趣的可以通過

http://dev.mysql.com/doc/internals/en/binlog-event.html去瞭解

 二、binlog event的構成

 (1)binlog event的構成

binlog event分為四部分:common header, post header, body以及footor,翻譯能力有限,不知道怎麼翻譯,但是只要明白就好,common header和footor是共有的,而post header, body則是每個event都獨有的。

common header 一般包含下麵幾個

名稱 格式 描述
when 4位元組整形 事件發生的時間,從1970年開始到現在的秒數
type_code 1位元組整形 binglog event的類型
unmasked_server_id 4位元組整形 伺服器id
data_written 4位元組整形 binglog event的長度,即common header的長度 + post header的長度 + body的長度+4
log_pos 4位元組整形 下一個binglog event在文件中的位置
flags 2位元組整形 binglog 的版本號

 

 

 

 

 

footor則包含一個crc32校驗碼,它的格式是4位元組的整形。

(2)重要的binlog event的構成

1)FORMAT_DESCRIPTION_EVENT

參考自http://dev.mysql.com/doc/internals/en/format-description-event.html

body:

名稱 格式 描述
binlog-version 2位元組整形 binlog的版本,一般為4
mysql-server version 50位元組字元串 mysql資料庫的版本
create timestamp 4位元組整形 創建時間
event header length 1位元組整形 common header的長度,一般為19
event type header lengths EOF型字元串 各種binlog event的post header的長度

 

 

 

 

2)Xid_event

參考自http://dev.mysql.com/doc/internals/en/xid-event.html

body:

名稱 格式 描述
XID 8位元組整形 提交的事務id

 

 

3) Anonymous_gtid_event

沒有可以參考的網站

post header:

名稱 格式 描述
commit flag 1位元組整形 是否提交,1代表提交,0代表沒有提交
ENCODED SID 16位元組整形 一般為0
ENCODED GNO 8位元組整形 一般為0
TS_TYPE 1位元組整形 一般為2

 

 

 

 

body:

名稱 格式 描述
last_committed 8位元組整形 上一次提交的序列號
sequence_number 8位元組整形 本次的序列號

 

 

4)STOP_EVENT

參考自http://dev.mysql.com/doc/internals/en/stop-event.html

沒有post header和body

5)ROTATE_EVENT

參考自http://dev.mysql.com/doc/internals/en/rotate-event.html

post header:

名稱 格式 描述
position 8位元組整形 下一個binlog event的位置

 

 

body:

名稱 格式 描述
name of the next binlog 字元串 下一個binlog event所在的文件名

 

 

6)Table_map_event 

參考自http://dev.mysql.com/doc/internals/en/table-map-event.html

post header

名稱 格式 描述
table id 4位元組整形 表id,在mysql資料庫中每個表都有一個唯一的id標識
flgas 2位元組整形 當前保留,為以後使用

 

 

body:

名稱 格式 描述
schema name length 1位元組整形 資料庫名長度
schema name NULL字元串 資料庫名
table name length 1位元組整形 表名長度
table name NULL字元串 表名
column-count 可變的整形 列數量
column-def 字元串 描述每列的數據類型
column-meta-def 字元串 描述每列的元數據
NULL-bitmask 字元串 描述每列的是不是可以為空

 

 

 

 

 

 

7)ROWS_EVENT

參考自http://dev.mysql.com/doc/internals/en/rows-event.html

post header

名稱 格式 描述
table id 4位元組整形 表id,在mysql資料庫中每個表都有一個唯一的id標識
flgas 2位元組整形 當前保留,為以後使用

 

 

body

名稱 格式 描述
var_header_len 4位元組整形 表的列數
columns_before_image 字元串 被使用列的比特值,例如,表有3列,只有第1列和第3列被使用,則該值為0xfa,只有第1列和第2列被使用,則該值為0xfc
columns_after_image 字元串 僅用於update命令,即更新後的情況是在這裡獲取的,delete和insert都沒有該項
row 字元串

string.var_len nul-bitmap, length (bits set in 'columns-present-bitmap1'+7)/8
string.var_len value of each field as defined in table-map
這裡的包含每一個行,每一行含有 nul-bitmap代表已使用的列是否為null,然後緊接著是數據value of each field as defined in table-map

 

 

 

 

 

 

 

8) QUERY_EVENT

參考自http://dev.mysql.com/doc/internals/en/query-event.html

post header

名稱 格式 描述
slave_proxy_id 4位元組整形 從機代理id
execution time 4位元組整形 執行時間
schema length 1位元組整形 資料庫名長度
error-code 2位元組整形 錯誤碼
status-vars length 2位元組整形 狀態長度

 

 

 

 

body

名稱 格式 描述
status-vars 字元串 執行sql語句的mysql的環境變數
schema NULL字元串 資料庫名
query EOF字元串 SQL語句

 

 

 

三、偽造的binlog文件

現在通過上面的介紹,我們已經能偽造我們的binlog文件,只不過我們只能偽造statement格式下的binlog,因為row模式下的binlog是需要sql執行時的真實數據的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要: 1.閂鎖就像是記憶體上的鎖,隨著越來越多的線程參與進來,他們爭相訪問同一塊記憶體,導致堵塞。2.自旋鎖就是閂鎖,不同之處是如果訪問的記憶體不可用,它將繼續檢查輪詢一段時間。3.拴鎖和自旋鎖是我們無法控制的,由sqlserver自動維護,但是我們應積極尋找避免他們發生堵塞的方法。4。id作為聚集索引 ...
  • 1 瞭解oracle SQL profile如何工作; 2 為什麼需要SQL profile; ...
  • 介紹 上篇文章介紹了MMM架構的實現方法,但是上篇文章的MMM方案的複製是非同步複製,非同步複製的主要問題在於當主從存在延時時如果主機出現了故障導致了主從切換時這時將會存在數據丟失;mysql為瞭解決非同步複製數據丟失的問題增加了半同步複製,半同步複製存在5.5以上的版本,半同步複製的原理是客戶端在事務提 ...
  • 先自我介紹一下,本人某財經大學應屆本科,專業經濟統計,現就職於某打車軟體公司做一名數據分析師。開通博客是因為我認為作為一名半技術人員,還是需要有一個技術博客的,技術博客有利於記錄下最近的工作和學習所得,不會讓自己忙著工作卻不知道自己在忙什麼。 再來說說我對數據分析的理解,數據分析其實範圍很廣,小到提 ...
  • PowerDesigner版本:15.2.0 步驟如下: 1.打開PowerDesigner軟體如下圖: 2.選擇:File->Reverse Engineer->Database... ,如下圖所示: 3.彈出如下圖所示框,設置你的模型(Model Name),根據實際選擇DBMS,我選擇的是My ...
  • 最近用到了 InfluxDB,在此記錄下學習過程,同時也希望能夠幫助到其他學習的同學。 本文主要介紹InfluxDB的功能特點以及influxDB的安裝過程。更多InfluxDB詳細教程請看:InfluxDB系列學習教程目錄 一、InfluxDB 簡介 InfluxDB 是用Go語言編寫的一個開源分 ...
  • select *,if(sva=1,"男","女") as ssva from taname where sva<>"" 12.2. 控制流程函數CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...
  • 1.greenplum資料庫安裝前期準備工作 1.1 安裝Linux l 記憶體:最小1GB,推薦2GB或以上。 l 交換空間: 記憶體大小是1-2GB時,交換空間是記憶體的1.5倍,記憶體大小2-16GB時,交換空間等於記憶體大小,記憶體大小16G以上時,交換空間為16GB。 l 需要選擇以下組件:GNOME ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...