日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xtrabackup压缩备份多线程备份(lz4,pigz)全详解

發布時間:2024/8/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xtrabackup压缩备份多线程备份(lz4,pigz)全详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

常用備份:
目前較新的:percona-xtrabackup-2.4.11-1.el6.x86_64.rpm

配置percona的yum源。
yum install epel-release
yum install libev qpress
yum install perl-DBD-MySQL
yum install percona-xtrabackup-2.4.11-1.el6.x86_64.rpm

innobackupex備份需要的權限:
操作系統層:
? ? 需要有對data目錄有讀,寫及可執行權限。
數據庫層:
? ? RELOAD 和 LOCK TABLES:為了在開始拷貝文件前,執行FLUSH TABLES WITH
? ? READ LOCK操作。
? ? REPLICATION CLIENT:為了獲得binlog日志位置。
? ? CREATE TABLESPACE:為了導入表,用戶表級別的恢復。
? ? SUPER:為了在復制環境下能夠start/stop slave復制線程。

create user 'xtrbak'@'localhost' identified by '[{ehE!)w:0xpL8';
grant select,reload,lock tables,process,replication slave,replication client on *.* to 'xtrbak'@'localhost';
flush privileges;


一旦使用xtrabackup進行備份,也就意味著數據量較大了,如果很小,備份時間很短,直接使用mysqldump或者mydumper。
因此,xtrabackup備份較大數據量,無論是本地還是異地,都壓縮,較小空間。默認使用自帶的壓縮方式。

================================全備以及恢復(默認壓縮compress)==============================

將實例A進行全備(使用默認壓縮qpress):
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=xtrbak \
? ? ? --password=aq0VR251xj \
? ? ? --parallel=4 \
? ? ? --no-timestamp \
? ? ? --compress \
? ? ? --compress-threads=8 \
? ? ? --tmpdir=/tmp \
? ? ? --socket=/usr/local/mysql_3307/mysql.sock ?\
? ? ? /data/backup/3307/full/

全備份恢復:

前提:已經創建了一個實例B,用于恢復剛剛A實例的備份。

(1).解壓qpress文件

cd /data/backup/3307/full/2016-04-13_14-20-27
for bf in `find . -iname "*/.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done

如果是版本大于2.1.4,可以使用以下方式:
innobackupex --decompress /data/backup/3307/full/2016-04-13_14-20-27

(2).應用日志,將已經提交的刷新到數據文件中:
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --apply-log /data/backup/3307/full/2016-04-13_14-20-27

(3).關閉需要恢復的實例 ?/etc/init.d/mysql_3306 stop
(4).刪除或者遷移實例B的數據目錄文件 rm -rf /usr/local/mysql_3307/data/* ?或者 mv /usr/local/mysql_3307/data/* /opt/tmp/

(5).將一致性的數據文件,cp回實例B的數據目錄中(一定要指定my.cnf,因為實例A和B的數據路徑不一定一樣.它會根據my.cnf中的位置cp回去):
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --copy-back /data/backup/3307/full/2016-04-13_14-20-27

xtrabackup --prepare --target-dir=/data/backup/3307/full/2016-04-13_14-20-27
數據文件在準備好之前并不一致,因為它們在程序運行時被復制在不同的時間,并且在發生這些情況時可能會被更改。 如果您嘗試使用這些數據文件啟動InnoDB,它將檢測到損壞并自動崩潰,以防止在損壞的數據上運行。 xtrabackup --prepare步驟使得文件在一段時間內完美地保持一致,所以您可以在其上運行InnoDB。

(6).給數據目錄權限設置。ls /usr/local/mysql_3307/data 是否已經有數據文件,并權限設置:
chown -R mysql:mysql /usr/local/mysql_3307/data

(7).啟動實例B: ?/etc/init.d/mysql_3306 start

(8).如果想做一個slave.
查看/data/backup/3307/full/2016-04-13_14-20-27目錄下xtrabackup_binlog_info文件,記錄了備份時的binlog或是gtid信息。
? bin.000005 ? ?16933082

(9).配置同步
CHANGE MASTER TO MASTER_HOST='192.168.1.101',MASTER_USER='repl', MASTER_PASSWORD='mysql',MASTER_LOG_FILE='bin.000005',MASTER_LOG_POS=16933082;
start slave;
show slave status\G

====================================增量備份以及恢復=======================================

(1).將實例A進行全備:
innobackupex \
? ? ? --defaults-file=/db/mysql_3306/my.cnf \
? ? ? --host=localhost \
? ? ? --user=root \
? ? ? --password='mysql' \
? ? ? --parallel=4 \
? ? ? --no-timestamp \
? ? ? --socket=/db/mysql_3306/mysql.sock ?\
? ? ? /data/backup/3307/full/

? (中間間隔一些操作....)

(2).對實例A增量備份
innobackupex \
? ? ? ? ?--defaults-file=/usr/local/mysql/3307/my.cnf?
? ? ? ? ?--user=innobk?
? ? ? ? ?--password=aq0VR251xj ?
? ? ? ? ?--socket=/usr/local/mysql/3307/mysql.sock?
? ? ? ? ?--incremental?
? ? ? ? ?--incremental-basedir=/data/backup/3307/full/2016-05-23_17-37-10 \
? ? ? ? ?/data/backup/3307/incr/


增量備份-恢復

前提:已經創建了一個實例B,用于恢復剛剛A實例的備份。

(1).應用日志,將已經提交的刷新到數據文件中:
innobackupex \
? ? ? ? --apply-log --redo-only /data/backup/3307/full/2016-05-23_17-37-10/

--redo-only 指的是把備份時commit的,但還在事務日志中的應用到時數據,但是還沒提交的不撤消,因為這個事務可能在增量備份中提交
假如的撤消了增量備份中就提交不了,因為事務已經不完整。

(2).將增量備份全并到完整備份中去
innobackupex \
? ? ? --apply-log --redo-only /data/backup/3307/full/2016-05-23_17-37-10 \
? ? ? --incremental-dir=/data/backup/3307/incr/2016-05-23_17-39-12/

/data/backup/3307/full/2016-05-23_17-37-10這個是完整備份的目錄。
--incremental-dir 后跟的是增量備份的目錄

這個會使增量備份中的的數據合并到完整備份中,如果還有增量備份,繼續(4)步驟合并.按照備份順序依次合并。
如下,只能在合并了/2016-05-23_17-39-12/這個增量備份之后,才能再合并/2016-05-23_19-06-05/這第二次增量。

示例:
innobackupex \
? ? ? --apply-log --redo-only /data/backup/3307/full/2016-05-23_17-37-10 \
? ? ? --incremental-dir=/data/backup/3307/incr/2016-05-23_19-06-05/

(3).關閉需要恢復的實例 ?/etc/init.d/mysql_3306 stop
(4).刪除或者遷移實例B的數據目錄文件 rm -rf /usr/local/mysql_3307/data/* ?或者 mv /usr/local/mysql_3307/data/* /opt/tmp/

(5).一致性恢復(指定的是(4)步驟合并的全備目錄)。
innobackupex \
? ? ? ?--defaults-file=/usr/local/mysql/3307/my.cnf \
? ? ? ?--copy-back /data/backup/3307/full/2016-05-23_17-37-10/

(6).給數據目錄權限設置。ls /usr/local/mysql_3307/data 是否已經有數據文件,并權限設置:
chown -R mysql:mysql /usr/local/mysql_3307/data

(7).啟動實例B: ?/etc/init.d/mysql_3306 start

OK,結束。


============流備份(tar,xbstream)以及壓縮(qpress,gzip,pigz,lz4)===============

# innobackupex --stream=xbstream /tmp >/backup/bak.xbstream ? ? ? ? ? ? ? ? ? ? ? ###非壓縮方式
# innobackupex --stream=xbstream --compress /tmp >/backup/bak_compress.xbstream ? ###壓縮方式

total 43M
-rw-r--r-- 1 root root ?37M Apr 15 17:41 bak.xbstream
-rw-r--r-- 1 root root 6.0M Apr 15 17:41 bak_compress.xbstream

解壓xbstream格式備份:
# xbstream -x < bak_compress.xbstream -C /backup/bk_compress ? ? ? ###解壓xbstream格式
# for bf in `find . -iname "*/.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done ###再解壓qp壓縮格式
# innobackupex --decompress /backup/bk_compress ? ? ###如果xtrabackup版本大于2.1.4,可以直接通過該方式解壓qp。


一、xbstream流備份及qpress壓縮

innobackupex \
? ? ? --defaults-file=/db/mysql_3306/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --compress \
? ? ? --compress-threads=8 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full >backup_20160815170906.xbstream

qpress壓縮在數據量大的時候也非常慢。
參數 --throttle=IOS ?
用來限制備份過程中每秒讀寫的 IO 次數,對服務器的 IO 是一個保護。


*************光速備份,光速創slave********************

前提:已經創建了一個實例B,用于恢復剛剛A實例的備份。

(1).關閉需要恢復的實例B ?/etc/init.d/mysql_3306 stop
? ? 刪除或者遷移實例B的數據目錄文件 rm -rf /usr/local/mysql_3307/data/* ?或者 mv /usr/local/mysql_3307/data/* /opt/tmp/

(2)直接傳輸到dest目標B實例服務器,并解壓,一步到位:

innobackupex \
? ? ? --defaults-file=/db/mysql_3306/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --compress \
? ? ? --compress-threads=8 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full |?
? ? ? ssh 172.17.73.57
? ? ? "cat - | xbstream -x -C /data/mysql_3307/data/"

B實例
解壓:innobackupex --decompress /data/mysql_3307/data/

(3).應用日志,將已經提交的刷新到數據文件中:
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --apply-log /data/mysql_3307/data/

(4).一致性文件恢復
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --copy-back /data/mysql_3307/data/

(5).給數據目錄權限設置。ls /usr/local/mysql_3307/data 是否已經有數據文件,并權限設置:
chown -R mysql:mysql /data/mysql_3307/data/

(7).啟動實例B: ?/etc/init.d/mysql_3307 start

(8).如果想做一個slave.
查看/data/mysql_3307/data/目錄下xtrabackup_binlog_info文件,記錄了備份時的binlog或是gtid信息。
? bin.000005 ? ?16933082

(9).配置同步
CHANGE MASTER TO \
MASTER_HOST='192.168.1.101', \
MASTER_USER='repl', ?\
MASTER_PASSWORD='mysql', \
MASTER_LOG_FILE='bin.000005', \
MASTER_LOG_POS=16933082;

start slave;
show slave status\G


二、xbstream流備份及gzip壓縮(官方推薦)

innobackupex \
? ? ? --defaults-file=/db/mysql_3306/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | gzip > /data/bak_20160815170906.tar.gz

gzip只是個單進程的應用,速度有些慢。


*************光速備份,光速創slave********************

前提:已經創建了一個實例B,用于恢復剛剛A實例的備份。

(1).關閉需要恢復的實例B ?/etc/init.d/mysql_3306 stop
? ? 刪除或者遷移實例B的數據目錄文件 rm -rf /usr/local/mysql_3307/data/* ?或者 mv /usr/local/mysql_3307/data/* /opt/tmp/

(2)直接傳輸到dest目標B實例服務器,并解壓,一步到位:

innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | gzip |
? ? ? ssh 172.17.73.57
? ? ? "cat - | gzip -d | xbstream -x -C /data/mysql_3307/data/"

目的主機,已經解壓。

(3).應用日志,將已經提交的刷新到數據文件中:
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --apply-log /data/mysql_3307/data/

(4).一致性文件恢復
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --copy-back /data/mysql_3307/data/

(5).給數據目錄權限設置。ls /usr/local/mysql_3307/data 是否已經有數據文件,并權限設置:
chown -R mysql:mysql /data/mysql_3307/data/

(7).啟動實例B: ?/etc/init.d/mysql_3307 start

(8).如果想做一個slave.
查看/data/mysql_3307/data/目錄下xtrabackup_binlog_info文件,記錄了備份時的binlog或是gtid信息。
? bin.000005 ? ?16933082

(9).配置同步
CHANGE MASTER TO \
MASTER_HOST='192.168.1.101', \
MASTER_USER='repl', ?\
MASTER_PASSWORD='mysql', \
MASTER_LOG_FILE='bin.000005', \
MASTER_LOG_POS=16933082;

start slave;
show slave status\G


三、xbstream流備份及pigz多線程壓縮,速度快。

yum install pigz -y

innobackupex \
? ? ? --defaults-file=/db/mysql_3306/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | pigz -9 -p 32 > /data/bak_20160815170906.tar.gz

壓縮級別分別為:0-9,11
-p 指定壓縮線程數。

965G數據文件,一共消耗了4.5個小時。

*************光速備份,光速創slave********************

前提:已經創建了一個實例B,用于恢復剛剛A實例的備份。

(1).關閉需要恢復的實例B ?/etc/init.d/mysql_3306 stop
? ? 刪除或者遷移實例B的數據目錄文件 rm -rf /usr/local/mysql_3307/data/* ?或者 mv /usr/local/mysql_3307/data/* /opt/tmp/

(2)直接傳輸到dest目標B實例服務器,并解壓,一步到位:

innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | pigz -9 -p 32 |
? ? ? ssh 172.17.73.57
? ? ? "cat - | pigz -d | xbstream -x -C /data/mysql_3307/data/"

目的主機,已經解壓。

(3).應用日志,將已經提交的刷新到數據文件中:
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --apply-log /data/mysql_3307/data/

(4).一致性文件恢復
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --copy-back /data/mysql_3307/data/

(5).給數據目錄權限設置。ls /usr/local/mysql_3307/data 是否已經有數據文件,并權限設置:
chown -R mysql:mysql /data/mysql_3307/data/

(7).啟動實例B: ?/etc/init.d/mysql_3307 start

(8).如果想做一個slave.
查看/data/mysql_3307/data/目錄下xtrabackup_binlog_info文件,記錄了備份時的binlog或是gtid信息。
? bin.000005 ? ?16933082

(9).配置同步
CHANGE MASTER TO \
MASTER_HOST='192.168.1.101', \
MASTER_USER='repl', ?\
MASTER_PASSWORD='mysql', \
MASTER_LOG_FILE='bin.000005', \
MASTER_LOG_POS=16933082;

start slave;
show slave status\G


四、xbstream流備份及lz4多線程壓縮,速度快。

yum install lz4 lz4-devel lz4-static -y

innobackupex \
? ? ? --defaults-file=/db/mysql_3306/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | lz4 -B4 > /data/bak_20160815170906.tar.gz

壓縮級別分別為:0-9
-f ? ? : 輸出覆蓋?
--rm ? : 壓縮或解壓之后刪除原文件。?
-B ? ? : 將文件剪切為大小為#bytes [32+](默認)或預定義塊大小的獨立塊


*************多線程備份直接傳輸并多線程解壓********************

前提:已經創建了一個實例B,用于恢復剛剛A實例的備份。

(1).關閉需要恢復的實例B ?/etc/init.d/mysql_3306 stop
? ? 刪除或者遷移實例B的數據目錄文件 rm -rf /usr/local/mysql_3307/data/* ?或者 mv /usr/local/mysql_3307/data/* /opt/tmp/

(2)直接傳輸到dest目標B實例服務器,并解壓,一步到位:

innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | lz4 -B4 |
? ? ? ssh 172.17.73.57
? ? ? "cat - | lz4 -d -B7 | xbstream -x -C /data/mysql_3307/data/"

目的主機,已經解壓。

(3).應用日志,將已經提交的刷新到數據文件中:
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --apply-log /data/mysql_3307/data/

(4).一致性文件恢復
innobackupex \
? ? ? --defaults-file=/usr/local/mysql_3307/my.cnf?
? ? ? --copy-back /data/mysql_3307/data/

(5).給數據目錄權限設置。ls /usr/local/mysql_3307/data 是否已經有數據文件,并權限設置:
chown -R mysql:mysql /data/mysql_3307/data/

(7).啟動實例B: ?/etc/init.d/mysql_3307 start

(8).如果想做一個slave.
查看/data/mysql_3307/data/目錄下xtrabackup_binlog_info文件,記錄了備份時的binlog或是gtid信息。
? bin.000005 ? ?16933082

(9).配置同步
CHANGE MASTER TO \
MASTER_HOST='192.168.1.101', \
MASTER_USER='repl', ?\
MASTER_PASSWORD='mysql', \
MASTER_LOG_FILE='bin.000005', \
MASTER_LOG_POS=16933082;

start slave;
show slave status\G

==============xbstream 流式增量備份====================


當前XtraBackup的穩定版本(2.06)的流增量備份僅支持xbstream格式.

基礎全備B實例:
innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | lz4 -B4 |
? ? ? ssh 172.17.73.57
? ? ? "cat - | lz4 -d -B7 | xbstream -x -C /data/mysql_3307/data/full/"

查看基礎備份的checkpoint信息:

ssh 172.17.73.57 -C "cat /data/mysql_3307/data/full/2016-05-24_14-26-33/xtrabackup_checkpoints"
backup_type = full-backuped
from_lsn = 0
to_lsn = 2457627
last_lsn = 2457636
compact = 0
recover_binlog_info = 0

[root@test12 backup]# mkdir -p incr/`date +"%Y-%m-%d_%H-%M-%S"`
2016-05-24_14-40-39

基于基礎備份,創建增量備份one:
innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=xbstream \
? ? ? --incremental \
? ? ? --incremental-lsn=2457627
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full | lz4 -B4 |
? ? ? ssh 172.17.73.57
? ? ? "cat - | lz4 -d -B7 | xbstream -x -C /data/mysql_3307/data/incr/2016-05-24_14-40-39"


第二種增量:

# innobackupex --stream=xbstream --compress --extra-lsndir=/backup/chkpoint /tmp >/backup/bak_compress.xbstream

# more /backup/chkpoint/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 8408290
last_lsn = 8408290
compact = 0

增備數據庫,如果后續還需要再次增備,則可以再次指定--extra-lsndir,如果與上次備份指定相同的位置,該文件被覆蓋.
# innobackupex --compress --incremental --extra-lsndir=/backup/chkpoint --incremental-basedir=/backup/chkpoint


二、tar 流備份及壓縮
將完全備份直接存儲到tar壓縮包,并將它進行gzip壓縮:

innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=tar \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full 2>>/backup/log | gzip - > /backup/backup.tar.gz


完全備份并gzip壓縮發送到遠程機器:

innobackupex \
? ? ? --defaults-file=/db/mysql_3307/my.cnf \
? ? ? --host=localhost \
? ? ? --user=innobk \
? ? ? --password=mysql \
? ? ? --parallel=4 \
? ? ? --stream=tar \
? ? ? --no-timestamp \
? ? ? --socket=/usr/local/mysql/3307/mysql.sock \
? ? ? /data/backup/3307/full 2>>/backup/log | gzip |
? ? ? ssh root@172.17.73.57 "cat - >/backup/backup.tar.gz"

解壓縮(必須使用-i參數):

tar -izxvf backup.tar.gz -C ./data/
注:解壓之后的數據仍然需要進行apply-log之后才可以用于恢復.


=====================================常見錯誤=================================

1. innobackupex: Error: Original data directory '.' is not empty! at /usr/bin/innobackupex line 2162
? 指定--defaults-file

2. innobackupex: Error: Original data directory '/db/mysql5.6/data' does not exist! at /usr/bin/innobackupex line 2141
? 創建datadir
3. innobackupex: Error: Cannot overwrite file: /db/mysql5.6/redo/ib_logfile1 at /usr/bin/innobackupex line 2177.
? 刪除ib_logfile*


4.如果使用xbstream格式異機備份時,異機未安裝xbstream(封裝在xtrabackup中)則出現如下錯誤提示。
? bash: xbstream: command not found
? xtrabackup: Error writing file 'UNOPENED' (Errcode: 32 - Broken pipe)
? xb_stream_write_data() failed.
? compress: write to the destination stream failed.
? xtrabackup: Error writing file 'UNOPENED' (Errcode: 32 - Broken pipe)
? xb_stream_write_data() failed.
? xtrabackup: Error writing file 'UNOPENED' (Errcode: 32 - Broken pipe)
? [01] xtrabackup: Error: xtrabackup_copy_datafile() failed.
? [01] xtrabackup: Error: failed to copy datafile.
? innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2681.

? 如果使用xbstream格式異機備份時,異機未安裝xbstream(封裝在xtrabackup中) 。

5.異機備份時需要建立等效性,如下示例
? # ssh-keygen
? Generating public/private rsa key pair.
? Enter file in which to save the key (/root/.ssh/id_rsa):
? Enter passphrase (empty for no passphrase):
? Enter same passphrase again:
? Your identification has been saved in /root/.ssh/id_rsa.
? Your public key has been saved in /root/.ssh/id_rsa.pub.
? The key fingerprint is:
? 29:45:ee:8d:b3:55:f1:5f:2f:da:2a:88:0c:0d:37:9f root@vdbsrv1

? ###copy 公鑰到遠程主機
? # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.7
? 21
? The authenticity of host '192.168.1.7 (192.168.1.7)' can't be established.
? RSA key fingerprint is 1d:7c:40:98:ef:de:6f:b8:8c:b2:87:72:0e:79:db:0a.
? Are you sure you want to continue connecting (yes/no)? yes
? Warning: Permanently added '192.168.1.7' (RSA) to the list of known hosts.
? root@192.168.1.7's password:
? Now try logging into the machine, with "ssh 'root@192.168.1.7'", and check in:

? ? .ssh/authorized_keys

? to make sure we haven't added extra keys that you weren't expecting.

? ###驗證等效性是否成功
? # ssh 192.168.1.7 date;
? Wed Apr 15 17:55:31 CST 2015

6.使用tar格式遠程增量備份時收到如下提示,即只支持xbstream
? xtrabackup: error: streaming incremental backups are incompatible with the
? 'tar' streaming format. Use --stream=xbstream instead.

7、用流備份,默認的臨時目錄都是系統的/tmp目錄,需要保證該目錄有足夠的空間,或指定--tmpdir選項
8、流備份日志輸出
? innobackupex --stream=xbstream /tmp 2>>"$backupLog" | gzip > "$backup_file" 2>>"$backupLog"


===========================使用binlog恢復到MySQL掛掉之前=======================

查看日志:/usr/local/mysql/3307/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v /log/binlog/3307/bin.000004 >/tmp/3307.sql

# at 2202
#160523 17:37:59 server id 11 ?end_log_pos 2246 CRC32 0xf5999189 ? ? ? ?Table_map: `test`.`t` mapped to number 211
# at 2246
#160523 17:37:59 server id 11 ?end_log_pos 2286 CRC32 0x308897a3 ? ? ? ?Write_rows: table id 211 flags: STMT_END_F
### INSERT INTO `test`.`t`
### SET
### ? @1=1001
# at 2286
#160523 17:37:59 server id 11 ?end_log_pos 2317 CRC32 0xdc9367e9 ? ? ? ?Xid = 201
COMMIT/*!*/;
# at 2317
#160523 17:40:19 server id 11 ?end_log_pos 2382 CRC32 0xc99d11d2 ? ? ? ?GTID ? ?last_committed=9 ? ? ? ?sequence_number=10
SET @@SESSION.GTID_NEXT= '3c7ce82b-18be-11e6-ba0a-0050569e70f2:143'/*!*/;
# at 2382
#160523 17:40:19 server id 11 ?end_log_pos 2459 CRC32 0x2ddc09f8 ? ? ? ?Query ? thread_id=18 ? ?exec_time=0 ? ? error_code=0
SET TIMESTAMP=1463996419/*!*/;
BEGIN
/*!*/;
# at 2459
# at 2509
#160523 17:40:19 server id 11 ?end_log_pos 2553 CRC32 0xe2ad52d0 ? ? ? ?Table_map: `test`.`t` mapped to number 212
# at 2553
#160523 17:40:19 server id 11 ?end_log_pos 2593 CRC32 0xffb7d75d ? ? ? ?Write_rows: table id 212 flags: STMT_END_F
### INSERT INTO `test`.`t`
### SET
### ? @1=9999
# at 2593
#160523 17:40:19 server id 11 ?end_log_pos 2624 CRC32 0x2b09846c ? ? ? ?Xid = 223
COMMIT/*!*/;
# at 2624
#160523 17:40:27 server id 11 ?end_log_pos 2689 CRC32 0x46dd7674 ? ? ? ?GTID ? ?last_committed=10 ? ? ? sequence_number=11
SET @@SESSION.GTID_NEXT= '3c7ce82b-18be-11e6-ba0a-0050569e70f2:144'/*!*/;
# at 2689
#160523 17:40:27 server id 11 ?end_log_pos 2766 CRC32 0x657dd679 ? ? ? ?Query ? thread_id=18 ? ?exec_time=0 ? ? error_code=0
SET TIMESTAMP=1463996427/*!*/;
BEGIN
/*!*/;
# at 2766
# at 2816
#160523 17:40:27 server id 11 ?end_log_pos 2860 CRC32 0xe0b8b86f ? ? ? ?Table_map: `test`.`t` mapped to number 212
# at 2860
#160523 17:40:27 server id 11 ?end_log_pos 2900 CRC32 0x83236ed8 ? ? ? ?Write_rows: table id 212 flags: STMT_END_F
### INSERT INTO `test`.`t`
### SET
### ? @1=8888
# at 2900
#160523 17:40:27 server id 11 ?end_log_pos 2931 CRC32 0xbf47abdd ? ? ? ?Xid = 224
COMMIT/*!*/;

我們這里知道現在數據庫中的數據是1001最后一條,所以,這里我們就知道從哪里開始恢復。
/usr/local/mysql/3307/bin/mysqlbinlog --no-defaults --start-position=2317 /log/binlog/3307/bin.000004 | mysql -uroot -p -S /usr/local/mysql/3307/mysql.sock

在新版本的mariadb 10.0上沒有這個問題。
而在mysql 5.7.13上存在該問題。實際上,添加一個參數即可:
?/usr/local/mysql/3307/bin/mysqlbinlog --no-defaults --skip-gtids --start-position=2317 /log/binlog/3307/bin.000004 | mysql -uroot -p -S /usr/local/mysql/3307/mysql.sock

如果指定--stop-position位置,那么需要指定到帶有flags: STMT_END_F標記的結束位置。

?

================從binlog中解析SQL語句=============================

[root@test11 ~]# /usr/local/mysql/3307/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-position=2317 -vv /log/binlog/3307/bin.000004 | grep "insert into"
# insert into t values(9999)
# insert into t values(8888)

[root@test11 ~]# /usr/local/mysql/3307/bin/mysqlbinlog --no-defaults --base64-output=decode-rows --start-position=2317 -vv /log/binlog/3307/bin.000004 | grep "insert into" | sed -e 's/#//g'|sed -e 's/)/);/g'
?insert into t values(9999);
?insert into t values(8888);
并不是所有的binlog都能夠解析出這個完整的SQL語句。

===================innobackupex 參數解析================================
innobackupex 參數解析
--apply-log
? 通過應用同一目錄下的事務日志文件xtrabackup_logfile,在BACKUP-DIR目錄準備一個備份。頁建立一個新的事務日志文件。innoDB的配置是從innobackupex備份時建立的文件backup-my.cnf讀取。
--close-files
? 不保持文件被打開。默認備份時tablespace不關閉,但如果表空間很大并且不適合任何限制,有一個可選的方法是關閉不再訪問的文件。使用該選項會產生不一致的備份。
--compact
建立一個忽略二級索引頁的簡潔備份。
--compress
建立一個innoDB數據文件的壓縮備份。它直接提交給xtrabackup的子進程
--compres-threads=#
并行壓縮的工作進場數量,它直接提交給xtrabackup的子進程
--compress-chunk-size=#
指定每個壓縮進程的內部工作緩沖區的尺寸,用字節來測量。它直接提交給xtrabackup的子進程
--copy-back
復制所有的備份到他們原來的位置
--databases=LIST
指定將要備份的數據庫列表。支持databasename.tablename格式,如果沒指定參數,則備份所有數據庫
--decompress
解壓所有以選項--compress備份的,結尾是.qp的文件。使用參數--parallel允許多個文件同時被解密和或解壓。
--decrypt=ENCRPYTION-ALGORITHM
解密用--encrpyt選項加密的以.xbcrypt結尾的文件。
--defaults-file=[my.cnf]
通過制定一個字符串來設置MySql的默認選項
--defaults-extra-file=[my.cnf]
在從標準的默認文件中取值默認之前的額外文件。接收一個字符串作為選項
--defaults-group=GROUP-NAME
如果用了Mysqld_multi,可設置讀取配置文件的特定組
--encrypt=ENCRYPTION-ALGORITHM
該選項指引xtrabackup使用參數ENCRYPTION_ALGORITHM參數制定的算法,加密innoDB數據文件的備份,它直接指向子進程
--encrypt-key=ENCRYPTION_KEY
指示xtrabackup在備份時使用ENCRYPTION_KEY指定的key做--encrypt加密。它直接傳給子進程
--encrypt-key-file=ENCRYPTION_KEY_FILE
當用選項--encrpyt加密時使用存儲在ENCRYPTION_KEY_FILE里存儲的加密key
--encrypt-threads=#
指定并行加密的工作線程數。它直接傳給子進程
--encrypt-chunk-size=#
指定每個加密進程使用的內粗工作緩沖區的尺寸,以字節計算大小
--export
它用于導出單個表用于導入另一個server
--extra-lsndir=DIRECTORY
指定xtrabackup_checkpoints文件的保留目錄
--force-non-empty-directories
? 該參數使得選項--copy-back or --move-back選項傳輸文件到非空目錄。不存在的文件將被刪除,存在的文件將被覆蓋。如果選項--copy-back or --move-back
? 必須從備份目錄到一個已經存在的目標目錄,則將失敗
--galera-info
? 該選項在備份時建立包含本地節點狀態xtrabackup_galera_info文件。用于執行Percona-XtraDB-Cluster備份
--host=HOST
? 執行通過TCP/IP連接訪問數據庫的主機,它傳給mysql的子進程
--ibbackup=IBBACKUP-BINARY
? 接收字符串參數,它用來指定要使用的xtrabackup binary、
--include=REGEXP
? 指定一個正則表達式,用語匹配格式為databasename.tablename的表名稱,它傳遞給--tables選項
--incremental
? 建立一個增量備份,傳遞給xtrabackup的子進程。該參數可以和參數--incremental-lsn or --incremental-basedir配合使用。
--incremental-basedir=DIRECTORY
? 指定一個包換全庫備份的目錄作為增量備份的基礎數據庫
--incremental-dir=DIRECTORY
? 指定增量備份與全庫備份合并去建立一個新的全備份的目錄。
--incremental-lsn=LSN
? 指定增量備份將要開始的LSN,它替代選項--incremental-basedir
--kill-long-queries-timeout=SECONDS
? 該選項指定innobackupex在開始FLUSH TABLES WITH READ LOCK和殺掉這些阻礙他的查詢之間的時間的等待時間,以秒計算,默認為0,意味著innobackupex不嘗試殺任何查詢,
? 該選項需要process and super權限
--kill-long-query-type=all|select
? 指定解鎖全局鎖時將被殺掉的查詢類型,默認是all
--lock-wait-timeout=SECONDS
? 運行FLUSH TABLES WITH READ LOCK之前,innobackupex等待阻塞查詢的時間數(秒數)
--lock-wait-threashold=SECONDS
? 選項指定查詢運行時間閥值,當innobackupex發現長運行查詢伴隨著--lock-wait-timeout的一個非0值,
--lock-wait-query-type=all|update
? 指定innobackupex發出一個全局鎖之前什么類型的查詢允許完成
--lock-copy-interval=#
? 指定日志日志復制線程檢車完成的時間間隔,以毫秒計算
--move-back
? 移動之前的所有備份從一個備份目錄到他們的原始位置
--no-lock
? 不允許使用flush tables with read lock表鎖。如果你的所有表示INNODB并且你不關心二進制日志備份的位置。如果有任何DDL語句被執行或任何非INNODB表上的update操作,這個選項就不能使用
--no-timestamp
? 把備份放在一個通過選項backup-root-dir指定的子目錄里,防止在backup-root-dir目錄下創建的時間戳子目錄里。
--no-version-check
? 禁止版本檢查
--parallel=NUMBER-OF-THREADS
? 該選項接收一個整數,xtarbackup子進程將用于同時備份文件的并發數。如果有多個.ibd文件可以并行,如果只有一個表空間文件,則該選項無效
--password=PASSWORD
? 指定連接到數據庫的賬戶密碼
--port=PORT
? 該選項指定通過TCP/IP連接到數據庫時所用的端口
--rebuild-indexes
? 只有用--apply-log選項時它才有效,當應用日志后使得xtrabackup重建所有的二級索引。一般用于準備簡約備份
--rebuild-threas=NUMBER-OF-THREADS
? 當一起使用選項--apply-log and --rebuild-indexes選項時才有用,使用后,當重建索引時,xtrabackup處理表空間時用一定數量的線程的并行模式
--redo-only
? 選項用于準備全庫備份和合并處最有一個備份外的所有增量備份。它強制xtrabackup忽略“rollback”階段只做“redo”.
--rsync
? 使用rsync工具優化本地文件傳輸。它讓xtrabackup使用rsync復制所有非innoDB文件,而不是使用多個cp
--safe-slave-backup
? 停止從SQL進程并等待啟動備份直到slave_open_temp_tables的值為0。如果沒有打開臨時表,備份會進行,否則SQL進程將啟動并直到沒有打開的臨時表時停止。如果slave_open_temp_tables在--
safe-slave-backup-timeout秒后沒有變成0,則備份會失敗。備份結束后,從SQL進程將重新啟動
--safe-slave-backup-timeout=SECONDS
? --safe-slave-backup要等slave_open_temp_tables變成0的時間,默認為300秒
--scopt=SCP-OPTIONS
? 當參數--remost-host指定時傳遞給scp的參數
--slave-info
? 當備份一個復制從庫操作的時候用,它打印二進制日志的position和主庫的名字,它頁把這些信息寫入xtrabackup_slave_info文件作為一個CHANGE MASTER命令
--socket=SOCKET
? 指定連接到本地數據庫sever時使用的一個unix domain socket,它沒有修改的傳入mysql子進程
--sshopt=SSH-OPTIONS
? 當使用參數--remost-host時,使用ssh的命令行參數
--stream=STREMNAME
? 當使用流備份時使用的特定格式。備份將以特定格式傳到STDOUT。支持的格式為tar and xbstream
--tables-file=FILE
? 指定備份的表的列表,格式為database.tablename
--throttle=IOS
? 指定I/O操作的數量/秒。該參數只適用于備份階段。不適用于參數--apply-log,--copy-back
--tmpdir=DIRECTORY
? 在參數--stream使用時指定,是指臨時文件被存儲的位置
--use-memory=#
? 該參數只能和參數--apply-log配合使用,被用于xtrabackup做creash恢復時準備鎖使用的內存量(單位:字節)。也支持其他單位,如:1MB,1M,1GB,1G
--user=USER
? 指定連接到mysql時使用的用戶名
--version
? 顯示innobackupex的版本信息和版權等信息
--version-check
? 指定該選項后,innobackupex將在建立一個連接后,在備份階段執行一個版本檢查

================================

總結

以上是生活随笔為你收集整理的xtrabackup压缩备份多线程备份(lz4,pigz)全详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。