1. 程式人生 > 實用技巧 >MySQL資料庫的備份還原至最新狀態

MySQL資料庫的備份還原至最新狀態

模擬資料庫在某次備份後但未達到下次備份時間中,被意外刪除的資料

此處恢復hello資料庫和裡面的students表

使用工具:均為mariadb-server自帶

1 mysqldump 
2 mysqlbinlog

前提條件:

  二進位制日誌檔案必須開啟

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      7674 |
|
mysql-bin.000002 | 264 | | mysql-bin.000003 | 15864234 | | mysql-bin.000004 | 30379 | | mysql-bin.000005 | 1038814 | | mysql-bin.000006 | 264 | | mysql-bin.000007 | 245 | +------------------+-----------+

但因為我伺服器上有過二進位制日誌檔案,清除掉這些二進位制日誌

1 MariaDB [hello]> reset master;
MariaDB [hello]> show master logs;
+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 245 | +------------------+-----------+
現在就是個乾淨的日誌檔案
1 cat /etc/my.cnf
2 [mysqld] 3 log_bin=/data/logbin/mysql-bin
這裡指定了二進位制日誌檔案的位置,實際生產中,建議二進位制日誌檔案放在其他盤上,實在沒有,最好也在其他分割槽上


sql_log_bin=ON|OFF:是否記錄二進位制日誌,預設ON
log_bin=/PATH/BIN_LOG_FILE:指定檔案位置;預設OFF,表示不啟用二進位制日誌功能,上述兩項都開啟才可
註釋:MariaDB [hello]>這個表示在資料庫中執行的,沒有這個就表示在shell命令中執行的
一、開始全域性備份重定向到 /data/下,備份檔案後的檔名為all.sql
mysqldump -A --master-data=2 > /data/all.sql

#註釋:此處-A表示全域性備份,--master-data=後面有兩個選項,分別是1和2,1可以用來配合主從複製,此處我沒有配置主從伺服器就選擇2就可以

1和2區別1是命令,而2只是個註釋

1:

2:

mysql -e 'show master logs'
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
+------------------+-----------+

#註釋:此處為了看的清除,我清除了之前的二進位制日誌檔案,現在的位置是245(初始的二進位制日誌檔案就是245)

二、切換到hello表,查看錶中的資料,以做後續參考

MariaDB [mysql]> use hello
MariaDB [hello]> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
|    26 | a             |  20 | F      |    NULL |      NULL |
|    27 | b             |  20 | F      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+

三、對資料進行修改

MariaDB [hello]> insert students (name,age)values('測試1',100);
MariaDB [hello]> insert students (name,age)values('測試2',101);
MariaDB [hello]> insert students (name,age)values('測試3',102);
MariaDB [hello]> update students set classid=111 where stuid=27

備份後修改前:

修改後:

四、開始模擬資料庫被異常刪除了(實驗環境這樣,實際生產中千萬不要用這種命令)

rm -rf /var/lib/mysql/*

五、先禁止使用者通過網路訪問,只能使用本地的套接字來連線

vim /etc/my.cnf
skip-networking

六、開始重啟服務

systemctl restart mariadb

註釋:重新啟動資料庫,會生成嶄新的資料庫檔案,但裡面是沒有資料的

七、臨時關閉二進位制日誌檔案

MariaDB [(none)]> set sql_log_bin=off;

註釋:還原資料的生成二進位制日誌檔案沒有什麼用,其他使用者此時也不能訪問,此處暫時不用記錄二進位制日誌檔案

八、檢視之前的二進位制日誌檔案更新到哪裡了

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1175 |
| mysql-bin.000002 |     30379 |
| mysql-bin.000003 |   1038814 |
| mysql-bin.000004 |       245 |
+------------------+-----------+

註釋:此處1,2,3是上次備份之後生成的,需要匯出的,而這個4是剛剛啟動時生成的(每次重啟服務之後會重新生成二進位制日誌)沒有用,可以不用匯出

九、其他視窗開啟,匯出二進位制日誌檔案

mysqlbinlog mysql-bin.000001 > /data/inc.sql
mysqlbinlog mysql-bin.000002 >> /data/inc.sql
mysqlbinlog mysql-bin.000003 >> /data/inc.sql

註釋:此處特地分開寫,後面兩個是追加,mysqlbinlog是匯出二進位制日誌檔案的命令

十、回到之前的視窗

把之前備份的檔案匯入進資料庫,還有之前生成的二進位制日誌檔案,也匯入進資料庫

MariaDB [test]> source /data/all.sql;
MariaDB [test]> source /data/inc.sql

十一、此時檢視上次備份後,新增和修改的資料是否恢復成功了。

MariaDB [hello]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |
| mysql              |
| performance_schema |
| test               |
+--------------------+

註釋:此時hello資料庫已經恢復成功了

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| students        |
| teachers        |
| testlog         |
| toc             |
+-----------------+

註釋:此時可以檢視到之前的students表恢復成功了

註釋:通過select * from students;可以檢視到之前修改過的資料庫檔案都恢復成功了。

至此恢復完成