在上一篇文章中我們提到熱拷貝(MySQL備份與恢復之熱拷貝),熱拷貝也就是在MySQL或者其他數據庫服務在運行的情況下使用mysqlhotcopy命令進行備份。這篇文章我們講解怎樣保證數據一致性。現在假設有這樣一種情況,我們總是在凌晨對數據庫進行備份,假設在凌晨之后發生數據庫異常,并且導致數據丟失。這樣凌晨之前的數據我們已經做了備份,但是凌晨到發生異常這段時間的數據就會丟失(沒有binlog的情況下)。好在InnoDB存儲引擎支持事務,也支持Binlog,凌晨到發生異常這段時間的數據就可以通過日志文件進行備份。所以,日志文件是非常重要,非常關鍵的。我們備份不僅要對數據進行備份,如果條件允許還需要對二進制文件進行備份。當然備份好數據之后,可以清空二進制文件,但如果為了長遠考慮,比如恢復出來的數據并不是我們想要的,我們就需要備份二進制文件了。還有一點切記,恢復數據需要轉到測試數據庫中做,不要在生產環境中做。待測試庫中測試沒有問題,再在生產環境中做。
示意圖

保證數據一致性模擬
第一步,驗證數據
| [root@serv01 databackup]# rm -rf *[root@serv01 databackup]# lsmysql> use larrydb;Database changedmysql> show tables;+-------------------+| Tables_in_larrydb |+-------------------+| class || stu |+-------------------+2 rows in set (0.00 sec)mysql> select * from class;+------+--------+| cid | cname |+------+--------+| 1 | linux || 2 | oracle |+------+--------+2 rows in set (0.00 sec)mysql> select * from stu;+------+---------+------+| sid | sname | cid |+------+---------+------+| 1 | larry01 | 1 || 2 | larry02 | 2 |+------+---------+------+2 rows in set (0.00 sec) |
第二步,備份數據
| [root@serv01 databackup]# mysqldump -uroot -p123456 --database larrydb > larrydb.sql[root@serv01 databackup]# ll larrydb.sql -rw-r--r--. 1 root root 2613 Sep 10 19:34 larrydb.sql |
第三步,清空日志,因為已經做了備份,所以不需要以前的日志
| mysql> show binary logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin.000001 | 27320 || mysql-bin.000002 | 1035309 || mysql-bin.000003 | 1010 || mysql-bin.000004 | 22809 || mysql-bin.000005 | 9860 || mysql-bin.000006 | 5659 || mysql-bin.000007 | 126 || mysql-bin.000008 | 10087 || mysql-bin.000009 | 8293 || mysql-bin.000010 | 476 || mysql-bin.000011 | 218 || mysql-bin.000012 | 126 || mysql-bin.000013 | 1113 || mysql-bin.000014 | 1171 || mysql-bin.000015 | 126 || mysql-bin.000016 | 107 || mysql-bin.000017 | 107 || mysql-bin.000018 | 13085 |+------------------+-----------+18 rows in set (0.00 sec)mysql> reset master;Query OK, 0 rows affected (0.01 sec)mysql> show binary logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin.000001 | 107 |+------------------+-----------+1 row in set (0.00 sec) |