您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“mysqlbinlog命令有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“mysqlbinlog命令有哪些”這篇文章吧。
在MySQL或MariaDB中,任意時間對數據庫所做的修改,都會被記錄到日志文件中。例如,當你添加了一個新的表,或者更新了一條數據,這些事件都會被存儲到二進制日志文件中。二進制日志文件在MySQL主從復合中是非常有用的,主服務器會發送其數據到遠程服務器中。
當你需要恢復MySQL時,也會需要使用到二進制日志文件。
mysqlbinlog 命令,以用戶可視的方式展示出二進制日志中的內容。同時,也可以將其中的內容讀取出來,供其他MySQL實用程序使用。
1 獲取當前二進制日志列表
在mysql中執行以下命令,即可查看二進制日志文件的列表。
mysql> SHOW BINARY LOGS;
+----------------------+----------+
| Log_name | File_size |
+--------------------------+------------+
| mysqld-bin.000001 | 15740 |
| mysqld-bin.000002 | 3319 |
..
..
如果熊沒有開啟此功能,則會顯示:
mysql> SHOW BINARY LOGS;
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默認會顯示為以下內容:
/*!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 AAAAAAAAAAAAAAAAAAAh6nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/;
# 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語句。
1$ mysqlbinlog --base64-output=never mysqld-bin.000001
將不會有任何與下面類似的行,它具有base64編碼的BINLOG。
1BINLOG ' IeZ4WQ8BAAAAZgAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAh6nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
always:當指定“always”選項時,只要有可能,它將只顯示BINLOG項。因此,只有在專門調試一些問題時才使用它。
$ mysqlbinlog --base64-output=always mysqld-bin.000001
下面是“always”的輸出,它只顯示了BINLOG項。
BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAh6nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/;
# 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選項時,如下所示。
$ mysqlbinlog --base64-output=decode-rows --verbose mysqld-bin.000001
auto:這是默認選項。當沒有指定任何base64解碼選項時,它將使用auto。在這種情況下,mysqlbinlog將僅為某些事件類型打印BINLOG項,例如基于行的事件和格式描述事件。
$ mysqlbinlog --base64-output=auto mysqld-bin.000001
$ mysqlbinlog 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
/*!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重定向命令,將輸出存儲到一個文件中,如下所示。
$ 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
SET TIMESTAMP=1501097894/*!*/;
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
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
.. ..
# Warning: this binlog is either in use or was not closed properly.
..
.. .. BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAh6nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
當看到這個提示時,需要連接到mysql并刷新日志,如下所示。
1mysql> 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)/*!*/;
SET TIMESTAMP=1501096106/*!*/;
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 選項指定正確的密碼,那么將得到以下“訪問拒絕”錯誤消息。
$ 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服務器用戶)。
$ mysqlbinlog -R --host=192.168.101.2 -u root -p mysqld-bin.000001
以上是“mysqlbinlog命令有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。