一、Percona Xtrabackup概述
Percona XtraBackup是世界上唯一一款开源的免费MySQL热备份软件,可以为InnoDB和XtraDB数据库执行非阻塞备份。
使用Percona XtraBackup,您可以获得以下好处:
快速可靠地完成备份
备份期间不间断的事务处理
节省磁盘空间和网络带宽
自动备份验证
由于恢复时间更快,正常运行时间更长
Percona XtraBackup对所有版本的Percona Server for MySQL和MySQL进行MySQL热备份。它执行流式、压缩和增量MySQL备份。
注意:
随着Percona XtraBackup 8.0的推出,Percona XtraBackup 2.4将继续支持MySQL和Percona Server 5.6和5.7数据库。由于新的MySQL重做日志和数据字典格式,Percona XtraBackup 8.0.x版本将只与MySQL8.0.x和即将推出的用于MySQL8.0.x的Percona服务器兼容
1、支持的存储引擎
Percona XtraBackup可以与MySQL和Percona Server for MySQL协同工作。它支持InnoDB、XtraDB和MyRocks存储引擎的完全无阻塞备份。此外,它还可以通过在备份结束时短暂暂停写入操作来备份以下存储引擎:MyISAM、Merge和Archive,包括分区表、触发器和数据库选项。
注意:
MyRocks存储引擎的支持在版本8.0.6中添加。
Percona XtraBackup 8.0不支持TokuDB存储引擎。
2、MySQL备份工具特性比较
| Features | Percona XtraBackup | MySQL Enterprise backup |
|---|---|---|
| License | GPL | Proprietary |
| Price | Free | Included in subscription at $5000 per Server |
| Streaming and encryption formats | Open source | Proprietary |
| Supported MySQL flavors | MySQL, Percona Server for MySQL, Percona XtraDB Cluster, | MySQL |
| Supported operating systems | Linux | Linux, Solaris, Windows, OSX, FreeBSD. |
| Non-blocking InnoDB backups [1] | Yes | Yes |
| Blocking MyISAM backups | Yes | Yes |
| Incremental backups | Yes | Yes |
| Full compressed backups | Yes | Yes |
| Incremental compressed backups | Yes | |
| Fast incremental backups [2] | Yes | |
| Incremental backups with archived logs feature in Percona Server | Yes | |
| Incremental backups with REDO log only | Yes | |
| Backup locks [7] | Yes (LOCK TABLE FOR BACKUP) |
Yes (LOCK INSTANCE FOR BACKUP) |
| Encrypted backups(加密备份) | Yes | Yes [3] |
| Streaming backups | Yes | Yes |
| Parallel local backups | Yes | Yes |
| Parallel compression | Yes | Yes |
| Parallel encryption | Yes | Yes |
| Parallel apply-log | Yes | |
| Parallel copy-back | Yes | |
| Partial backups | Yes | Yes |
| Partial backups of individual partitions | Yes | |
| Throttling [4](限流) | Yes | Yes |
| Backup image validation(备份映像验证) | Yes | |
| Point-in-time recovery support | Yes | Yes |
| Safe slave backups | Yes | |
| Compact backups [5] | Yes | |
| Buffer pool state backups | Yes | |
| Individual tables export(个别表导出) | Yes | Yes [6] |
| Individual partitions export | Yes | |
| Restoring tables to a different server | Yes | Yes |
| Data & index file statistics | Yes | |
| InnoDB secondary indexes defragmentation(InnoDB二级索引碎片整理) | Yes | |
rsync support to minimize lock time(支持最小化锁定时间) |
Yes | |
Improved FTWRL handling |
Yes | |
| Backup history table | Yes | Yes |
| Backup progress table | Yes | |
| Offline backups | Yes | |
| Backup to tape media managers(备份到磁带介质管理器) | Yes | |
| Cloud backups support | Amazon S3 | |
| External graphical user interfaces to backup/recovery(用于备份/恢复的外部图形用户界面) | Zmanda Recovery Manager for MySQL | MySQL Workbench, MySQL Enterprise Monitor |
[1]复制非InnoDB数据时,InnoDB表仍然被锁定。
[2]Percona Server for MySQL支持快速增量备份,支持XtraDB更改页面跟踪。
[3]Percona XtraBackup支持对任何备份进行加密。MySQL企业备份只支持对单个文件备份进行加密。
[4]Percona XtraBackup根据每秒IO操作数执行限制。MySQL企业备份支持操作之间的可配置睡眠时间。
[5]Percona XtraBackup跳过辅助索引页,并在准备压缩备份时重新创建它们。MySQL Enterprise Backup跳过未使用的页并重新插入到准备阶段。
[6]Percona XtraBackup甚至可以从完整备份中导出单个表,无论InnoDB版本如何。MySQL Enterprise Backup仅在执行部分备份时使用InnoDB 5.6可移植表空间。
[7]备份锁是用Percona Server for MySQL中的读锁刷新表的轻量级替代方法。Percona XtraBackup使用它们自动复制非InnoDB数据,以避免阻塞修改InnoDB表的DML查询。
3、Percona XtraBackup有什么特点?
在不暂停数据库的情况下创建热的InnoDB备份
对MySQL进行增量备份
将压缩的MySQL备份流式传输到另一台服务器
在MySQL服务器之间在线移动表
轻松创建新的MySQL复制从属服务器
在不向服务器添加负载的情况下备份MySQL
二、Percona XtraBackup备份工作原理
1、Percona XtraBackup备份工作原理
Percona XtraBackup基于InnoDB的崩溃恢复功能。它复制您的InnoDB数据文件,这会导致数据在内部不一致;但随后它会对这些文件执行崩溃恢复,使它们再次成为一致的、可用的数据库。
这是因为InnoDB维护一个重做日志,也称为事务日志。它包含对InnoDB数据的每次更改的记录。当InnoDB启动时,它检查数据文件和事务日志,并执行两个步骤。它将提交的事务日志条目应用于数据文件,并对修改数据但未提交的任何事务执行撤消操作。
Percona XtraBackup的工作原理是在启动时记住日志序列号(LSN),然后复制数据文件。这样做需要一些时间,因此如果文件正在更改,那么它们将反映数据库在不同时间点的状态。同时,Percona XtraBackup运行一个后台进程来监视事务日志文件,并从中复制更改。PerconaXtrabackup需要不断地这样做,因为事务日志是以循环方式编写的,并且可以在一段时间后重用。Percona XtraBackup自开始执行以来,每次对数据文件的更改都需要事务日志记录。
Percona XtraBackup使用备份锁(如果有的话)作为一种轻量级的替代方法来使用读锁刷新表。Percona Server for MySQL 5.6+中提供了此功能。MySQL 8.0允许通过lock instance FOR backup语句获取实例级备份锁。
只有在Percona XtraBackup完成对所有InnoDB/XtraDB数据和日志的备份后,才会对MyISAM和其他非InnoDB表执行锁定。Percona XtraBackup会自动复制非InnoDB数据,避免阻塞修改InnoDB表的DML查询。
注意
为了要有效地使用LOCK INSTANCE FOR BACKUP or LOCK TABLES FOR BACKUP,需要BACKUP_ADMIN权限才能查询performance_schema.log_status。
当实例只包含InnoDB表时,xtrabackup试图避免使用备份锁并用读锁刷新表。在这种情况下,xtrabackup从performance_schema.log_status获取二进制日志坐标。使用--slave info启动xtrabackup时,MySQL 8.0中仍然需要使用FLUSH TABLES WITH READ LOCK。Percona Server for MySQL8.0中的log_status表被扩展为包含中继日志坐标,因此即使使用--slave info选项也不需要锁。
2、Percona XtraBackup备份步骤
1)当服务器支持备份锁时,xtrabackup首先复制InnoDB数据,运行LOCK TABLES FOR BACKUP,然后复制MyISAM表。
2)完成后,将开始备份文件。它将备份.frm、.MRG、.MYD、.MYI、.ARM、.ARZ、.CSM、.CSV、.sdi和.par文件。
3)在此之后,xtrabackup将使用LOCK BINLOG FOR BACKUP,以阻止所有可能更改二进制日志位置或Exec_Master_log_Pos或Exec_Gtid_Set(即,主二进制日志坐标对应于复制从机上的当前SQL线程状态)的操作,如SHOW Master/slave STATUS所报告的。然后,xtrabackup将完成复制重做日志文件并获取二进制日志坐标。完成后,xtrabackup将解锁二进制日志和表。
4)最后,二进制日志位置将被打印到STDERR,如果所有操作都正常,则返回0。
请注意,xtrabackup的STDERR没有写入任何文件。您必须将其重定向到一个文件,例如xtrabackup OPTIONS 2>backupout.log。
三、Percona XtraBackup恢复工作原理
要使用xtrabackup还原备份,可以使用--copy back或--move back选项。
1、XTrabkUp将从My.CNF变量datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir读取并检查目录是否存在。
2、首先复制MyISAM表、索引等(.MRG、.MYD、.MYI、.ARM、.ARZ、.CSM、.CSV、.sdi和par文件),然后复制InnoDB表和索引,最后复制日志文件。它将在复制文件时保留文件的属性,您可能需要在启动数据库服务器之前将文件的所有权更改为mysql,因为它们将由创建备份的用户拥有。
3、或者,可以使用--move back选项恢复备份。此选项类似于--copy back,唯一的区别是它将文件移到目标位置而不是复制文件。由于此选项将删除备份文件,因此必须谨慎使用。当没有足够的可用磁盘空间来保存数据文件及其备份副本时,它非常有用。
四、Percona Xtrabackup8.0变更
Percona Xtrabackup是一个开源的热备份工具,用于基于MySQL的服务器,在备份过程中不会锁定数据库。
无论是24x7高负载的服务器还是低事务量的环境,Percona XtraBackup都旨在使备份成为一个无缝的过程,而不会中断服务器在生产环境中的性能。提供商业支持合同。
Percona XtraBackup可以备份MySQL8.0服务器上InnoDB、XtraDB、MyISAM和MyRocks表的数据,也可以备份带有XtraDB的MySQL Percona服务器、MySQL8.0的Percona服务器和Percona XtraDB集群8.0的数据。
注意:
1、MyRocks存储引擎的支持在版本8.0.6中添加。
2、Percona XtraBackup 8.0不支持TokuDB存储引擎。
3、Percona XtraBackup 8.0不支持对MySQL 8.0之前版本、Percona Server for MySQL或Percona XtraDB Cluster中创建的数据库进行备份。由于MySQL8.0在数据字典、重做日志和撤消日志中引入的更改与以前的版本不兼容,目前Percona XtraBackup 8.0不可能同时支持8.0之前的版本。
五、Redhat/CentOS 安装Percona Xtrabackup8.0
支持的版本:
CentOS 6和RHEL 6(当前稳定版本)
CentOS 7和RHEL 7
Amazon Linux AMI(与CentOS 6相同)
亚马逊Linux 2
| Package | Contains |
|---|---|
percona-xtrabackup-80-debuginfo |
The debug symbols for binaries in percona-xtrabackup-80
|
percona-xtrabackup-test-80 |
The test suite for Percona XtraBackup |
percona-xtrabackup |
The older version of the Percona XtraBackup |
1、安装方式一Percona yum repository
1)以root用户身份运行以下命令或使用sudo安装Percona-yum存储库:yum Install https://repo.Percona.com/yum/Percona-release-latest.noarch.rpm
启用存储库:percona release只启用tools release
如果打算将Percona XtraBackup与上游MySQL服务器结合使用,只需启用工具库:Percona release enable only tools。
2)运行:yum Install Percona-XtraBackup-80安装Percona XtraBackup
2、安装方式二using downloaded rpm packages
$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
$ yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
3、卸载Percona XtraBackup
yum remove percona-xtrabackup
六、需要连接和权限
Percona XtraBackup需要能够连接到数据库服务器,在创建备份时、在某些情况下准备备份时以及在还原备份时对服务器和datadir执行操作。为此,必须满足对其执行的特权和权限要求。
权限是指允许系统用户在数据库服务器中执行的操作。它们在数据库服务器上设置,仅适用于数据库服务器中的用户。
权限是允许用户在系统上执行操作的权限,例如在某个目录上读、写或执行,或启动/停止系统服务的权限。它们设置在系统级别,仅适用于系统用户。
使用xtrabackup时,涉及两个参与者:调用程序的用户(系统用户)和在数据库服务器中执行操作的用户(数据库用户)。注意,这些用户在不同的地方是不同的,即使他们可能有相同的用户名。
本文档中对xtrabackup的所有调用都假定系统用户具有适当的权限,并且除了要执行的操作选项之外,您还提供了连接数据库服务器的相关选项,并且数据库用户具有足够的权限。
1、连接到DB Server
$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/
Other Connection Options
| Option | Description |
|---|---|
| –port | The port to use when connecting to the database server with TCP/IP. |
| –socket | The socket to use when connecting to the local database. |
| –host | The host to use when connecting to the database server with TCP/IP. |
注意
在多个服务器实例的情况下,必须指定正确的连接参数(端口、套接字、主机),xtrabackup才能与正确的服务器通信。
2、需要的许可与权限Permissions and Privileges Needed
The database user needs the following privileges on the tables/databases to be backed up:
-
RELOADandLOCK TABLES(unless the--no-lockoption is specified) in order to runFLUSH TABLES WITH READ LOCKandFLUSH ENGINE LOGSprior to start copying the files, and requires this privilege when Backup Locks are used -
BACKUP_ADMINprivilege is needed to query the performance_schema.log_status table, and runLOCK INSTANCE FOR BACKUP,LOCK BINLOG FOR BACKUP, orLOCK TABLES FOR BACKUP. -
REPLICATION CLIENTin order to obtain the binary log position, -
CREATE TABLESPACEin order to import tables (see Restoring Individual Tables), -
PROCESSin order to runSHOW ENGINE INNODB STATUS(which is mandatory), and optionally to see all threads which are running on the server (see Handling FLUSH TABLES WITH READ LOCK), -
SUPERin order to start/stop the slave threads in a replication environment, use XtraDB Changed Page Tracking for Incremental Backups and for handling FLUSH TABLES WITH READ LOCK, -
CREATEprivilege in order to create the PERCONA_SCHEMA.xtrabackup_history database and table, -
INSERTprivilege in order to add history records to the PERCONA_SCHEMA.xtrabackup_history table, -
SELECTprivilege in order to use--incremental-history-nameor--incremental-history-uuidin order for the feature to look up theinnodb_to_lsnvalues in the PERCONA_SCHEMA.xtrabackup_history table.
创建具有完整备份所需最低权限的数据库用户的SQL示例如下:
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cr%T';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
七、配置xtrabackup
1、参数配置
所有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二进制文件不接受与mysqld服务器二进制文件完全相同的语法。出于历史原因,mysqld服务器二进制文件接受具有--set variable=<variable>=<value>语法的参数,xtrabackup不理解这些语法。如果my.cnf文件有这样的配置指令,则应使用--variable=value语法重写它们。
2、系统配置和NFS卷
xtrabackup工具在大多数系统上不需要特殊配置。但是,当调用fsync()时,-target dir所在的存储必须正常工作。特别是,我们注意到没有使用sync选项装载的NFS卷可能不会真正同步数据。因此,如果备份到使用async选项装入的NFS卷,然后尝试从另一台也装入该卷的服务器准备备份,则数据可能已损坏。您可以使用sync mount选项来避免此问题。
八、备份周期-完全备份
1、创建备份
要创建备份,请使用--backup选项运行xtrabackup。您还需要指定--target dir选项,这是备份的存储位置,如果InnoDB数据或日志文件不是存储在同一个目录中,您可能还需要指定这些文件的位置。如果目标目录不存在,XTrabkUp创建它。如果目录确实存在并且是空的,XTrabkUp将成功。
XTrabkUp不会覆盖现有文件,操作系统错误17将失败,文件存在。
要启动备份进程,请执行以下操作:
$ xtrabackup --backup --target-dir=/data/backups/
这将在/data/backups/存储备份。如果指定相对路径,则目标目录将相对于当前目录。
在备份过程中,您应该会看到许多显示要复制的数据文件的输出,以及日志文件线程重复扫描日志文件并从中复制。下面是一个示例,其中显示了在后台扫描日志的日志线程和在ibdata1文件上工作的文件复制线程:
160906 10:19:17 Finished backing up non-InnoDB tables and files
160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '62988944'
xtrabackup: Stopping log copying thread.
.160906 10:19:18 >> log scanned up to (137343534)
160906 10:19:18 Executing UNLOCK TABLES
160906 10:19:18 All tables unlocked
160906 10:19:18 Backup created in directory '/data/backups/'
160906 10:19:18 [00] Writing backup-my.cnf
160906 10:19:18 [00] ...done
160906 10:19:18 [00] Writing xtrabackup_info
160906 10:19:18 [00] ...done
xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied.
注意
日志复制线程每秒钟检查一次事务日志,查看是否有需要复制的新日志记录写入,但有可能日志复制线程无法跟上事务日志的写入量,当日志记录在被读取之前被覆盖时,将遇到错误。
2、准备备份
在使用--backup选项进行备份之后,您需要准备它以便还原它。数据文件在准备好之前是不一致的,因为它们是在程序运行的不同时间复制的,并且在发生这种情况时可能已经被更改了。
如果您尝试用这些数据文件启动InnoDB,它将检测到损坏并停止工作,以避免在损坏的数据上运行。--prepare步骤使文件在一瞬间完全一致,因此您可以对它们运行InnoDB。
您可以在任何计算机上运行准备操作;它不需要在原始服务器或您要还原到的服务器上。您可以将备份复制到实用程序服务器并在那里进行准备。
请注意,Percona XtraBackup 8.0只能备份MySQL8.0、Percona Server for MySQL8.0和Percona XtraDB Cluster 8.0数据库。不支持8.0之前的版本。
在prepare操作中,xtrabackup启动了一种经过修改的嵌入式InnoDB(xtrabackup链接到的库)。这些修改对于禁用InnoDB标准安全检查是必要的,比如抱怨日志文件大小不对。此警告不适用于处理备份。这些修改仅适用于xtrabackup二进制文件;不需要经过修改的InnoDB就可以使用xtrabackup进行备份。
准备步骤使用这个“embedded InnoDB”使用复制的日志文件对复制的数据文件执行崩溃恢复。准备步骤使用起来非常简单:只需使用--prepare选项运行xtrabackup并告诉它准备哪个目录,例如,准备以前执行的备份运行:
$ xtrabackup --prepare --target-dir=/data/backups/
完成后,您将看到InnoDB关闭,并显示如下消息,其中LSN的值将再次取决于您的系统:
InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!
All following prepares will not change the already prepared data files, you’ll see that output says:
xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'.
不建议在准备备份时中断xtrabackup进程,因为它可能导致数据文件损坏,备份将变得不可用。如果准备过程中断,则无法保证备份有效性。
注意
如果要将备份作为进一步增量备份的基础,则在准备备份时应使用--apply log only选项,否则将无法对其应用增量备份。有关详细信息,请参阅有关准备增量备份的文档。
3、恢复备份
为了方便起见,xtrabackup binary具有--copy back选项,可以将备份复制到服务器的datadir:
$ xtrabackup --copy-back --target-dir=/data/backups/
如果不想保存备份,可以使用--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
数据现在已还原,您可以启动服务器。
九、