在MySQL或MariaDB中,任意時間對資料庫所做的修改,都會被記錄到日志檔案中。例如,當你添加了一個新的表,或者更新了一條資料,這些事件都會被存儲到二進制日志檔案中。二進制日志檔案在MySQL主從複合中是非常有用的,主伺服器會發送其資料到遠端伺服器中。
當你需要恢複MySQL時,也會需要使用到二進制日志檔案。
mysqlbinlog 指令,以使用者可視的方式展示出二進制日志中的内容。同時,也可以将其中的内容讀取出來,供其他MySQL實用程式使用。
在此示例中,我們将會涉及以下内容:
- 擷取目前二進制日志清單
- mysqlbinlog預設行為
- 擷取特定資料庫條目
- 禁止恢複過程産生日志
- 在輸出中控制base-64 BINLOG
- mysqlbinlog輸出調試資訊
- 跳過前N個條目
- 儲存輸出到檔案
- 從一個特定位置提取條目
- 将條目截止到一個特定的位置
- 重新整理日志以清除Binlog輸出
- 在輸出中隻顯示語句
- 檢視特定開始時間的條目
- 檢視特定結束時間的條目
- 從遠端伺服器擷取二進制日志
1 擷取目前二進制日志清單
在mysql中執行以下指令,即可檢視二進制日志檔案的清單。
1 2 3 4 5 6 7 8 | mysql> SHOW BINARY LOGS; +----------------------+----------+ | Log_name | File_size | +--------------------------+------------+ | mysqld-bin.000001 | 15740 | | mysqld-bin.000002 | 3319 | .. |
如果熊沒有開啟此功能,則會顯示:
ERROR 1381 (HY000): You are not using binary logging |
二進制日志檔案預設會存放在 /var/lib/mysql 目錄下
$ ls -l /var/lib/mysql/ -rw-rw----. 1 mysql mysql 15740 Aug 28 14:57 mysqld-bin.000001 -rw-rw----. 1 mysql mysql 3319 Aug 28 14:57 mysqld-bin.000002 |
2 mysqlbinlog 預設行為
下面将以一種使用者友好的格式顯示指定的二進制日志檔案(例如:mysqld.000001)的内容。
$ mysqlbinlog mysqld-bin.000001 |
mysqlbinlog預設會顯示為以下内容:
9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /*!40019 SET @@session.max_insert_delayed_threads=0*/;/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/;# at 4#170726 14:57:37 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.73-log created 170726 14:57:37 at startup# Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/; # at 106 #170726 14:59:31 server id 1 end_log_pos 182 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1501095571/*!*/; SET @@session.pseudo_thread_id=2/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C latin1 *//*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; .. # at 14191 #170726 15:20:38 server id 1 end_log_pos 14311 Query thread_id=4 exec_time=0 error_code=0SET TIMESTAMP=1501096838/*!*/; insert into salary(name,dept) values('Ritu', 'Accounting')/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE* |
上面的指令将會顯示出,在該系統上資料庫發生的所有改變事件。
3 擷取特定資料庫條目
預設情況下,mysqlbinlog會顯示所有的内容,太過于雜亂。使用 -d 選項,可以指定一個資料庫名稱,将隻顯示在該資料庫上所發生的事件。
$ mysqlbinlog -d crm mysqld-bin.000001 > crm-events.txt |
也可以使用 --database 指令,效果相同。
$ mysqlbinlog -database crm mysqld-bin.000001 > crm-events.txt |
4 禁止恢複過程産生日志
在使用二進制日志檔案進行資料庫恢複時,該過程中也會産生日志檔案,就會進入一個循環狀态,繼續恢複該過程中的資料。是以,當使用mysqlbinlog指令時,要禁用二進制日志,請使用下面所示的-D選項:
$ mysqlbinlog -D mysqld-bin.000001 |
也可以使用 --disable-log-bin 指令,效果相同。
$ mysqlbinlog --disable-log-bin mysqld-bin.000001 |
備注:在輸出中,當指定-D選項時,将看到輸出中的第二行。也就是SQL_LOG_BIN=0
/*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!32316 SET @OLD_SQL_LOG_BIN=@@SQL_LOG_BIN, SQL_LOG_BIN=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; |
當使用-to-last-log選項時,這個選項也會有所幫助。另外,請記住,該指令需要root權限來執行。
5 在輸出中控制base-64 BINLOG
使用base64-output選項,可以控制輸出語句何時是輸出base64編碼的BINLOG語句。以下是base64輸出設定的可能值:
- never
- always
- decode-rows
- auto(預設)
never:當指定如下所示的“never”時,它将在輸出中顯示base64編碼的BINLOG語句。
$ mysqlbinlog --base64-output=never mysqld-bin.000001 |
将不會有任何與下面類似的行,它具有base64編碼的BINLOG。
BINLOG ' IeZ4WQ8BAAAAZgAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC |
always:當指定“always”選項時,隻要有可能,它将隻顯示BINLOG項。是以,隻有在專門調試一些問題時才使用它。
$ mysqlbinlog --base64-output=always mysqld-bin.000001 |
下面是“always”的輸出,它隻顯示了BINLOG項。
#170726 14:59:31 server id 1 end_log_pos 182 BINLOG ' k+Z4WQIBAAAATAAAALYAAAAIAAIAAAAAAAAADAAAGgAAAEAAAAEAAAAAAAAAAAYDc3RkBAgACAAI AHRoZWdlZWtzdHVmZgBCRUdJTg== '/*!*/; # at 182 #170726 14:59:30 server id 1 end_log_pos 291 BINLOG ' kuZ4WQIBAAAAbQAAACMBAAAAAAIAAAAAAAAADAAAGgAAAEAAAAEAAAAAAAAAAAYDc3RkBAgACAAI AHRoZWdlZWtzdHVmZgBJTlNFUlQgSU5UTyB0IFZBTFVFUygxLCAnYXBwbGUnLCBOVUxMKQ== '/*!*/; # at 291 #170726 14:59:30 server id 1 end_log_pos 422 BINLOG ' kuZ4WQIBAAAAgwAAAKYBAAAAAAIAAAAAAAAADAAAGgAAAEAAAAEAAAAAAAAAAAYDc3RkBAgACAAI AHRoZWdlZWtzdHVmZgBVUERBVEUgdCBTRVQgbmFtZSA9ICdwZWFyJywgZGF0ZSA9ICcyMDA5LTAx LTAxJyBXSEVSRSBpZCA9IDE= |
decode-rows:這個選項将把基于行的事件解碼成一個SQL語句,特别是當指定-verbose選項時,如下所示。
$ mysqlbinlog --base64-output=decode-rows --verbose mysqld-bin.000001 |
auto:這是預設選項。當沒有指定任何base64解碼選項時,它将使用auto。在這種情況下,mysqlbinlog将僅為某些事件類型列印BINLOG項,例如基于行的事件和格式描述事件。
$ mysqlbinlog --base64-output=auto mysqld-bin.000001 |
6 mysqlbinlog輸出調試資訊
下面的調試選項,在完成處理給定的二進制日志檔案之後,将檢查檔案打開和記憶體使用。
$ mysqlbinlog --debug-check mysqld-bin.000001 |
如下所示,在完成處理給定的二進制日志檔案之後,下面的調試資訊選項将顯示額外的調試資訊。
$ mysqlbinlog --debug-info mysqld-bin.000001 > /tmp/m.di User time 0.00, System time 0.00 Maximum resident set size 2848, Integral resident set size 0 Non-physical pagefaults 863, Physical pagefaults 0, Swaps 0 Blocks in 0 out 48, Messages in 0 out 0, Signals 0 Voluntary context switches 1, Involuntary context switches 2 |
7 跳過前N個條目
除了讀取整個mysql二進制日志檔案外,也可以通過指定偏移量來讀取它的特定部分。可以使用 -o 選項。o代表偏移。
下面将跳過指定的mysql bin日志中的前10個條目。
$ mysqlbinlog -o 10 mysqld-bin.000001 |
為了確定它正常工作,給偏移量提供一個巨大的數字,将看不到任何條目。下面的内容将從日志中跳過10,000個條目(事件)。
$ mysqlbinlog -o 10000 mysqld-bin.000001 /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; .. .. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; |
在本例中,由于這個特定的日志檔案沒有10,000個條目,是以在輸出中沒有顯示任何資料庫事件。
8 儲存輸出到檔案
也可以使用簡單的Linux重定向指令,将輸出存儲到一個檔案中,如下所示。
$ mysqlbinlog mysqld-bin.000001 > output.log |
或者也可以使用 -r (結果檔案)選項,如下所示,将輸出存儲到一個檔案中。
$ mysqlbinlog -r output.log mysqld-bin.000001 |
備注:還可以使用 -server-id 指定mysql伺服器,確定是由給定伺服器id的mysql伺服器所生成的日志。
$ mysqlbinlog --server-id=1 -r output.log mysqld-bin.000001 |
9 從一個特定位置提取條目
通常在mysql二進制日志檔案中,你将看到如下所示的位置号。下面是mysqlbinlog的部分輸出,你可以看到“15028”是一個位置編号。
#170726 15:38:14 server id 1 end_log_pos 15028 Query thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1501097894/*!*/; insert into salary values(400,'Nisha','Marketing',9500) /*!*/; # at 15028 #170726 15:38:14 server id 1 end_log_pos 15146 Query thread_id=5 exec_time=0 error_code=0 insert into salary values(500,'Randy','Technology',6000) |
下面的指令将從位置編号為15028的二進制日志條目處開始讀取。
$ mysqlbinlog -j 15028 mysqld-bin.000001 > from-15028.out |
當在指令行中指定多個二進制日志檔案時,開始位置選項将僅應用于給定清單中的第一個二進制日志檔案。還可以使用 -H 選項來獲得給定的二進制日志檔案的十六進制轉儲,如下所示。
$ mysqlbinlog -H mysqld-bin.000001 > binlog-hex-dump.out |
10 将條目截止到一個特定的位置
就像前面的例子一樣,你也可以從mysql二進制日志中截止到一個特定位置的條目,如下所示。
$ mysqlbinlog --stop-position=15028 mysqld-bin.000001 > upto-15028.out |
上面的示例将在15028的位置上停止binlog。當在指令行中指定多個二進制日志檔案時,停止位置将僅應用于給定清單中的最後一個二進制日志檔案。
11 重新整理日志以清除Binlog輸出
當二進制日志檔案沒有被正确地關閉時,将在輸出中看到一個警告消息,如下所示。
$ mysqlbinlog mysqld-bin.000001 > output.out |
如下所示,報告中提示binlog檔案沒有正确地關閉。
# head output.log .. .. # Warning: this binlog is either in use or was not closed properly. .. .. BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC |
當看到這個提示時,需要連接配接到mysql并重新整理日志,如下所示。
mysql> flush logs; |
重新整理日志之後,再次執行mysqlbinlog指令,将不會看到在mysqlbinlog輸出中binlog未正确關閉的警告消息。
12 在輸出中隻顯示語句
預設情況下,正如在前面的示例輸出中看到的一樣,除了SQL語句之外,在mysqlbinlog輸出中還會有一些附加資訊。如果隻想檢視正常的SQL語句,而不需要其他内容,那麼可以使用 -s 選項,如下所示。
也可以使用 --short-form 選項,效果相同。
$ mysqlbinlog -s mysqld-bin.000001 $ mysqlbinlog --short-form mysqld-bin.000001 |
下面是上述指令的部分輸出。在這裡,它将隻顯示來自給定二進制日志檔案的SQL語句。
SET TIMESTAMP=1501096106/*!*/; insert into employee values(400,'Nisha','Marketing',9500)/*!*/; insert into employee values(500,'Randy','Technology',6000) |
不會顯示像下面這樣的條目:
# at 1201 #170726 15:08:26 server id 1 end_log_pos 1329 Query thread_id=3 exec_time=0 error_code=0 |
13 檢視特定開始時間的條目
下面将隻提取從指定時間開始的條目。在此之前的任何條目都将被忽略。
$ mysqlbinlog --start-datetime="2017-08-16 10:00:00" mysqld-bin.000001 |
當你想要從一個二進制檔案中提取資料時,這是非常有用的,因為你希望使用它來恢複或重構在某個時間段内發生的某些資料庫活動。時間戳的格式可以是MySQL伺服器所了解的DATETIME和timestamp中的任何類型。
14 檢視特定結束時間的條目
與前面的開始時間示例一樣,這裡也可以指定結束時間,如下所示。
$ mysqlbinlog --stop-datetime="2017-08-16 15:00:00" mysqld-bin.000001 |
上面的指令将讀取到給定結束時間的條目。任何來自于超過給定結束時間的mysql二進制日志檔案的條目都不會被處理。
15 從遠端伺服器擷取二進制日志
在本地機器上,還可以讀取位于遠端伺服器上的mysql二進制日志檔案。為此,需要指定遠端伺服器的ip位址、使用者名和密碼,如下所示。
此處使用-R選項。-R選項與-read-from-remote-server相同。
$ mysqlbinlog -R -h 192.168.101.2 -p mysqld-bin.000001 |
在上面指令中:
- -R 選項訓示mysqlbinlog指令從遠端伺服器讀取日志檔案
- -h 指定遠端伺服器的ip位址
- -p 将提示輸入密碼。預設情況下,它将使用“root”作為使用者名。也可以使用 -u 選項指定使用者名。
- mysqld-bin.000001 這是在這裡讀到的遠端伺服器的二進制日志檔案的名稱。
下面指令與上面的指令完全相同:
$ mysqlbinlog --read-from-remote-server --host=192.168.101.2 -p mysqld-bin.000001 |
如果隻指定 -h 選項,将會得到下面的錯誤消息。
$ mysqlbinlog -h 192.168.101.2 mysqld-bin.000001 mysqlbinlog: File 'mysqld-bin.000001' not found (Errcode: 2) |
當你在遠端資料庫上沒有足夠的特權時,将得到以下“不允許連接配接”錯誤消息。在這種情況下,確定在遠端資料庫上為本地客戶機授予适當的特權。
$ mysqlbinlog -R --host=192.168.101.2 mysqld-bin.000001 ERROR: Failed on connect: Host '216.172.166.27' is not allowed to connect to this MySQL server |
如果沒有使用 -p 選項指定正确的密碼,那麼将得到以下“通路拒絕”錯誤消息。
ERROR: Failed on connect: Access denied for user 'root'@'216.172.166.27' (using password: YES) |
下面的示例顯示,還可以使用-u選項指定mysqlbinlog應該用于連接配接到遠端MySQL資料庫的使用者名。請注意,這個使用者是mysql使用者(不是Linux伺服器使用者)。
$ mysqlbinlog -R --host=192.168.101.2 -u root -p mysqld-bin.000001 |
mysqlbinlog詳解
mysqlbinlog用于處理二進制日志檔案的實用工具詳解mysqlbinlog
從二進制日志讀取語句的工具。在二進制日志檔案中包含的執行過的語句的日志可用來幫助從崩潰中恢複。
binlog日志打開方法
在my.cnf這個檔案中加一行(Windows為my.ini)。
#vi /etc/my.cnf
[mysqld]
log-bin=mysqlbin-log #添加這一行就ok了=号後面的名字自己定義吧
然後我們可以對資料庫做簡單的操作後到mysql資料檔案所在的目錄來看binlog檔案
[root@linux mysql]# ll
-rw-rw—- 1 mysql mysql 813255 Nov 25 18:14 mysqlbin-log.000001
搞定了
mysqlbinlog用法詳細說明
伺服器生成的二進制日志檔案寫成二進制格式。要想檢查這些文本格式的檔案,應使用mysqlbinlog實用工具。
應這樣調用mysqlbinlog:
shell> mysqlbinlog [options] log-files…例如,要想顯示二進制日志binlog.000003的内容,使用下面的指令:
shell> mysqlbinlog binlog.0000003輸出包括在binlog.000003中包含的所有語句,以及其它資訊例如每個語句花費的時間、客戶發出的線程ID、發出線程時的時間戳等等。
通常情況,可以使用mysqlbinlog直接讀取二進制日志檔案并将它們用于本地MySQL伺服器。也可以使用–read-from-remote-server選項從遠端伺服器讀取二進制日志。
當讀取遠端二進制日志時,可以通過連接配接參數選項來訓示如何連接配接伺服器,但它們經常被忽略掉,除非你還指定了–read-from-remote-server選項。這些選項是–host、–password、–port、–protocol、–socket和–user。
還可以使用mysqlbinlog來讀取在複制過程中從伺服器所寫的中繼日志檔案。中繼日志格式與二進制日志檔案相同。
mysqlbinlog支援下面的選項:
·
—help,-?
顯示幫助消息并退出。
—database=db_name,-d db_name
隻列出該資料庫的條目(隻用本地日志)。
–force-read,-f
使用該選項,如果mysqlbinlog讀它不能識别的二進制日志事件,它會列印警告,忽略該事件并繼續。沒有該選項,如果mysqlbinlog讀到此類事件則停止。
–hexdump,-H
在注釋中顯示日志的十六進制轉儲。該輸出可以幫助複制過程中的調試。在MySQL 5.1.2中添加了該選項。
–host=host_name,-h host_name
擷取給定主機上的MySQL伺服器的二進制日志。
–local-load=path,-l pat
為指定目錄中的LOAD DATA INFILE預處理本地臨時檔案。
–offset=N,-o N
跳過前N個條目。
–password[=password],-p[password]
當連接配接伺服器時使用的密碼。如果使用短選項形式(-p),選項和 密碼之間不能有空格。如果在指令行中–password或-p選項後面沒有 密碼值,則提示輸入一個密碼。
–port=port_num,-P port_num
用于連接配接遠端伺服器的TCP/IP端口号。
–position=N,-j N
不贊成使用,應使用–start-position。
–protocol={TCP | SOCKET | PIPE | -position
使用的連接配接協定。
–read-from-remote-server,-R
從MySQL伺服器讀二進制日志。如果未給出該選項,任何連接配接參數選項将被忽略。這些選項是–host、–password、–port、–protocol、–socket和–user。
–result-file=name, -r name
将輸出指向給定的檔案。
–short-form,-s
隻顯示日志中包含的語句,不顯示其它資訊。
–socket=path,-S path
用于連接配接的套接字檔案。
–start-datetime=datetime
從二進制日志中第1個日期時間等于或晚于datetime參量的事件開始讀取。datetime值相對于運作mysqlbinlog的機器上的本地時區。該值格式應符合DATETIME或TIMESTAMP資料類型。例如:
shell> mysqlbinlog –start-datetime=”2004-12-25 11:25:56″ binlog.000003該選項可以幫助點對點恢複。
–stop-datetime=datetime
從二進制日志中第1個日期時間等于或晚于datetime參量的事件起停止讀。關于datetime值的描述參見–start-datetime選項。該選項可以幫助及時恢複。
–start-position=N
從二進制日志中第1個位置等于N參量時的事件開始讀。
–stop-position=N
從二進制日志中第1個位置等于和大于N參量時的事件起停止讀。
–to-last-logs,-t
在MySQL伺服器中請求的二進制日志的結尾處不停止,而是繼續列印直到最後一個二進制日志的結尾。如果将輸出發送給同一台MySQL伺服器,會導緻無限循環。該選項要求–read-from-remote-server。
–disable-logs-bin,-D
禁用二進制日志。如果使用–to-last-logs選項将輸出發送給同一台MySQL伺服器,可以避免無限循環。該選項在崩潰恢複時也很有用,可以避免複制已經記錄的語句。注釋:該選項要求有SUPER權限。
–user=user_name,-u user_name
連接配接遠端伺服器時使用的MySQL使用者名。
–version,-V
顯示版本資訊并退出。
還可以使用–var_name=value選項設定下面的變量:
open_files_limit
指定要保留的打開的檔案描述符的數量。
可以将mysqlbinlog的輸出傳到mysql用戶端以執行包含在二進制日志中的語句。如果你有一個舊的備份,該選項在崩潰恢複時也很有用:
shell> mysqlbinlog hostname-bin.000001 | mysql或:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql如果你需要先修改含語句的日志,還可以将mysqlbinlog的輸出重新指向一個文本檔案。(例如,想删除由于某種原因而不想執行的語句)。編輯好檔案後,将它輸入到mysql程式并執行它包含的語句。
mysqlbinlog有一個–position選項,隻列印那些在二進制日志中的偏移量大于或等于某個給定位置的語句(給出的位置必須比對一個事件的開始)。它還有在看見給定日期和時間的事件後停止或啟動的選項。這樣可以使用–stop-datetime選項進行點對點恢複(例如,能夠說“将資料庫前滾動到今天10:30 AM的位置”)。
如果MySQL伺服器上有多個要執行的二進制日志,安全的方法是在一個連接配接中處理它們。下面是一個說明什麼是不安全的例子:
shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!!shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!使用與伺服器的不同連接配接來處理二進制日志時,如果第1個日志檔案包含一個CREATE TEMPORARY TABLE語句,第2個日志包含一個使用該臨時表的語句,則會造成問題。當第1個mysql程序結束時,伺服器撤銷臨時表。當第2個mysql程序想使用該表時,伺服器報告 “不知道該表”。
要想避免此類問題,使用一個連接配接來執行想要處理的所有二進制日志中的内容。下面提供了一種方法:
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql另一個方法是:
shell> mysqlbinlog hostname-bin.000001 > /tmp/statements.sqlshell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sqlshell> mysql -e “source /tmp/statements.sql”mysqlbinlog産生的輸出可以不需要原資料檔案即可重新生成一個LOAD DATA INFILE操作。mysqlbinlog将資料複制到一個臨時檔案并寫一個引用該檔案的LOAD DATA LOCAL INFILE語句。由系統确定寫入這些檔案的目錄的預設位置。要想顯式指定一個目錄,使用–local-load選項。
因為mysqlbinlog可以将LOAD DATA INFILE語句轉換為LOAD DATA LOCAL INFILE語句(也就是說,它添加了LOCAL),用于處理語句的用戶端和伺服器必須配置為允許LOCAL操作。
警告:為LOAD DATA LOCAL語句建立的臨時檔案不會自動删除,因為在實際執行完那些語句前需要它們。不再需要語句日志後應自己删除臨時檔案。檔案位于臨時檔案目錄中,檔案名類似original_file_name-#-#。
–hexdump選項可以在注釋中産生日志内容的十六進制轉儲:
shell> mysqlbinlog –hexdump master-bin.000001上述指令的輸出應類似:
;;# at 4#051024 17:24:13 server id 1 end_log_pos 98# Position Timestamp Type Master ID Size Master Pos Flags# 00000004 9d fc 5c 43 0f 01 00 00 00 5e 00 00 00 62 00 00 00 00 00# 00000017 04 00 35 2e 30 2e 31 35 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|# 00000027 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |og…………..|# 00000037 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |…………….|# 00000047 00 00 00 00 9d fc 5c 43 13 38 0d 00 08 00 12 00 |…….C.8……|# 00000057 04 04 04 04 12 00 00 4b 00 04 1a |…….K…|# Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13# at startupROLLBACK;十六進制轉儲的輸出包含下面的元素:
Position: The byte position within the log file.
Timestamp: The event timestamp. In the example just shown, ’9d fc 5c 43′ is the representation of ’051024 17:24:13′ in hexadecimal.
Type: The type of the log event. ’0f’ means that the example event is a FORMAT_DESCRIPTION_EVENT. The types are:
00 UNKNOWN_EVENT·
This event should never be present in the log.·
01 START_EVENT_V3·
This indicates the start of a log file written by MySQL 4 or earlier.·
02 QUERY_EVENT·
The most common type of events. These contain queries executed·
on the master.·
03 STOP_EVENT·
Indicates that master has stopped.·
04 ROTATE_EVENT·
Written when the master switches to a new log file.·
05 INTVAR_EVENT·
Used mainly for AUTO_INCREMENT values and if the LAST_INSERT_ID()·
function is used in the statement.·
06 LOAD_EVENT·
Used for LOAD DATA INFILE in MySQL 3.23.·
07 SLAVE_EVENT·
Reserved for future use.·
08 CREATE_FILE_EVENT·
Used for LOAD DATA INFILE statements. This indicates the start·
of execution of such a statement. A temporary file is created·
on the slave. Used in MySQL 4 only.·
09 APPEND_BLOCK_EVENT·
Contains data for use in a LOAD DATA INFILE statement. The·
data is stored in the temporary file on the slave.·
0a EXEC_LOAD_EVENT·
Used for LOAD DATA INFILE statements. The contents of the·
temporary file is stored in the table on the slave.·
Used in MySQL 4 only.·
0b DELETE_FILE_EVENT·
Rollback of LOAD DATA INFILE statement. The temporary file·
should be deleted on slave.·
0c NEW_LOAD_EVENT·
Used for LOAD DATA INFILE in MySQL 4 and earlier.·
0d RAND_EVENT·
Used to send information about random values if the RAND()·
function is used in the query.·
0e USER_VAR_EVENT·
Used to replicate user variables.·
0f FORMAT_DESCRIPTION_EVENT·
This indicates the start of a log file written by MySQL 5 or later.·
10 XID_EVENT·
Event indicating commit of XA transaction·
11 BEGIN_LOAD_QUERY_EVENT·
Used for LOAD DATA statements in MySQL 5 and later.·
12 EXECUTE_LOAD_QUERY_EVENT·
13 TABLE_MAP_EVENT·
Reserved for future use·
14 WRITE_ROWS_EVENT·
15 UPDATE_ROWS_EVENT·
16 DELETE_ROWS_EVENT·
Master ID: The server id of the master that created the event.
Size: The size in bytes of the event.
Master Pos: The position of the event in the original master log file.
Flags: 16 flags.
01 LOG_EVENT_BINLOG_IN_USE_F·
Log file correctly closed (Used only in FORMAT_DESCRIPTION_EVENT)·
If this flag is set (if the flags are e.g. ’01 00′) in an·
FORMAT_DESCRIPTION_EVENT, then the log file has not been·
properly closed. Most probably because of a master crash (for·
example, due to power failure).·
02 Reserved for future use.·
04 LOG_EVENT_THREAD_SPECIFIC_F·
Set if the event is dependent on the connection it was·
executed in (example ’04 00′), e.g. if the event uses·
temporary tables.·
08 LOG_EVENT_SUPPRESS_USE_F·
Set in some circumstances when the event is not dependent on·
the current database其它标志保留用于将來使用。
在以後的版本中十六進制轉儲輸出的格式可能會改變。