常用备份:
目前较新的: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 [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 root@vdbsrv1
###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语句=============================
[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将在建立一个连接后,在备份阶段执行一个版本检查
================================