mysql按照備份恢復方式分爲邏輯備份和物理備份。邏輯備份是備份sql語句,在恢復的時候執行備份的sql語句實現數據庫數據的重現,物理備份就是備份數據文件了,比較形象點就是cp下數據文件,但真正備份的時候天然不是的cp這麼簡單。mysql
這2種備份各有優劣,通常來講,物理備份恢復速度比較快,佔用空間比較大,邏輯備份速度比較慢,佔用空間比較小sql
下面介紹如下3種經常使用的備案方法數據庫
1、mysqldump工具有份安全
mysqldump因爲是mysql自帶的備份工具,因此也是最經常使用的mysql數據庫的備份工具。支持基於InnoDB的熱備份。但因爲是邏輯備份,因此速度不是很快,適合備份數據量比較小的場景。
mysqldump徹底備份+二進制日誌 —>實現時間點恢復app
溫備:工具
在使用MyISAM引擎中,只能使用溫備份,這時候要防止數據的寫入,因此先加上讀鎖spa
這時候能夠進入數據庫手動加讀鎖。這樣比較麻煩,在mysqldump工具中直接有一個加鎖的選項日誌
mysqldump --databases mydatabase --lock-all-tables --flush-logs> /tmp/backup-`date +%F-%H-%M`.sqlorm
若是是針對某張表備份,只要在數據庫名稱後面加上表名稱就好了事務
這裏注意,要實現時間點的恢復,加上--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語句插入數據,而恢復時候插入數據的日誌沒有意義。
2、基於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,而後備份二進制日誌後將原來備份的文件還原進去,而後經過二進制日誌還原到出錯的時間點(經過二進制還原時間點的時候不要忘了暫時關閉二進制日誌)
3、使用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指向徹底備份文件夾就好了
最後再廢話一句:要實現時間點還原,是須要使用二進制日誌的,因此備份好二進制日誌相當重要。除非在恢復時間點和上一次備份時間點這段時間的數據對你來講無所謂。