這篇文章主要為大家展示了“MySQLbinlog命令有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“mysqlbinlog命令有哪些”這篇文章吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、南召網(wǎng)站維護(hù)、網(wǎng)站推廣。
在MySQL或MariaDB中,任意時(shí)間對數(shù)據(jù)庫所做的修改,都會(huì)被記錄到日志文件中。例如,當(dāng)你添加了一個(gè)新的表,或者更新了一條數(shù)據(jù),這些事件都會(huì)被存儲(chǔ)到二進(jìn)制日志文件中。二進(jìn)制日志文件在MySQL主從復(fù)合中是非常有用的,主服務(wù)器會(huì)發(fā)送其數(shù)據(jù)到遠(yuǎn)程服務(wù)器中。
當(dāng)你需要恢復(fù)MySQL時(shí),也會(huì)需要使用到二進(jìn)制日志文件。
mysqlbinlog 命令,以用戶可視的方式展示出二進(jìn)制日志中的內(nèi)容。同時(shí),也可以將其中的內(nèi)容讀取出來,供其他MySQL實(shí)用程序使用。
1 獲取當(dāng)前二進(jìn)制日志列表
在mysql中執(zhí)行以下命令,即可查看二進(jìn)制日志文件的列表。
mysql> SHOW BINARY LOGS;
+----------------------+----------+
| Log_name | File_size |
+--------------------------+------------+
| mysqld-bin.000001 | 15740 |
| mysqld-bin.000002 | 3319 |
..
..
如果熊沒有開啟此功能,則會(huì)顯示:
mysql> SHOW BINARY LOGS;
ERROR 1381 (HY000): You are not using binary logging
二進(jìn)制日志文件默認(rèn)會(huì)存放在 /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 默認(rèn)行為
下面將以一種用戶友好的格式顯示指定的二進(jìn)制日志文件(例如:mysqld.000001)的內(nèi)容。
$ mysqlbinlog mysqld-bin.000001
mysqlbinlog默認(rèn)會(huì)顯示為以下內(nèi)容:
/*!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*
上面的命令將會(huì)顯示出,在該系統(tǒng)上數(shù)據(jù)庫發(fā)生的所有改變事件。
3 獲取特定數(shù)據(jù)庫條目
默認(rèn)情況下,mysqlbinlog會(huì)顯示所有的內(nèi)容,太過于雜亂。使用 -d 選項(xiàng),可以指定一個(gè)數(shù)據(jù)庫名稱,將只顯示在該數(shù)據(jù)庫上所發(fā)生的事件。
$ mysqlbinlog -d crm mysqld-bin.000001 > crm-events.txt
也可以使用 --database 命令,效果相同。
$ mysqlbinlog -database crm mysqld-bin.000001 > crm-events.txt
4 禁止恢復(fù)過程產(chǎn)生日志
在使用二進(jìn)制日志文件進(jìn)行數(shù)據(jù)庫恢復(fù)時(shí),該過程中也會(huì)產(chǎn)生日志文件,就會(huì)進(jìn)入一個(gè)循環(huán)狀態(tài),繼續(xù)恢復(fù)該過程中的數(shù)據(jù)。因此,當(dāng)使用mysqlbinlog命令時(shí),要禁用二進(jìn)制日志,請使用下面所示的-D選項(xiàng):
$ mysqlbinlog -D mysqld-bin.000001
也可以使用 --disable-log-bin 命令,效果相同。
$ mysqlbinlog --disable-log-bin mysqld-bin.000001
備注:在輸出中,當(dāng)指定-D選項(xiàng)時(shí),將看到輸出中的第二行。也就是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*/;
當(dāng)使用-to-last-log選項(xiàng)時(shí),這個(gè)選項(xiàng)也會(huì)有所幫助。另外,請記住,該命令需要root權(quán)限來執(zhí)行。
5 在輸出中控制base-64 BINLOG
使用base64-output選項(xiàng),可以控制輸出語句何時(shí)是輸出base64編碼的BINLOG語句。以下是base64輸出設(shè)置的可能值:
never
always
decode-rows
auto(默認(rèn))
never:當(dāng)指定如下所示的“never”時(shí),它將在輸出中顯示base64編碼的BINLOG語句。
1$ mysqlbinlog --base64-output=never mysqld-bin.000001
將不會(huì)有任何與下面類似的行,它具有base64編碼的BINLOG。
1BINLOG ' IeZ4WQ8BAAAAZgAAABAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAh6nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
always:當(dāng)指定“always”選項(xiàng)時(shí),只要有可能,它將只顯示BINLOG項(xiàng)。因此,只有在專門調(diào)試一些問題時(shí)才使用它。
$ mysqlbinlog --base64-output=always mysqld-bin.000001
下面是“always”的輸出,它只顯示了BINLOG項(xiàng)。
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:這個(gè)選項(xiàng)將把基于行的事件解碼成一個(gè)SQL語句,特別是當(dāng)指定-verbose選項(xiàng)時(shí),如下所示。
$ mysqlbinlog --base64-output=decode-rows --verbose mysqld-bin.000001
auto:這是默認(rèn)選項(xiàng)。當(dāng)沒有指定任何base64解碼選項(xiàng)時(shí),它將使用auto。在這種情況下,mysqlbinlog將僅為某些事件類型打印BINLOG項(xiàng),例如基于行的事件和格式描述事件。
$ mysqlbinlog --base64-output=auto mysqld-bin.000001
$ mysqlbinlog mysqld-bin.000001
6 mysqlbinlog輸出調(diào)試信息
下面的調(diào)試選項(xiàng),在完成處理給定的二進(jìn)制日志文件之后,將檢查文件打開和內(nèi)存使用。
$ mysqlbinlog --debug-check mysqld-bin.000001
如下所示,在完成處理給定的二進(jìn)制日志文件之后,下面的調(diào)試信息選項(xiàng)將顯示額外的調(diào)試信息。
$ 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個(gè)條目
除了讀取整個(gè)mysql二進(jìn)制日志文件外,也可以通過指定偏移量來讀取它的特定部分??梢允褂?-o 選項(xiàng)。o代表偏移。
下面將跳過指定的mysql bin日志中的前10個(gè)條目。
$ mysqlbinlog -o 10 mysqld-bin.000001
為了確保它正常工作,給偏移量提供一個(gè)巨大的數(shù)字,將看不到任何條目。下面的內(nèi)容將從日志中跳過10,000個(gè)條目(事件)。
$ 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*/;
在本例中,由于這個(gè)特定的日志文件沒有10,000個(gè)條目,所以在輸出中沒有顯示任何數(shù)據(jù)庫事件。
8 保存輸出到文件
也可以使用簡單的Linux重定向命令,將輸出存儲(chǔ)到一個(gè)文件中,如下所示。
$ mysqlbinlog mysqld-bin.000001 > output.log
或者也可以使用 -r (結(jié)果文件)選項(xiàng),如下所示,將輸出存儲(chǔ)到一個(gè)文件中。
$ mysqlbinlog -r output.log mysqld-bin.000001
備注:還可以使用 -server-id 指定mysql服務(wù)器,確保是由給定服務(wù)器id的mysql服務(wù)器所生成的日志。
$ mysqlbinlog --server-id=1 -r output.log mysqld-bin.000001
9 從一個(gè)特定位置提取條目
通常在mysql二進(jìn)制日志文件中,你將看到如下所示的位置號(hào)。下面是mysqlbinlog的部分輸出,你可以看到“15028”是一個(gè)位置編號(hào)。
#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)
下面的命令將從位置編號(hào)為15028的二進(jìn)制日志條目處開始讀取。
$ mysqlbinlog -j 15028 mysqld-bin.000001 > from-15028.out
當(dāng)在命令行中指定多個(gè)二進(jìn)制日志文件時(shí),開始位置選項(xiàng)將僅應(yīng)用于給定列表中的第一個(gè)二進(jìn)制日志文件。還可以使用 -H 選項(xiàng)來獲得給定的二進(jìn)制日志文件的十六進(jìn)制轉(zhuǎn)儲(chǔ),如下所示。
$ mysqlbinlog -H mysqld-bin.000001 > binlog-hex-dump.out
10 將條目截止到一個(gè)特定的位置
就像前面的例子一樣,你也可以從mysql二進(jìn)制日志中截止到一個(gè)特定位置的條目,如下所示。
$ mysqlbinlog --stop-position=15028 mysqld-bin.000001 > upto-15028.out
上面的示例將在15028的位置上停止binlog。當(dāng)在命令行中指定多個(gè)二進(jìn)制日志文件時(shí),停止位置將僅應(yīng)用于給定列表中的最后一個(gè)二進(jìn)制日志文件。
11 刷新日志以清除Binlog輸出
當(dāng)二進(jìn)制日志文件沒有被正確地關(guān)閉時(shí),將在輸出中看到一個(gè)警告消息,如下所示。
$ mysqlbinlog mysqld-bin.000001 > output.out
如下所示,報(bào)告中提示binlog文件沒有正確地關(guān)閉。
# 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
當(dāng)看到這個(gè)提示時(shí),需要連接到mysql并刷新日志,如下所示。
1mysql> flush logs;
刷新日志之后,再次執(zhí)行mysqlbinlog命令,將不會(huì)看到在mysqlbinlog輸出中binlog未正確關(guān)閉的警告消息。
12 在輸出中只顯示語句
默認(rèn)情況下,正如在前面的示例輸出中看到的一樣,除了SQL語句之外,在mysqlbinlog輸出中還會(huì)有一些附加信息。如果只想查看常規(guī)的SQL語句,而不需要其他內(nèi)容,那么可以使用 -s 選項(xiàng),如下所示。
也可以使用 --short-form 選項(xiàng),效果相同。
$ mysqlbinlog -s mysqld-bin.000001
$ mysqlbinlog --short-form mysqld-bin.000001
下面是上述命令的部分輸出。在這里,它將只顯示來自給定二進(jìn)制日志文件的SQL語句。
SET TIMESTAMP=1501096106/*!*/;
insert into employee values(400,'Nisha','Marketing',9500)/*!*/;
SET TIMESTAMP=1501096106/*!*/;
insert into employee values(500,'Randy','Technology',6000)
..
..
不會(huì)顯示像下面這樣的條目:
# at 1201
#170726 15:08:26 server id 1 end_log_pos 1329 Query thread_id=3 exec_time=0 error_code=0
13 查看特定開始時(shí)間的條目
下面將只提取從指定時(shí)間開始的條目。在此之前的任何條目都將被忽略。
$ mysqlbinlog --start-datetime="2017-08-16 10:00:00" mysqld-bin.000001
當(dāng)你想要從一個(gè)二進(jìn)制文件中提取數(shù)據(jù)時(shí),這是非常有用的,因?yàn)槟阆M褂盟鼇砘謴?fù)或重構(gòu)在某個(gè)時(shí)間段內(nèi)發(fā)生的某些數(shù)據(jù)庫活動(dòng)。時(shí)間戳的格式可以是MySQL服務(wù)器所理解的DATETIME和timestamp中的任何類型。
14 查看特定結(jié)束時(shí)間的條目
與前面的開始時(shí)間示例一樣,這里也可以指定結(jié)束時(shí)間,如下所示。
$ mysqlbinlog --stop-datetime="2017-08-16 15:00:00" mysqld-bin.000001
上面的命令將讀取到給定結(jié)束時(shí)間的條目。任何來自于超過給定結(jié)束時(shí)間的mysql二進(jìn)制日志文件的條目都不會(huì)被處理。
15 從遠(yuǎn)程服務(wù)器獲取二進(jìn)制日志
在本地機(jī)器上,還可以讀取位于遠(yuǎn)程服務(wù)器上的mysql二進(jìn)制日志文件。為此,需要指定遠(yuǎn)程服務(wù)器的ip地址、用戶名和密碼,如下所示。
此處使用-R選項(xiàng)。-R選項(xiàng)與-read-from-remote-server相同。
$ mysqlbinlog -R -h 192.168.101.2 -p mysqld-bin.000001
在上面命令中:
-R 選項(xiàng)指示mysqlbinlog命令從遠(yuǎn)程服務(wù)器讀取日志文件
-h 指定遠(yuǎn)程服務(wù)器的ip地址
-p 將提示輸入密碼。默認(rèn)情況下,它將使用“root”作為用戶名。也可以使用 -u 選項(xiàng)指定用戶名。
mysqld-bin.000001 這是在這里讀到的遠(yuǎn)程服務(wù)器的二進(jìn)制日志文件的名稱。
下面命令與上面的命令完全相同:
$ mysqlbinlog --read-from-remote-server --host=192.168.101.2 -p mysqld-bin.000001
如果只指定 -h 選項(xiàng),將會(huì)得到下面的錯(cuò)誤消息。
$ mysqlbinlog -h 192.168.101.2 mysqld-bin.000001
mysqlbinlog: File 'mysqld-bin.000001' not found (Errcode: 2)
當(dāng)你在遠(yuǎn)程數(shù)據(jù)庫上沒有足夠的特權(quán)時(shí),將得到以下“不允許連接”錯(cuò)誤消息。在這種情況下,確保在遠(yuǎn)程數(shù)據(jù)庫上為本地客戶機(jī)授予適當(dāng)?shù)奶貦?quán)。
$ 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 選項(xiàng)指定正確的密碼,那么將得到以下“訪問拒絕”錯(cuò)誤消息。
$ 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選項(xiàng)指定mysqlbinlog應(yīng)該用于連接到遠(yuǎn)程MySQL數(shù)據(jù)庫的用戶名。請注意,這個(gè)用戶是mysql用戶(不是Linux服務(wù)器用戶)。
$ mysqlbinlog -R --host=192.168.101.2 -u root -p mysqld-bin.000001
以上是“mysqlbinlog命令有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!