備份對於數據庫而言是至關重要的。當數據文件發生損壞、MySQL服務出現錯誤、系統內核崩潰、計算機硬件損壞或者數據被誤刪等事件時,使用一種有效的數據備份方案,就可以快速解決以上所有的問題。MySQL提供了多種備份方案,包括:邏輯備份、物理備份、全備份以及增量備份,你可以選擇最適合自己使用的方式備份數據。
物理備份通過直接復制包含有數據庫內容的目錄與文件實現,這種備份方式適用於對重要的大規模數據進行備份,並且要求實現快速還原的生產環境。典型的物理備份就是復制 MySQL數據庫的部分或全部目錄,物理備份還可以備份相關的配置文件。但采用物理備份需要MySQL處於關閉狀態或者對數據庫進行鎖操作,防止在備份的過程中改變發送數據。物理備份可以使用mysqlbackup對InnoDB數據進行備份,使用mysqlhotcopy對MyISAM數據進行備份。另外,也可以使用文件系統級別的cp、scp、tar、rsync等命令。
邏輯備份通過保存代表數據庫結構及數據內容的描述信息實現,如,保存創建數據結構以及添加數據內容的SQL語句,這種備份方式適用於少量數據的備份與還原。邏輯備份需要查詢MySQL服務器獲得數據結構及內容信息,因為需要查詢數據庫信息並將這些信息轉換為邏輯格式,所以相對於物理備份而言比較慢。邏輯備份不會備份日志、配置文件等不屬於數據庫內容的資料。邏輯備份的優勢在於不管是服務層面、數據庫層面還是數據表層面的備份都可以實現,由於是以邏輯格式存儲的,所以這種備份與系統、硬件無關。
全備份將備份某一時刻所有的數據,增量備份僅備份某一段時間內發生過改變的數據。通過物理或邏輯備份工具就可以完成完全備份,而增量備份需要開啟MySQL二進制日志,通過日志記錄數據的改變,從而實現增量差異備份。
下面將通過一些案例介紹如何使用MySQL提供的工具命令進行邏輯備份。使用 mysqldump 備份數據庫,默認該工具會將SQL語句信息導出至標准輸出,可以通過重定向將輸出保存至文件:
(1)備份所有的數據庫
mysqldump -u root -p --all-databases > bak.sql
(2)備份指定的數據庫db1、db2以及db3
mysqldump -u root -p --databases db1 db2 db3 > bak.sql
(3)備份db數據庫,當僅備份一個數據庫時,--databases可以省略
mysqldump -u root -p db4 > bak.sql
mysqldump -u root -p --databases db4 > bak.sql
兩者之間的差別在於不使用 --databases 選項,則備份輸出信息中不會包含CREATE DATABASE或USE語句。不使用 --databases 選項備份的數據文件,在后期進行數據還原操作時,如果該數據庫不存在,必須先創建該數據庫。
使用mysql命令讀取備份文件,實現數據還原功能:
mysql -u root -p < bak.sql
mysql -u root -p db4 < bak.sq1
案例:下面將 testDB 數據庫中的內容導出成一個文件,並保存到 /home/目錄下
[root@192 home]# mysqldump -u root -p testDB > /home/bak.sql Enter password:
然后進入MySQL數據庫,徹底刪除 testDB 數據庫,然后重新創建 testDB 數據庫
mysql> select * from testDB.mybook; +--------+-------+-------+
| name | price | pages |
+--------+-------+-------+
| Linux2 | 40 | 200 |
| Linux4 | 60 | 400 |
+--------+-------+-------+
2 rows in set (0.00 sec) mysql> drop database testDB; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec) mysql> exit
創建數據庫
mysql> create database testDB; Query OK, 1 row affected (0.00 sec) mysql> exit Bye
將備份的數據導入到剛新建的 testDB 數據庫中
[root@192 home]# mysql -u root -p testDB < /home/bak.sql Enter password:
查看數據是否恢復成功
[root@192 home]# mysql -u root -p Enter password: mysql> select * from testDB.mybook; +--------+-------+-------+
| name | price | pages |
+--------+-------+-------+
| Linux2 | 40 | 200 |
| Linux4 | 60 | 400 |
+--------+-------+-------+
2 rows in set (0.00 sec)