超級有用的15個mysqlbinlog命令


在MySQL或MariaDB中,任意時間對數據庫所做的修改,都會被記錄到日志文件中。例如,當你添加了一個新的表,或者更新了一條數據,這些事件都會被存儲到二進制日志文件中。二進制日志文件在MySQL主從復合中是非常有用的,主服務器會發送其數據到遠程服務器中。

 

當你需要恢復MySQL時,也會需要使用到二進制日志文件。

mysqlbinlog 命令,以用戶可視的方式展示出二進制日志中的內容。同時,也可以將其中的內容讀取出來,供其他MySQL實用程序使用。

在此示例中,我們將會涉及以下內容:

  • 獲取當前二進制日志列表
  • mysqlbinlog默認行為
  • 獲取特定數據庫條目
  • 禁止恢復過程產生日志
  • 在輸出中控制base-64 BINLOG
  • mysqlbinlog輸出調試信息
  • 跳過前N個條目
  • 保存輸出到文件
  • 從一個特定位置提取條目
  • 將條目截止到一個特定的位置
  • 刷新日志以清除Binlog輸出
  • 在輸出中只顯示語句
  • 查看特定開始時間的條目
  • 查看特定結束時間的條目
  • 從遠程服務器獲取二進制日志

1 獲取當前二進制日志列表

在mysql中執行以下命令,即可查看二進制日志文件的列表。


如果熊沒有開啟此功能,則會顯示:


二進制日志文件默認會存放在 /var/lib/mysql 目錄下

 

2 mysqlbinlog 默認行為

下面將以一種用戶友好的格式顯示指定的二進制日志文件(例如:mysqld.000001)的內容。


mysqlbinlog默認會顯示為以下內容:


上面的命令將會顯示出,在該系統上數據庫發生的所有改變事件。

3 獲取特定數據庫條目

默認情況下,mysqlbinlog會顯示所有的內容,太過於雜亂。使用 -d 選項,可以指定一個數據庫名稱,將只顯示在該數據庫上所發生的事件。

 


也可以使用 --database 命令,效果相同。

 

4 禁止恢復過程產生日志

在使用二進制日志文件進行數據庫恢復時,該過程中也會產生日志文件,就會進入一個循環狀態,繼續恢復該過程中的數據。因此,當使用mysqlbinlog命令時,要禁用二進制日志,請使用下面所示的-D選項:


也可以使用 --disable-log-bin 命令,效果相同。


備注:在輸出中,當指定-D選項時,將看到輸出中的第二行。也就是SQL_LOG_BIN=0

 

當使用-to-last-log選項時,這個選項也會有所幫助。另外,請記住,該命令需要root權限來執行。

5 在輸出中控制base-64 BINLOG

使用base64-output選項,可以控制輸出語句何時是輸出base64編碼的BINLOG語句。以下是base64輸出設置的可能值:

 

  • never
  • always
  • decode-rows
  • auto(默認)

never:當指定如下所示的“never”時,它將在輸出中顯示base64編碼的BINLOG語句。


將不會有任何與下面類似的行,它具有base64編碼的BINLOG。


always:當指定“always”選項時,只要有可能,它將只顯示BINLOG項。因此,只有在專門調試一些問題時才使用它。


下面是“always”的輸出,它只顯示了BINLOG項。


decode-rows:這個選項將把基於行的事件解碼成一個SQL語句,特別是當指定-verbose選項時,如下所示。


auto:這是默認選項。當沒有指定任何base64解碼選項時,它將使用auto。在這種情況下,mysqlbinlog將僅為某些事件類型打印BINLOG項,例如基於行的事件和格式描述事件。

 

6 mysqlbinlog輸出調試信息

下面的調試選項,在完成處理給定的二進制日志文件之后,將檢查文件打開和內存使用。


如下所示,在完成處理給定的二進制日志文件之后,下面的調試信息選項將顯示額外的調試信息。

 

7 跳過前N個條目

除了讀取整個mysql二進制日志文件外,也可以通過指定偏移量來讀取它的特定部分。可以使用 -o 選項。o代表偏移。

 

下面將跳過指定的mysql bin日志中的前10個條目。


為了確保它正常工作,給偏移量提供一個巨大的數字,將看不到任何條目。下面的內容將從日志中跳過10,000個條目(事件)。


在本例中,由於這個特定的日志文件沒有10,000個條目,所以在輸出中沒有顯示任何數據庫事件。

8 保存輸出到文件

也可以使用簡單的Linux重定向命令,將輸出存儲到一個文件中,如下所示。


或者也可以使用 -r (結果文件)選項,如下所示,將輸出存儲到一個文件中。


 備注:還可以使用 -server-id 指定mysql服務器,確保是由給定服務器id的mysql服務器所生成的日志。

 

9 從一個特定位置提取條目

通常在mysql二進制日志文件中,你將看到如下所示的位置號。下面是mysqlbinlog的部分輸出,你可以看到“15028”是一個位置編號。


下面的命令將從位置編號為15028的二進制日志條目處開始讀取。


當在命令行中指定多個二進制日志文件時,開始位置選項將僅應用於給定列表中的第一個二進制日志文件。還可以使用 -H 選項來獲得給定的二進制日志文件的十六進制轉儲,如下所示。

 

 

10 將條目截止到一個特定的位置

就像前面的例子一樣,你也可以從mysql二進制日志中截止到一個特定位置的條目,如下所示。


上面的示例將在15028的位置上停止binlog。當在命令行中指定多個二進制日志文件時,停止位置將僅應用於給定列表中的最后一個二進制日志文件。

11 刷新日志以清除Binlog輸出

當二進制日志文件沒有被正確地關閉時,將在輸出中看到一個警告消息,如下所示。


如下所示,報告中提示binlog文件沒有正確地關閉。


當看到這個提示時,需要連接到mysql並刷新日志,如下所示。


刷新日志之后,再次執行mysqlbinlog命令,將不會看到在mysqlbinlog輸出中binlog未正確關閉的警告消息。

12 在輸出中只顯示語句

默認情況下,正如在前面的示例輸出中看到的一樣,除了SQL語句之外,在mysqlbinlog輸出中還會有一些附加信息。如果只想查看常規的SQL語句,而不需要其他內容,那么可以使用 -s 選項,如下所示。

 

也可以使用 --short-form 選項,效果相同。

 

下面是上述命令的部分輸出。在這里,它將只顯示來自給定二進制日志文件的SQL語句。

 

 

不會顯示像下面這樣的條目:

 

 

13 查看特定開始時間的條目

下面將只提取從指定時間開始的條目。在此之前的任何條目都將被忽略。

 

 

當你想要從一個二進制文件中提取數據時,這是非常有用的,因為你希望使用它來恢復或重構在某個時間段內發生的某些數據庫活動。時間戳的格式可以是MySQL服務器所理解的DATETIME和timestamp中的任何類型。

 

14 查看特定結束時間的條目

與前面的開始時間示例一樣,這里也可以指定結束時間,如下所示。


上面的命令將讀取到給定結束時間的條目。任何來自於超過給定結束時間的mysql二進制日志文件的條目都不會被處理。

15 從遠程服務器獲取二進制日志

在本地機器上,還可以讀取位於遠程服務器上的mysql二進制日志文件。為此,需要指定遠程服務器的ip地址、用戶名和密碼,如下所示。

 

此處使用-R選項。-R選項與-read-from-remote-server相同。


在上面命令中:

 

  • -R 選項指示mysqlbinlog命令從遠程服務器讀取日志文件
  • -h 指定遠程服務器的ip地址
  • -p 將提示輸入密碼。默認情況下,它將使用“root”作為用戶名。也可以使用 -u 選項指定用戶名。
  • mysqld-bin.000001 這是在這里讀到的遠程服務器的二進制日志文件的名稱。

下面命令與上面的命令完全相同:


如果只指定 -h 選項,將會得到下面的錯誤消息。


當你在遠程數據庫上沒有足夠的特權時,將得到以下“不允許連接”錯誤消息。在這種情況下,確保在遠程數據庫上為本地客戶機授予適當的特權。


如果沒有使用 -p 選項指定正確的密碼,那么將得到以下“訪問拒絕”錯誤消息。


下面的示例顯示,還可以使用-u選項指定mysqlbinlog應該用於連接到遠程MySQL數據庫的用戶名。請注意,這個用戶是mysql用戶(不是Linux服務器用戶)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM