这份文档针对的是最新发布的版本:Percona XtraBackup 2.4.29(发布说明)。
Percona XtraBackup是一款针对MySQL系列服务器的开源热备份工具,在备份过程中不会锁定您的数据库。它能够对MySQL 5.1、5.5、5.6和5.7服务器以及带有XtraDB的Percona服务器上的InnoDB、XtraDB和MyISAM表进行数据备份。
注意:
从Percona XtraBackup 2.1版本开始,已移除对InnoDB 5.1内置版本的支持。
如需了解更多关于其众多高级功能的概述,包括功能对比,请参阅"关于Percona XtraBackup"。
无论是对24小时高负载服务器还是低交易量环境,Percona XtraBackup都旨在实现无缝备份,而不会中断生产环境中服务器的性能。我们还提供商业支持合同。
重要提示:
Percona XtraBackup 2.4 不支持对 MySQL 8.0 、Percona Server for MySQL 8.0 或 Percona XtraDB Cluster 8.0中创建的数据库进行备份。请为8.0版本的数据库使用Percona XtraBackup 8.0。
一 介绍
1 关于 Percona XtraBackup
Percona XtraBackup是全球唯一一款开源且免费的MySQL热备份软件,能够为InnoDB和XtraDB数据库执行非阻塞备份。使用Percona XtraBackup,您可以获得以下好处:
- 快速且可靠的备份完成
- 备份期间事务处理不间断
- 节省磁盘空间和网络带宽
- 自动备份验证
- 由于恢复时间更快,因此系统正常运行时间更长
请查看Percona软件和平台生命周期中的兼容性矩阵,了解Percona XtraBackup支持哪些版本的MySQL、MariaDB以及Percona Server for MySQL,并且支持对任何类型的备份进行加密。
Percona XtraBackup支持对InnoDB、Percona XtraDB Cluster和HailDB存储引擎进行非阻塞备份。此外,在备份结束时短暂暂停写入操作,Percona XtraBackup还可以备份以下存储引擎:MyISAM、Merge(.MRG)和Archive(.ARM),包括分区表、触发器和数据库选项。在复制非InnoDB数据时,InnoDB表仍然会被锁定。对于启用了更改页面跟踪的Percona Server with Percona XtraDB Cluster,支持快速增量备份。
重要提示:
- Percona XtraBackup 2.4仅支持Percona XtraDB Cluster 5.7。
- Percona XtraBackup 2.4不支持MyRocks存储引擎或TokuDB存储引擎。
- Percona XtraBackup与MariaDB 10.3及更高版本不兼容。
Percona的企业级商业MySQL支持合同包括了对Percona XtraBackup的支持。我们建议您为关键的生产环境部署提供支持。
Percona XtraBackup有哪些功能?
以下是Percona XtraBackup功能的简短列表。更多信息请参见文档。
- 在不暂停数据库的情况下创建InnoDB热备份
- 对MySQL进行增量备份
- 将压缩的MySQL备份流式传输到另一台服务器
- 在线在MySQL服务器之间移动表
- 轻松创建新的MySQL复制副本
- 在不增加服务器负载的情况下备份MySQL
备份锁是Percona Server 5.6+中提供的FLUSH TABLES WITH READ LOCK的轻量级替代方案。Percona XtraBackup会自动使用它们来复制非InnoDB数据,以避免阻塞修改InnoDB表的DML查询。
Percona XtraBackup根据每秒IO操作的数量进行限速。
在准备紧凑备份时,Percona XtraBackup会跳过次要索引页并在之后重新创建它们。
无论InnoDB版本如何,Percona XtraBackup都可以从完整备份中导出单个表。
使用Percona XtraBackup导出的表可以导入到Percona Server 5.1、5.5或5.6+或MySQL 5.6+中。
2 Percona XtraBackup 如何工作
Percona XtraBackup基于InnoDB的崩溃恢复功能。它首先复制您的InnoDB数据文件,这些数据文件在内部是不一致的;但随后它会对这些文件执行崩溃恢复操作,使它们再次成为一致且可用的数据库。
这之所以可行,是因为InnoDB维护了一个重做日志(也称为事务日志)。该日志记录了InnoDB数据的所有更改。InnoDB启动时,会检查数据文件和事务日志,并执行两个步骤。它将已提交的事务日志条目应用到数据文件中,并对任何修改了数据但未提交的事务执行回滚操作。
Percona XtraBackup的工作原理是,在开始时记住日志序列号(LSN),然后复制数据文件。这个过程需要一些时间,因此如果文件正在更改,则它们会反映数据库在不同时间点的状态。同时,Percona XtraBackup会运行一个后台进程来监控事务日志文件,并从中复制更改。Percona XtraBackup需要持续这样做,因为事务日志是以循环方式写入的,并且可以被重用。自Percona XtraBackup开始执行以来,它需要事务日志记录来记录对数据文件的每次更改。
在可能的情况下,Percona XtraBackup会使用备份锁作为FLUSH TABLES WITH READ LOCK的轻量级替代方案。此功能在Percona Server for MySQL 5.6+中可用。Percona XtraBackup会自动使用此功能来复制非InnoDB数据,以避免阻塞修改InnoDB表的DML查询。当服务器支持备份锁时,xtrabackup将首先复制InnoDB数据,运行LOCK TABLES FOR BACKUP并复制MyISAM表和.frm文件。完成这些操作后,将开始备份文件。它将备份.frm、.MRG、.MYD、.MYI、.TRG、.TRN、.ARM、.ARZ、.CSM、.CSV、.par和.opt文件。
注意
仅对MyISAM和其他非InnoDB表进行锁定,并且仅在Percona XtraBackup完成备份所有InnoDB/XtraDB数据和日志后进行。在可能的情况下,Percona XtraBackup会使用备份锁作为FLUSH TABLES WITH READ LOCK的轻量级替代方案。此功能在Percona Server for MySQL 5.6+中可用。Percona XtraBackup会自动使用此功能来复制非InnoDB数据,以避免阻塞修改InnoDB表的DML查询。
之后,xtrabackup将使用LOCK BINLOG FOR BACKUP来阻止所有可能会更改二进制日志位置或Exec_Master_Log_Pos或Exec_Gtid_Set(即SHOW MASTER/SLAVE STATUS报告的与复制副本上当前SQL线程状态对应的源二进制日志坐标)的操作。然后,xtrabackup将完成复制REDO日志文件并获取二进制日志坐标。完成此操作后,xtrabackup将解锁二进制日志和表。
最后,二进制日志位置将被打印到STDERR,如果一切正常,xtrabackup将退出并返回0。
请注意,xtrabackup的STDERR不会写入任何文件。您需要将其重定向到文件,例如,xtrabackup OPTIONS 2> backupout.log。
它还会在备份目录中创建以下文件。
在准备阶段,Percona XtraBackup将使用复制的事务日志文件对复制的数据文件执行崩溃恢复。完成后,数据库即可恢复和使用。
备份的MyISAM和InnoDB表最终将相互一致,因为在准备(恢复)过程之后,InnoDB的数据会向前滚动到备份完成时的点,而不是回滚到开始时的点。这个时间点与FLUSH TABLES WITH READ LOCK的时间点相匹配,因此MyISAM数据和准备好的InnoDB数据是同步的。
xtrabackup和innobackupex工具都提供了许多前面解释中未提及的功能。手册中进一步详细解释了每个工具的功能。简而言之,这些工具允许您执行诸如流式和增量备份等操作,这些操作可以结合复制数据文件、复制日志文件以及将日志应用到数据来实现。
恢复备份
要使用xtrabackup恢复备份,您可以使用xtrabackup --copy-back或xtrabackup --move-back选项。
xtrabackup将读取my.cnf中的datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir变量,并检查这些目录是否存在。
它将首先复制MyISAM表、索引等(.frm、.MRG、.MYD、.MYI、.TRG、.TRN、.ARM、.ARZ、.CSM、.CSV、par和.opt文件),然后是InnoDB表和索引,最后是日志文件。在复制文件时,它会保留文件的属性,因此在启动数据库服务器之前,您可能需要将文件的所有权更改为mysql,因为备份文件的所有者将是创建备份的用户。
另外,还可以使用xtrabackup --move-back选项来恢复备份。此选项与xtrabackup --copy-back类似,唯一不同的是,它不是复制文件,而是将它们移动到目标位置。由于此选项会删除备份文件,因此请谨慎使用。当磁盘空间不足以同时存储数据文件和其备份副本时,此选项很有用。
3 理解版本号
版本号用于标识产品的发布版本。该产品包含发布时最新的通用可用(GA)功能。
Percona采用语义版本号,遵循基础版本和次要构建的格式。Percona为每个次要构建发布分配唯一且递增的非负整数。版本号结合了Percona XtraBackup的基础版本号和次要构建版本号。
Percona并不会为MySQL 5.7的每个发布版本都发布一个新的Percona XtraBackup 2.4版本。Percona XtraBackup 2.4与MySQL 5.7的更新版本兼容。
Percona XtraBackup 2.4.26的版本号定义了以下信息:
- 基础版本 - 最左边的数字表示基于MySQL 5.7的Percona XtraBackup的版本。基础版本升级时,次要构建版本会重置为0。
- 次要构建版本 - 一个内部编号,表示软件的版本。每次发布Percona XtraBackup时,构建版本都会增加1。
二 安装
官方文档支持多种安装方式 使用RPM包 源码编译 ,二进制压缩包等,我们这里使用下载的rpm包进行安装
使用下载的rpm包安装Percona XtraBackup
下载页面: https://www.percona.com/downloads
从下载页面为您的架构下载所需系列的包。以下示例将下载适用于CentOS 7的Percona XtraBackup 2.4.28发行版包:
bash
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm
现在,您可以通过运行以下命令来安装Percona XtraBackup:
bash
yum install -y percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm
卸载Percona XtraBackup
要完全卸载Percona XtraBackup,您需要删除所有已安装的软件包。
删除软件包:
|---|---------------------------------|
| | yum remove percona-xtrabackup
|
三 要求
1 连接和所需权限
Percona XtraBackup在创建备份、在某些场景下准备备份以及恢复备份时,需要能够连接到数据库服务器并在服务器上和数据目录(datadir)执行操作。为了执行这些操作,必须满足其执行时的权限和许可要求。
权限指的是系统用户在数据库服务器上被允许执行的操作。这些权限在数据库服务器上设置,并且仅适用于数据库服务器中的用户。
许可是指允许用户在系统上执行操作,如读取、写入或执行某个目录中的文件,或启动/停止系统服务。这些许可在系统级别设置,并且仅适用于系统用户。
无论使用xtrabackup还是innobackupex,都涉及两个主体:调用程序的用户(系统用户)和在数据库服务器上执行操作的用户(数据库用户)。请注意,尽管它们可能有相同的用户名,但它们在不同的地方是不同的用户。
本文档中所有对innobackupex和xtrabackup的调用都假设系统用户具有适当的许可,并且您除了提供执行操作所需的选项外,还提供了连接数据库服务器的相关选项,同时数据库用户具有足够的权限。
连接到服务器
连接到服务器的数据库用户及其密码由xtrabackup的--user和--password选项指定:
bash
$ 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 -
如果您不使用xtrabackup的--user选项,Percona XtraBackup将假定执行它的系统用户的名称是数据库用户名。
其他连接选项
根据您的系统,您可能需要指定以下一个或多个选项来连接到服务器:
- --port:使用TCP/IP连接到数据库服务器时要使用的端口。
- --socket:连接到本地数据库时要使用的套接字。
- --host:使用TCP/IP连接到数据库服务器时要使用的主机。
这些选项将原封不动地传递给mysql子进程,详见mysql --help。
注意:在多个服务器实例的情况下,为了xtrabackup能够与正确的服务器通信,必须指定正确的连接参数(端口、套接字、主机)。
所需许可和权限
连接到服务器后,为了执行备份,您需要在服务器的数据目录的文件系统级别具有读取和执行权限。
数据库用户需要对要备份的表/数据库具有以下权限:
- RELOAD 和LOCK TABLES(除非指定了--no-lock选项),以便在开始复制文件之前执行FLUSH TABLES WITH READ LOCK和FLUSH ENGINE LOGS,并且在使用备份锁时需要此权限来LOCK TABLES FOR BACKUP和LOCK BINLOG FOR BACKUP。
- REPLICATION CLIENT以获得二进制日志位置。
- CREATE TABLESPACE以导入表(见恢复单个表)。
- PROCESS以运行SHOW ENGINE INNODB STATUS(这是必需的),并且可选地查看服务器上正在运行的所有线程(见改进的FLUSH TABLES WITH READ LOCK处理)。
- SUPER以在复制环境中启动/停止复制线程,使用XtraDB Changed Page Tracking进行增量备份,以及进行改进的FLUSH TABLES WITH READ LOCK处理。
- CREATE权限以创建PERCONA_SCHEMA.xtrabackup_history数据库和表。
- ALTER权限以升级PERCONA_SCHEMA.xtrabackup_history数据库和表。
- INSERT权限以向PERCONA_SCHEMA.xtrabackup_history表添加历史记录。
- SELECT权限以使用innobackupex --incremental-history-name或innobackupex --incremental-history-uuid功能来查找PERCONA_SCHEMA.xtrabackup_history表中的innodb_to_lsn值。
这些权限的使用情况解释可以在《Percona XtraBackup的工作原理》中找到。
创建一个具有执行完整备份所需最低权限的数据库用户的SQL示例如下:
sql
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO
'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
2 配置xtrabackup
xtrabackup的所有配置都是通过选项完成的,这些选项的行为与标准的MySQL程序选项完全相同:它们既可以在命令行中指定,也可以通过如/etc/my.cnf这样的文件指定。
xtrabackup二进制文件会按顺序读取任何配置文件中的[mysqld]和[xtrabackup]部分。这样做是为了让它可以从您现有的MySQL安装中读取选项,比如datadir或一些InnoDB选项。如果您想覆盖这些选项,只需在[xtrabackup]部分中指定它们,并且由于它是后面读取的,因此会优先生效。
如果您不想在my.cnf中放置任何配置,也不需要这样做。您可以直接在命令行中指定选项。通常,您可能觉得在my.cnf文件的[xtrabackup]部分中唯一方便放置的是target_dir选项,用于设置备份文件默认放置的目录,例如:
[xtrabackup]
target_dir = /data/backups/mysql/
本手册将假设您没有为xtrabackup设置任何基于文件的配置,因此它总是会显式地显示所使用的命令行选项。有关所有配置选项的详细信息,请参阅选项和变量参考。
xtrabackup二进制文件在my.cnf文件中接受的语法并不完全与mysqld服务器二进制文件相同。出于历史原因,mysqld服务器二进制文件接受带有--set-variable=<variable>=<value>语法的参数,但xtrabackup不理解这种语法。如果您的my.cnf文件中有这样的配置指令,您应该将它们重写为--variable=value语法。
3 系统配置和NFS卷
在大多数系统上,xtrabackup工具不需要特殊配置。但是,xtrabackup的--target-dir所在的存储必须在调用fsync()时表现正常。特别是,我们注意到,未使用sync选项挂载的NFS卷可能不会真正同步数据。因此,如果您将备份存储在使用async选项挂载的NFS卷上,然后尝试从也挂载了该卷的不同服务器准备备份,数据可能会显示为损坏。您可以使用sync挂载选项来避免这个问题。
四 备份场景
1 全备
**(1)**Creating a backup 创建全备
要创建备份,请使用带有--backup
选项的xtrabackup
命令。您还需要指定--target-dir
选项,该选项定义了备份存储的位置。如果InnoDB数据或日志文件未存储在相同目录中,您可能还需要指定这些文件的位置。如果目标目录不存在,xtrabackup
将创建它。如果目录已存在且为空,xtrabackup
将成功执行。xtrabackup
不会覆盖现有文件,如果尝试这样做,将会遇到操作系统错误17(文件已存在)并导致失败。
要启动备份过程,请运行:
$ xtrabackup --backup --target-dir=/data/backups/
这将在/data/backups/
目录下存储备份。如果您指定的是相对路径,则目标目录将相对于当前目录。
在备份过程中,您应该会看到大量输出,显示数据文件正在被复制,以及日志线程反复扫描日志文件并从中复制内容。以下是一个示例,显示了后台日志线程正在扫描日志,以及一个文件复制线程正在处理ibdata1
文件:
最后,您应该会看到类似以下的内容,其中<LSN>的值将取决于您的系统:
xtrabackup: 已复制lsn从(<SLN>)到(<LSN>)的事务日志。
注意
日志复制线程每秒检查一次事务日志,以查看是否有需要复制的新日志记录写入,但有可能日志复制线程无法跟上写入事务日志的量,并且当日志记录在被读取之前被覆盖时,会遇到错误。
备份完成后,目标目录将包含如下文件,假设您有一个名为test.tbl1的单个InnoDB表,并且正在使用MySQL的innodb_file_per_table选项:
$ ls -lh /data/backups/
结果如下:
备份可能需要很长时间,具体取决于数据库的大小。但您可以随时安全地取消,因为它不会修改数据库。
下一步是准备恢复备份。
(2) Preparing a backup 准备恢复
使用xtrabackup --backup
选项进行备份后,您需要先准备它,然后才能恢复。在准备之前,数据文件并不是时间点一致的,因为它们在程序运行时是在不同时间复制的,而且在这个过程中可能会发生变化。如果您尝试使用这些数据文件启动InnoDB,它将检测到损坏并自行崩溃,以防止您在损坏的数据上运行。xtrabackup --prepare
步骤可以使文件在某一瞬间完全一致,这样您就可以在它们上面运行InnoDB。
您可以在任何机器上运行准备操作;它不需要在原始服务器或您打算恢复的服务器上。您可以将备份复制到实用程序服务器并在那里准备它。
注意
您可以使用较新的Percona XtraBackup版本来准备使用较旧版本创建的备份,但反之则不行。在不支持的服务器版本上准备备份时,应使用支持该服务器版本的最新Percona XtraBackup发行版。例如,如果有人使用Percona XtraBackup 1.6创建了MySQL 5.0的备份,那么使用Percona XtraBackup 2.3来准备备份是不受支持的,因为Percona XtraBackup 2.1中已移除了对MySQL 5.0的支持。相反,应该使用2.0系列的最新版本。
在准备操作期间,xtrabackup
会启动一种嵌入在其内部的修改过的InnoDB(它链接到的库)。这些修改是必要的,以禁用InnoDB的标准安全检查,比如抱怨日志文件大小不正确,这些对于处理备份来说是不合适的。这些修改仅适用于xtrabackup
二进制文件;您不需要修改InnoDB即可使用xtrabackup
进行备份。
准备步骤使用此嵌入的InnoDB对复制的数据文件执行崩溃恢复,并使用复制的日志文件。准备步骤的使用非常简单:您只需运行xtrabackup --prepare
选项并告诉它要准备哪个目录,例如,要准备之前创建的备份,请运行:
$ xtrabackup --prepare --target-dir=/data/backups/
完成后,您应该会看到InnoDB关闭并显示如下消息,其中LSN的值将取决于您的系统:
InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!
后续的所有准备操作都不会更改已经准备好的数据文件,您会看到输出显示:
xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'.
不建议在准备备份时中断xtrabackup
进程,因为这可能会导致数据文件损坏,使备份无法使用。如果准备过程被中断,则不保证备份的有效性。
注意
如果您打算让备份成为进一步增量备份的基础,那么在准备备份时应使用xtrabackup --apply-log-only
选项,否则您将无法将增量备份应用到它上面。有关准备增量备份的更多详细信息,请参阅相关文档。
**(3)**Restoring a Backup 恢复备份
警告
备份需要先准备好才能恢复。
$ xtrabackup --copy-back --target-dir=/data/backups/
如果您不想保留备份,可以使用xtrabackup --move-back
选项,这将把备份的数据移动到datadir。
如果您不想使用上述任何选项,还可以使用rsync
或cp
来恢复文件。
注意
- 在恢复备份之前,datadir必须为空。
- 此外,重要的是要注意,在恢复之前需要关闭MySQL服务器。您不能恢复到正在运行的mysqld实例的datadir(除非在导入部分备份时)。
可以使用以下示例rsync
命令来恢复备份:
$ rsync -avrP /data/backup/ /var/lib/mysql/
您应该检查恢复的文件是否具有正确的所有权和权限。
由于文件属性将被保留,在大多数情况下,您需要在启动数据库服务器之前将文件的所有权更改为mysql,因为它们的所有者将是创建备份的用户:
$ chown -R mysql:mysql /var/lib/mysql
现在数据已恢复,您可以启动服务器。
注意
当启用relay-log-info-repository=TABLE
时,从备份恢复的实例会在错误日志中出现错误,如下所示:
2019-08-09 12:40:02 69297 [ERROR] Failed to open the relay log '/data/mysql-relay-bin.004349' (relay_log_pos 5534092)
为避免此类问题,请在执行CHANGE MASTER TO
之前启用relay_log_recovery
或执行RESET SLAVE
。
中继日志信息已备份,但已创建新的中继日志,这在恢复期间会造成不匹配。
2 增量备份
3 压缩备份
Percona XtraBackup 支持压缩备份:可以使用 xbstream 对本地或流式备份进行压缩或解压缩。
(1)创建压缩备份
要创建压缩备份,您需要使用 xtrabackup 的 --compress
选项:
$ xtrabackup --backup --compress --target-dir=/data/compressed/
xtrabackup --compress
使用 qpress 工具进行压缩,您可以通过 percona-release 包配置工具安装该工具,如下所示:
bash
$ sudo percona-release enable tools
$ sudo apt update
$ sudo apt install qpress
注意
启用存储库:percona-release enable-only tools release
。如果您打算将 Percona XtraBackup 与上游 MySQL 服务器结合使用,则只需启用 tools 存储库:percona-release enable-only tools
。
如果要加快压缩速度,可以使用并行压缩,通过 --compress-threads
选项启用。以下示例将使用四个线程进行压缩:
bash
$ xtrabackup --backup --compress --compress-threads=4 \
--target-dir=/data/compressed/
(2)准备备份
在准备备份之前,您必须解压缩所有文件。Percona XtraBackup 实现了 --decompress
选项,可用于解压缩备份。
|---|------------------------------------------------------------|
| | $ xtrabackup --decompress --target-dir=/data/compressed/
|
注意
--parallel
可以与 --decompress
选项一起使用,以同时解压缩多个文件。
Percona XtraBackup 不会自动删除压缩文件。为了清理备份目录,请使用 --remove-original
选项。如果未删除文件,在使用 --copy-back
或 --move-back
时,它们不会被复制到或移动到 datadir。
解压文件后,您可以使用 --prepare
选项准备备份:
|---|---------------------------------------------------------|
| | $ xtrabackup --prepare --target-dir=/data/compressed/
|
检查确认消息
现在,/data/compressed/
中的文件已准备好供服务器使用。
(3)恢复备份
xtrabackup
有一个 --copy-back
选项,可将备份恢复到服务器的 datadir:
|---|--------------------------------------------------------|
| | $ xtrabackup --copy-back --target-dir=/data/backups/
|
该选项将所有相关数据文件复制回服务器的 datadir,该目录由服务器的 my.cnf
配置文件确定。检查输出的最后一行以获取成功消息:
复制代码
|---|--------------------------|
| | 170223 13:49:13 完成 OK!
|
复制数据后,验证文件权限。您可能需要调整权限。例如,以下命令更改文件位置的所有者:
bash复制代码
|---|-----------------------------------------|
| | $ chown -R mysql:mysql /var/lib/mysql
|
现在,datadir 包含恢复的数据。您已准备好启动服务器。