XtraBackup物理備份
Percona XtraBackup是世界上唯一的開(kāi)源,免費(fèi)的MySQL熱備份軟件,為InnoDB和XtraDB?數(shù)據(jù)庫(kù)執(zhí)行非阻塞備份。使用Percona XtraBackup,可以實(shí)現(xiàn)以下優(yōu)勢(shì):
-
快速可靠地完成的備份
-
備份期間的不間斷事務(wù)處理
-
節(jié)省磁盤(pán)空間和網(wǎng)絡(luò)帶寬
-
自動(dòng)備份驗(yàn)證
-
創(chuàng)建熱InnoDB備份,而不暫停數(shù)據(jù)庫(kù)
-
對(duì)MySQL進(jìn)行增量備份
-
將壓縮的MySQL備份壓縮到另一個(gè)服務(wù)器
-
在MySQL服務(wù)器之間移動(dòng)表
-
輕松創(chuàng)建新的MySQL主從
-
備份MySQL,而不向服務(wù)器添加負(fù)載
Percona XtraBackup為所有版本的Percona Server,MySQL和MariaDB進(jìn)行MySQL熱備份,壓縮和增量MySQL備份。Percona XtraBackup與MySQL,MariaDB和Percona Server配合使用。它支持完全非阻塞備份InnoDB,XtraDB和HailDB?存儲(chǔ)引擎。
Percona XtraBackup工作原理
Percona XtraBackup是基于InnoDB的崩潰恢復(fù)功能。復(fù)制InnoDB數(shù)據(jù)文件,導(dǎo)致內(nèi)部不一致的數(shù)據(jù);?但隨后它對(duì)文件執(zhí)行崩潰恢復(fù),使它們?cè)俅纬蔀橐恢拢捎玫臄?shù)據(jù)庫(kù)。
這是因?yàn)镮nnoDB維護(hù)一個(gè)重做日志,也稱(chēng)為事務(wù)日志。這包含對(duì)InnoDB數(shù)據(jù)的每個(gè)更改的記錄。當(dāng)InnoDB?啟動(dòng)時(shí),它會(huì)檢查數(shù)據(jù)文件和事務(wù)日志,并執(zhí)行兩個(gè)步驟。它將提交的事務(wù)日志條目應(yīng)用于數(shù)據(jù)文件,并對(duì)修改數(shù)據(jù)但未提交的任何事務(wù)執(zhí)行撤銷(xiāo)操作。
Percona XtraBackup通過(guò)記錄日志序列號(hào)(LSN)開(kāi)始工作,然后復(fù)制掉數(shù)據(jù)文件。這需要一小會(huì)時(shí)間來(lái)完成,所以如果文件正在改變,那么它們反映了數(shù)據(jù)庫(kù)在不同時(shí)間點(diǎn)的狀態(tài)。同時(shí),Percona XtraBackup運(yùn)行一個(gè)后臺(tái)進(jìn)程,監(jiān)視事務(wù)日志文件,并從中復(fù)制更改。Percona XtraBackup需要不斷地這樣做,因?yàn)槭聞?wù)日志是以循環(huán)方式編寫(xiě)的,并且可以在一段時(shí)間后重復(fù)使用。Percona XtraBackup從數(shù)據(jù)文件開(kāi)始執(zhí)行以來(lái)每次更改都需要事務(wù)日志記錄。
Percona XtraBackup將使用備份鎖?,作為一個(gè)輕量級(jí)替代。此功能在Percona Server?5.6+中可用。Percona XtraBackup使用這個(gè)自動(dòng)復(fù)制非InnoDB數(shù)據(jù),以避免阻塞修改InnoDB表的DML查詢(xún)。當(dāng)服務(wù)器支持備份鎖時(shí),xtrabackup將首先復(fù)制InnoDB數(shù)據(jù),運(yùn)行并復(fù)制MyISAM表和.frm文件。一旦完成,文件的備份將開(kāi)始。它將備份.frm,.MRG,.MYD,.MYI,.TRG,F(xiàn)LUSH?TABLES?WITH?READ?LOCKLOCK?TABLES?FOR?BACKUP.par
注意
鎖定只對(duì)MyISAM和其他非InnoDB表,只有?在?Percona XtraBackup完成所有InnoDB / XtraDB數(shù)據(jù)和日志后備份。Percona XtraBackup將使用備份鎖?,作為一個(gè)輕量級(jí)替代。此功能在Percona Server?5.6+中可用。Percona XtraBackup使用這個(gè)自動(dòng)復(fù)制非InnoDB數(shù)據(jù),以避免阻塞修改InnoDB表的DML查詢(xún)。FLUSH?TABLES?WITH?READ?LOCK
之后,xtrabackup將使用阻止所有操作,可能更改二進(jìn)制日志位置或?或 報(bào)告。然后xtrabackup將完成復(fù)制REDO日志文件和獲取二進(jìn)制日志坐標(biāo)。在這完成之后xtrabackup將解鎖二進(jìn)制日志和表。LOCK?BINLOG?FOR?BACKUPExec_Master_Log_PosExec_Gtid_SetSHOW?MASTER/SLAVE?STATUS
最后,二進(jìn)制日志位置將被打印到STDERR和xtrabackup?將退出返回0如果一切正常。
需要注意的是STDERR的xtrabackup不是寫(xiě)在任何文件中。您必須將其重定向到一個(gè)文件,例如,。xtrabackup?OPTIONS2>?backupout.log
它還將在備份的目錄中創(chuàng)建以下文件。
在準(zhǔn)備階段,Percona XtraBackup使用復(fù)制的事務(wù)日志文件對(duì)復(fù)制的數(shù)據(jù)文件執(zhí)行崩潰恢復(fù)。完成此操作后,數(shù)據(jù)庫(kù)就可以恢復(fù)和使用。
備份的MyISAM和InnoDB表最終將彼此一致,因?yàn)樵跍?zhǔn)備(恢復(fù))過(guò)程之后,InnoDB的數(shù)據(jù)會(huì)前滾到備份完成的點(diǎn),而不會(huì)回滾到該點(diǎn)開(kāi)始。這個(gè)時(shí)間點(diǎn)匹配所采取的位置,因此MyISAM數(shù)據(jù)和準(zhǔn)備的?InnoDB數(shù)據(jù)是同步的。FLUSH?TABLES?WITHREAD?LOCK
簡(jiǎn)而言之,這些工具允許您通過(guò)復(fù)制數(shù)據(jù)文件,復(fù)制日志文件以及將日志應(yīng)用到數(shù)據(jù)的各種組合來(lái)執(zhí)行流式和增量備份等操作。
還原備份
要使用xtrabackup恢復(fù)備份,您可以使用?或選項(xiàng)。xtrabackup?–copy-backxtrabackup?–move-back
xtrabackup將從my.cnf變量datadir,?innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir中讀取,?并檢查目錄是否存在。
這將復(fù)制MyISAM表,索引等(.FRM,.MRG,?.MYD,.MYI,.TRG,.TRN,.ARM,?.ARZ,.CSM,.CSV,par和.opt的文件)首先,InnoDB的下一步是表和索引,最后是日志文件。它將在復(fù)制文件時(shí)保留文件的屬性,mysql在啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器之前可能需要將文件的所有權(quán)更改為,因?yàn)樗鼈儗⒂蓜?chuàng)建備份的用戶(hù)擁有。
或者,該選項(xiàng)可用于恢復(fù)備份。此選項(xiàng)?與唯一的區(qū)別是,它不是復(fù)制文件,而是將其移動(dòng)到目標(biāo)位置。由于此選項(xiàng)刪除備份文件,因此必須謹(jǐn)慎使用。在沒(méi)有足夠的可用磁盤(pán)空間來(lái)保存這兩個(gè)數(shù)據(jù)文件及其備份副本的情況下,此功能非常有用。xtrabackup?–move-backxtrabackup?–copy-back
安裝XtraBackup
安裝XtraBackup?源
[root@ZHENGDA ~]# uname -r
3.10.0-327.el7.x86_64
yum -y install
安裝
yum -y install percona-xtrabackup-24
創(chuàng)建連接用戶(hù)并受權(quán)
mysql> CREATE USER 'zhengda'@'localhost' IDENTIFIED BY 'goyun.org'; mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'zhengda'@'localhost'; mysql> FLUSH PRIVILEGES;
完整備份
(1)xtrabackup只能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
(2)innobackupex是一個(gè)封裝了xtrabackup的Perl腳本,支持同時(shí)備份innodb和myisam,但在對(duì)myisam備份時(shí)需要加一個(gè)全局的讀鎖。還有就是myisam不支持增量備份。
$ xtrabackup --user=zhengda --password=goyun.org --backup --target-dir=/data/backup $ innobackupex --user=zhengda --password=goyun.org /path/ to /backup/dir/ $ innobackupex --user=zhengda --password=goyun.org --stream=tar ./ | bzip2 -
備份到/data/backup下
備份所有庫(kù):$ innobackupex --defaults-file=/etc/my.cnf--user=zhengda --password=goyun.org --socket=/tmp/mysql.sock /data/backup 備份兩個(gè)庫(kù):$ innobackupex --databases="db1 db2"--defaults-file=/etc/my.cnf--user=zhengda --password=goyun.org --socket=/tmp/mysql.sock /data/backup
增量備份
注:第一次增量備份要建立在完整備份之上才可以
–incremental /data/backup1 指定增量備份存放的目標(biāo)目錄
–incremental-basedir=/data/backup 指定完整備份的目錄
$ innobackupex --defaults-file=etc/my.cnf --user=zhengda --password=goyun.org --socket=/tmp/mysql.sock --incremental /data/backuup1 --incremental-basedir=/data/backup/#會(huì)根據(jù)當(dāng)天時(shí)間生成個(gè)目錄
進(jìn)行第二次增量備份,需要指定上一次增量備份的目錄
–incremental /data/backup2 指定這次增量備份目錄
–incremental-basedir=/data/backup1 指定上次增量備份目錄
$ innobackupex --defaults-file=/etc/my.cnf --user=zhengda --password=goyun.org --socket=/tmp/mysql.sock --incremental /data/backup2 --incremental-basedir=/data/backup1/(....)
還原備份
–apply-log 準(zhǔn)備還原備份的選項(xiàng)
–use-memory=8G 設(shè)置準(zhǔn)備還原數(shù)據(jù)時(shí)使用的內(nèi)存,可以提高準(zhǔn)備所花費(fèi)的時(shí)間
$ innobackupex --apply-log --use-memory=8G /data/backup #還原如下 $ innobackupex --defaults-file=/etc/my.cnf --user= --password= --copy-back /data/backup #或 $ xtrabackup --user=zhengda --password=goyun.org --copy-back --target-dir=/data/backup
使用Mysqldump進(jìn)行邏輯備份
mysqldump作為重要的MySQL備份工具,功能相當(dāng)強(qiáng)大。備份參數(shù)、恢復(fù)策略,需要仔細(xì)研究。
備份數(shù)據(jù)庫(kù):
備份單個(gè)數(shù)據(jù)庫(kù)或單個(gè)數(shù)據(jù)庫(kù)中的指定表:
mysqldump [OPTIONS] database [tb1] [tb2]…
備份多個(gè)數(shù)據(jù)庫(kù):
mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3…]
備份所有數(shù)據(jù)庫(kù):
mysqldump [OPTIONS] –all-databases [OPTIONS]
添加此選項(xiàng)備份時(shí)不鎖表
--single-transaction
案例:本地備份所有庫(kù)
mysqldump -u root -p密碼 --all-databases > ./all.sql
案例:本地恢復(fù)所有庫(kù)
mysql -u root -p密碼 < ./all.sql
案例:備份本地db1,db2兩個(gè)庫(kù)
mysqldump -u root -p密碼 --databases db1 db2 > ./db1_2.sql
案例:恢復(fù)本地db1,db2兩個(gè)庫(kù)
mysql -u root -p密碼 db1 db2 < ./db1_2.sql
案例:在B主機(jī)上執(zhí)行將A主機(jī)的yun庫(kù)備份到B主機(jī)上 ,在B主機(jī)上需要?jiǎng)?chuàng)建yun庫(kù)
-C表示主機(jī)間的數(shù)據(jù)傳輸使用數(shù)據(jù)壓縮
mysqldump --host=192.168.6.108(A) -u root -p密碼 --opt yun | mysql --host=localhost(B) -u root -p密碼 -C yun
案例:在 B主機(jī) 上執(zhí)行將 A主機(jī) 上的所有數(shù)據(jù)庫(kù)備份到本地
mysqldump --host=192.168.6.108(A) -u root -p密碼 --all-databases > all.sql(B)
案例:恢復(fù)在B主機(jī)上執(zhí)行