MySQL的備份與恢復
1.備份
按備份時服務器是否在線來劃分,備份可分爲:
(1).熱備份:數據庫在線同時服務正常運行,此時進行的備份 (非常不安全,容易造成數據不一致)
(2).溫備份:數據庫服務正常運行,但數據只能讀不能寫,此時進行的備份(較安全)
(3).冷備份:服務器關閉,此時進行的備份(最安全,但最不可行)
按備份的內容來劃分:備份可分爲:
(1).邏輯備份:支持跨平臺,備份的是SQL語句(DDL和insert語句),以文本形式存儲,較佔空間,不過可使用壓縮進行節約空間
(2).物理備份:直接複製數據文件進行的備份,較邏輯備份速度較快
按備份涉及的數據範圍來劃分,備份可分爲:
(1).完全備份:備份整個數據庫
(2).增量備份:數據庫從上一次完全備份或者最近一次的增量備份以來改變的內容的備份
(3).差異備份:基於的是最近一次的完整數據備份,差異備份僅捕獲自該次完整備份後發生更改的數據。
2.備份哪些東西以及備份策略:
(1).二進制日誌
(2).InnoDB的日誌文件
(3).mysqld的主配置文件 (例/etc/my.cnf)
(4).從服務器位置信息
(5).中繼日誌 (在從服務器上的)
備份策略:二進制日誌要獨立備份,一定不能和數據文件在同一個磁盤上,備份之前要確定備份方案,然後再進行備份。
3.備份工具
mysqldump實現的是邏輯備份,對於INNODB的引擎實行的是熱備份,其它引擎則是溫備份。
SELECT INTO OUTFILE 指定僅備份某個表的部分數據或字段
Ibbackup 是一種商業軟件備份工具,實現的是物理備份,對於INNODB的引擎實行的是熱備份;其它引擎則是溫備份
Filesystem (copy files) 基於文件系統的備份,直接複製數據庫文件,是冷備份,物理備份
Snapshot 快照備份,幾乎熱備份,物理備份
mysqlhotcopy 只能備份MyIsam引擎,是冷備份
(1).mysqldump的使用
選項:
--all-databases 備份所有數據庫
--databases db_name 備份某個數據庫
--lock-tables 鎖定表(非常不建議使用此選項)
--lock-all-tables 鎖定所有的表
--events 備份EVENT的相關信息
--no-data 只備份DDL語句、備份表結構,不備份數據(一般不使用)
--master-data=n 備份的時候同時導出二進制日誌文件和位置;如果n爲1,則把信息保存爲CHANGE MASTER語句;如果n爲2,則把信息保存爲註釋掉的CHANGE MASTER語句。
--routines 將存儲過程和存儲函數定義備份
--single-transaction 實現熱備(只能熱備InnoDB引擎的)
--triggers 備份觸發器
舉例:備份lh數據庫至/backup目錄下,並以日期+時間的方式命名。
# mysqldump –databases lh –lock-all-tables –flush-logs –master-data=2 > /backup/lh-`date +%F-%H-%M-%S`.sql
還原數據庫時:
# mysql
mysql> SET SQL_LOG_BIN=0;
mysql > SOURCE /backup/lh-20120418-12-12-10.sql;
mysql> SET SQL_LOG_BIN=1;
說明:此時還原數據庫時要關閉二進制日誌。
(2).使用cp、tar命令進行物理備份
使用cp、tar等命令進行復制或歸檔數據庫
# service mysqld stop
# cp –a /mydata/data/* /backup/alldata- `date +%F-%H-%M-%S`/
# tar jcf /backup/ alldata- `date +%F-%H-%M-%S`.tar.bz2 /mydata/data/*
說明:以上兩個命令的備份,必須要停止mysql服務才能備份,這裏假設mysql的數據路徑是:/mydata/data。
(3).使用xtrabackup進行備份
xtrabackup是percona組織的一款開源備份軟件,可實現完全備份和增量備份,是世界上惟一一款開源的能夠對innodb和xtradb引擎的數據庫進行熱備的工具。
完全備份:
# innobackupex --user=root --password=123456 /backup
恢復數據的時候要先準備一個完全備份才能實現恢復:
# innobackupex --apply-log /backup/ 2012-04-18_12-12-10
# innobackupex --copy-back /backup/2012-04-18_12-12-10
增量備份:
第一次增量備份:
# innobackupex --incremental /backup --incremental-basedir=/backup/2012-04-18_12-12-10
說明:-incremental-basedir後面跟的是完全備份的數據庫的路徑(要想增量備份,前提必須已經實現完全備份),並且此時在/backup目錄下,生成了一個2012-04-18_13-13-10的增量備份的目錄
恢復的時候也需要準備才能恢復數據,但和完全備份準備的方式不同:
# innobackupex --apply-log --redo-only /backup/2012-04-18_12-12-10
# innobackupex --apply-log --redo-only \
/backup/2012-04-18_12-12-10 --incremental-dir=/backup/2012-04-18_13-13-10
說明:此時數據恢復成功,如果有多個增量備份,則重複執行第二條語句(綠色的語句),並且執行第二條語句的時候,第一次增量備份的先執行,依次執行後面的增量備份。