MySQLbinlog日誌04binlog日誌位元組碼解析之二Write_Rows事件

来源:https://www.cnblogs.com/coe2coe/archive/2018/09/22/9690708.html
-Advertisement-
Play Games

本系列博客主要介紹MySQL資料庫的binlog日誌的相關內容,這個系列的主題包括: MySQLbinlog日誌01binlog日誌基本操作 MySQLbinlog日誌02binlog日誌用於數據恢復 MySQLbinlog日誌03binlog日誌位元組碼解析 MySQLbinlog日誌04binlo ...


本系列博客主要介紹MySQL資料庫的binlog日誌的相關內容,這個系列的主題包括:

MySQLbinlog日誌01binlog日誌基本操作

MySQLbinlog日誌02binlog日誌用於數據恢復

MySQLbinlog日誌03binlog日誌位元組碼解析

MySQLbinlog日誌04binlog日誌位元組碼解析之二Write_Rows事件

 

前一篇博客介紹了 

MySQLbinlog日誌03binlog日誌位元組碼解析

本篇博客將接著介紹Write Rows事件的位元組碼解析。

 

7.Write rows事件

現在來解析insert語句對應的核心binlog事件:Write rows事件。這個事件用於insert/update語句產生的增加和修改行數據的記錄。每個Write rows事件只涉及對一行數據的增加或者修改,儘管這個事件的名字用了複數形式。

 

對應的位元組碼數據如下所示:

common header的內容如下:

時間戳:

 

欄位

位元組碼

時間戳

8191a35b

2018-09-20 20:24:33 

事件類型

1e

30

MySQL server-id

65000000

101

本事件的長度

3b000000

59

下一個事件的開始位置

5e140000

5214

標誌

0000

0

 

 

 

Write rows事件的事件相關頭結構格式還是從源代碼註釋中找到的,總體結構如下:

 

 

各個條目細分後的具體含義如下:

條目

長度

事件

偏移

備註

id

6

0

 

標誌

2

6

 

var_header_len

2

8

 

附加行數據

 

 

取決於var_header_len的值

列的個數

2

8

Npacked integer

列標誌

變長

 

INT((N + 7) / 8,每個列1bit

操作前列數據標誌

變長

 

定位行數據用到的列:INSERT/DELETE

操作後列數據標誌

變長

 

修改後的列:UPDATE,本例中沒這部分。

行數據

變長

 

是否為NULL標誌+1的值+2的值+...

 

 

 

Write rows事件自身的位元組碼數據如下:

id6個位元組,值為120

標誌占2個位元組,值為1

var_header_len2個位元組,值為2位元組。包含了自身的長度以及附加行數據的長度。因此這個事件中沒有附加行數據。

接著是列的個數,這個整數的編碼規則比較複雜。下麵這個代碼用於讀取這樣的列的個數的位元組碼。具體代碼如下所示:

這個事件中第1個位元組為06,因此列的數量就是6個列,僅僅占用1個位元組。

接著是操作前的行記錄用到的列的標誌。對於INSERT語句而言,不包含這一部分。對於UPDATE/DELETE而言,就是mysqlbinlog輸出的WHERE中用到哪些列。因此具體格式在操作後的部分進行描述。

接著是操作後的行記錄用到的列的標誌。長度是(6+7)/8=1個位元組,值為ff,只有6個二進位位有效。可以看到這個6個欄位都被使用到了。這1個位元組僅僅是標誌位,不是實際的列數據。對於INSERT語句而言,就是新增的記錄數據中包含哪些列。對於UPDATE而言,就是SET中用到哪些列。

最後是真正的行記錄的列數據。因為在common header中已經知道了整個事件的長度,而此時前面這些部分的長度也已經確定了,那麼列數據的長度也可以計算出來。實際上就是分析到此時的偏移量開始,到事件結束位置的前1位元組為止的這個範圍內的位元組碼。

列數據具體是怎麼存儲的,稍後介紹。

行數據先經過pack_row()函數進行組裝後才寫入到binlog文件中。pack_row()函數的代碼經過精簡後如下所示:

 

先存儲NULL標記,即值為NULL的列標記,每個列用一個位來表示其後的值是否為NULL

t1表只有6個列,因此這裡值為NULL的列只可能占用1個位元組。當前事件中這個值為0xc0

最後6位全部是0,這6個列當前的值全部不為NULL

 

接著依次存儲每個值不是NULL的列的具體數據。

每一種類型的列都有對應的pack()函數。前面已經知道了t1表的6個列中,第2列(name)是varchar之外,其它列都是intint類型的列在MySQL源代碼中定義為Field_long類。

功能主要就是這個32位整數存儲為Big endian格式的位元組碼,占用4個位元組。

varchar類型的列對應的類是Field_varstring

 

對於varstring,先存儲字元串的長度,再存儲實際的字元串。整數類型的列的存儲方式和前面介紹的各種長度的存儲方式是類似的,都可以認為是big-endian格式,而這裡的字元串長度,是按照little-endian格式存儲的。小於255位元組,存儲為1個位元組,否則存儲為2個位元組。

 

現在來解析這個Write rows事件中包含的列的值,即行記錄的具體數據。

 

 

 

位元組碼

NULL標記

c0

11000000.6列的值均不為NULL

1

0200 0000

INT2

2

024132

VARSTRINGA2

3

1500 0000

INT:21

4

1600 0000

INT:22

5

1700 0000

INT:23

6

1800 0000

INT:24

 

這個結果與使用mysqlbinlog提取的結果是一致的:

 

最後面4個位元組是這個binlog事件的校驗碼。

至此,INSERT語句對應的Write row事件的位元組碼解析完畢。UPDATEDELETE語句對應的binlog事件的位元組碼解析方式跟這個非常類似,就不再贅述了。

 MySQL資料庫binlog系列博客就是這些內容了。

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 一.用戶組 前面章節知道用戶賬戶在控制單個用戶安全性方面很好,但涉及到共用資源或把用戶類型分組時,組概念就出來了。 組許可權允許多個用戶對系統中的對象(比如文件,目錄,設備等)共用一組共用的許可權。 在centos中創建一個用戶會為該用戶單獨創建一個組,這樣可以更安全一些。 1.1 /etc/group ...
  • 菜鳥一枚,也是接觸linux系統沒多長時間,前一陣子網上說有一個高級資料庫工程師,因為rm -rf / 命令幹掉了資料庫-(nb),居然還跑路了!厲害了我的哥!也是閑的我蛋疼,在虛擬機里試了一批,本來沒啥事情滴,哈爾皮地少敲了一個字母,幹掉了根目錄,mmp.... 還好做了快照,嘿嘿....... ...
  • 系統鏈接:https://pan.baidu.com/s/1T5FdJf1jhTj78vEBYCXxyA 密碼:rl7m 1、製作系統盤(下載文件中有教程),插好U盤,重啟電腦 2、按F2進入BOSS,在彈出界面中選擇YES 3、進入BOOT界面,第一個opinion選擇U盤,保存退出 4、按照步 ...
  • 文章轉載至:http://tech.ccidnet.com/art/2583/20071030/1258885_1.html 如果你對SUID、SGID仍有迷惑可以好好參考一下! Copyright by kevintz. 由於用戶在UNIX下經常會遇到SUID、SGID的概念,而且SUID和SGI ...
  • linux系統中的設備驅動是否安裝好一般檢查幾個方面:1、系統日誌。嵌入式系統多是直接dmesg一下,看有沒有設備關鍵字相關的出錯信息(通用系統可檢查/var/log/messages文件)。2、已載入的模塊。檢查模塊載入列表中有沒有相關設備的模塊。lsmod3、設備列表。檢查已載入的設備中有沒有相 ...
  • 由於之前想看看.class文件中的內容是否是“0101”二進位,選擇了用記事本打開,並忘記取消勾選“始終使用選擇的程式打開這種文件(A)”,導致電腦上所有.class結尾的文件圖標和打開方式都變成了記事本,雖然好像沒什麼影響,但是經不住自己有強迫症。非要把.class文件還原成之前的狀態。用上一篇文 ...
  • Zookeeper作為一個分散式協調系統提供了一項基本服務: 分散式鎖服務 ,分散式鎖是分散式協調技術實現的核心內容。像配置管理、任務分發、組服務、分散式消息隊列、分散式通知/協調等,這些應用實際上都是基於這項基礎服務由用戶自己摸索出來的。 1.Zookeeper在大數據系統中的常見應用 zooke ...
  • 剛接觸數據倉庫是在我的第一份實習工作——數據中心數據管理系統開發,它是一個B/S架構的應用,與一般的項目不同的是,系統是以數據倉庫來進行數據存取的,這是我第一次聽說數倉這個詞,感覺它龐大而且神秘,不知道從何入手,對數據倉庫有一種敬畏之心,後來經過慢慢的學習和使用,發現其實它在應用開發中的使用方法跟傳... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...