解析 MySQL8-x binlog 錯位了,差點裂開了!!

大家好,我是冰河~~

MySQL 是互聯網行業使用的最多的關係型數據庫之一,而且 MySQL 又是開源的,對於 MySQL 的深入研究,能夠加深我們對於數據庫原理的理解。自從開源了 mykit-data 之後,不少小夥伴試用後,反饋 mykit-data 無法正確的解析 MySQL8 的 binlog。於是我測試了下,mykit-data 在解析 MySQL5.x 的 binlog 時,沒有啥問題,能夠正確的解析出結果數據。然而,在解析 MySQL8.x 的 binlog 時,總是與 binlog 日誌位數相差 12 位而導致解析失敗。

文章已收錄到:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

問題修復

今天太晚了,我還在研究 MySQL 8.0.20 的源碼,問題的修復過程後續再寫一篇詳細的文章來與小夥伴們分享下。這裏,我就直接說我是如何解決這個問題的。

MySQL5.x binlog 的解析結果與 MySQL8.x binlog 的解析結果總是存在位數偏差,框架原本的代碼直接解析 MySQL 5.x 是沒啥問題的,在解析 MySQL 8.x 的時候出現位數錯誤。

期間,我幾乎翻閱了 MySQL 的所有官方文檔,把 mykit-data 中關於解析 binlog 日誌的功能重新寫了一遍,解析 MySQL5.x 沒問題,解析 MySQL8.x 還是錯位。

到底哪裏出了問題呢?就在對於問題的解決一籌莫展的時候,突然,想到一個思路:解決 MySQL8.x binlog 的時候不是總錯位嗎?那我就把多餘位數的 binlog 數據讀取出來,直接忽略掉,使後續 binlog 的解析操作對齊不就行了嗎?

趕緊嘗試一下,於是我在 mykit-data 框架的源碼中,添加了如下代碼。

上面代碼是對解析 MySQL binlog 位數的校驗和讀取的封裝,當讀取的 binlog 位數未達到讀取的限制位數時,一直讀取 binlog 的數據,直到讀取的 binlog 位數達到讀取的限制位數位置。具體內部的邏輯,小夥伴們可以閱讀 mykit-data 的源碼。

加上這個邏輯後,進行測試驗證,解析 MySQL 8.x 數據庫的 binlog 竟然成功了!!困擾我幾天的問題就這麼在不經意間解決了!!

從解決這個問題的結果來看,MySQL8.x 的 binlog 在本質上比 MySQL5.x 的 binlog 位數要長,中間會拼接用來分隔不同事件位的標識,我們在解析 MySQL8.x 的 binlog 日誌時,可直接忽略掉這些分隔不同事件位的標識,目的就是讓 binlog 的解析位對齊,從而能夠正確的解析出下一個事件。而這樣處理,也不會影響解析結果。

很多時候就是這樣,當你苦於解決某個問題,遲遲找不到解決方案而一籌莫展時,在某個不經意的瞬間,就會無意中解決這個棘手的問題,但前提是你需要深刻理解它的原理並嘗試各種方式和方法來解決它!

關於 mykit-data

mykit-data 是一款完全開源的數據異構中間件,支持插件化、可視化的數據異構框架,支持 MySQL 到 MySQL、MySQL 到 Oracle、Oracle 到 MySQL、Oracle 到 Oracle 的全量、實時 / 定時增量數據同步。完全的插件化、可視化操作。通過日誌最大限度的避免同步過程中的數據丟失。支持失敗重試,人工干預,支持查看同步的數據和詳細的日誌信息,目前已有 30 多家公司將 mykit-data 應用於生產環境,支撐着其核心業務數據的實時與定時同步,並經受住了高併發、大流量的考驗。

mykit-data 框架目前支持 MySQL5.x、MySQL8.x,Oracle 11g 及以上版本。後續會以插件的形式支持更多的異構數據源。

mykit-data 的開源地址如下:

GitHub:https://github.com/sunshinelyz/mykit-data

Gitee:https://gitee.com/binghe001/mykit-data

最後,小夥伴們爲這款開源項目點個 Star 呀!!

好了,今天就到這兒吧,我是冰河,大家有啥問題可以在下方留言,也可以加我微信:sun_shine_lyz,一起交流技術,一起進階,一起進大廠~~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/L26mbxZv6CrBPyMtp3O1oA