1. 程式人生 > MYSQL進階教學 ><p>MySQL 的邏輯恢復</p>

<p>MySQL 的邏輯恢復</p>

邏輯恢復通常支援兩種恢復方式:完全恢復、不完全恢復,本小節結合 mysqldump 和 mysqlbinlog 工具,介紹這兩種恢復方式的操作步驟。

1. 完全恢復

MySQL 中,邏輯備份的完全恢復相對比較簡單,一般包含兩個步驟:

  • 恢復最新的全備檔案
shell> mysql -uroot -p < backup.sql
  • 恢復日誌檔案
shell> mysqlbinlog binlog-file | mysql -uroot -p

實際案例:完整的mysqldump備份與恢復

1. 中午12點,備份資料庫

[mysql@localhost ~]$ mysqldump --single-transaction -F -uroot -p --databases tempdb > /tmp/db_tempdb.sql
Enter password: 

[mysql@localhost ~]$ ls -lrt db_tempdb.sql 
-rw-r--r-- 1 mysql mysql 19602842 Jul 23 12:01 db_tempdb.sql

引數 --single-transaction 表示給 InnoDB 表生成快照,保持資料一致性

引數 -F 表示生成一個新的日誌檔案

此時表 customer 的資料如下:

mysql> select * from customer;
+----+-----------+------------+------------+--------+---------+
| id | last_name | first_name | birth_date | gender | balance |
+----+-----------+------------+------------+--------+---------+
| 1 | 111 | 111 | 1998-01-25 | 1 | 10 | | 2 | 222 | 222 | 2020-07-15 | 1 | 20 | +----+-----------+------------+------------+--------+---------+ 2 rows in set (0.00 sec)

2. 13點,表 customer 插入新的資料:

mysql> insert into customer(id,last_name,first_name,birth_date,
gender,balance) values(3,333,333,'2020-08-10',1,30); Query OK, 1 row affected (0.00 sec) mysql> insert into customer(id,last_name,first_name,birth_date,gender,balance) values(4,444,444,'2020-09-10',1,40); Query OK, 1 row affected (0.00 sec)

3. 14點,資料庫故障,需要恢復資料:

[mysql@localhost ~]$ mysql -uroot -p tempdb < /tmp/db_tempdb.sql
Enter password: 

恢復後表 customer 的資料如下:

mysql> select * from customer;
+----+-----------+------------+------------+--------+---------+
| id | last_name | first_name | birth_date | gender | balance |
+----+-----------+------------+------------+--------+---------+
|  1 | 111       | 111        | 1998-01-25 | 1      |      10 |
|  2 | 222       | 222        | 2020-07-15 | 1      |      20 |
+----+-----------+------------+------------+--------+---------+
2 rows in set (0.00 sec)

4. 從 binlog 日誌恢復 12 點備份以來的資料(mysql-bin.000021 為 12 點備份後產生的新的 binlog 日誌):

[mysql@localhost ~]$ mysqlbinlog mysql-bin.000021 | mysql -uroot -p tempdb
Enter password: 

恢復日誌後,表 customer 的資料如下:

mysql> select * from customer;
+----+-----------+------------+------------+--------+---------+
| id | last_name | first_name | birth_date | gender | balance |
+----+-----------+------------+------------+--------+---------+
|  1 | 111       | 111        | 1998-01-25 | 1      |      10 |
|  2 | 222       | 222        | 2020-07-15 | 1      |      20 |
|  3 | 333       | 333        | 2020-08-10 | 1      |      30 |
|  4 | 444       | 444        | 2020-09-10 | 1      |      40 |
+----+-----------+------------+------------+--------+---------+
4 rows in set (0.00 sec)

表 customer 的資料全部恢復。

2. 不完全恢復

MySQL 中,不完全恢復分為基於時間點的恢復和基於位置的恢復。一般來說,不完全恢復需要跳過一些語句,比如說,由於誤操作刪除了一張表,這時用完全恢復是沒有用的,因為 binlog 日誌還存在誤操作的語句,我們需要跳過誤操作語句,在恢復後面的語句,來完成恢復。

2.1 基於時間點恢復

以下是基於時間點恢復的操作步驟:

1. 13點,運維人員誤刪除表 customer,可以用備份和 binlog 日誌恢復到故障前(中午 12 點,備份資料庫)

[mysql@localhost ~]$ mysql -uroot -p tempdb < /tmp/db_tempdb.sql
Enter password: 

[mysql@localhost ~]$ mysqlbinlog --stop-datetime="2020-07-23 11:59:59" mysql-bin.000021 | mysql -uroot -p tempdb
Enter password:

2. 跳過故障時間點,繼續使用後面的binlog日誌完成恢復。

[mysql@localhost ~]$ mysqlbinlog --start-datetime="2020-07-23 12:01:00" mysql-bin.000021 | mysql -uroot -p tempdb
Enter password:

基於時間的恢復,稍顯粗糙,因為同一時間點可能會有很多條 sql 在執行,那就會跳過一些正常執行的sql。一般我們會考慮使用更為精確的基於位置的恢復。

2.2 基於位置恢復

以下是基於位置恢復的操作步驟:

1. 執行如下 mysqlbinlog 命令:

[mysql@localhost ~]$ mysqlbinlog --start-datetime="2020-07-23 11:55:00" --stop-datetime="2020-07-23 12:05:00" mysql-bin.000021 > /tmp/temp_restore.sql

從 temp_restore.sql 找到誤操作語句前後的位置號為 383 和 437:

2. 恢復備份檔案,使用 binlog 日誌跳過故障語句的位置號,完成恢復。

[mysql@localhost ~]$ mysql -uroot -p tempdb < /tmp/db_tempdb.sql
Enter password: 

[mysql@localhost ~]$ mysqlbinlog --stop-position="383" mysql-bin.000021 | mysql -uroot -p tempdb
Enter password:

[mysql@localhost ~]$ mysqlbinlog --start-position="437" mysql-bin.000021 | mysql -uroot -p tempdb
Enter password:

3. 小結

本小節通過 mysqldump 和 mysqlbinlog 工具,介紹了邏輯恢復的兩種恢復方式:完全恢復、不完全恢復。

  • 邏輯備份的完全恢復相對簡單,恢復最新的全備檔案和日誌檔案即可;
  • 不完全恢復分為基於時間點的恢復和基於位置的恢復,通常適用於人為誤操作的恢復場景。