mysql常用的三種備份方法

mysql按照備份恢復方式分爲邏輯備份和物理備份

邏輯備份是備份sql語句,在恢復的時候執行備份的sql語句實現數據庫數據的重現

物理備份就是備份數據文件了,比較形象點就是cp下數據文件,但真正備份的時候自然不是的cp這麼簡單

這2種備份各有優劣,一般來說,物理備份恢復速度比較快,佔用空間比較大,邏輯備份速度比較慢,佔用空間比較小

下面介紹以下3種常用的備案方法


一、mysqldump工具備份

mysqldump由於是mysql自帶的備份工具,所以也是最常用的mysql數據庫的備份工具。支持基於InnoDB的熱備份。但由於是邏輯備份,所以速度不是很快,適合備份數據量比較小的場景。
mysqldump完全備份+二進制日誌 —>實現時間點恢復

溫備:

在使用MyISAM引擎中,只能使用溫備份,這時候要防止數據的寫入,所以先加上讀鎖

這時候可以進入數據庫手動加讀鎖。這樣比較麻煩,在mysqldump工具中直接有一個加鎖的選項

mysqldump --databases mydatabase --lock-all-tables --flush-logs> /tmp/backup-`date +%F-%H-%M`.sql

如果是針對某張表備份,只要在數據庫名稱後面加上表名稱就行了

這裏注意,要實現時間點的恢復,加上--flush-logs選項,在使用備份文件恢復後,然後再基於二進制日誌進行時間點的恢復

時間點的恢復方法

mysqlbinlog mysql-bin.000000x > /tmp/PointTime.sql

然後用mysql命令導入這個sql腳本就行了

熱備:
如果使用的是InnoDB引擎,就不必進行對數據庫加鎖的操作,加一個選項既可以進行熱備份:--single-transaction
mysqldump --databases mydb --single-transaction  --flush-logs --master-data=2 > /tmp/backup-`date +%F-%H-%M`.sql

注意點
恢復的時刻關閉二進制日誌
mysql>set sql_log_bin=0;
因爲這是基於邏輯備份方式,在恢復日誌時會執行sql語句插入數據,而恢復時候插入數據的日誌沒有意義。

二、基於LVM快照備份

在物理備份中 ,有基於文件系統的物理備份(LVM的快照),也可以直接用tar之類的命令打包。但這些只能進行冷備份
不同的存儲引擎能備份的級別也不一樣,MyISAM能備份到表級別,而InnoDB不開啓每表一文件的話就只能備份整個數據庫。

下面就介紹下使用LVM的快照功能進行備份
爲了安全 首先在數據庫上施加讀鎖
mysql>FLUSH TABLES WITH READ LOCK;

刷新一下二進制日誌,便於做時間點恢復

mysql>FLUSH LOGS;

然後創建快照卷

lvcreate –L 1G –s –n data-snap –p –r /dev/myvg/mydata

最後進入數據庫釋放讀鎖

UNLOCK TABLES;

掛載快照捲進行備份

mount –r /dev/myvg/data-snap /mnt/snap

然後對/mnt/snap下的文件進行打包備份
還原的時候,關閉mysqld,然後備份二進制日誌後將原來備份的文件還原進去,然後通過二進制日誌還原到出錯的時間點(通過二進制還原時間點的時候不要忘了暫時關閉二進制日誌)
 

三、使用percona提供的xtrabackup(推薦)

支持InnoDB的物理熱備份,支持完全備份,增量備份,而且速度非常快,而且支持InnoDB引擎的數據在不同數據庫遷移
爲了讓xtrabackup支持更多的功能擴展,配置InnoDB每表一個文件的功能
在my.cnf的mysqld中加入此項: innodb_file_per_table=1
此項不啓用將不支持備份單獨的表
但如果之前沒有啓用這個選項,要實現單表一文件的話,可以用mysqldump導出數據,然後啓用該選項,恢復回去後就是單表一文件了
 
首先下載xtrabackup

下載地址:http://www.percona.com/software/percona-xtrabackup
可以直接下載rpm包安裝即可
xtrabackup有完全備份,增量備份和部分備份(前面開啓innodb每表一文件,就是爲了此功能)

1.完全備份整個數據庫

innobackupex --user=root --password=123456 /tmp/backup

此時會在/tmp/backup目錄下生成以時間爲名的文件夾,裏面是備份文件

在這裏,備份的數據還不能直接用來還原,因爲備份數據中會含有尚未提交的事務或者未同步到數據文件中的事物。這裏需要用prepare回滾事物使數據文件處於一致性。

innobackupex --apply-log /tmp/backup/dir

處理完成後才能用來還原數據,用此命令還原

innobackupex --copy-back /tmp/backup/dir

要實現時間點還原,還是需要使用二進制日誌

2.增量備份

增量備份支持Innodb,對於MyISAM只能完全備份
innobackupex –incremental /tmp/backup/incremental --incremental-basedir=/tmp/backup/dir

在進行一次增量備份--incremental-basedir要指向上一次增量備份的目錄

如果要進行還原,先進行prepare處理

這裏處理的方式,將備份合併

innobackupex --apply-log --redo-only /tmp/backup/dir

innobackupex --apply-log --redo-only /tmp/backup/dir --incremental-dir=/tmp/backup/incremental

最後使用完全備份的那個備份還原

至於差異備份,只要每次將basedir指向完全備份文件夾就行了

最後再廢話一句:要實現時間點還原,是需要使用二進制日誌的,所以備份好二進制日誌至關重要。除非在恢復時間點和上一次備份時間點這段時間的數據對你來說無所謂。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章