Percona XtraBackup使用说明
XtraBackup介绍
Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。它可以备份来自MySQL5.1,5.5,5.6和5.7服务器上的InnoDB,XtraDB和MyISAM表的数据,以及带有XtraDB的Percona服务器。
Percona XtraBackup为所有版本的Percona Server,MySQL和MariaDB进行MySQL热备份。它执行流,压缩和增量MySQL备份。
功能:
- 在不暂停数据库的情况下创建热的InnoDB备份
- 进行MySQL的增量备份
- 将压缩的MySQL备份传输到另一台服务器
- 在MySQL服务器之间移动表格
- 轻松创建新的MySQL复制从站
- 在不增加服务器负载的情况下备份MySQL
下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/
官方文档:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html#user-s-manual
参数说明:
https://www.percona.com/doc/percona-xtrabackup/LATEST/xtrabackup_bin/xbk_option_reference.html
yum安装
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum list | grep percona
yum install percona-xtrabackup-24
或者rpm下载到本地安装:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm
yum localinstall percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm
安装文件说明:
# rpm -ql percona-xtrabackup-24-2.4.11-1.el7.x86_64
/usr/bin/innobackupex # xtrabackup 的软连接
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt #加密解密用
/usr/bin/xbstream #类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.11
/usr/share/doc/percona-xtrabackup-24-2.4.11/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
innobackupex
功能全部集成到xtrabackup
里面,只有一个 binary,另外为了使用上的兼容考虑,innobackupex作为 xtrabackup 的一个软链,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex。
在当前2.4.11版本中innobackupex命令已经被弃用,但仍然以xtrabackup软连接的形式存在,
# innobackupex --help
NOTICE: 'innobackupex' is deprecated, please switch to 'xtrabackup'
# ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 May 17 20:34 /usr/bin/innobackupex -> xtrabackup
连接到服务器
$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/
$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
$ innobackupex --user=LUKE --password=US3TH3F0RC3 --stream=tar ./ | bzip2
其他选项:
-–port -–socket -–host
在多服务器实例的情况下,必须指定正确的连接参数(端口,套接字,主机)以便xtrabackup与正确的服务器通信
权限和特权需要
一旦连接到服务器,以执行备份你需要 READ
,WRITE
并EXECUTE
在服务器的文件系统级权限的datadir。
数据库用户需要备份的表/数据库上的以下特权:
RELOAD and LOCK TABLES (unless the --no-lock option is specified) in order to FLUSH TABLES WITH READ LOCK and FLUSH ENGINE LOGS prior to start copying the files, and LOCK TABLES FOR BACKUP and LOCK BINLOG FOR BACKUP require this privilege when Backup Locks are used,
REPLICATION CLIENT in order to obtain the binary log position,
CREATE TABLESPACE in order to import tables (see Restoring Individual Tables),
PROCESS in order to run SHOW ENGINE INNODB STATUS (which is mandatory), and optionally to see all threads which are running on the server (see Improved FLUSH TABLES WITH READ LOCK handling),
SUPER in order to start/stop the slave threads in a replication environment, use XtraDB Changed Page Tracking for Incremental Backups and for Improved FLUSH TABLES WITH READ LOCK handling,
CREATE privilege in order to create the PERCONA_SCHEMA.xtrabackup_history database and table,
INSERT privilege in order to add history records to the PERCONA_SCHEMA.xtrabackup_history table,
SELECT privilege in order to use innobackupex --incremental-history-name or innobackupex --incremental-history-uuid in order for the feature to look up the innodb_to_lsn values in the PERCONA_SCHEMA.xtrabackup_history table.
使用完整备份所需的最低权限创建数据库用户的SQL示例为:
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
完整备份
1.创建备份:
要创建备份,请使用xtrabackup --backup
选项运行xtrabackup,同时也需要--target-dir
选项指定存储备份的位置。如果目标目录不存在,xtrabackup会创建它。如果目录确实存在并且为空,则xtrabackup将成功。xtrabackup不会覆盖现有文件,它会因操作系统错误17而失败。
$ xtrabackup --backup --target-dir=/data/backups/
这会将备份存储在/data/backups/。如果您指定了相对路径,则目标目录将相对于当前目录。在备份过程中,可以看到大量输出显示正在复制的数据文件,以及日志文件线程反复扫描日志文件并从中复制日志文件。备份可能需要很长时间,具体取决于数据库的大小。随时取消是安全的,因为它不会修改数据库。
2.准备备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。--prepare
参数实现通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
$ xtrabackup --prepare --target-dir=/data/backups/
建议不要在准备备份时中断xtrabackup进程,因为它可能会导致数据文件损坏,并且备份将变得不可用。如果准备过程中断,则不保证备份有效性。注意:如果打算将备份作为进一步增量备份的基础,则应在准备备份时使用xtrabackup --apply-log-only
选项,否则将无法对其应用增量备份。
3.恢复备份
在恢复备份之前需要先执行--prepare
.
为了方便xtrabackup有一个xtrabackup --copy-back
选项,它将备份复制到服务器的datadir;如果您不想保存备份,则可以使用 xtrabackup --move-back
选项将备份的数据移动到DATADIR;如果您不想使用上述任何选项,则可以使用 rsync
或cp
来恢复文件。注意:在合并除最后一个之外的所有增量时应该使用xtrabackup –apply-log-only。这就是为什么上一行不包含该选项。即使 在最后一步使用了,备份仍然是一致的,但在这种情况下,服务器将执行回滚阶段。在恢复备份之前,DATADIR必须是空的。同样重要的是要注意,在执行恢复之前,需要关闭MySQL服务器。不能恢复运行的MySQL实例的DATADIR(除了导入部分备份)
可用于恢复备份的rsync命令示例如下所示:
$ rsync -avrP /data/backup/ /var/lib/mysql/
您应该检查还原的文件是否具有正确的所有权和许可权。由于文件的属性将被保留,在大多数情况下,您需要mysql在启动数据库服务器之前将文件的所有权更改为,因为它们将由创建备份的用户拥有:
$ chown -R mysql:mysql /var/lib/mysql
到此为止数据现在已恢复,您可以启动服务器。
增量备份
xtrabackup
和innobackupex
工具都支持增量备份,这意味着它们可以只复制自上次备份以来发生变化的数据。增量备份实际上不会将数据文件与前一个备份的数据文件进行比较。事实上,如果您知道它的LSN,可以使用xtrabackup --incremental-lsn
来执行增量备份,而无需执行以前的备份。增量备份只需读取页面并将其LSN与最后一个备份的LSN进行比较。然而,您仍然需要一个完整的备份来恢复增量更改;没有完整的备份作为基础,增量备份是无用的。
1.创建增量备份
要进行增量备份先进性完整备份。该xtrabackup二进制命令将一个xtrabackup_checkpoints的文件写入到备份的目标目录。该文件包含一个显示 to_lsn的行,这是备份结束时数据库的LSN。
完整备份:
$ xtrabackup --backup --target-dir=/data/backups/base
增量备份:
$ xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
该/data/backups/inc1/目录现在应该包含增量文件,如ibdata1.delta和test/table1.ibd.delta。这些代表了自那以来的变化。
现在可以将此目录用作另一个增量备份的基础:
增量备份的步骤与完整备份的步骤不同。在完整备份中,执行两种类型的操作以使数据库保持一致:从日志文件中针对数据文件重放已提交的事务,并且未提交的事务将回滚。在准备增量备份时,您必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行,并且很可能会在下一次增量备份中提交。您应该使用 xtrabackup –apply-log-only 该选项来防止回滚阶段。
$ xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
to_lsn
(最后一个检查点LSN)和last_lsn
(最后一个复制的LSN)之间存在差异,这意味着备份过程中服务器上存在一些流量。
2.准备增量备份
增量备份的步骤与完整备份的步骤不同。在完整备份中,执行两种类型的操作以使数据库保持一致:从日志文件中针对数据文件重放已提交的事务,并且未提交的事务将回滚。在准备增量备份时,您必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行,并且很可能会在下一次增量备份中提交。您应该使用 xtrabackup --apply-log-only
该选项来防止回滚阶段。注意: 如果您不使用xtrabackup --apply-log-only
该选项来阻止回滚阶段,那么您的增量备份将毫无用处。事务回滚后,不能应用进一步的增量备份。
从创建的完整备份开始,您可以准备它,然后将增量差异应用于它。回想一下,您有以下备份:
/data/backups/base
/data/backups/inc1
/data/backups/inc2
要准备基础备份,您需要照常运行xtrabackup –prepare,但要防止回滚阶段:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
日志序列号应该与您之前看到的基本备份的to_lsn相匹配。
要将第一次增量备份应用到完全备份,请运行以下命令:
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
这会将增量文件应用到文件中/data/backups/base,这些文件会将它们及时转发到增量备份的时间。然后像往常一样将重做日志应用于结果。最终数据位于 /data/backups/base,不在增量目录中。
准备第二次增量备份是一个类似的过程:对(已修改的)基础备份应用增量,并且您将及时将其数据转发到第二次增量备份的位置:
$ xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
注意:在合并除最后一个之外的所有增量时应该使用xtrabackup –apply-log-only。这就是为什么上一行不包含该选项。即使 在最后一步使用了,备份仍然是一致的,但在这种情况下,服务器将执行回滚阶段。
3.恢复备份
增量备份恢复步骤与完整备份恢复步骤一样。
压缩备份
Percona XtraBackup实施了对压缩备份的支持。它可用于使用xbstream
压缩/解压缩本地或流式备份。
1.创建压缩备份
为了进行压缩备份,您需要使用xtrabackup --compress
选项:
$ xtrabackup --backup --compress --target-dir=/data/compressed/
如果你想加快压缩速度,你可以使用并行压缩,这可以通过xtrabackup --compress-threads
选项启用。以下示例将使用四个线程进行压缩:
$ xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/compressed/
2.准备数据
在准备备份之前,您需要解压所有文件。 Percona XtraBackup已经实现了可用于解压缩备份的选项xtrabackup --decompress
。
在继续之前,您需要确保已安装qpress。它可以从 Percona软件仓库获得
$ xtrabackup --decompress --target-dir=/data/compressed/
Percona XtraBackup不会自动删除压缩文件。为了清理备份目录,您应该使用 xtrabackup --remove-original
移除原始选项。
当文件解压时,您可以使用xtrabackup --prepare
选项准备备份:
$ xtrabackup --prepare --target-dir=/data/compressed/
3.恢复数据
xtrabackup有一个xtrabackup --copy-back
选项,可以将备份恢复到服务器的datadir:
$ xtrabackup --copy-back --target-dir=/data/backups/
它会将所有与数据相关的文件复制回服务器的datadir,由服务器的my.cnf配置文件决定。
复制数据后应检查文件权限。你可能需要用类似的方法来调整它们:
$ chown -R mysql:mysql /var/lib/mysql
加密备份
Percona XtraBackup已经实现了对加密备份的支持。它可用于使用xbstream
选项加密/解密本地备份或流式备份(不支持流式tar备份),以便为备份添加另一层保护。加密是用libgcrypt库完成的。
1.创建加密备份
指定加密选项(xtrabackup --encrypt-key
and xtrabackup --encrypt-key-file
二选一)
--encrypt=ALGORITHM
目前支持的算法是: AES128,AES192和AES256
--encrypt-key=ENCRYPTION_KEY
使用适当长度的加密密钥。不建议在通过命令行访问机器的情况下使用此选项,因此可以将该密钥视为过程信息的一部分。
--encrypt-key-file=KEYFILE
可从中读取适当长度的原始密钥的文件的名称。该文件必须是一个简单的二进制(或文本)文件,其中包含准确使用的密钥。
生成秘钥:
$ openssl rand -base64 24
GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs
使用该--encrypt-key
选项:
$ xtrabackup --backup --target-dir=/data/backups --encrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs"
使用该--encrypt-key-file
选项:
$ xtrabackup --backup --target-dir=/data/backups/ --encrypt=AES256 --encrypt-key-file=/data/backups/keyfile
建议的方法是使用以下命令创建文件:
echo -n "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /data/backups/keyfile
2.优化加密过程
已经引入了两个选项,这些加密备份可用于加速加密过程。他们是 xtrabackup --encrypt-threads
和 xtrabackup --encrypt-chunk-size
。
xtrabackup --encrypt-threads #可以指定多个线程并行地进行加密。
xtrabackup --encrypt-chunk-size #可用于指定每个加密线程的工作加密缓冲区的大小(以字节为单位)(默认值为64K)。
3.解密加密过程
Percona XtraBackup xtrabackup --decrypt
选项可用于解密备份:
$ xtrabackup --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" --target-dir=/data/back
Percona XtraBackup不会自动删除加密文件。为了清理备份目录,用户应该删除这些*.xbcrypt
文件。您可以使用xtrabackup --remove-original
选项在解密后删除加密文件。
$ xtrabackup --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" --target-dir=/data/backups/ --remove-original
4.准备加密备份
$ xtrabackup --prepare --target-dir=/data/backups/
5.恢复加密的备份
$ xtrabackup --copy-back --target-dir=/data/backups/