1、Xtrabackup bin目錄文件 介紹
innobackupex 是xtrabackup的一個符號鏈接 . innobackupex still supports all features and syntax as 2.2 version did, but is now deprecated and will be removed in next major release.
一個由C編譯而來的二進制文件,可以整備MySQL database instance with MyISAM, InnoDB, and XtraDB tables
用來加密或解密備份的數據
用來解壓或壓縮xbstream格式的壓縮文件
utility used for downloading and uploading full or part of xbstream archive from/to cloud.
是開源免費的MySQL數據庫熱備份軟件,它能對InnoDB和XtraDB存儲引擎的數據庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖)
you can achieve the following benefits: (https://www.percona.com/doc/percona-xtrabackup/2.3/intro.html)
1、在InnoDB內部會維護一個redo/undo日志文件,也可以叫做事務日志文件。事務日志會存儲每一個InnoDB表數據的記錄修改。當InnoDB啟動時,InnoDB會檢查數據文件和事務日志,並執行兩個步驟:它應用(前滾)已經提交的事務日志到數據文件,並將修改過但沒有提交的數據進行回滾操作。
2、Xtrabackup在啟動時會記住log sequence number(LSN),並且復制所有的數據文件。復制過程需要一些時間,所以這期間如果數據文件有改動,那麼將會使數據庫處於一個不同的時間點。這時,xtrabackup會運行一個後台進程,用於監視事務日志,並從事務日志復制最新的修改。Xtrabackup必須持續的做這個操作,是因為事務日志是會輪轉重復的寫入,並且事務日志可以被重用。所以xtrabackup自啟動開始,就不停的將事務日志中每個數據文件的修改都記錄下來。
3、上面就是xtrabackup的備份過程。接下來是准備(prepare)過程,在這個過程中,xtrabackup使用之前復制的事務日志,對各個數據文件執行災難恢復(就像mysql剛啟動時要做的一樣)。當這個過程結束後,數據庫就可以做恢復還原了,這個過程在xtrabackup的編譯二進制程序中實現。程序innobackupex可以允許我們備份MyISAM表和frm文件從而增加了便捷和功能。Innobackupex會啟動xtrabackup,直到xtrabackup復制數據文件後,然後執行FLUSH TABLES WITH READ LOCK來阻止新的寫入進來並把MyISAM表數據刷到硬盤上,之後復制MyISAM數據文件,最後釋放鎖。
4、備份MyISAM和InnoDB表最終會處於一致,在准備(prepare)過程結束後,InnoDB表數據已經前滾到整個備份結束的點,而不是回滾到xtrabackup剛開始時的點。這個時間點與執行FLUSH TABLES WITH READ LOCK的時間點相同,所以myisam表數據與InnoDB表數據是同步的。類似oracle的,InnoDB的prepare過程可以稱為recover(恢復),myisam的數據復制過程可以稱為restore(還原)。
5、Xtrabackup 和 innobackupex這兩個工具都提供了許多前文沒有提到的功能特點。手冊上有對各個功能都有詳細的介紹。簡單介紹下,這些工具提供了如流(streaming)備份,增量(incremental)備份等,通過復制數據文件,復制日志文件和提交日志到數據文件(前滾)實現了各種復合備份方式。
1、安裝
yum -y install perl perl-devel libaio libaio-devel yum -y install perl-DBI perl-DBD-MySQL perl-TermReadKey perl-devel perl-Time-HiRes cd /usr/local/src wget -c https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/ \ binary/tarball/percona-xtrabackup-2.3.2-Linux-x86_64.tar.gz tar -zxf percona-xtrabackup-2.3.2-Linux-x86_64.tar.gz cd percona-xtrabackup-2.3.2-Linux-x86_64/ mkdir /usr/local/xtrabackup mv bin /usr/local/xtrabackup/ ln -s /usr/local/xtrabackup/bin/* /usr/bin/
2、修改my.cnf
[mysqld] datadir=/var/lib/mysql innodb_data_home_dir = /data/mysql/ibdata innodb_log_group_home_dir = /data/mysql/iblogs innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend innodb_log_files_in_group = 2 innodb_log_file_size = 1G
//全部數據庫備份 innobackupex --user=root --password=123456 /data/backup/ //單數據庫備份 innobackupex --user=root --password=123456 --database=backup_test /data/backup/ //多庫 innobackupex--user=root --password=123456 --include='dba.*|dbb.*' /data/backup/ //多表 innobackupex --user=root --password=123456 --include='dba.tablea|dbb.tableb' /data/backup/ //數據庫備份並壓縮 log=zztx01_`date +%F_%H-%M-%S`.log db=zztx01_`date +%F_%H-%M-%S`.tar.gz innobackupex --user=root --stream=tar /data/backup 2>/data/backup/$log | gzip 1> /data/backup/$db //不過注意解壓需要手動進行,並加入 -i 的參數,否則無法解壓出所有文件,疑惑了好長時間 //如果有錯誤可以加上 --defaults-file=/etc/my.cnf
service mysqld stop mv /data/mysql /data/mysql_bak && mkdir -p /data/mysql //--apply-log選項的命令是准備在一個備份上啟動mysql服務 innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /data/backup/2015-09-18_16-35-12 //--copy-back 選項的命令從備份目錄拷貝數據,索引,日志到my.cnf文件裡規定的初始位置 innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /data/backup/2015-09-18_16-35-12 chown -R mysql.mysql /data/mysq service mysqld start
create database backup_test; //創建庫 CREATE TABLE `backup` ( //創建表 `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(20) NOT NULL DEFAULT '' , `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP , `del` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
#--incremental:增量備份的文件夾 #--incremental-dir:針對哪個做增量備份 //第一次備份 mysql> INSERT INTO backup (name) VALUES ('xx'),('xxxx'); //插入數據 innobackupex --user=root --incremental-basedir=/data/backup/2015-09-18_16-35-12 --incremental /data/backup/ //再次備份 mysql> INSERT INTO backup (name) VALUES ('test'),('testd'); //在插入數據 innobackupex --user=root --incremental-basedir=/data/backup/2015-09-18_18-05-20 --incremental /data/backup/
[root@localhost 2015-09-18_16-35-12]# cat xtrabackup_checkpoints //全備目錄下的文件 backup_type = full-prepared from_lsn = 0 //全備起始為0 to_lsn = 23853959 last_lsn = 23853959 compact = 0 [root@localhost 2015-09-18_18-05-20]# cat xtrabackup_checkpoints //第一次增量備份目錄下的文件 backup_type = incremental from_lsn = 23853959 to_lsn = 23854112 last_lsn = 23854112 compact = 0 [root@localhost 2015-09-18_18-11-43]# cat xtrabackup_checkpoints //第二次增量備份目錄下的文件 backup_type = incremental from_lsn = 23854112 to_lsn = 23854712 last_lsn = 23854712 compact = 0
增量備份做完後,把backup_test這個數據庫刪除掉,drop database backup_test;這樣可以對比還原後
分為兩個步驟
a.prepare
innobackupex --apply-log /path/to/BACKUP-DIR
此時數據可以被程序訪問使用;可使用—use-memory選項指定所用內存以加快進度,默認100M;
b.recover
innobackupex --copy-back /path/to/BACKUP-DIR
從my.cnf讀取datadir/innodb_data_home_dir/innodb_data_file_path等變量
先復制MyISAM表,然後是innodb表,最後為logfile;--data-dir目錄必須為空
innobackupex --apply-log --redo-only /data/backup/2015-09-18_16-35-12 innobackupex --apply-log --redo-only --incremental /data/backup/2015-09-18_16-35-12 --incremental-dir=/data/backup/2015-09-18_18-05-20 innobackupex --apply-log --redo-only --incremental /data/backup/2015-09-18_16-35-12 --incremental-dir=/data/backup/2015-09-18_18-11-43 #/data/backup/2015-09-18_16-35-12 全備份目錄 #/data/backup/2015-09-18_18-05-20 第一次增量備份產生的目錄 #/data/backup/2015-09-18_18-11-43 第二次增量備份產生的目錄
service mysqld stop innobackupex --copy-back /data/backup/2015-09-18_16-35-12 service mysqld start
--defaults-file
同xtrabackup的--defaults-file參數
--apply-log
對xtrabackup的--prepare參數的封裝
--copy-back
做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir ;
--remote-host=HOSTNAME
通過ssh將備份數據存儲到進程服務器上;
--stream=[tar]
備 份文件輸出格式, tar時使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時有指定--stream=tar, 則tar4ibd文件所處目錄一定要在$PATH中(因為使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)。
在 使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候並發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題。
--tmpdir=DIRECTORY
當有指定--remote-host or --stream時, 事務日志臨時存儲的目錄, 默認采用MySQL配置文件中所指定的臨時目錄tmpdir
--redo-only --apply-log組,
強制備份日志時只redo ,跳過rollback。這在做增量備份時非常必要。
--use-memory=#
該參數在prepare的時候使用,控制prepare時innodb實例使用的內存量
--throttle=IOS
同xtrabackup的--throttle參數
--sleep=是給ibbackup使用的,指定每備份1M數據,過程停止拷貝多少毫秒,也是為了在備份時盡量減小對正常業務的影響,具體可以查看ibbackup的手冊 ;
--compress[=LEVEL]
對備份數據迚行壓縮,僅支持ibbackup,xtrabackup還沒有實現;
--include=REGEXP
對 xtrabackup參數--tables的封裝,也支持ibbackup。備份包含的庫表,例如:--include="test.*",意思是要備份 test庫中所有的表。如果需要全備份,則省略這個參數;如果需要備份test庫下的2個表:test1和test2,則寫 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST
列出需要備份的databases,如果沒有指定該參數,所有包含MyISAM和InnoDB表的database都會被備份;
--uncompress
解壓備份的數據文件,支持ibbackup,xtrabackup還沒有實現該功能;
--slave-info,
備 份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 文件, 這裡會保存主日志文件以及偏移, 文件內容類似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便備份進程登錄mysql.
參考
http://www.percona.com/doc/percona-xtrabackup/2.1/