通過 mysqlbinlog 和 grep 命令定位binlog文件中指定操作

来源:https://www.cnblogs.com/xuliuzai/archive/2019/04/26/10770728.html
-Advertisement-
Play Games

1.binlog日誌基本知識 MySQL的二進位日誌binlog可以說是MySQL最重要的日誌,它記錄了所有的DDL和DML語句(除了數據查詢語句select),以事件形式記錄,還包含語句所執行的消耗的時間。 binlog有三種格式:Statement、Row以及Mixed。分別是:基於SQL語句的 ...


1.binlog日誌基本知識

MySQL的二進位日誌binlog可以說是MySQL最重要的日誌,它記錄了所有的DDL和DML語句(除了數據查詢語句select),以事件形式記錄,還包含語句所執行的消耗的時間。

binlog有三種格式:Statement、Row以及Mixed。分別是:基於SQL語句的複製(statement-based replication,SBR)、 基於行的複製(row-based replication,RBR)和混合模式複製(mixed-based replication,MBR)。

 

格式 說明 優點 缺點
Statement模式 每一條會修改數據的sql語句都會記錄到binlog中。 不需要記錄每一行的變化,減少了binlog日誌量,節約了IO,提高性能。 缺點是在某些情況下會導致master-slave中的數據不一致(如sleep()函數,last_insert_id(),以及user-defined functions(udf)等會出現問題)。
Row模式

不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什麼樣了。

而且不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確複製的問題。

新版本的MySQL中對row level模式也被做了優化,並不是所有的修改都會以row level來記錄,像遇到表結構變更的時候就會以statement模式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,那麼會記錄所有行的變更。

任何情況都可以被覆制,這對複製來說是最安全可靠的。多數情況下,從伺服器上的表如果有主鍵的話,複製就會快了很多。
複製以下幾種語句時的行鎖更少:(1)INSERT ... SELECT;(2)包含 AUTO_INCREMENT 欄位的 INSERT;(3)沒有附帶條件或者並沒有修改很多記錄的 UPDATE 或 DELETE 語句
執行INSERT,UPDATE,DELETE 語句時鎖更少。從伺服器上採用多線程來執行複製成為可能。

binlog 大了很多
複雜的回滾時 binlog 中會包含大量的數據
主伺服器上執行 UPDATE 語句時,所有發生變化的記錄都會寫到 binlog 中,這會導致頻繁發生 binlog 的併發寫問題
UDF 產生的大 BLOB 值會導致複製變慢
無法從 binlog 中看到都複製了寫什麼語句
MIXED模式 實際上就是前兩種模式的結合,在mixed模式下,mysql會根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,也就是在statement和row之間選一種。 在Mixed模式下,一般的語句修改使用statment格式保存binlog,如一些函數,statement無法完成主從複製的操作,則採用row格式保存binlog,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,也就是在Statement和Row之間選擇一種。

2.查看Row模式和Statement模式的binlog

為了加深印象,下麵我們看看兩者模式下的binlog到底長什麼樣子。

2.1 測試案例

分別在Row模式 和 Statement模式 下執行以下語句。

創建一張表

        CREATE TABLE IF NOT EXISTS `tt` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
          `name` varchar(16) NOT NULL,
          `sex` enum('m','w') NOT NULL DEFAULT 'm',
          `age` tinyint(3) unsigned NOT NULL,
          `classid` char(6) DEFAULT NULL,
          PRIMARY KEY (`id`)
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向表中insert 5筆數據

 insert into zyyshop.tt(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');

用一條SQL語句修改前兩筆數據

update tt set name ='XXX' where id in (1,2);

在Row模式下形成的binlog文件為:mysql3306_bin.000011

在Statement模式下生成的binlog文件為:mysql3306_bin.000012。

2.2 用 show binlog events in 命令去查看分析2各個文件

查詢Row模式記錄如下:

 查詢Statement模式記錄如下:

 通過這個命令查看log,兩者差距不大。

2.3 通過mysqlbinlog命令解析

執行的命令分別如下

指定路徑/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路徑/mysql_log/mysql3306_bin.000011
指定路徑/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路徑/mysql_log/mysql3306_bin.000012

我們可以看到Row模式下的binlog記錄豐富的多,例如針對update的那條語句。

Row模式記錄如下:

Statement模式記錄如下:

 

 總結:通過 show binlog events in 命令,查看 Row模式下記錄 和 Statement模式下的記錄,兩者基本一致。通過 mysqlbinlog 可以查看binlog具體的信息。Row模式下的binlog記錄比 Statement模式下豐富的多。

3. 通過 mysqlbinlog 和 grep 命令定位binlog文件中指定操作

既然binlog文件中有詳細的操作信息,如果有人誤操作,我們是否可以快速定位到對應操作信息呢?

快速定位可以幫助我們找到當時具體的操作是什麼,也可以找到POS(position)點,方便精準恢復。

例如,書接上回,我們發現表 tt 不在了,被人刪除了。ERROR 1146 (42S02): Table 'TestBinlog2.tt' doesn't exist。

那麼我們就可以在binlog查找drop相關的操作,命令如下:

指定路徑/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路徑/mysql_log/mysql3306_bin.000012 | grep drop

可惜沒有數據,這是什麼情況呢?不應該啊!!!

會不會大小寫的問題?那麼命令修改如下:

 指定路徑/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路徑/mysql_log/mysql3306_bin.000012 | grep -i drop

找到了,但是信息不是很完整,我們可不可以找到,這條命令的更信息信息呢?例如,drop 前後各10條數據。

指定路徑/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v 指定路徑/mysql_log/mysql3306_bin.000012 | grep -i  -A 10 -B 10  drop

這正是我們想要的,完美!

4. 其它知識補充

4.1 mysqlbinlog工具

此處主要講解用於查看binglog日誌的部分參數,用於還原binlog的參數在此不細講。

mysqlbinlog工具參數說明【用於查看的部分】
參數 說明
-base64-output

inlog輸出語句的base64解碼 分為三類:
預設是值auto ,僅列印base64編碼的需要的信息,如row-based 事件和事件的描述信息。
never 僅適用於不是row-based的事件
decode-rows 配合--verbose選項一起使用解碼行事件到帶註釋的偽SQL語句

--verbose 重新構建偽SQL語句的行信息輸出, -v會增加列類型的註釋信息。
--database=name 列出資料庫的名稱(僅限binlog文件存儲在本地)

 

4.2 grep 命令

grep是一個強大的文本搜索工具命令,用於查找文件中符合指定格式的字元串,支持正則表達式。

grep命令常用參數說明
參數 說明
-A 除了顯示符合條件的那一行之外,並顯示該列之後的指定行的內容內容。
-B 除了顯示符合條件的那一行之外,並顯示該列之前的指定行的內容內容。
-c 計算符合結果的行數。
-i 忽略字元大小寫
-v 反向查找
-e 按指定字元串查找
-E 按指定字元串指定的正則查找
-n 在顯示符合條件的那一行前,標識出該行的行數標號。

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

-Advertisement-
Play Games
更多相關文章
  • 下麵介紹 screen 使用的技巧教你管理遠程會話 你是不是經常需要 SSH 或者 telent 遠程登錄到 Linux 伺服器?你是不是經常為一些長時間運行的任務而頭疼,比如系統備份、 ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠程終端視窗,因為他們執行的時間太長了。必須等待它執 ...
  • VMnet1設置 VMnet8設置 /etc/sysconfig/network-scripts/ifcfg-eth0設置 Windows系統ping Linux系統IP 其他命令.我也不知道為什麼要這樣.如果以上還不能可以結合這些來 service iptables status 查看狀態 ser ...
  • 預編譯Statement優點 執行效率高 由於預編譯語句使用占位符 ”?”,在執行SQL之前語句會被先發送到Oracle伺服器進行 語法檢查和編譯 等工作,並將SQL語句加入到Oracle的 語句緩衝池 里,隨後再對SQL語句中的占位符”?”設置定值。 那麼也就說如果你要執行1000行插入的時候第一 ...
  • 在dos客戶端輸出視窗中查詢表中的數據,還有項目部署到伺服器上時前臺的頁面,中文數據都顯示成亂碼,如下圖所示: 這個問題困擾了我一天,後來解決了才發現原來我的方向錯了,一直我以為是SpringBoot項目的原因,因為之前我已經檢查過資料庫這邊的字元集問題,把所有字元集更改成utf8,包括這個char ...
  • 如果執行線上項目拷下來sqlserver的.sql的資料庫腳本文件,如果文件較大時,那麼就會報錯記憶體不足之類的。 這時可以在命令提示符使用命令來執行腳本文件。切記,執行前先改一下資料庫存放位置! 命令:osql -S . ,1433 -U sa -P 123 -i C:\Users\Cheng\De ...
  • 2.2 鏈接:mysql --host=localhost --port=3306 --user=root --password mysql -u root -p 斷開鏈接:exit / ctrl + d 可以執行以分隔符; \g \G結尾的命令,;或\g對應的輸出水平顯示,\G對應的輸出垂直顯示 ...
  • 下麵為您介紹mysql觸發器new old的相關知識,供您參考學習,如果您在mysql觸發器方面遇到過類似的問題,不妨一看,相信對您會有所幫助。 mysql觸發器new old: "NEW . column_name"或者"OLD . column_name".這樣在技術上處理(NEW | OLD ...
  • 錯誤SQL 查詢:編輯SHOWFULLFIELDSFROM`表`FROM`資料庫`;MySQL 返回:#1030 - Got error 28 from storage engine根據返回值,可以判斷應該是某掛在分區空間已滿造成。[root@websites ~]# df -lhFilesyste ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...