一、Percona XtraBackup工具介绍
Percona XtraBackup是世界上唯一开源、免费的MySQL热备份软件,可为InnoDB和XtraDB数据库执行非阻塞备份。Percona XtraBackup特点如下所示:
1、在不暂停数据库的情况下创建热InnoDB备份。
2、对MySQL进行增量备份。
3、将压缩的MySQL备份流式传输到另一台服务器。
4、在线在MySQL服务器之间移动表。
5、轻松创建新的MySQL复制副本。
6、不增加服务器负载的情况下备份MySQL。
7、Percona XtraBackup根据每秒的IO操作数进行节流。
8、Percona XtraBackup跳过二级索引页面并在准备紧凑备份时重新创建它们。
9、Percona XtraBackup甚至可以从完整备份中导出单个表,无论InnoDB版本如何。
10、FLUSH TABLES WITH READ LOCK备份锁是Percona Server中可用的轻量级替代品。XtraBackup使用它们自动复制非InnoDB数据,以避免阻塞修改InnoDB表的DML查询。
二、安装Percona XtraBackup
参考官方:Percona XtraBackup工具多种安装方式
2.1、环境信息
说明:一般来说,建议Percona XtraBackup版本高于或等于Mysql的版本,如果Mysql的版本高于XtraBackup版本,则有可能会备份失败。
2.2、使用YUM存储库安装
1、安装Percona yum存储库
[root@localhost ~]# yum install /yum/percona-release-latest.noarch.rpm
2、启用存储库
[root@localhost ~]# percona-release enable-only tools release
3、如果Percona XtraBackup打算与上游MySQL Server结合使用,你只需要启用`tools repository
[root@localhost ~]# percona-release enable-only tools
4、通过运行安装Percona XtraBackup
[root@localhost ~]# yum install percona-xtrabackup-80
5、为了能够进行压缩备份,请安装qpress软件包
[root@localhost ~]# yum install qpress
6、要解压缩使用ZSTD压缩算法制作的备份,请安装zstd软件包
[root@localhost ~]# yum install zstd
三、创建备份数据库用户
说明:创建具有完整备份所需的最低权限的数据库用户,如下所示:
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Lolaage@backup' PASSWORD EXPIRE NEVER;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> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'localhost';mysql> GRANT SELECT ON performance_schema.replication_group_members TO bkpuser@'localhost';mysql> FLUSH PRIVILEGES;
如下图所示:
四、xtrabackup全量备份与恢复
说明:xtrabackup配置都是通过选项完成的,也可以通过诸如/etc/f进行配置,如下所示:
[root@localhost ~]# vim /etc/f[xtrabackup]host=localhostport=53000user=bkpuserpassword=Lolaage@backupsocket=/var/lib/mysql/mysql.socktarget_dir=/data/mysql_backup
4.1、xtrabackup全量备份
说明:xtrabackup默认会读取/etc/f文件中的datadir参数,可以使用–defaults-file手动指定,注意该参数必须是第一个参数,如下所示:
[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --backup --target-dir=/data/mysql_backup/`date "+%Y%m%d"` --no-server-version-check#备份后的数据并不处于一致性状态,为了可以用来恢复,需要使用--prepare准备备份集[root@localhost 1214]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --prepare --target-dir=/data/mysql_backup/`date "+%Y%m%d"` --no-server-version-check
如下图所示,则表明备份成功。
总结:为什么备份完后要准备备份prepare?
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。它的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。prepare操作可以在任何机器上运行准备操作;它不需要位于原始服务器或你打算恢复到的服务器上。您可以将备份复制到实用程序服务器并在那里准备,我这里是在备份完成后进行prepare操作的。
4.2、xtrabackup全量恢复
说明:以下操作请勿在生产环境操作,如下操作仅做恢复测试,建议使用个人本地测试环境进行测试。
1、模拟数据库故障,删除数据库文件
[root@localhost ~]# systemctl stop mysqld[root@localhost ~]# rm -rf /var/lib/mysql/*
2、快速的恢复数据库中的数据
[root@localhost ~]# xtrabackup --defaults-file=/etc/f --copy-back --target-dir=/data/mysql_backup/1214
3、恢复数据时,一定要记得更改数据目录下的文件拥有者以及所属组权限,否则mysql无法启动
[root@localhost ~]# chown mysql.mysql /var/lib/mysql -R[root@localhost ~]# systemctl start mysqld
总结:恢复备份注意数据目录必须为空及权限
在恢复备份之前数据目录必须是空的。另外,需要注意的是,在执行恢复之前需要关闭MySQL服务器。您不能恢复到正在运行的mysqld实例的数据目录(导入部分备份时除外)。由于文件的属性将被保留,在大多数情况下,您需要mysql在启动数据库服务器之前将文件的属主和属组更改为mysql.mysql。
五、xtrabackup增量备份与恢复
5.1、xtrabackup增量备份
说明:要进行增量备份,请像往常一样从完整备份开始。
1、全量备份
[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --backup --target-dir=/data/mysql_backup/base --no-server-version-check
说明:备份完成后,xtrabackup_checkpoints文件包含一行显示to_lsn,这是备份结束时数据库的LSN。
[root@localhost ~]# cat /data/mysql_backup/base/xtrabackup_checkpoints backup_type = full-backupedfrom_lsn = 0to_lsn = 19460146last_lsn = 19460146flushed_lsn = 19460146redo_memory = 360redo_frames = 1
2、创建第一次增量备份
[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --backup --target-dir=/data/mysql_backup/inc1 \--incremental-basedir=/data/mysql_backup/base --no-server-version-check
说明:备份完成后,xtrabackup_checkpoints文件包含一行显示to_lsn,这是备份结束时数据库的LSN。from_lsn是备份的起始LSN,对于增量备份,它必须与先前基础备份的to_lsn相同。
[root@localhost ~]# cat /data/mysql_backup/inc1/xtrabackup_checkpoints backup_type = incrementalfrom_lsn = 19460146to_lsn = 19518284last_lsn = 19518284flushed_lsn = 19518284redo_memory = 360redo_frames = 1
3、创建第二次增量备份
[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --backup --target-dir=/data/mysql_backup/inc2 \--incremental-basedir=/data/mysql_backup/inc1 --no-server-version-check
说明:备份完成后,xtrabackup_checkpoints文件包含一行显示to_lsn,这是备份结束时数据库的LSN。from_lsn是备份的起始LSN,对于增量备份,它必须与先前基础备份的to_lsn相同。
[root@localhost ~]# cat /data/mysql_backup/inc2/xtrabackup_checkpoints backup_type = incrementalfrom_lsn = 19518284to_lsn = 19541579last_lsn = 19541579flushed_lsn = 19541579redo_memory = 360redo_frames = 1
4、准备增量备份
#1、第一次[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --prepare --apply-log-only --target-dir=/data/mysql_backup/base#2、第二次[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --prepare --apply-log-only --target-dir=/data/mysql_backup/base --incremental-dir=/data/mysql_backup/inc1#3、第三次[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --prepare --target-dir=/data/mysql_backup/base --incremental-dir=/data/mysql_backup/inc2
说明:增量备份的prepare步骤与完整备份的步骤不同
1、对于全量备份,在准备阶段中,需要将已提交事务从日志文件写入数据文件,回滚未提交的事务,确保数据处于一致性状态。
2、对于增量备份,在准备阶段中,不能回滚未提交的事务,因为事务可能在下次备份中提交。因此必须使用 --apply-log-only选项来阻止回滚阶段,否则你的增量备份将毫无用处。事务回滚后,无法应用下一次的增量备份。
3、如果有多次增量备份,最后一次增量备份prepare准备阶段则不能使用–apply-log-only选项,之前的增量备份则需要使用–apply-log-only选项。
5.2、xtrabackup增量恢复
说明:以下操作请勿在生产环境操作,如下操作仅做恢复测试,建议使用个人本地测试环境进行测试。
1、模拟数据库故障,删除数据库文件
[root@localhost ~]# systemctl stop mysqld[root@localhost ~]# rm -rf /var/lib/mysql/*
2、快速的恢复数据库中的数据
[root@localhost ~]# xtrabackup --defaults-file=/etc/f --copy-back --target-dir=/data/mysql_backup/base
3、恢复数据时,一定要记得更改数据目录下的文件拥有者以及所属组权限,否则mysql无法启动
[root@localhost ~]# chown mysql.mysql /var/lib/mysql -R[root@localhost ~]# systemctl start mysqld
总结:恢复备份注意数据目录必须为空及权限
在恢复备份之前数据目录必须是空的。另外,需要注意的是,在执行恢复之前需要关闭MySQL服务器。您不能恢复到正在运行的mysqld实例的数据目录(导入部分备份时除外)。由于文件的属性将被保留,在大多数情况下,您需要mysql在启动数据库服务器之前将文件的属主和属组更改为mysql.mysql。
六、xtrabackup压缩备份与恢复
Percona XtraBackup支持压缩备份,可以使用xbstream压缩或解压缩本地或流式备份。要进行压缩备份,请将选项与和–compress选项一起使用。
6.1、安装qpress
[root@localhost ~]# percona-release enable tools[root@localhost ~]# yum install qpress -y
6.2、xtrabackup全量备份
1、创建压缩备份
[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --compress --compress-threads=4 \--backup --target-dir=/data/mysql_backup/base --no-server-version-check
说明:未使用压缩备份和使用压缩备份之后的文件大小差异,压缩过后是以qp结尾的文件。
[root@localhost ~]# du -sh /data/mysql_backup/base/71M/data/mysql_backup/base[root@localhost ~]# du -sh /data/mysql_backup/base/3.7M/data/mysql_backup/base
6.3、xtrabackup全量恢复
说明:以下操作请勿在生产环境操作,如下操作仅做恢复测试,建议使用个人本地测试环境进行测试。
1、模拟数据库故障,删除数据库文件
[root@localhost ~]# systemctl stop mysqld[root@localhost ~]# rm -rf /var/lib/mysql/*
2、快速的恢复数据库中的数据
#1、解压缩所有备份文件[root@localhost ~]# xtrabackup --decompress --target-dir=/data/mysql_backup/base#2、解压缩文件后,使用以下--prepare选项准备备份[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --prepare --target-dir=/data/mysql_backup/base --no-server-version-check#3、使用--copy-back选项恢复备份[root@localhost ~]# xtrabackup --defaults-file=/etc/f --copy-back --target-dir=/data/mysql_backup/base
3、恢复数据时,一定要记得更改数据目录下的文件拥有者以及所属组权限,否则mysql无法启动
[root@localhost ~]# chown mysql.mysql /var/lib/mysql -R[root@localhost ~]# systemctl start mysqld
总结:恢复备份注意数据目录必须为空及权限
在恢复备份之前数据目录必须是空的。另外,需要注意的是,在执行恢复之前需要关闭MySQL服务器。您不能恢复到正在运行的mysqld实例的数据目录(导入部分备份时除外)。由于文件的属性将被保留,在大多数情况下,您需要mysql在启动数据库服务器之前将文件的属主和属组更改为mysql.mysql。
七、xtrabackup部分备份与恢复
说明:xtrabackup支持在启用innodb_file_per_table选项时进行部分备份。创建部分备份的方法有以下三种:
1、将表名与正则表达式匹配
2、提供文件中的表名列表
3、提供数据库列表
指定部分表的选项--tables=name:用正则表达式的方式指定包括的表--tables-file=name:将要包括的表名放在指定的文件中--tables-exclude=name:用正则表达式的方式指定排除的表,该选项比 --tables 的优先级高。指定部分数据库的选项--databases=name:用正则表达式的方式指定包括的库--databases-file=name:将要包括的库名放在指定的文件中--databases-exclude=name:用正则表达式的方式指定排除的库,该选项比 --databases 的优先级高。
说明:这里就以物理备份某库为例。
#1、创建部分备份[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --backup --target-dir=/data/mysql_backup/base \--databases=possecu_3 --no-server-version-check#2、准备部分备份[root@localhost ~]# xtrabackup --defaults-file=/etc/f -Hlocalhost -P53000 -ubkpuser -pLolaage@backup \-S /var/lib/mysql/mysql.sock --prepare --export --target-dir=/data/mysql_backup/base --no-server-version-check
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》