在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 |
..
..
|
如果熊沒有開啟此功能,則會顯示:
1
2
|
mysql> SHOW BINARY LOGS;
ERROR 1381 (HY000): You are not using binary logging
|
二進制日志文件默認會存放在 /var/lib/mysql 目錄下
1
2
3
4
5
|
$ 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)的內容。
1
|
$ mysqlbinlog mysqld-bin.000001
|
mysqlbinlog默認會顯示為以下內容:
1
2
3
4
5
6
7
8
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 選項,可以指定一個數據庫名稱,將只顯示在該數據庫上所發生的事件。
1
|
$ mysqlbinlog -d crm mysqld-bin.000001 > crm-events.txt
|
也可以使用 --database 命令,效果相同。
1
|
$ mysqlbinlog -database crm mysqld-bin.000001 > crm-events.txt
|
4 禁止恢復過程產生日志
在使用二進制日志文件進行數據庫恢復時,該過程中也會產生日志文件,就會進入一個循環狀態,繼續恢復該過程中的數據。因此,當使用mysqlbinlog命令時,要禁用二進制日志,請使用下面所示的-D選項:
1
|
$ mysqlbinlog -D mysqld-bin.000001
|
也可以使用 --disable-log-bin 命令,效果相同。
1
|
$ mysqlbinlog --disable-log-bin mysqld-bin.000001
|
備注:在輸出中,當指定-D選項時,將看到輸出中的第二行。也就是SQL_LOG_BIN=0
1
2
3
|
/*!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語句。
1
|
$ mysqlbinlog --base64-output=never mysqld-bin.000001
|
將不會有任何與下面類似的行,它具有base64編碼的BINLOG。
1
|
BINLOG ' IeZ4WQ8BAAAAZgAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
|
always:當指定“always”選項時,只要有可能,它將只顯示BINLOG項。因此,只有在專門調試一些問題時才使用它。
1
|
$ mysqlbinlog --base64-output=always mysqld-bin.000001
|
下面是“always”的輸出,它只顯示了BINLOG項。
1
2
3
4
5
6
7
8
9
10
|
BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/;
# at 106
#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選項時,如下所示。
1
|
$ mysqlbinlog --base64-output=decode-rows --verbose mysqld-bin.000001
|
auto:這是默認選項。當沒有指定任何base64解碼選項時,它將使用auto。在這種情況下,mysqlbinlog將僅為某些事件類型打印BINLOG項,例如基於行的事件和格式描述事件。
1
2
|
$ mysqlbinlog --base64-output=auto mysqld-bin.000001
$ mysqlbinlog mysqld-bin.000001
|
6 mysqlbinlog輸出調試信息
下面的調試選項,在完成處理給定的二進制日志文件之后,將檢查文件打開和內存使用。
1
|
$ mysqlbinlog --debug-check mysqld-bin.000001
|
如下所示,在完成處理給定的二進制日志文件之后,下面的調試信息選項將顯示額外的調試信息。
1
2
3
4
5
6
|
$ 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個條目。
1
|
$ mysqlbinlog -o 10 mysqld-bin.000001
|
為了確保它正常工作,給偏移量提供一個巨大的數字,將看不到任何條目。下面的內容將從日志中跳過10,000個條目(事件)。
1
2
3
4
5
6
|
$ mysqlbinlog -o 10000 mysqld-bin.000001
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; .. ..
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
|
在本例中,由於這個特定的日志文件沒有10,000個條目,所以在輸出中沒有顯示任何數據庫事件。
8 保存輸出到文件
也可以使用簡單的Linux重定向命令,將輸出存儲到一個文件中,如下所示。
1
|
$ mysqlbinlog mysqld-bin.000001 > output.log
|
或者也可以使用 -r (結果文件)選項,如下所示,將輸出存儲到一個文件中。
1
|
$ mysqlbinlog -r output.log mysqld-bin.000001
|
備注:還可以使用 -server-id 指定mysql服務器,確保是由給定服務器id的mysql服務器所生成的日志。
1
|
$ mysqlbinlog --server-id=1 -r output.log mysqld-bin.000001
|
9 從一個特定位置提取條目
通常在mysql二進制日志文件中,你將看到如下所示的位置號。下面是mysqlbinlog的部分輸出,你可以看到“15028”是一個位置編號。
1
2
3
4
5
6
7
8
|
#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
SET TIMESTAMP=1501097894/*!*/;
insert into salary values(500,'Randy','Technology',6000)
|
下面的命令將從位置編號為15028的二進制日志條目處開始讀取。
1
|
$ mysqlbinlog -j 15028 mysqld-bin.000001 > from-15028.out
|
當在命令行中指定多個二進制日志文件時,開始位置選項將僅應用於給定列表中的第一個二進制日志文件。還可以使用 -H 選項來獲得給定的二進制日志文件的十六進制轉儲,如下所示。
1
|
$ mysqlbinlog -H mysqld-bin.000001 > binlog-hex-dump.out
|
10 將條目截止到一個特定的位置
就像前面的例子一樣,你也可以從mysql二進制日志中截止到一個特定位置的條目,如下所示。
1
|
$ mysqlbinlog --stop-position=15028 mysqld-bin.000001 > upto-15028.out
|
上面的示例將在15028的位置上停止binlog。當在命令行中指定多個二進制日志文件時,停止位置將僅應用於給定列表中的最后一個二進制日志文件。
11 刷新日志以清除Binlog輸出
當二進制日志文件沒有被正確地關閉時,將在輸出中看到一個警告消息,如下所示。
1
|
$ mysqlbinlog mysqld-bin.000001 > output.out
|
如下所示,報告中提示binlog文件沒有正確地關閉。
1
2
3
4
5
6
7
|
# head output.log
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
.. ..
# Warning: this binlog is either in use or was not closed properly.
..
.. .. BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
|
當看到這個提示時,需要連接到mysql並刷新日志,如下所示。
1
|
mysql> flush logs;
|
刷新日志之后,再次執行mysqlbinlog命令,將不會看到在mysqlbinlog輸出中binlog未正確關閉的警告消息。
12 在輸出中只顯示語句
默認情況下,正如在前面的示例輸出中看到的一樣,除了SQL語句之外,在mysqlbinlog輸出中還會有一些附加信息。如果只想查看常規的SQL語句,而不需要其他內容,那么可以使用 -s 選項,如下所示。
也可以使用 --short-form 選項,效果相同。
1
2
3
|
$ mysqlbinlog -s mysqld-bin.000001
$ mysqlbinlog --short-form mysqld-bin.000001
|
下面是上述命令的部分輸出。在這里,它將只顯示來自給定二進制日志文件的SQL語句。
1
2
3
4
5
6
|
SET TIMESTAMP=1501096106/*!*/;
insert into employee values(400,'Nisha','Marketing',9500)/*!*/;
SET TIMESTAMP=1501096106/*!*/;
insert into employee values(500,'Randy','Technology',6000)
..
..
|
不會顯示像下面這樣的條目:
1
2
|
# at 1201
#170726 15:08:26 server id 1 end_log_pos 1329 Query thread_id=3 exec_time=0 error_code=0
|
13 查看特定開始時間的條目
下面將只提取從指定時間開始的條目。在此之前的任何條目都將被忽略。
1
|
$ mysqlbinlog --start-datetime="2017-08-16 10:00:00" mysqld-bin.000001
|
當你想要從一個二進制文件中提取數據時,這是非常有用的,因為你希望使用它來恢復或重構在某個時間段內發生的某些數據庫活動。時間戳的格式可以是MySQL服務器所理解的DATETIME和timestamp中的任何類型。
14 查看特定結束時間的條目
與前面的開始時間示例一樣,這里也可以指定結束時間,如下所示。
1
|
$ mysqlbinlog --stop-datetime="2017-08-16 15:00:00" mysqld-bin.000001
|
上面的命令將讀取到給定結束時間的條目。任何來自於超過給定結束時間的mysql二進制日志文件的條目都不會被處理。
15 從遠程服務器獲取二進制日志
在本地機器上,還可以讀取位於遠程服務器上的mysql二進制日志文件。為此,需要指定遠程服務器的ip地址、用戶名和密碼,如下所示。
此處使用-R選項。-R選項與-read-from-remote-server相同。
1
|
$ mysqlbinlog -R -h 192.168.101.2 -p mysqld-bin.000001
|
在上面命令中:
- -R 選項指示mysqlbinlog命令從遠程服務器讀取日志文件
- -h 指定遠程服務器的ip地址
- -p 將提示輸入密碼。默認情況下,它將使用“root”作為用戶名。也可以使用 -u 選項指定用戶名。
- mysqld-bin.000001 這是在這里讀到的遠程服務器的二進制日志文件的名稱。
下面命令與上面的命令完全相同:
1
|
$ mysqlbinlog --read-from-remote-server --host=192.168.101.2 -p mysqld-bin.000001
|
如果只指定 -h 選項,將會得到下面的錯誤消息。
1
2
|
$ mysqlbinlog -h 192.168.101.2 mysqld-bin.000001
mysqlbinlog: File 'mysqld-bin.000001' not found (Errcode: 2)
|
當你在遠程數據庫上沒有足夠的特權時,將得到以下“不允許連接”錯誤消息。在這種情況下,確保在遠程數據庫上為本地客戶機授予適當的特權。
1
2
3
|
$ 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 選項指定正確的密碼,那么將得到以下“訪問拒絕”錯誤消息。
1
2
|
$ mysqlbinlog -R --host=192.168.101.2 mysqld-bin.000001
ERROR: Failed on connect: Access denied for user 'root'@'216.172.166.27' (using password: YES)
|
下面的示例顯示,還可以使用-u選項指定mysqlbinlog應該用於連接到遠程MySQL數據庫的用戶名。請注意,這個用戶是mysql用戶(不是Linux服務器用戶)。
1
|
$ 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·
Used for LOAD DATA statements in MySQL 5 and later.·
13 TABLE_MAP_EVENT·
Reserved for future use·
14 WRITE_ROWS_EVENT·
Reserved for future use·
15 UPDATE_ROWS_EVENT·
Reserved for future use·
16 DELETE_ROWS_EVENT·
Reserved for future use·
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其它標志保留用於將來使用。
在以后的版本中十六進制轉儲輸出的格式可能會改變。