天天看點

使用mysqldump+binlog還原資料庫

binlog日志非常關鍵,它記錄了所有的DDL和DML的資料增删改操作,使用binlog日志可以恢複資料,做主從的複制。是以,無論是開發環境還是測試環境,一定都要開啟binlog功能。

下面進入主題,在本地環境模拟生産資料庫故障,利用全量備份和binlog日志恢複資料庫的過程。

1、測試環境資訊:資料庫hse_whj,測試表whj_a,表初始資料量是10條。

MariaDB [hse_whj]> show tables;
+-------------------+
| Tables_in_hse_whj |
+-------------------+
| t_pm_factory      |
| whj_a             |
+-------------------+
2 rows in set (0.00 sec)

MariaDB [hse_whj]> select count(1) from whj_a;
+----------+
| count(1) |
+----------+
|       10 |
+----------+
1 row in set (0.03 sec)

MariaDB [hse_whj]> 
           

2、對hse_whj資料庫做一個全量備份,備份工具使用mysqldump。備份檔案存放路徑是根目錄下的backup_whj。

[[email protected] /]# mysqldump -uroot -p --single-transaction --flush-logs --master_data=2 -E -R -B hse_whj > ./backup_whj/hse_whj_full.sql
Enter password: 
[[email protected] /]# cd backup_whj
[[email protected] backup_whj]# ls
hse_whj_full.sql
[[email protected] backup_whj]# 
           

mysqldump參數說明:(1)--single-transaction 擷取備份的一緻性,隻對innodb引擎有效,但不能隔離DDL操作

                                   (2)--flush-logs 開始備份前重新整理日志

                                   (3)--master_data 把binlog的位置和檔案名追加到輸出檔案中。如果為1就會輸出CHANGE MASTER 指令;如果為2就會輸出的CHANGE MASTER指令前添加注釋資訊

                                   (4)-E 指定備份事件

                                   (5)-R 指定備份存儲過程及自定義函數

                                   (6)-B 指定備份的資料庫

3、向whj_a表裡新增1條資料,這時表資料量是11條,而且這條資料是在備份結束之後新增的。

MariaDB [hse_whj]> INSERT INTO whj_a
    -> VALUES(11);
Query OK, 1 row affected (0.10 sec)

MariaDB [hse_whj]> select count(1) from whj_a;
+----------+
| count(1) |
+----------+
|       11 |
+----------+
1 row in set (0.01 sec)

MariaDB [hse_whj]> 
           

4、模拟事故,删除資料hse_whj。

MariaDB [hse_whj]> drop database hse_whj;
Query OK, 2 rows affected (0.32 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hse01              |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.03 sec)

MariaDB [(none)]> 
           

檢視備份後新增的binlog檔案

[[email protected] backup_whj]# ls
hse_whj_full.sql
[[email protected] backup_whj]# grep CHANGE hse_whj_full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='master-log.000038', MASTER_LOG_POS=403;
[[email protected] backup_whj]# 
           

5、這時候不要慌張,先檢視備份後新增的和目前的binlog日志,記錄事故pos點。

MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000038 |      708 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> show binlog events in 'master-log.000038'\G
*************************** 1. row ***************************
   Log_name: master-log.000038
        Pos: 4
 Event_type: Format_desc
  Server_id: 7
End_log_pos: 256
       Info: Server ver: 10.2.14-MariaDB-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: master-log.000038
        Pos: 256
 Event_type: Gtid_list
  Server_id: 7
End_log_pos: 315
       Info: [0-8-3,0-7-80]
*************************** 3. row ***************************
   Log_name: master-log.000038
        Pos: 315
 Event_type: Binlog_checkpoint
  Server_id: 7
End_log_pos: 359
       Info: master-log.000037
*************************** 4. row ***************************
   Log_name: master-log.000038
        Pos: 359
 Event_type: Binlog_checkpoint
  Server_id: 7
End_log_pos: 403
       Info: master-log.000038
*************************** 5. row ***************************
   Log_name: master-log.000038
        Pos: 403
 Event_type: Gtid
  Server_id: 7
End_log_pos: 445
       Info: BEGIN GTID 0-7-81
*************************** 6. row ***************************
   Log_name: master-log.000038
        Pos: 445
 Event_type: Query
  Server_id: 7
End_log_pos: 544
       Info: use `hse_whj`; INSERT INTO whj_a
VALUES(11)
*************************** 7. row ***************************
   Log_name: master-log.000038
        Pos: 544
 Event_type: Xid
  Server_id: 7
End_log_pos: 575
       Info: COMMIT /* xid=1083 */
*************************** 8. row ***************************
   Log_name: master-log.000038
        Pos: 575
 Event_type: Gtid
  Server_id: 7
End_log_pos: 617
       Info: GTID 0-7-82
*************************** 9. row ***************************
   Log_name: master-log.000038
        Pos: 617
 Event_type: Query
  Server_id: 7
End_log_pos: 708
       Info: drop database hse_whj
9 rows in set (0.01 sec)

MariaDB [(none)]> 
           

通過讀取日志發現出現問題的pos是617到708之間。語句在info行可以看到。

6、移動備份後新産生的binlog日志,并轉成可以編輯的sql檔案,編輯sql檔案去除事故語句drop database hse_whj

[[email protected] /]# cp ./var/lib/mysql/master-log.000038 ./backup_whj/master-log.000038
[[email protected] /]# cd backup_whj
[[email protected] backup_whj]# ls
hse_whj_full.sql  master-log.000038
[[email protected] backup_whj]# mysqlbinlog -d hse_whj master-log.000038 > master-log.sql
[[email protected] backup_whj]# ls
hse_whj_full.sql  master-log.000038  master-log.sql
[[email protected] backup_whj]# vi master-log.sql
           

7、先恢複全量備份,在恢複全量備份之前要停止記錄binlog,可以修改配置檔案,重新開機資料庫服務。避免恢複過程記錄到binlog,對日志造成幹擾。

[[email protected] backup_whj]# ls
hse_whj_full.sql  master-log.000038  master-log.sql
[[email protected] backup_whj]# mysql -uroot -p < hse_whj_full.sql
Enter password: 
[[email protected] backup_whj]# 
           

8、binlog恢複

[[email protected] backup_whj]# ls
hse_whj_full.sql  master-log.000038  master-log.sql
[[email protected] backup_whj]# mysql -uroot -p < master-log.sql
Enter password: 
[[email protected] backup_whj]# 
           

9、驗證

+--------------------+
| Database           |
+--------------------+
| hse01              |
| hse_whj            |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.02 sec)

MariaDB [(none)]> use hse_whj;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [hse_whj]> select count(1) from whj_a;
+----------+
| count(1) |
+----------+
|       11 |
+----------+
1 row in set (0.01 sec)

MariaDB [hse_whj]> 
           

通過驗證發現hse_whj表資料已經是11條了,恢複了之前的資料。不要忘記再開啟二進制日志。

繼續閱讀