Xtrabackup 是一個對 InnoDB 作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具 InnoDB Hotbackup 的一個很好的
替代品。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
一、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表
二、innobackupex 是參考了 InnoDB Hotbackup 的 innoback 腳本修改而來的.innobackupex 是一個 perl 腳本封裝,封裝了 xtrabackup。主要
是爲了方便的同時備份InnoDB和MyISAM引擎的表,但在處理myisam時須要加一個讀鎖。而且加入了一些使用的選項。如slave-info能夠記錄備份
恢復後,做爲slave須要的一些信息,根據這些信息,能夠很方便的利用備份來重作slave。
三、官方文檔:http://www.percona.com/doc/percona-xtrabackup/2.1/
在線(熱)備份整個庫的InnoDB、 XtraDB表
在xtrabackup的上一次整庫備份基礎上作增量備份(innodb only)
以流的形式產生備份,能夠直接保存到遠程機器上(本機硬盤空間不足時頗有用)
MySQL數據庫自己提供的工具並不支持真正的增量備份,二進制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。Xtrabackup工具支持
對InnoDB存儲引擎的增量備份,工做原理以下:
(1)首先完成一個徹底備份,並記錄下此時檢查點的LSN(Log Sequence Number)。
(2)在進程增量備份時,比較表空間中每一個頁的LSN是否大於上次備份時的LSN,若是是,則備份該頁,同時記錄當前檢查點的LSN。
首先,在 logfile 中找到並記錄最後一個 checkpoint(「last checkpoint LSN」),而後開始從 LSN 的位置開始拷貝 InnoDB 的 logfile 到
xtrabackup_logfile;接着,開始拷貝所有的數據文件.ibd;在拷貝所有數據文件結束以後,才中止拷貝logfile。
由於logfile裏面記錄所有的數據修改狀況,因此,即時在備份過程當中數據文件被修改過了,恢復時仍然可以經過解析xtrabackup_logfile保持數據
的一致。
XtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,因爲不鎖表,複製出來的數據是不一致的,在恢復的時候使用
crash-recovery,使得數據恢復一致。
InnoDB維護了一個redo log,又稱爲transaction log,事務日誌,它包含了innodb數據的全部改動狀況。當InnoDB啓動的時候,它會先去檢
查data file和transaction log,而且會作二步操做:
XtraBackup在備份的時候, 一頁一頁地複製innodb的數據,並且不鎖定表,與此同時,XtraBackup還有另一個線程監視着transactions log,
一旦log發生變化,就把變化過的log pages複製走。爲何要急着複製走呢? 由於transactions log文件大小有限,寫滿以後,就會從頭再開始寫,
因此新數據可能會覆蓋到舊的數據。
在prepare過程當中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。
官方原理
在 InnoDB內部會維護一個redo日誌文件,咱們也能夠叫作事務日誌文件。事務日誌會存儲每個InnoDB表數據的記錄修改。當InnoDB啓動 時,
InnoDB會檢查數據文件和事務日誌,並執行兩個步驟:它應用(前滾)已經提交的事務日誌到數據文件,並將修改過但沒有提交的數據進行回滾操做。
Xtrabackup 在啓動時會記住 log sequence number(LSN),而且複製全部的數據文件。複製過程須要一些時間,因此這期間若是數據文件有改動,
那麼將會使數據庫處於一個不一樣的時間點。這 時,xtrabackup會運行一個後臺進程,用於監視事務日誌,並從事務日誌複製最新的修改。Xtrabackup
必須持續的作這個操做,是由於事務日 志是會輪轉重複的寫入,而且事務日誌能夠被重用。因此 xtrabackup 自啓動開始,就不停的將事務日誌中每一個
數據文件的修改都記錄下來。
上面就是 xtrabackup 的備份過程。接下來是準備(prepare)過程。在這個過程當中,xtrabackup 使用以前複製的事務日誌,對各個數據文件執行災難
恢復(就像mysql剛啓動時要作的同樣)。當這個過程結束後,數據庫就能夠作恢復還原了。
以 上的過程在 xtrabackup 的編譯二進制程序中實現。程序 innobackupex 能夠容許咱們備份 MyISAM 表和 frm 文件從而增長了便捷和功 能。
Innobackupex會啓動xtrabackup,直到xtrabackup複製數據文件後,而後執行FLUSH TABLES WITH READ LOCK來阻止新的寫入進來並把MyISAM
表數據刷到硬盤上,以後複製MyISAM數據文件,最後釋放鎖。
備 份MyISAM和InnoDB表最終會處於一致,在準備(prepare)過程結束後,InnoDB表數據已經前滾到整個備份結束的點,而不是回滾到 xtrabackup
剛開始時的點。這個時間點與執行FLUSH TABLES WITH READ LOCK的時間點相同,因此myisam表數據與InnoDB表數據是同步的。相似oracle的,
InnoDB的prepare過程能夠稱爲 recover(恢復), myisam的數據複製過程能夠稱爲restore(還原)。
Xtrabackup 和 innobackupex 這兩個工具都提供了許多前文沒有提到的功能特色。手冊上有對各個功能都有詳細的介紹。簡單介紹下,這些工具提供
瞭如流 (streaming)備份,增量(incremental)備份等,經過複製數據文件,複製日誌文件和提交日誌到數據文件(前滾)實現了各類複合備份方 式。
XtraBackup以read-write模式打開innodb的數據文件,而後對其進行復制。其實它不會修改此文件。也就是說,運行XtraBackup的用戶,必須
對 innodb 的數據文件具備讀寫權限。之因此採用 read-write 模式是由於 XtraBackup 採用了其內置的 innodb 庫來打開文件,而 innodb 庫打開文件
的時候就是rw的。
XtraBackup要從文件系統中複製大量的數據,因此它儘量地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據,從而提高性能。由於這些
數據不會重用到了,OS卻沒有這麼聰明。若是要緩存一下的話,幾個G的數據,會對OS的虛擬內存形成很大的壓力,其它進程,好比mysqld頗有可
能被swap出去,這樣系統就會受到很大影響了。
在備份 innodb page 的過程當中,XtraBackup 每次讀寫 1MB 的數據,1MB/16KB=64 個 page。這個不可配置。讀 1MB 數據以後,XtraBackup
一頁一頁地遍歷這 1MB 數據,使用 innodb 的 buf_page_is_corrupted()函數檢查此頁的數據是否正常,若是數據不正常,就從新讀取這一頁,最多重
新讀取10次,若是仍是失敗,備份就失敗了,退出。在複製transactions log的時候,每次讀寫512KB的數據。一樣不能夠配置。
基於以上原理,xtrabackup 備份恢復工具比較適合數據增加型數據庫。對於數據增加型的庫,因爲數據的增加致使數據備份和恢復的空間和時
間上的壓力較大。而xtrabackup有增量備份的功能,在短期內能夠經過進行增量備份來保證數據的安全性。而長期來看,仍然須要間斷性的進行全庫
備份。此外,因爲xtrabackup對innodb的數據庫不進行鎖定,所以對要求不影響線上服務的數據備份和恢復較適合。
而對於數據量無明顯增加,且更新爲主的數據更新型數據庫,xtrabackup顯得過於複雜。xtrabackup操做反而不如mysqldump的性能高。
我的理解:
一、無需中止數據庫進行InnoDB熱備,快速、可靠的完成備份
2.備份期間不間斷事務處理
3.節省磁盤空間和網絡帶寬
4.自動對備份文件進行驗證
5.快速恢復,保障在線運行時間持久性
官方說明:
1.在不停庫的狀況下,對InnoDB數據庫進行熱備
2.增量備份MySQL數據庫
3.經過流壓縮備份MySQL數據到另一臺服務器
4.在線MySQL服務器之間進行表空間遷移
官網下載:https://www.percona.com/downloads/XtraBackup/LATEST/mysql
本文示例安裝包下載sql
下載連接:https://pan.baidu.com/s/1C88-Ninf0cTG3ghBWdMPEw 密碼:0kp1數據庫
安裝軟件vim
[root@Admin ~]# yum install libev -y [root@Admin ~]# rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm
建立測試數據緩存
建庫:mysql> create database ceshi; 建表:mysql> create table users (id int primary key auto_increment,name varchar(20) not null unique,password varchar(100) not null,address varchar(200))ENGINE=MyISAM; 添加數據:mysql> insert into users (id,name,password,address) values (1,'zhang','1234',null),(2,'wang','4321','湖北武漢'), (3,'li','5678','北京海淀'); 建庫:mysql> create database test2; 建表:mysql> create table articles (id int primary key auto_increment,content longtext not null); 添加數據:mysql> insert into articles (id,content) values (11,'hahahahahaha'),(12,'xixixixixix'),(13,'aiaiaiaia'),(14,'hohoahaoaooo');
建立備份目錄:安全
[root@Admin ~]# mkdir -p /backup/{full_data,dk_data,zl_data}
注:full_data 全庫備份目錄
dk_data 單庫備份目錄
zl_data 增量備份目錄服務器
全庫備份(All DB)網絡
官方備份用法說明:oracle
$ innobackupex --defaults-file=/tmp/other-my.cnf --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
官方恢復用法說明:app
用法一:$ innobackupex --apply-log /path/to/BACKUP-DIR
用法二:$ innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR
注:--use-memory=4G 該參數在 prepare 的時候使用,控制 prepare 時 innodb 實例使用的內存量
全庫備份操做步驟:
第一步:執行備份全庫命令
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /backup/full_data
注:--defaults-file:默認配置文件的路徑,若是不應參數,xtrabackup 將從依次從如下位置查找配置文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、 ~/.my.cnf,並讀取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只須要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6個參數便可讓xtrabackup正常工做。 --user:受權的數據庫用戶 --password:數據庫用戶的密碼 --target-dir=name備份文件的存放目錄路徑(即:/backup/full_data )
第二步:恢復準備:
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --apply-log /backup/full_data/2018-10-18_20-58-04
第三步:停庫:
[root@Admin ~]# /etc/init.d/mysqld stop
第四步:把備份文件拷貝至原數據目錄下並受權:
[root@Admin ~]# rm -rf /data/DB/* # 把數據目錄刪除測試 [root@Admin ~]# cp /backup/full_data/2018-10-18_20-58-04/* /data/DB/ [root@Admin ~]# chown -R mysql. /data/DB/
第五步:重啓數據庫:
[root@Admin ~]# /etc/init.d/mysqld start
第六步:查看數據:
mysql> show databases; mysql> use ceshi; mysql> show tables; mysql> select * from users;
單庫備份跟全庫用法是同樣的,只不過單庫在備份裏,要指定要備份的數據庫名,即: --databases=LIST
單庫備份操做步驟:
全量備份:
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --database=ceshi /backup/dk_data
注:若是是備份從庫的話,須要添加參數:--slave-info,即: [root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --slave-info --database=ceshi /tmp
刪除ceshi庫,方便後面測試是否恢復成功:
mysql> drop database ceshi;
恢復單庫操做步驟:
[root@Admin ~]# /etc/init.d/mysqld stop
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --apply-log /backup/dk_data/2018-10-18_21-10-51
[root@Admin ~]# cp -ap /backup/dk_data/2018-10-18_21-10-51/ceshi/ /data/DB/
[root@Admin ~]# chown -R mysql. /data/DB/
[root@Admin ~]# /etc/init.d/mysqld start
mysql> show databases; mysql> use ceshi; mysql> show tables; mysql> select * from users; mysql> show create table users\G
單庫增量備份操做步驟:
增量的備份:
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --database=ceshi /backup/dk_data/
mysql> select * from users; mysql> insert into users (id,name,password,address) values (4,'liu','1122',null),(5,'zou','4311','湖南長沙'), (6,'zhou','6789','北京八 寶山'), (7,'ding','7891','深圳西麗');
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --database=ceshi --incremental --incremental-basedir=/backup/dk_data/2018-10-18_21-33-20 /backup/zl_data
注: --incremental 指備份類型爲增量備份,作增量備份以前首先要作一次全量備份,因此 --incremental-basedir=/backup/dk_data/2014-05-30_23-26-22 的目錄 就是--incremental-basedir=BASEDIR /backup/zl_data就是 --incremental-basedir=INCREMENTAL-DIR-1 INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。
增量的恢復:
[root@Admin ~]# /etc/init.d/mysqld stop
[root@Admin ~]# innobackupex --defaluts-file=/etc/my.cnf --user=root --password=123 --apply-log --redo-only /backup/dk_data/2018-10-18_21-33-20
加選項:--apply-log-only做用是:只應用redo log,不對數據的rollback,起到先合併事務日誌#
[root@Admin ~]# innobackupex --defaluts-file=/etc/my.cnf --user=root --password=123 --apply-log --red-only /backup/dk_data/2018-10-18_21-33-20 --incremental-dir=/backup/zl_data/2018-10-18_22-17-33
注:其中BASE-DIR是指全備目錄,INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。 BASE-DIR:/backup/dk_data/2014-05-30_11-56-51 INCREMENTAL-DIR-1:/backup/zl_data/2014-05-31_03-01-33 以上語句執行成功以後,最終數據在BASE-DIR(即全備目錄)下
[root@Admin ~]# \cp -afp /backup/dk_data/2018-10-18_21-33-20/* /data/DB/
[root@Admin ~]# chown -R mysql. /data/DB/
[root@Admin ~]# /etc/init.d/mysqld start
mysql> show databases; mysql> select * from ceshi.users;
建立測試數據
建庫:mysql> create database db01; 建表:mysql> create table db01.t1(id int, name varchar(10)) engine=myisam; 增長數據:mysql> insert into db01.t1 values(1,'mona'); 建表:mysql> create table db01.t2(id int, name varchar(10)) engine=innodb; 增長數據:mysql> insert into db01.t2 values(2,'tom');
查看當前表裏的數據
mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | mona | +------+------+ 1 row in set (0.02 sec) mysql> select * from t2; +------+------+ | id | name | +------+------+ | 2 | tom | +------+------+ 1 row in set (0.00 sec)
開啓二進制日誌
[root@Admin ~]# vim /etc/my.cnf log-bin=mysql-bin [root@Admin ~]# /etc/init.d/mysqld restart
備份操做步驟:
一、建立備份目錄
[root@Admin ~]# mkdir -p /backup/innobackupex
二、使用innobackupex對數據庫作全庫備份
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /backup/innobackupex/
三、數據庫更新
mysql> insert into db01.t1 values(2,'jack'); mysql> insert into db01.t2 values(2,'aaa'); mysql> update db01.t1 set name='harry' where id=1;
查看數據
mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 1 | harry | | 2 | jack | +------+-------+ 2 rows in set (0.00 sec) mysql> select * from t2; +------+------+ | id | name | +------+------+ | 2 | tom | | 2 | aaa | +------+------+ 2 rows in set (0.00 sec)
四、預備過程
[root@Admin ~]# innobackupex --apply-log /backup/innobackupex/2018-10-19_12-13-06/
五、備份二進制日誌
查看備份目錄裏面的日誌文件是從哪裏開始記錄的,再作相應的備份
[root@Admin ~]# cat /backup/innobackupex/2018-10-19_12-13-06/xtrabackup_binlog_info mysql-bin.000004 1119 [root@Admin ~]# mysqlbinlog --start-position=1119 /data/DB/mysql-bin.000004 > /backup/innobackupex/update.sql 這裏備份只是備份改變後的數據就能夠了
六、恢復演練
[root@Admin ~]# rm -rf /data/DB/*
[root@Admin ~]# killall -9 mysqld
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/innobackupex/2018-10-19_12-13-06/
[root@Admin ~]# chown mysql. /data/DB/ -R
[root@Admin ~]# /etc/init.d/mysqld start 恢復後能夠看見數據庫裏面的文件是最初始化時候的,也就是備份完成時的內容 mysql> select * from db01.t1; +------+------+ | id | name | +------+------+ | 1 | mona | +------+------+ 1 row in set (0.00 sec) mysql> select * from db01.t2; +------+------+ | id | name | +------+------+ | 2 | tom | +------+------+ 1 row in set (0.00 sec)
能夠直接在數據庫裏面source備份的日誌文件(由於備份的日誌文件裏面是sql語句) mysql> source /backup/innobackupex/update.sql 恢復完成後再次查看數據,能夠發現已經恢復到最新狀態的數據 mysql> select * from db01.t2; +------+------+ | id | name | +------+------+ | 2 | tom | | 2 | aaa | +------+------+ 2 rows in set (0.00 sec) mysql> select * from db01.t1; +------+-------+ | id | name | +------+-------+ | 1 | harry | | 2 | jack | +------+-------+ 2 rows in set (0.00 sec)