xtrbackup只能用於備份innodb引擎的數據庫,而innobackex 既可以備份innodb引擎的數據庫,也可以備份myisam引擎的數據庫。備份時也可分爲全量備份和增量備份
一、安裝innobackex
1.1、安裝yum拓展源percona-release
1、
rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
1.2、安裝percona-xtrabackup
1、yum install percona-xtrabackup
二、全量備份mysql
2.1、創建並授權備份用戶
我們可以直接授權all權限,但是不符合安全原則
mysql -uroot -pallen
grant reload,lock tables,replication client on . to 'backupuser'@'localhost' identified by 'allen';
flush privileges;
//權限爲reload,lock tables,replication client。
2.2、創建備份保存目錄
1、mkdir /data/backup
2.3、備份mysql
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='allen' -S /tmp/mysql.sock /data/backup
//–defaults-file=/etc/my.cnf指定配置文件位置是爲了獲得datadir位置
//備份完成後,會在指定的保存目錄中生成一個時間戳目錄,該時間戳目錄名稱也是恢復時的apply-log。
備份時出現的錯誤:
//出現該錯誤時,我們需要檢查是否mysqld服務沒有運行,或者sock文件位置不對
三、全量備份恢復
模擬故障,此時mysql的數據損毀。而之前我們已經全量備份。
3.1、停止mysql服務
/etc/init.d/mysqld stop
ps aux |grep "mysqld"
#不允許mysql進程存在
3.2、刪除mysql原有數據
mv /data/mysql /data/mysql.bak
mkdir /data/mysql
3.3、恢復mysql
首先,需要初始化(初始化的叫法不夠嚴謹)
innobackupex --use-memory=512M --apply-log /備份的時間戳目錄/
#innobackupex --use-memory=512M --apply-log /data/backup/2017-08-23_10-24-06/
// –use-memory=512M指定備份時使用的內存爲512M,注意單位。默認爲字節
初始化完成後,進行恢復
innobackupex --defaults-file=/etc/my.cnf --copy-back /備份的時間戳目錄/
#innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2017-08-23_10-24-06/
//使用–copy-back參數恢復
設置權限
chown -R mysql:mysql /data/mysql
四、增量備份
之前我們已經進行了全量備份,經過操作,一段時間後重新全量備份的話,需要耗費的資源較多,這時我們就可以使用增量備份了。
本次實驗將執行一次全量備份,兩次增量備份
4.1、進行一次全量備份
增量備份是基於全量備份的,所以在增量備份操作之前我們需要先進行全量備份
innobackupex --defaults-file=/etc/my.cnf --user=backuser --password='allen' -S /tmp/mysql.sock /data/backup
//data/backup/2018-09-29_23-12-38就是我們第二次進行全量備份的時間戳目錄
4.2、進行增量備份
4.2.1、進行數據庫操作
#創建測試庫test1_backup
mysql -uroot -pallen -e 'create database test1_backup;'
#導入數據
mysql -uroot -pallen test1_backup < /tmp/1.sql
模擬數據庫數據發生改變,進行增量備份
4.2.2、進行第一次增量備份
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='allen' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/全量備份時間戳目錄/
//–incremental表示增量備份,–incremental-basedir指定全量備份時間戳目錄,因爲本次增量備份是基於全量備份。
//本次增量備份的時間戳目錄爲/data/backup/2018-09-29_23-20-02
//可以看到該目錄比全量備份的目錄小很多
4.2.3、進行數據庫操作
#創建測試庫test2_backup
mysql -uroot -pallen -e 'create database test2_backup;'
#導入數據
mysql -uroot -pallen test2_backup < /tmp/1.sql
4.2.4、進行第二次增量備份
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='allen' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/第一次增量備份時間戳目錄/
//–incremental-basedir指定第一次增量備份時間戳目錄,因爲本次增量備份是基於第一次增量備份。
//本次增量備份的時間戳目錄爲/data/backup/2018-09-29_23-22-33
經過以上操作,我們的增量備份就完成了
4.3、增量備份指定的INCREMENTAL-BASEDIR如何確定
在上面的實驗中,我們進行增量操作時。第一次增量的incremental-basedir是全量備份時間戳目錄,第二次增量的incremental-basedir是第一次增量備份的時間戳目錄,這是爲什麼呢?
在每個備份的時間戳目錄下面都有一個文件xtrabackup_checkpoints,裏面記錄了本次備份的檢查點。
//from_lsn爲起始檢查點,to_lsn爲終止檢查點
//全量備份的from_lsn爲0,to_lsn爲第一次增量備份的from_lsn,而第一次增量備份的to_lsn爲第二次增量備份的from_lsn。剛好組成0-1863060。
//如果上面的檢查點不是依次連續的,那麼在後面的增量恢復時容易出現錯誤。
//如果每一次都是使用全量備份時間戳目錄作爲incremental-basedir,那麼會出現以下情況:
//第二次增量備份的to_lsn會覆蓋第一次增量備份的to_lsn。
//如果是這樣,那麼我們在恢復時只需要初始化全量備份和第二次增量備份的時間戳目錄
五、增量備份恢復
模擬故障,此時mysql的數據損毀。而之前我們已經進行全量和增量備份。
5.1、停止mysql服務
/etc/init.d/mysqld stop
ps aux |grep "mysqld"
#不允許mysql進程存在
5.2、刪除mysql原有數據
mv /data/mysql /data/mysql.bak
mkdir /data/mysql
5.3、增量備份合併步驟
1、先初始化全量
innobackupex --apply-log --redo-only /data/backup/全量備份目錄
2、初始化第一次增量
innobackupex --apply-log --redo-only /data/backup/全量備份目錄 --incremental-dir=/data/backup/第一次增量備份目錄
3、innobackupex --apply-log /data/backup/全量備份目錄 --incremental-dir=/data/backup/第二次增量備份目錄
4、再初始化一次全量
innobackupex --apply-log /data/backup/全量備份目錄
//–redo-only參數是增量備份必須的參數,第一步和最後一步初始化都是初始化全量備份,但是最後一步不需要–redo-only參數。(因爲全部數據都在最後一步的全量目錄中)
//除了第一步和最後一步,其餘步驟都是初始化增量備份,最後一次增量備份也不需要–redo-only參數
使用–use-memory可以設置執行時使用的內存大小
5.4、增量備份恢復
進行初始化,執行恢復時與全量備份恢復一樣,都是指定全量備份目錄
innobackupex --copy-back /bakdir/全量備份目錄
#爲了避免權限問題,導致mysql無法啓動
chown -R mysql:mysql /data/mysql
所以,增量備份恢復在本次實驗的步驟如下。
1、#停止mysql服務
/etc/init.d/mysqld stop
2、#模擬數據庫損毀
3、mv /data/mysql /data/mysql.bak
4、mkdir /data/mysql
5、chown mysql:mysql /data/mysql
6、#初始化全局
innobackupex --apply-log --redo-only /data/backup/2017-08-24_23-05-09
7、#初始化第一次增量
innobackupex --apply-log /data/backup/2017-08-24_23-05-09 --incremental-dir=/data/backup/2017-08-24_23-21-16
8、#初始化第二次增量,這是最後一次增量,所以不需要--redo-only參數
innobackupex --apply-log /data/backup/2017-08-24_23-05-09 --incremental-dir=/data/backup/2017-08-24_23-21-16
9、#再初始化全量,不使用--redo-only
innobackupex --apply-log /data/backup/2017-08-24_23-05-09
10、#恢復mysql
innobackupex --copy-back /data/backup/2017-08-24_23-05-09
11、#設置權限,避免啓動mysql出錯
chown -R mysql:mysql /data/mysql
5.5、查看是否成功
啓動test1_backup和test2_backup是做完全量備份才創建的測試庫,說明恢復成功
ps:在進行增量備份時,每一次的–incremental-basedir都指定全量備份時間戳。那麼在恢復時,只需要初始化全量備份時間戳目錄和最後一次增量備份的時間戳目錄 。
1、先初始化全量
innobackupex --apply-log --redo-only /data/backup/全量備份目錄
2、初始化最後一次增量
innobackupex --apply-log /data/backup/全量備份目錄 --incremental-dir=/data/backup/最後一次增量備份目錄
3、再初始化一次全量,不需要--redo-only
innobackupex --apply-log /data/backup/全量備份目錄
4、恢復
innobackupex --copy-back /data/backup/全量備份目錄