使用mysqlbinlog工具進行基於位置或時間點的資料恢複,mysqlbinlog位置

來源:互聯網
上載者:User

使用mysqlbinlog工具進行基於位置或時間點的資料恢複,mysqlbinlog位置
使用mysqlbinlog工具進行基於位置或時間點的恢複

MySQL備份一般採取全備份加記錄備份的方式,比如每天執行一次全備份,每小時執行一次二進位記錄備份。這樣在MySQL Server故障後可以使用全備份和記錄備份將資料恢複到最後一個二進位記錄備份前的任意位置或時間。用來進行全備和日誌備的工具各種各樣,各有其特色,在這裡不做描述。本文主要講解一下在回複完全備份後,如何應用備份的二進位日誌來將資料恢複到指定的位置或時間點。

這裡有個十分重要的工具——mysqlbinlog,專門用來查看二進位日誌。我們以一些列子來說明問題:

先看看如何在MySQL Server中直接查看有哪些二進位記錄檔及檔案中包含哪些事件。

先清空MySQL Server上的所有二進位日誌
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)

查看MySQL Server上的二進位日誌
mysql> show binary logs;
+---------------------+-----------+
| Log_name            | File_size |
+---------------------+-----------+
| VMS00781-bin.000001 |       120 |
+---------------------+-----------+

查看二進位日誌中的事件

mysql>show binlog events;
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
| VMS00781-bin.000001 |   4 | Format_desc |        36 |         120 | Server ver: 5.6.12-log, Binlog ver: 4 |
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

執行一些DML操作

mysql> delete from ab limit 2;
Query OK, 2 rows affected (1.01 sec)

重新開始一個新的記錄檔

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

執行一些DML操作

mysql> delete from ab limit 1;
Query OK, 1 row affected (0.00 sec)
mysql> delete from ab limit 2;
Query OK, 2 rows affected (0.01 sec)

查看MySQL Server上的二進位日誌
mysql> show binary logs;
+---------------------+-----------+
| Log_name            | File_size |
+---------------------+-----------+
| VMS00781-bin.000001 |       372 |
| VMS00781-bin.000002 |       515 |
+---------------------+-----------+

查看二進位日誌中的事件
mysql> show binlog events;
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
| VMS00781-bin.000001 |   4 | Format_desc |        36 |         120 | Server ver: 5.6.12-log, Binlog ver: 4 |
| VMS00781-bin.000001 | 120 | Query       |        36 |         192 | BEGIN                                 |
| VMS00781-bin.000001 | 192 | Table_map   |        36 |         238 | table_id: 204 (test.ab)               |
| VMS00781-bin.000001 | 238 | Delete_rows |        36 |         291 | table_id: 204 flags: STMT_END_F       |
| VMS00781-bin.000001 | 291 | Xid         |        36 |         322 | COMMIT /* xid=289981 */               |
| VMS00781-bin.000001 | 322 | Rotate      |        36 |         372 | VMS00781-bin.000002;pos=4             |
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
預設顯示可找到的第一個二進位記錄檔中的事件,包含了事件的開始位置、結束位置、事件類型、資訊等內容。可以看到,第一個事件為格式描述事件;第二個為查詢事件,事務開始;第三個為表映射事件,第四個為我們執行的刪除操作,第五個為Xid時間是自動認可事務的動作,第六個為日誌輪換事件,是我們執行flush logs開啟新記錄檔引起的。

查看指定的二進位日誌中的事件
mysql> show binlog events in 'VMS00781-bin.000002';
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
| VMS00781-bin.000002 |   4 | Format_desc |        36 |         120 | Server ver: 5.6.12-log, Binlog ver: 4 |
| VMS00781-bin.000002 | 120 | Query       |        36 |         192 | BEGIN                                 |
| VMS00781-bin.000002 | 192 | Table_map   |        36 |         238 | table_id: 204 (test.ab)               |
| VMS00781-bin.000002 | 238 | Delete_rows |        36 |         282 | table_id: 204 flags: STMT_END_F       |
| VMS00781-bin.000002 | 282 | Xid         |        36 |         313 | COMMIT /* xid=290004 */               |
| VMS00781-bin.000002 | 313 | Query       |        36 |         385 | BEGIN                                 |
| VMS00781-bin.000002 | 385 | Table_map   |        36 |         431 | table_id: 204 (test.ab)               |
| VMS00781-bin.000002 | 431 | Delete_rows |        36 |         484 | table_id: 204 flags: STMT_END_F       |
| VMS00781-bin.000002 | 484 | Xid         |        36 |         515 | COMMIT /* xid=290005 */               |
| VMS00781-bin.000002 | 515 | Query       |        36 |         593 | flush slow logs                       |
| VMS00781-bin.000002 | 593 | Query       |        36 |         671 | flush slow logs                       |
+---------------------+-----+-------------+-----------+-------------+---------------------------------------+
該命令還包含其他選項以便靈活查看
SHOW BINLOG EVENTS   [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
mysql> show binlog events in 'VMS00781-bin.000002' from 120 limit 2,3;
+---------------------+-----+-------------+-----------+-------------+---------------------------------+
| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                            |
+---------------------+-----+-------------+-----------+-------------+---------------------------------+
| VMS00781-bin.000002 | 238 | Delete_rows |        36 |         282 | table_id: 204 flags: STMT_END_F |
| VMS00781-bin.000002 | 282 | Xid         |        36 |         313 | COMMIT /* xid=290004 */         |
| VMS00781-bin.000002 | 313 | Query       |        36 |         385 | BEGIN                           |
+---------------------+-----+-------------+-----------+-------------+---------------------------------+

SHOW BINARY LOGS 等價於 SHOW MASTER LOGS
PURGE BINARY LOGS用於裡二進位日誌,如:
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

RESET MASTER 與 RESET SLAVE
前者清空index檔案中列出的所有二進位日誌,重設index檔案為空白,並建立一個新的二進位記錄檔,一般用於MASTER初次開機時。後者使SLAVE忘記其在MASTER二進位記錄檔中的複製位置,它會刪除master.info、relay-log.info 和所有中繼記錄檔並開始一個新的中繼記錄檔,以便於開始一個乾淨的複製。在使用RESET SLAVE前需先關閉 SLAVE複製線程。


上述方式可以查看到伺服器上存在的二進位記錄檔及檔案中的事件,但是想查看到檔案中具體的內容並應於恢複情境還得藉助mysqlbinlog這個工具。
查看:
shell> mysqlbinlog [options] log_file ...
比如:
mysqlbinlog [options] VMS00781-bin.000001
輸出內容會因記錄檔的格式以及mysqlbinlog工具使用的選項不同而略不同。二進位記錄檔中具體內容的含義以及mysqlbinlog的可用選項可參考相關手冊。這裡就一些需要特別注意的情況進行說明。

二進位記錄檔的格式包含行模式、語句模式和混合模式(也即有伺服器決定在什麼情況下記錄什麼類型的日誌),基於語句的日誌中事件資訊包含執行的語句等,基於行的日誌中事件資訊包含的是行的變化資訊等。混合模式的日誌中兩種類型的事件資訊都會記錄。為了便於查看記錄了行變化資訊的事件在當時具體執行了什麼樣的SQL語句可以使用mysqlbinlog工具的-v(--verbose)選項,該選項會將行事件重構成被注釋掉的偽SQL語句,如果想看到更詳細的資訊可

以將該選項給兩次如-vv,這樣可以包含一些資料類型和元資訊的注釋內容,如

mysqlbinlog -v VMS00781-bin.000001
mysqlbinlog -vv VMS00781-bin.000001

另外mysqlbinlog和可以通過--read-from-remote-server選項從遠程伺服器讀取二進位記錄檔,這時需要一些而外的串連參數,如--host,--password ,--port,--user,--socket,--protocol等,這些參數僅在指定了--read-from-remote-server後有效。

無論是本地二進位記錄檔還是遠程伺服器上的二進位記錄檔,無論是行模式、語句模式還是混合模式的二進位記錄檔,被mysqlbinlog工具解析後都可直接應用與MySQL Server進行基於時間點、位置或資料庫的恢複。
比如:
mysqlbinlog  VMS00781-bin.000001 | mysql -uusername -p

或者先將二進位日誌寫到.sql檔案中,然後在mysql用戶端執行這些檔案,比如:
mysqlbinlog  VMS00781-bin.000001 > /tmp/VMS00781-bin.000001.sql
mysql>source /tmp/VMS00781-bin.000001.sql

這裡有幾個比較關鍵的參數:
--database=db_name, -d db_name
該參數使mysqlbinlog僅從本地二進位日誌中輸出指定的db_name被use命令選作預設資料庫時產生的日誌事件。行為類似於mysqld的--binlog-do-db命令。若該參數指定了多次那麼只有最後一次指定的內容有效。參數具體的影響依賴於二進位日誌格式,只有在使用行模式的日誌格式時該參數才能保證一致性。基於語句或混合模式的二進位日誌格式中因為可能存在跨庫的更新導致--database參數表現不同的行為,從而不能保證資料一致性。
mysqlbinlog  VMS00781-bin.000001  -d testDB | mysql -uusername -p

--force-read, -f
使用了該參數後mysqlbinlog工具在讀取到不能識別的日誌事件時會列印出warning,忽略事件並繼續執行,沒有此參數的情況下mysqlbinlog會停止。
mysqlbinlog  VMS00781-bin.000001  -d testDB -f | mysql -uusername -p

--no-defaults
阻止mysqlbinlog工具從任何設定檔讀取參數, .mylogin.cnf除外(以便於安全的儲存密碼)
mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults| mysql -uusername -p

--start-datetime=datetime
--stop-datetime=datetime
上邊一組參數用於指定恢複開始時間點和結束時間點,可以一起或單獨給出,也可與--start-position,--stop-position混用
mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults --start-datetime=datetime --stop-position=NNNNNN | mysql -uusername -p

--start-position=N, -j N
--stop-position=N
上邊一組參數用於指定恢複開始位置和結束位置,可以一起或單獨給出也可與--start-datetime,--stop-datetime混用
mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

需要還原的二進位記錄檔通常不止一個,那麼要是有多個二進位記錄檔需要還原呢,該注意些什嗎?
首先,可以選擇上述直接重新導向到mysql用戶端的方法或先匯入到.sql檔案然後執行.sql檔案的方式逐個應用二進位記錄檔。但是這裡存在一個隱患,及,如果二進位日誌中記錄有使用暫存資料表的情況,那麼當上一個日誌應用完,在新串連中應用下一個二進位日誌時暫存資料表就會丟失,引起錯誤。所以,安全的方式是多個二進位檔案同時執行。
如:
mysqlbinlog  VMS00781-bin.000001  VMS00781-bin.000002 VMS00781-bin.000003 --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

或mysqlbinlog  VMS00781-bin.00000[1-3] --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

當多個二進位記錄檔同時執行時,--start-position和--stop-position分別只應用於第一個列出的二進位記錄檔和最後一個列出的二進位記錄檔

當然也可以先將多個二進位記錄檔的輸出導到同一個.sql檔案最後在執行該.sql檔案(適用於日誌量不多的情況)
跪 MYSQL 資料恢複工具 或資料恢複方法!!!!!

只要恢複軟體的話find,WHIX什麼的就可以恢複,但是資料庫很容易被覆蓋如果您資料重要的話建議別自己嘗試了,而且具體操作也不是幾句話就能說清楚的 你直接百度HI我吧 我可以給你先遠程看一下。
 
mysql中怎用mysqlbinlog工具將記錄檔產生txt檔案出來分析

在cmd下或者linux終端命令列執行

mysqlbinlog -u root -p密碼 二進位檔案名 >d:\\test.sql
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.