很多時候,當我們的業務資料產生了不正常的變化,但卻無法得知這類操作是在**進行,並且如何進行,單單從程式當面排查很費力。那麼就需要通過分析資料庫日誌來得到歷史執行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語句。
grep -c 2 -i "delete from audit_orga_specialtype" :通過管道命令篩選出所需sql及執行時間。
/opt/sql.log :將結果匯入到日誌檔案,方便檢視。
結果示例:
三. 解析方式對比
對於常見的資料庫(sql server 、oracle 、mysql)來說,都具有類似相同的日誌來記錄歷史sql,不同的只是日誌的記錄方式和解析方法:
| 資料庫 | sql日誌| 常見解析方式|優點|缺點|
| sql server| ldf檔案&日誌備份| apexlog|圖形化工具、操作簡單,可以自由篩選時間、表物件及對應操作|無法得到當時實際執行的sql,只有具體的行資料及操作型別。
| mysql| binlog&relaylog | mysqlbinlog|可以得到當時實際執行sql及執行時間|無法知道執行賬號及客戶端ip,如果binlog日誌較多,需要解析多次。
MySQL bin日誌解析
目錄 很多時候,當我們的業務資料產生了不正常的變化,但卻無法得知這類操作是在 進行,並且如何進行,單單從程式當面排查很費力。那麼就需要通過分析資料庫日誌來得到歷史執行sql,根據sql執行邏輯來確認 位置,進而確認是否是bug,亦或是誤操作等。binlog是mysql server層記錄的二進位制日...
mysql bin日誌檔案清理
如果你的mysql伺服器不需要做主從複製的話,建議通過修改my.cnf檔案,來設定不生成這些檔案,只要刪除my.cnf中的下面一行就可以了。log bin mysql bin 如果你需要複製,最好控制一下這些日誌檔案保留的天數,可以通過下面的配置設定日誌檔案保留的天數 expire logs day...
mysql bin許可權問題導致mysql無法啟動
mysql bin許可權問題導致mysql無法啟動 啟動mysql報錯誤,錯誤提示找不到mysql bin.000002檔案,但檢查該檔案是存在的.root host1 mysql ls mysql bin.000002 mysql bin.000002 難道是許可權問題,再次檢查 root hos...