【小白福利—初級DBA入門必看】MySQL常用工具介紹(十三)——實用程序MySQL_binlog

MYSQL常用工具一文馬上就要結束啦~儘管如此Amy可是絲毫不敢懈怠,始終抱着能夠給大家帶來誠意十足的乾貨的心態更新每一篇文章。大家學習之餘別忘了看一下之前的文章哦,相信一定會有更多的收穫!——MySQL常用工具和分佈式事務數據庫開發規範系列文章

1 . 簡介

mysqlbinlog可以將二進制日誌和中繼日誌包含的事件以文本格式顯示其內容,也可以作爲binlog的備份程序。
調用:
shell> mysqlbinlog [options] log_file …
#mysqlbinlog支持讀取本地服務器的二進制文件,也支持遠程服務器的。當讀取遠程服務器時,其表現爲一個客戶端,故此需要用到客戶端通用的連接等選項。mysqlbinlog選項可以從[mysqlbinlog]和[client]組讀取。
輸出:
如shell> mysqlbinlog binlog.0000003命令將顯示該文件的包含的事件內容。對於基於語句的日誌記錄,事件信息包括sql語句,執行語句的服務器id,執行語句的時間戳,花費的時間等。對於基於行的日誌記錄,該事件表示行的更改而不是sql語句。
事件之前是頭註釋,包含其他信息,例如事件在文件中的偏移或或起始位置、事件時間戳指示語句在源服務器上的起始時間(對於複製,該時間戳傳播到從服務器)、源服務器id、下一事件起始位置、執行語句的線程id、在源服務器上exec_time爲執行耗時而在從上爲語句執行結束事件減去語句在源開始時間、執行事件的結果0表示沒有錯誤發生。格式如下:
at 141
#100309 9:28:36 server id 123 end_log_pos 245 Query thread_id=3350 exec_time=11 error_code=0
注意:When using event groups, the file offsets of events may be grouped together and the comments of events may be grouped together. Do not mistake these grouped events for blank file offsets.
當讀取一個大文件時,注意文件系統空間是否足夠容納結果文件。要配置臨時文件所使用的文件夾,使用TMPDIR環境變量。
mysqbinlog在執行任何sql前設置pseudo_slave_mode=1。
mysqlbinlog的輸出可以重新執行(如輸入到mysql中)。可以用於奔潰恢復操作,也可以用於基於時間點的恢復。
可以將mysqlbinlog的輸出通過管道輸入到mysql中。
shell> mysqlbinlog binlog.000001 | mysql -u root -p
shell> mysqlbinlog binlog.[0-9]* | mysql -u root -p
#若mysqlbinlog包含blob,使用mysql --binary-mode。

也可以先輸出到文件,修改後再輸入到mysql
shell> mysqlbinlog binlog.000001 > tmpfile
shell> … edit tmpfile …
shell> mysql -u root -p < tmpfile

如果你需要將多個binlog導入mysql,安全的方法是使用一個會話:(否則可能因爲臨時表被刪除等導致不一致)
shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!
以上兩個命令的用法是不安全的,要使用下面的方法:
shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
mysqlbinlog可以將load data語句轉換成本地的load data local語句,需要在默認的系統決定的目錄或–local-load指定的目錄保存該語句需要的文件,文件的格式類似original_file_name-#-#。

2 . 選項介紹與部分選項舉例說明

#注意:這裏默認值是不再選用“程序名 --no-defaults --help”打印的輸出,而是指未指定時內部初始值,該值可被自身選項顯示指定,也可能會受其他互斥選項、相關選項更改。只寫出啓用的布爾型,以及有內部值的選項。有內部值的選項可以不顯示給出。
2.1 所有客戶端共有選項
2.1.1 影響選項文件讀取的選項

在這裏插入圖片描述
2.1.2 幫助與版本
在這裏插入圖片描述
2.1.2 連接的建立
在這裏插入圖片描述
在這裏插入圖片描述
連接方式參數說明:優先級–protocol>–pipe>-h;
linux兩種連接方式:若未指定–host和-h,或指定爲localhost,或指定爲空(–host=或–host=’’),則使用unix套接字;否則使用tcp/ip。
windows三種連接方式:若未指定–host和-h,或指定爲localhost,且服務端開啓了共享內存,則使用共享內存;若指定爲.,或tcp禁用且socket未指定或主機指定爲空(–host=),則使用命名管道;否則tcp。
連接方式舉例
全平臺使用tcp/ip:
mysql --protocol=tcp [-h127.0.0.1] [–port=3306]
mysql -h127.0.0.1 [–port=3306]

unix使用socket:
mysql [–host=localhost] [–socket=/tmp/mysql.sock]

windows使用命名管道:需在服務端開啓命名管道支持
mysql --protocol=pipe
mysql --pipe
mysql --host=.

windows使用共享內存:未知,存在問題。理論上應當在服務上開啓共享內存後使用
mysql [–host=localhost] --shared-memory-base-name=MYSQL,但是實際上使用的tcp,或者
mysql --protocol=memory --shared-memory-base-name=MYSQL,但是會報錯ERROR 2046 (HY000): Can’t open shared memory; cannot send request event to server (5);

2.1.3 字符集
在這裏插入圖片描述
2.1.4 調試日誌
在這裏插入圖片描述
2.2 mysqlbinlog特定選項
在這裏插入圖片描述
在這裏插入圖片描述

3 . mysqlbinlog的十六進制轉儲格式

hexdump使mysqlbinlog生成十六進制輸出,包含#開頭的註釋行,如

shell> mysqlbinlog --hexdump master-bin.000001
/*!40019 SET @@SESSION.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
 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 startup
ROLLBACK;

目前,十六進制輸出包含以下元素:

•	Position: The byte position within the log file.
•	Timestamp: The event timestamp. In the example shown, '9d fc 5c 43' is the representation of '051024 17:24:13'in hexadecimal.
•	Type: The event type code.
•	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 next event in the original master log file.
•	Flags: Event flag values.

4 . mysqlbinlog行事件的顯示

base64-output=DECODE-ROWS 和–verbose選項可用於影響行事件輸出。
假如執行如下語句:

CREATE TABLE t
(
  id   INT NOT NULL,
  name VARCHAR(20) NOT NULL,
  date DATE NULL
) ENGINE = InnoDB;

START TRANSACTION;
INSERT INTO t VALUES(1, 'apple', NULL);
UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;
DELETE FROM t WHERE id = 1;
COMMIT;

4.1 默認情況下mysql用BINLOG顯示編碼爲base-64的行事件:

shell> mysqlbinlog log_file
...
at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
...
 at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
...
at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;

4.2 要添加行事件的僞sql顯示,使用-v。輸出中的行sql以###開頭

shell> mysqlbinlog -v log_file
...
at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
 INSERT INTO test.t
SET
   @1=1
  @2='apple'
  @3=NULL
...
 at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
 UPDATE test.t
 WHERE
  @1=1
  @2='apple'
  @3=NULL
 SET
  @1=1
   @2='pear'
   @3='2009:01:01'
...
 at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
DELETE FROM test.t
WHERE
   @1=1
   @2='pear'
   @3='2009:01:01'

4.3 指定兩次-v如-vv,在僞sql語句中還包含額外的註釋以顯示數據類型和一些列元數據

shell> mysqlbinlog -vv log_file
...
 at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
 INSERT INTO test.t
 SET
   @1=1 /* INT meta=0 nullable=0 is_null=0 */
   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
 @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
...
at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
 UPDATE test.t
 WHERE
  @1=1 /* INT meta=0 nullable=0 is_null=0 */
  @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
SET
  @1=1 /* INT meta=0 nullable=0 is_null=0 */
 @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
  @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
...
 at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F

BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
 DELETE FROM test.t
 WHERE
  @1=1 /* INT meta=0 nullable=0 is_null=0 */
 @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
 @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */

4.4 可以使用–base64-output=DECODE-ROWS取消BINLOG語句的顯示。可以方便地查看行事件的僞sql語句

...
at 218
#080828 15:03:08 server id 1  end_log_pos 258   Write_rows: table id 17 flags: STMT_END_F
 INSERT INTO test.t
SET
  @1=1
 @2='apple'
  @3=NULL
...
 at 302
#080828 15:03:08 server id 1  end_log_pos 356   Update_rows: table id 17 flags: STMT_END_F
 UPDATE test.t
 WHERE
  @1=1
  @2='apple'
  @3=NULL
 SET
  @1=1
  @2='pear'
  @3='2009:01:01'
...
 at 400
#080828 15:03:08 server id 1  end_log_pos 442   Delete_rows: table id 17 flags: STMT_END_F
DELETE FROM test.t
WHERE
  @1=1
  @2='pear'
 @3='2009:01:01'

5 . 使用mysqlbinlog備份二進制日誌

mysqlbinlog可以將服務器上的二進制日誌備份到客戶端本地。
至少需–read-from-remote-server和–raw選項,可選–stop-never、–stop-never-slave-server-id=id、–result-file等

5.1 靜態備份:
查看服務器binlog日誌組文件名

mysql> SHOW BINARY LOGS;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000130 |     27459 |
| binlog.000131 |     13719 |
| binlog.000132 |     43268 |
+---------------+-----------+

使用以下兩個語句備份:

mysqlbinlog --read-from-remote-server --host=host_name --raw  binlog.000130 binlog.000131 binlog.000132


mysqlbinlog --read-from-remote-server --host=host_name --raw --to-last-log binlog.000130
#兩個語句的不同之處在於if the server happens to open binlog.000133 before mysqlbinlog reaches the end of binlog.000132, the first command will not read it, but the second command will.
5.2 動態備份
mysqlbinlog --read-from-remote-server --host=host_name --raw --stop-never binlog.000130
此時輸出文件的名稱如下所述:
無–raw時,mysqlbinlog在–result-file或stdout生成文本輸出;
有–raw時,不改變複製過來的文件名字,但–result-file可以給文件指定位置並加前綴。當–result-file指定爲目錄時不改名字,但目錄要以/結尾
在這裏插入圖片描述
5.3 舉例:mysqldump和mysqlbinlog用來備份還原
備份binlog:
mysqlbinlog --read-from-remote-server --host=host_name --raw --stop-never binlog.000999

備份數據:
mysqldump --host=host_name --all-databases --events --routines --master-data=2> dump_file

當需要還原時,先將最近備份還原:
mysql --host=host_name -u root -p < dump_file
隨後從dump_file中找到-- CHANGE MASTER TO MASTER_LOG_FILE=‘binlog.001002’, MASTER_LOG_POS=27284;
然後用二進制備份恢復自己想要恢復的內容:
mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004 | mysql --host=host_name -u root -p

mysqlbinlog備份限制
mysqlbinlog與服務器連接丟失後不會重連;
在5.7.19前,即便sync_binlog=1,mysqlbinlog也不一定得到所有的提交;
備份延時和複製延時類似。

6 . 指定mysqlbinlog的server id

當使用–read-from-remote-server 選項調用時,mysqlbinlog連接到MySQL服務器,報告用於標識自身的服務器ID,並從服務器請求二進制日誌文件。您可以使用 mysqlbinlog以多種方式從服務器請求日誌文件:
顯示指定多個文件:對於每個文件, mysqlbinlog連接併發出一個Binlog dump命令。服務器發送文件並斷開連接。每個文件有一個連接。
指定起始文件和–to-last-log:mysqlbinlog連接併爲所有文件發出一個Binlog dump 命令。服務器發送所有文件後斷開連接。
指定起始文件和–stop-never:mysqlbinlog連接併爲所有文件發出一個Binlog dump 命令。服務器發送所有文件後保持連接。
當僅指定–read-from-remote-server選項,mysqlbinlog使用0作爲服務id(0表示發送完請求後斷開連接);當還指定–stop-never,以65535或–stop-never-slave-server-id連接,非零值使服務器不斷開連接;這樣,因爲0所以前兩種斷開,給定–stop-never而非0故不斷開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章