5 min read

xtrabackup使用笔记

xtrabackup使用笔记

论MySQL的备份与恢复效率,还得数xtrabackup为王者。以下为个人笔记,不具备权威指导,望自行斟酌!

安装 xtrabackup

方式1:通过二进制包

二进制相对比较通用,适应性及兼容性要好,基本适应所有系统。我一般中意这种方式来实现安装--不需要去匹配分支发行、操作系统。

步骤1: 下载二进包

wget http://dl-oss.vqiu.cn/package/mysql/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17-minimal.tar.gz
Tips:留意该版本只针对数据库的 8.0,若针对5.7版本需要去下载2.4版本:http://dl-oss.vqiu.cn/package/mysql/percona-xtrabackup-2.4.29-Linux-x86_64.glibc2.17-minimal.tar.gz

步骤2: 解压并配置软链接

tar Cxzvf /usr/local/bin percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17-minimal.tar.gz
cd /usr/local/bin
ln -svf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17-minimal/bin/xtrabackup xtrabackup
Tips: 这样就可以正常使用xtrabackup命令了

步骤3: 工具验证

# xtrabackup --version
xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64) (revision id: 6beb4b49)
Tips: 有以上输出就说明已经安装成功。

方式2:通过软件包RPM/DEB

<略>

全量备份数据库

配置备份环境变量,下面的备份步骤会使用到该变量

# export xtb_opts='--user=用户名 --password="密码" --backup'

备份数据库所有数据到/data/backups目录

# xtrabackup $xtb_opts --target-dir=/data/backups/  

全量恢复数据

假设已经将MySQL服务停止以及将数据进行清理(备份)。

将备份数据传输到需要恢复的节点,目录为/dbbackup

准备

# xtrabackup --prepare --target-dir=/dbbackup/base

复制数据

# xtrabackup --copy-back --parallel=16 --target-dir=/dbbackup/base
Tips: 如果不想保留备份,使用--move-back选项,它将备份的数据移动到数据目录

增量备份数据

增量备份需要在全量备份的基础上进行,比如我们以备份某个库(vqiu_8848)为例

# xtrabackup $xtb_opts --databases='vqiu_8848' --target-dir=/dbbackup/base
# xtrabackup $xtb_opts --databases='vqiu_8848' --target-dir=/dbbackup/inc1 --incremental-basedir=/dbbackup/base
# xtrabackup $xtb_opts --databases='vqiu_8848' --target-dir=/dbbackup/inc2 --incremental-basedir=/dbbackup/inc1

此时我们有一个全量备份的数据及两个增量备份的数据

增量还原数据

增量备份的步骤不同 至于完整备份。在完整备份中,将执行两种类型的操作自使数据库保持一致:提交的事务从日志 针对数据文件进行文件,并回滚未提交的事务。 在准备 增量备份,因为当时未提交的事务 之 您的备份可能正在进行中,并且很可能会提交 在 下一个增量备份。应使用--apply-log-only选项来防止回滚阶段。

如果不使用--apply-log-only选项来阻止回滚阶段,则增量备份没有意义。事务回滚后,无法应用进一步的增量备份。

我们有以下备份数据

/dbbackup/base
/dbbackup/inc1
/dbbackup/inc2

准备base备份,但要防止回滚阶段:--prepare

# xtrabackup --prepare --apply-log-only --target-dir=/dbbackup/base

准备第一份增量数据,执行如下:

# xtrabackup --prepare --apply-log-only --target-dir=/dbbackup/base --incremental-dir=/dbbackup/inc1

准备第二个增量备份的过程,执行如下:

# xtrabackup --prepare --target-dir=/dbbackup/base --incremental-dir=/dbbackup/inc2
Tips:--apply-log-only在合并增量备份时应使用,但最后一个备份除外。

将备份的数据复制到数据目录下面

# xtrabackup --copy-back --parallel=16 --target-dir=/dbbackup/base
Tips: 恢复前必须保证数据目录为空,且服务停止状态。

权限分配

# chown mysql.mysql /data/mysql/dbs

服务启动

# systemctl restart mysqld 

其它运维操作

备份所有库,并启动4个线程,备份到/data/backups目录

# xtrabackup $xtb_opts --parallel=4 --target-dir=/data/backups/

备份指定的库或表

# xtrabackup $xtb_backup_opts --databases="db1 db2 db3.t1" --parallel=4 --target-dir=/data/backups/
Tips: 多个库可以用空格接入。

忽略某个库

# xtrabackup $xtb_opts --databases-exclude="db1 db2 db3.t1" --parallel=4 --target-dir=/data/backups/
Tips: 优先级比 --database高。

复制数据时可以加入内存限制

# xtrabackup --copy-back --use-memory=512M 

复制数据时也可以指定非数据库目录

# xtrabackup --copy-back --datadir=/var/lib/mysql

备份时使用pv限制速率

# xtrabackup --backup --stream=xbstream ./ | pv -q -L10m ssh user@desthost "cat - > /data/backups/backup.xbstream"

将备份数据存储到S3,注意xbcloud命令是否在环境变量中

https://docs.percona.com/percona-xtrabackup/8.0/xbcloud-s3.html

解决xbcloud依赖问题

#Debian/Ubundu
apt-get install libev4 libev-dev

执行以下命令

xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \
xbcloud put --storage=s3 \
--s3-endpoint='http://s3.vqiu.local:9000' \
--s3-access-key='YOUR-ACCESSKEYID' \
--s3-secret-key='YOUR-SECRETACCESSKEY' \
--s3-bucket='mysql-backups' \
--parallel=10 \
$(date -I)-full_backup

将备份流式传输到名为backup.xbstream

$ xtrabackup --backup --stream=xbstream --compress --target-dir=./ > backup.xbstream

加密备份

$ xtrabackup --backup --stream=xbstream ./ > backup.xbstream gzip -`` | openssl des3 -salt -k "密码" backup.xbstream.gz.des3

使用以下方法将备份发送到另一台服务器netcat

$ nc -l 9999 | cat - > /data/backups/backup.xbstream
$ xtrabackup --backup --stream=xbstream ./ | nc desthost 9999

压缩并行

# xtrabackup --backup --compress --compress-threads=8 --stream=xbstream --parallel=4 --target-dir=./ > backup.xbstream


解压缩
# mkdir /app/backup/data

解包,解压出都是qb文件
# cat backup.xbstream | xbstream -x -v -C /app/backup/data

解压缩解包出的文件,并删除qb原文件
# xtrabackup --decompress --remove-original --target-dir=/app/backup/data