1. 程式人生 > >xtrabackup壓縮備份多執行緒備份(lz4,pigz)全詳解

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

[[email protected] 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 [email protected] "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 [email protected]

  ###copy 公鑰到遠端主機   # ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]   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.   [email protected]'s password:   Now try logging into the machine, with "ssh '[email protected]'", 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語句=============================

[[email protected] ~]# /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)

[[email protected] ~]# /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將在建立一個連線後,在備份階段執行一個版本檢查

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