《Linux运维实战:使用Percona XtraBackup物理备份与恢复Mysql数据》

一、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、环境信息

主机IP操作系统Mysql版本XtraBackup版本类型
192.168.1.191Centos7.68.0.308.0.30单机

说明:一般来说,建议Percona XtraBackup版本高于或等于Mysql的版本,如果Mysql的版本高于XtraBackup版本,则有可能会备份失败。


2.2、使用YUM存储库安装

1、安装Percona yum存储库

[root@localhost ~]# yum install https://repo.percona.com/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@backup2022' 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/my.cnf进行配置,如下所示:

[root@localhost ~]# vim /etc/my.cnf
[xtrabackup]
host=localhost
port=53000
user=bkpuser
password=Lolaage@backup2022
socket=/var/lib/mysql/mysql.sock
target_dir=/data/mysql_backup

4.1、xtrabackup全量备份

说明:xtrabackup默认会读取/etc/my.cnf文件中的datadir参数,可以使用–defaults-file手动指定,注意该参数必须是第一个参数,如下所示:

[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-S /var/lib/mysql/mysql.sock --backup --target-dir=/data/mysql_backup/`date "+%Y%m%d"` --no-server-version-check

#备份后的数据并不处于一致性状态,为了可以用来恢复,需要使用--prepare准备备份集
[root@localhost 20221214]# xtrabackup --defaults-file=/etc/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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/my.cnf --copy-back --target-dir=/data/mysql_backup/20221214

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/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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-backuped
from_lsn = 0
to_lsn = 19460146
last_lsn = 19460146
flushed_lsn = 19460146
redo_memory = 360
redo_frames = 1

2、创建第一次增量备份

[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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 = incremental
from_lsn = 19460146
to_lsn = 19518284
last_lsn = 19518284
flushed_lsn = 19518284
redo_memory = 360
redo_frames = 1

3、创建第二次增量备份

[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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 = incremental
from_lsn = 19518284
to_lsn = 19541579
last_lsn = 19541579
flushed_lsn = 19541579
redo_memory = 360
redo_frames = 1

4、准备增量备份

#1、第一次
[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-S /var/lib/mysql/mysql.sock --prepare --apply-log-only --target-dir=/data/mysql_backup/base

#2、第二次
[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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/my.cnf --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/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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/my.cnf --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/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-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/my.cnf -Hlocalhost -P53000 -ubkpuser -pLolaage@backup2022 \
-S /var/lib/mysql/mysql.sock --prepare --export --target-dir=/data/mysql_backup/base --no-server-version-check

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:《Linux运维篇:Linux系统运维指南》

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值