MySQL bin日誌解析
阿新 • • 發佈:2018-11-15
目錄
很多時候,當我們的業務資料產生了不正常的變化,但卻無法得知這類操作是在哪裡進行,並且如何進行,單單從程式當面排查很費力。那麼就需要通過分析資料庫日誌來得到歷史執行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 Server | LDF檔案&日誌備份 | ApexLog | 圖形化工具、操作簡單,可以自由篩選時間、表物件及對應操作 |
Oracle | 線上日誌&歸檔日誌 | LogMiner | 可以得到當時實際執行SQL及對應賬號、客戶端IP |
MySQL | BinLog&RelayLog | mysqlbinlog | 可以得到當時實際執行SQL及執行時間 |