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将在建立一个连接后,在备份阶段执行一个版本检查

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


 

展开阅读全文

没有更多推荐了,返回首页