1.安裝percona-xtrabackup
下載地址為http://www.percona.com/downloads/XtraBackup/
??1)服務器搭建本地yum源;
??2)yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
??3)rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
??4)rpm -ivh percona-xtrabackup-24-2.4.7-1.el6.x86_64.rpm
??5)rpm -ivh percona-xtrabackup-24-debuginfo-2.4.7-1.el6.x86_64.rpm
??6)rpm -ivh percona-xtrabackup-test-24-2.4.7-1.el6.x86_64.rpm
??安裝完成,包含以下兩大模塊:
??xtrabackup:支持innodb存儲引擎表毅弧,xtradb存儲引擎表;
??innobackupex:支持innodb存儲引擎表类茂、xtradb存儲引擎表、myisam存儲引擎表托嚣; 常用的是innobackupex巩检,可以使用innobackupex –help查看更詳細的參數(shù)。
2.增量備份示意圖
3.percona-xtrabackup實現(xiàn)增量備份及恢復原理
1)與mysqldump的比較:
??Mysqldump是mysql自帶的備份工具示启,目錄在bin目錄下面:/usr/local/mysql/bin/mysqldump兢哭,支持基于innodb的熱備份。但是由于是邏輯備份夫嗓,所以速度不是很快迟螺,適合備份數(shù)據(jù)比較小的場景。Mysqldump完全備份+二進制日志可以實現(xiàn)基于時間點的恢復舍咖。
??對myisam存儲引擎的表矩父,只能使用溫備份,這個時候要防止數(shù)據(jù)的寫入排霉,所以先加上讀鎖窍株。這個時候也可以進入數(shù)據(jù)庫手動加讀鎖,不過這樣比較麻煩,可以在mysqldump工具中直接有一個加鎖的選擇球订,就是 --lock-all-tables 后裸,例如mysqldump --databases test --lock-all-tables --flush-logs > /tmp/backuptestdate+%F-%H-%M
.sql。
??如果是備份單張表辙售,直接在庫名字test后面加上表名字即可轻抱。
??對于innodb存儲引擎表飞涂,可以熱備旦部,不必對數(shù)據(jù)庫進行加鎖的操作,加一個選項可以進行熱備份较店,--single-transaction士八,例如:
mysqldump --databases test --single-transaction --flush-logs--master-data=2> /tmp/backup_test_`date +%F-%H-%M`.sql
PS:注意點,恢復的時候記得關閉二進制日志:
mysql> set sql_log_bin=0;
因為這是基于邏輯備份方式梁呈,所以執(zhí)行sql會插入數(shù)據(jù)婚度,會記錄到二進制日志里面去,因為這事恢復官卡,所以插入的二進制日志基本沒有啥意思蝗茁,可以關閉掉,縮短恢復時間寻咒。
2)percona-xtrabackup的優(yōu)勢
??支持innodb的物理熱備份哮翘,支持完全備份,增量備份毛秘,而且速度非撤顾拢快,支持innodb存儲引起的數(shù)據(jù)在不同數(shù)據(jù)庫之間遷移叫挟,支持復制模式下的從機備份恢復備份恢復艰匙,為了讓xtrabackup支持更多的功能擴展,可以設立獨立表空間抹恳,打開 innodb_file_per_table功能员凝,啟用之后可以支持單獨的表備份。
3)基本原理
??數(shù)據(jù)庫首先奋献,使用percona-xtrabackup工具對進行全備健霹,然后再每次數(shù)據(jù)庫 的數(shù)據(jù)更新后對數(shù)據(jù)進行增量備份,每次增量備份均在上一次備份的基礎上秽荞≈韫恢復時依次把每次增量備份的數(shù)據(jù)恢復到全備中,最后使用合并的數(shù)據(jù)進行數(shù)據(jù)恢復扬跋。
4.percona-xtrabackup實現(xiàn)增量備份及恢復過程
1)全量備份
??首先創(chuàng)建備份目錄阶捆,執(zhí)行:
mkdir –p /home/xtrabackup/
innobackupex --user=root --password=root /home/xtrabackup/
出現(xiàn)“completed”提示時說明備份成功:
150318 19:32:49 innobackupex: Connection to database serverclosed
150318 19:32:49 innobackupex: completed
2)增量備份
??執(zhí)行命令:
innobackupex --user=root --password=root --incremental /home/xtrabackup/ --incremental-basedir=/home/xtrabackup/2017-06-29_16-04-29/
其中--incremental-basedir是剛剛生成的全量備份目錄;
??同樣出現(xiàn)“complete”提示是備份成功。
??3)對全量備份數(shù)據(jù)進行檢查
innobackupex --apply-log --redo-only 2017-06-29_16-04-29
出現(xiàn)下述提示洒试,說明數(shù)據(jù)沒有問題可以用作恢復:
130910 22:23:35 InnoDB: Starting shutdown...
130910 22:23:36 InnoDB: Shutdown completed; log sequence number 2098700
130910 22:23:36 innobackupex: completed OK!
4)合并增量備份和全量備份
innobackupex --apply-log --redo-only --incremental /home/xtrabackup/2017-06-29_16-04-29/ --incremental-dir=/home/xtrabackup/2017-06-29_16-15-18
同樣出現(xiàn)complet提示后合并完成倍奢。
??5)數(shù)據(jù)恢復
??假如存在數(shù)據(jù)丟失、誤刪數(shù)據(jù)庫等問題垒棋,需要數(shù)據(jù)恢復時卒煞,首先確認上述全量數(shù)據(jù)庫可以使用,然后執(zhí)行:
/etc/init.d/mysql stop #關閉數(shù)據(jù)庫
mv /var/lib/mysql /var/lib/mysql_bak #備份數(shù)據(jù)庫目錄
mkdir –p /var/lib/mysql #創(chuàng)建新的數(shù)據(jù)庫目錄
innobackupex --datadir=/var/lib/mysql --copy-back 2017-06-29_16-04-29 #恢復數(shù)據(jù)庫
chown –R mysql:mysql /var/lib/mysql #賦予數(shù)據(jù)庫目錄用戶權限
/etc/init.d/mysql restart #啟動數(shù)據(jù)庫
執(zhí)行完成沒有錯誤即恢復完成叼架,可以檢查數(shù)據(jù)庫已經(jīng)成功恢復畔裕。 親測25G的數(shù)據(jù)庫恢復過程只需7min。 而如果采用mysqldump備份的數(shù)據(jù)庫恢復同樣大小的數(shù)據(jù)需要5~6小時乖订。
5.一些重要參數(shù)
--defaults-file
??同xtrabackup的--defaults-file參數(shù)
--apply-log
??對xtrabackup的--prepare參數(shù)的封裝
--copy-back
??做數(shù)據(jù)恢復時將備份數(shù)據(jù)文件拷貝到MySQL服務器的datadir扮饶;
--remote-host=HOSTNAME
??通過ssh將備份數(shù)據(jù)存儲到進程服務器上;
--stream=[tar]
??備份文件輸出格式, tar時使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時有指定--stream=tar, 則tar4ibd文件所處目錄一定要在$PATH中(因為使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)乍构。
??在使用參數(shù)stream=tar備份的時候甜无,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候并發(fā)寫入較大的話 xtrabackup_logfile可能會很大(5G+)哥遮,很可能會撐滿你的/tmp目錄岂丘,可以通過參數(shù)--tmpdir指定目錄來解決這個問題。 --tmpdir=DIRECTORY 當有指定--remote-host or --stream時, 事務日志臨時存儲的目錄, 默認采用MySQL配置文件中所指定的臨時目錄tmpdir --redo-only--apply-log組, 強制備份日志時只redo ,跳過rollback眠饮。這在做增量備份時非常必要奥帘。 --use-memory=# 該參數(shù)在prepare的時候使用,控制prepare時innodb實例使用的內(nèi)存量君仆,用來取代my.cnf中的buffer_pool_size值翩概,如果你是獨立服務器,而且內(nèi)存足夠大的話返咱,為了加快備份恢復的效率钥庇,你可以調(diào)大--use-memory這個參數(shù)值
--throttle=IOS
??同xtrabackup的--throttle參數(shù)
--sleep=
??是給ibbackup使用的,指定每備份1M數(shù)據(jù)咖摹,過程停止拷貝多少毫秒评姨,也是為了在備份時盡量減小對正常業(yè)務的影響,具體可以查看ibbackup的手冊萤晴;
--compress[=LEVEL]
??對備份數(shù)據(jù)迚行壓縮吐句,僅支持ibbackup,xtrabackup還沒有實現(xiàn)店读;
--include=REGEXP
??對 xtrabackup參數(shù)--tables的封裝嗦枢,也支持ibbackup。備份包含的庫表屯断,例如:--include="test."文虏,意思是要備份 test庫中所有的表侣诺。如果需要全備份,則省略這個參數(shù)氧秘;如果需要備份test庫下的2個表:test1和test2,則寫成:--include="test.test1|test.test2"年鸳。也可以使用通配符,如:--include="test.test"丸相。
--databases=LIST
??列出需要備份的databases搔确,如果沒有指定該參數(shù),所有包含MyISAM和InnoDB表的database都會被備份灭忠;
--uncompress
??解壓備份的數(shù)據(jù)文件膳算,支持ibbackup,xtrabackup還沒有實現(xiàn)該功能更舞;
--slave-info
??備份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 文件, 這里會保存主日志文件以及偏移, 文件內(nèi)容類似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
??指定mysql.sock所在位置畦幢,以便備份進程登錄mysql.
--safe-slave-backup
??則會暫停Slave的SQL線程,等待到?jīng)]有打開的臨時表的時候開始備份.備份結束后SQL線程會自動啟動,這樣就可以確保一致性的復制狀態(tài).