共計 8873 個字符,預計需要花費 23 分鐘才能閱讀完成。
這篇文章主要為大家展示了“mysqlbinlog 命令有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“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 命令有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!