Xtrabackup

652 阅读9分钟

安装

官方文档地址:www.percona.com/doc/percona…

yum源安装

  1. 安装Percona源
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
  1. 安装包
yum install epel-release -y
yum install percona-xtrabackup-24 -y
yum install qpress -y #压缩备份需要

源码编译安装

  1. 从github获取源码
git clone https://github.com/percona/percona-xtrabackup.git 
cd percona-xtrabackup 
git checkout 2.4

然后,您应该有一个以您分支的版本命名的目录,例如 percona-xtrabackup

  1. 编译安装
  • 先安装依赖
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf \ 
bison libtool ncurses-devel libgcrypt-devel libev-devel libcurl-devel \ 
vim-common
  • 编译安装
cmake -DBUILD_CONFIG = xtrabackup_release -DWITH_MAN_PAGES=OFF && make -j4
make install #默认安装/usr/local/xtrabackup

二进制包安装

1.下载2进制包

wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.9/binary/tarball/percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz

2.安装

yum install numactl -y
tar xf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/percona-xtrabackup-2.4.9-Linux-x86_64/ /usr/local/xtrabackup
echo 'export PATH=$PATH:/usr/local/xtrabackup/bin' >> /etc/profile
source /etc/profile

创建备份用户

create user 'bak'@'localhost' identified by 'bak';
grant reload,lock tables,replication client,process,super on *.* to 'bak'@'localhost';
flush privileges;

配置Xtrabackup

xtrabackup读取配置文件信息在my.cnf的[mysqld]和[xtrabackup]中,如果需要配置xtrabackup的配置只需要在

[xtrabackup]下配置,例如配置默认target_dir

[xtrabackup]
target_dir = /data/backups/mysql/

备份与恢复

完全备份

创建一次全备

2.4之后版本innobackpex将被弃用,所以后续都用xtrabackup

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --target-dir=/data/backups/

准备备份文件

xtrabackup --prepare --target-dir=/data/backups/

恢复备份到datadir

xtrabackup --copy-back --target-dir=/data/backups/

如果你不想保存备份,可以使用--move-back

在恢复备份之前,datadir必须为空。另外需要注意的是,在执行恢复之前需要关闭MySQL服务器。您无法还原到正在运行的mysqld实例的datadir(导入部分备份时除外)。

还可以直接拷贝或者通过rsync来还原备份

rsync -avrP /data/backup/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql

增量备份

创建一次全备

备份目录上一级目录必须存在,佛则报错

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --target-dir=/data/backups/base

备份会在xtrabackup_checkpoints文件中记录LSN和备份方式信息

基于全备的第一次增量备份

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base

基于全备的第二次增量备份

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --target-dir=/data/backups/inc2 \
--incremental-basedir=/data/backups/inc1

准备备份文件

  1. 先对全备做只提交不回滚
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
  1. 把第一次增量备份应用于全备
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1
  1. 把第二次增量备份应用于已修改的全备(包含第一次增量备份数据)
xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2

注意:除了最后一次增量备份应用于全备的操作,其余都需要加--apply-log-only,只提交,不回滚。

  1. 再对全备做一次--prepare
xtrabackup --prepare --target-dir=/data/backups/base
  1. 恢复全备
xtrabackup --copy-back --target-dir=/data/backups/base

压缩备份

要进行压缩备份,您需要使用 选项:--compress

创建压缩备份

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --compress --target-dir=/data/compressed/

采用并行压缩加速压缩备份,采用4个压缩线程

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --compress --compress-threads=4 \
--target-dir=/data/compressed/

准备备份文件

在准备备份之前,您需要解压缩所有文件。 Percona XtraBackup实现了可用于解压缩备份的选项。xtrabackup --decompress

Percona XtraBackup不会自动删除压缩文件。要清理备份目录,您应该使用 选项。即使它们没有被删除,如果使用--copy-back,--rmove-back,这些文件也不会被复制/移动到datadir 。 --remove-original

xtrabackup --decompress --target-dir=/data/compressed/

在继续之前,您需要确保已安装qpress。它可从 Percona Software存储库获得 yum install qpress -y

xtrabackup --prepare --target-dir=/data/compressed/

恢复备份

xtrabackup --copy-back --target-dir=/data/compressed/
chown -R mysql:mysql /var/lib/mysql

加密备份

Percona XtraBackup已实现对加密备份的支持。它可用于使用xbstream选项加密/解密本地或流式备份(不支持流式tar备份),以便为备份添加另一层保护。加密是通过libgcrypt库完成的。

要进行加密备份,需要指定选项(选项 并且 是互斥的,即只需要提供其中一个):

--encrypt-key

--encrypt-key-file

  • --encrypt=ALGORITHM-目前支持的算法是: AES128AES192AES256
  • --encrypt-key=ENCRYPTION_KEY - 使用适当长度的加密密钥。如果命令行无法控制访问机器,则不建议使用此选项,因此可以将密钥视为流程信息的一部分。
  • --encrypt-key-file=KEYFILE - 可以读取适当长度的原始密钥的文件的名称。该文件必须是一个简单的二进制(或文本)文件,其中包含要使用的密钥。

这两个选项, 可用于指定加密密钥:

--encrypt-key

--encrypt-key-file

可以使用以下命令生成加密密钥:

openssl rand -base64 24

该命令的示例输出应如下所示:

GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs

然后,该值可用作加密密钥

使用--encrypt-key选项

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --target-dir=/data/backups --encrypt=AES256 \
--encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs"

使用--encrypt-key-file选项

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --target-dir=/data/backups/ --encrypt=AES256 \
--encrypt-key-file=/data/backups/keyfile

优化加密备份

加密备份引入了两个选项,可用于加速加密过程

--encrypt-threads 指定多个线程并行地用于加密

--encrypt-chunk-size 用于指定每个加密线程的工作加密缓冲区的大小(以字节为单位)(默认为64K)

解密加密备份

可用于解密备份: --decrypt

xtrabackup --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \
--target-dir=/data/backups/
xtrabackup --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \
--target-dir=/data/backups/ --remove-original

准备加密备份

xtrabackup --prepare --target-dir=/data/backups/

恢复加密备份

xtrabackup --copy-back --target-dir=/data/backups/

部分备份

xtrabackup支持在启用独立表空间innodb_file_per_table选项时进行部分备份 ,有三种方法

  1. 将表名与正则表达式匹配
  2. 提供文件中的表名列表
  3. 提供数据库列表
  4. 该表必须是在开启独立表空间后创建的

--tables

正则匹配所有开头test的库下的所有表

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.].*"

正则匹配开头是test的库下的t1表

xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.]t1"

--tables-file

以库名.表名格式写入文件

echo "mydatabase.mytable" > /tmp/tables.txt
xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --tables-file=/tmp/tables.txt

--databases

多个库空格分隔

#多库备份中,最好同时备份mysql,sys库,这样方便恢复时用户账号信息也存在
xtrabackup -H 127.0.0.1 -ubak -pbak -P 3306 --backup --databases='mysql sys performance_schema ...' --target-dir=/data/backups/

部分备份恢复

部分备份有2种方式恢复

1 常规备份恢复

2 --export 单表恢复

  1. 常规恢复
xtrabackup --prepare --target-dir=/data/backups/

关闭数据库,拷贝数据库目录或者对应的表文件到datadir对应的库或者表,如果直接恢复到一个新实例也可以直接用copy-back.

chown mysql.mysql datadir -R
service mysqld start
  1. --export 单表恢复
xtrabackup --prepare --export --target-dir=/data/backups/

然后你能在备份目录中看到.exp文件

find /data/backups/ -name export_test.*
/data/backups/test/export_test.exp 
/data/backups/test/export_test.ibd 
/data/backups/test/export_test.cfg

目标实例必须是mysql5.6版本以上才支持导入单表

要将表导入其他服务器,首先要创建一个新表,其结构与将在该服务器上导入的表相同:

mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然后丢弃它的表空间:

mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制mytable.ibdmytable.exp文件到数据库的主页,并导入其表空间:

mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
ANALYZE TABLE mydatabase.mytable;

运行此命令后,导入表中的数据将可用。

限制备份

虽然xtrabackup不会阻止数据库的操作,但任何备份都可以为正在备份的系统增加负载。在没有太多备用I / O容量的系统上,限制xtrabackup读取和写入数据的速率可能会有所帮助。您可以使用该 选项执行此操作。此选项限制每秒复制的块数。块大小为10 MB

--throttle=

默认情况下,没有限制,xtrabackup尽可能快地读取和写入数据。如果您对IOPS设置了太严格的限制,则备份可能会非常慢,以至于它永远无法跟上InnoDB正在编写的事务日志,因此备份可能永远不会完成。

二进制日志

默认有两个文件会记录2进制日志信息

  1. 在只使用XtraDB或InnoDB引擎的情况下,可以在xtrabackup_binlog_pos_innodb中查看
  2. 如果有包含其他存储引擎的库(MyisAM),则通过查看xtrabackup_binlog_info

通常情况下只有innodb两个文件2进制一样,如果有其他引擎,则通常xtrabackup_binlog_info 中所示的 position 应该会比 xtrabackup_binlog_pos_innodb 所示的数值大

常见选项

  • --apply-log-only

    此选项仅在准备备份时执行重做阶段。这对增量备份非常重要。

  • --backup 进行备份并将其放入。

  • --compress

    此选项告诉xtrabackup使用指定的压缩算法压缩所有输出数据,包括事务日志文件和元数据文件。目前唯一支持的算法是quicklz。生成的文件具有qpress存档格式,即*.qp,xtrabackup生成的每个文件本质上都是一个文件的qpress存档,可以通过qpress文件存档提取和解压缩。

  • --compress-chunk-size=# 压缩线程的工作缓冲区大小(以字节为单位)。默认值为64K。

  • --compress-threads=#

    此选项指定xtrabackup用于并行数据压缩的工作线程数。此选项默认为1。并行压缩(:选项:xtrabackup -compress-threads)可以与并行文件复制()一起使用。例如, 将创建4个I / O线程,这些线程将读取数据并将其传递给2个压缩线程。xtrabackup --parallel --parallel=4 --compress --compress-threads=2

  • --copy-back 将先前制作的备份中的所有文件从备份目录复制到其原始位置

  • --databases=# 此选项指定应备份的数据库和表的列表。该选项接受表单列表。`"databasename1[.table_name1] databasename2[.table_name2] . . ."

  • --datadir=DIRECTORY 备份的源目录。这应该与MySQL服务器的datadir相同,因此my.cnf如果存在则应该从中读取; 否则你必须在命令行上指定它

  • --decompress