1. 程式人生 > >Mysql備份Xtrabackup

Mysql備份Xtrabackup

一,Xtrabackup 可以做什麼
1,線上熱備份整個庫的InnoDB,XtraDB表

2,在xtrabackup的上一次整庫備份基礎上做增量備份

3,以流的形式產生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)

環境 redhat 7.2
資料庫:mysql 5.7.18
XtraBackup版本 :Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar
wget :wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar

所需安裝包:libev.so.4()
wget http://rpmfind.net/linux/Mandriva/devel/cooker/x86_64/media/main/release/lib64ev4-4.11-5-mdv2012.0.x86_64.rpm

如何解決 XtraBackup 在系統裡面已經存在的問題
yum list | grep percona-xtrabackup
然後
yum remove -y 安裝包

安裝過程如下:
#cd /usr/local/src
#yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool zlib-devel libgcrypt-devel libcurl-devel crypt* libgcrypt* python-sphinx openssl imake libxml2-devel expat-devel

#wget :wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar

#tar -xvf Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar

#wget http://rpmfind.net/linux/Mandriva/devel/cooker/x86_64/media/main/release/lib64ev4-4.11-5-mdv2012.0.x86_64.rpm

#yum -ivh lib64ev4-4.11-5-mdv2012.0.x86_64.rpm
#yum -ivh 安裝Percona-XtraBackup安裝包
當遇到依賴問題: --nodeps 解決

#innobackupex --help
#whereis innobackupex

二,全備跟恢復

確定mysql的安裝目錄:
確定mysql的配置檔案路徑:
全備份的資料存放路徑:/backup/mysql/data/

1,確定mysql的安裝目錄以及資料目錄
#ps -ef|grep mysql
2,建立全備份的資料存放路徑
#mkdir -p /backup/mysql/data
#innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /backup/mysql/data

3,遠端全備
#innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --host=127.0.0.1 --parallel=2 --throttle=200 /backup/mysql/data 2>/backup/mysql/data/bak.log 1>/backup/mysql/data/data +%Y-%m-%d_%H-%M%S
解釋如下:
–user:mysql使用者名稱稱
–password:mysql賬號密碼
–host:mysql 所屬的主機
–parallel=2 --throttle=200:並行個數,根據主機配置選擇合適的,預設是1個,多個可以加快備份速度。
/backup/mysql/data 備份存放的目錄
2>/backup/mysql/data/bak.log 備份日誌,將備份工程中的輸出資訊重定向到bak.log
由於遠端備份,備份成功後,不會自動在備份目錄下建立一個時間戳目錄,所以需要加上命令定義

恢復備份
1),要先關閉資料庫
2),要先刪除資料檔案和日誌檔案
1,確認mysql的資料和日誌的存放路徑
#ps -ef|grep mysql
2, 停止mysql 資料庫服務
#/etc/init.d/mysql stop
3,刪除mysql下面的資料跟日誌
#rm -rf /data/mysql/datadir/3306/data/*
4, 恢復資料
恢復資料操作分為兩個步驟
1),第一步恢復應用日誌(apply-log),為了加快速度,一般建議設定–use-memory (如果系統記憶體充足,可以使用加大記憶體進行備份)。
2),第二步恢復拷貝檔案(copy-back),即把備份檔案拷貝至原資料目錄下。
5,檢查mysql資料目錄下,所恢復的資料檔案的所有者或者許可權是否正確
#ll /data/mysql/datadir/3306/data/
#chown -R mysql:mysql /data/mysql/datadir/3306/data/*
6,啟動mysql 資料庫
#/etc/init.d/mysqld start
#mysql -u -p
檢查資料恢復情況

三,全備跟增量備份
1,增量備份之前需要進行全備
2,增量備份後開始進行增量備份
#innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --incremental-basedir=/backup/mysql/data/2016-12-01_00-07-15 --incremental /backup/mysql/data
解釋:
–incremental-basedir=/backup/mysql/data/2016-12-01_00-07-15 --incremental /backup/mysql/data
- 在–incremental執行的目錄下建立一個時間戳子目錄。
在備份的時間戳下面,可以檢視備份與增量備份的區別
# cat xtrabackup_checkpoints
3,第二次增量備份
#innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --incremental-basedir=/backup/mysql/data/2016-12-01_01-12-22 --incremental /backup/mysql/data
解釋如下:
–incremental-basedir=/backup/mysql/data/2016-12-01_01-12-22 這個是第一次就生成的時間戳
–incremental /backup/mysql/data 意思就是繼續建立一個時間戳子目錄
四,增量備份的恢復

1,第一步是在所有備份目錄下重做已提交的日誌(備份路徑要跟全路徑)
   1),innobackupex --apply-log --redo-only BASE-DIR
   2), innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
   3) ,innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 

2,BASE-DIR 是指全量備份的目錄

INCREMENTAL-DIR-1 是指第一次增量備份的目錄
INCREMENTAL-DIR-2 是指第二次增量備份的目錄。
1)最後一步的增量備份並沒有–redo-only選項!回滾進行崩潰恢復過程
2)可以使用–use_memory提高效能。

先恢復應用日誌(注意最後一個不需要加–redo-only引數)
[[email protected] ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --apply-log --redo-only /backup/mysql/data/2016-12-01_00-07-15
[[email protected] ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --apply-log --redo-only /backup/mysql/data/2016-12-01_00-07-15 --incremental-dir=/backup/mysql/data/2016-12-01_02-24-11
[[email protected] ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --apply-log /backup/mysql/data/2016-12-01_00-07-15 --incremental-dir=/backup/mysql/data/2016-12-01_03-42-43

最後拷貝檔案,並驗證資料目錄的許可權
[[email protected] ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --copy-back /backup/mysql/data/2016-12-01_00-07-15


innobackupex 常用引數說明
–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.

innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --socket=/data/mysql/datadir/3306/data/mysql.sock --stream=tar ./ |ssh [email protected] “gzip - > /backupdir/full/full.tar.gz”