1. 程式人生 > >MySQL bin日誌解析

MySQL bin日誌解析

目錄

很多時候,當我們的業務資料產生了不正常的變化,但卻無法得知這類操作是在哪裡進行,並且如何進行,單單從程式當面排查很費力。那麼就需要通過分析資料庫日誌來得到歷史執行SQL,根據SQL執行邏輯來確認程式碼位置,進而確認是否是BUG,亦或是誤操作等。

一. BinLog簡介

BinLog 是MySQL Server層記錄的二進位制日誌檔案,用於記錄MySQL的資料更新或者潛在更新(比如DELETE語句執行刪除而實際並沒有符合條件的資料),select或show等不會修改資料的操作不會記錄在binlog中。

BinLog檔案是我們得到歷史執行SQL的基礎,但是僅僅只能得到歷史的DML&DDL操作,而不能得到查詢操作。

二. mysqlbinlog 工具

由於BinLog是二進位制檔案,所以無法直接使用文字開啟。所以需要通過mysqlbinlog解析二進位制檔案後才可讀。

由於windows下面無法使用管道命令如此簡潔的提取出SQL,所以這邊就只寫Linux下的使用方法。我平時的做法會將windows下面的binlog拷貝到Linux下,再利用Linux的管道命令解析。

Linux下常見使用命令:

mysqlbinlog /data/mysql_data/bin.000008 --database test --base64-output=decode-rows -vv --skip-gtids=true |grep -C 2 -i "delete from Audit_Orga_Specialtype" > /opt/sql.log

  • /data/mysql_data/bin.000008:需要解析的binlog日誌。
  • database :只列出該資料庫的SQL。
  • base64-output=decode-rows -vv :顯示具體SQL語句。
  • skip-gtids=true :忽略GTID相關顯示。
  • grep -C 2 -i "delete from Audit_Orga_Specialtype" :通過管道命令篩選出所需SQL及執行時間。
  • /opt/sql.log :將結果匯入到日誌檔案,方便檢視。

結果示例:


三. 解析方式對比

對於常見的資料庫(SQL Server 、Oracle 、MySQL

)來說,都具有類似相同的日誌來記錄歷史SQL,不同的只是日誌的記錄方式和解析方法:

資料庫 SQL日誌 常見解析方式 優點
SQL Server LDF檔案&日誌備份 ApexLog 圖形化工具、操作簡單,可以自由篩選時間、表物件及對應操作
Oracle 線上日誌&歸檔日誌 LogMiner 可以得到當時實際執行SQL及對應賬號、客戶端IP
MySQL BinLog&RelayLog mysqlbinlog 可以得到當時實際執行SQL及執行時間