目录
1.前言
2.准备工作
2.1.环境信息
2.2.创建备份目录
2.3.配置/etc/my.cnf文件
2.4.授予root用户BACKUP_ADMIN权限
3.增量备份
3.1.第一步:全量备份
3.2.第二步:增量备份
3.3.第三步:再次增量备份
4.准备备份
4.1.准备全量备份
4.2.逐个应用增量备份
4.3.最终准备
5.备份恢复
6.总结
"实战演练:利用Percona XtraBackup执行MySQL增量备份操作详解"
1.前言
在承接上篇【MySQL备份】Percona XtraBackup全量备份实战篇智慧之后,我们再度启航,深化对Percona XtraBackup这一强大工具的探索之旅。本章节,我们将从全量备份的稳固基石出发,迈向更加精细化的领域——增量备份实战策略。在这里,不仅会揭示如何高效地运用Percona XtraBackup捕获数据库的每一次微妙变化,还会详述如何在数据海洋的波涛中,精准锚定并保护那些宝贵的新增信息,从而构建起一道既灵活又坚不可摧的数据防护网。
通过本篇的深入解析,您将学会如何在不影响数据库正常运行的前提下,以最小的资源开销,实现对数据库变化的持续追踪与备份。我们将一步步揭开增量备份的神秘面纱,从策略规划、命令行操作的细微调整,到备份效率与数据一致性的双重优化,全方位展示如何在数据保护的征途中,步步为营,稳扎稳打。
不论是对于寻求优化备份策略的数据库管理员,还是渴望深入了解MySQL备份机制的IT专业人员,本文都将是一份不可或缺的实战指南,旨在助力您在数据保护的道路上行稳致远,让每一次数据备份都成为数据安全的一块坚固磐石。
2.准备工作
2.1.环境信息
主机IP | 操作系统 | Mysql版本 | XtraBackup版本 |
---|---|---|---|
172.17.0.2 | CentOS Stream release 9 | 8.0.37 | 8.0.35 |
2.2.创建备份目录
mkdir -p /data/full_backup
2.3.配置/etc/my.cnf文件
[xtrabackup]
host=localhost
port=3306
user=root
password=123456
socket=/var/lib/mysql/mysql.sock
target_dir=/data/full_backup
2.4.授予root用户BACKUP_ADMIN权限
grant BACKUP_ADMIN on *.* to 'root'@'%'
LOCK INSTANCE FOR BACKUP 是MySQL 8.0引入的一种新的备份相关SQL语句,主要用于在进行数据库备份时,以一种更为细粒度和高效的方式控制对数据库实例的访问,以保证备份的一致性。这个命令的工作原理及特点如下:
目的:在执行备份操作时,此命令用于获取一个实例级别的锁,该锁允许在备份过程中继续执行DML(数据操作语言,如INSERT、UPDATE、DELETE)操作,同时防止那些可能导致数据快照不一致的DDL(数据定义语言,如CREATE、ALTER、DROP)操作和某些管理操作。这样可以在不影响数据库服务的情况下进行备份,特别适用于需要最小化服务中断的在线备份场景。
权限需求:执行LOCK INSTANCE FOR BACKUP语句需要用户具备BACKUP_ADMIN权限。这是一个专门为了备份相关的高级操作而设计的权限级别。
兼容性:此特性是在MySQL 8.0及以上版本中引入的,早于8.0的MySQL版本并不支持这一语句,因此在使用旧版本时,可能需要依赖其他机制(如FLUSH TABLES WITH READ LOCK)来确保备份的一致性。
解锁:执行备份后,需要使用UNLOCK INSTANCE语句来释放之前由LOCK INSTANCE FOR BACKUP获得的锁,从而恢复正常操作。
与传统备份命令的对比:相比于传统的备份方法,如使用FLUSH TABLES WITH READ LOCK,LOCK INSTANCE FOR BACKUP提供了更小的性能影响,因为它不会完全阻止写操作,只是限制了可能引起数据不一致的活动,更适合于高可用性和高性能要求的生产环境。
3.增量备份
登陆数据库查看现有的数据,可以看到tes1库中有两个表
3.1.第一步:全量备份
xtrabackup --backup --target-dir=/data/full_backup --user=root --password=123456 --host=172.17.0.2 --port=3306
--target-dir=/data/full_backup
指定了全量备份的目标目录。
如果查看xtrabackup_checkpoints文件,应该会看到类似的内容 内容取决于您的LSN编号:
3.2.第二步:增量备份
登陆数据库创建一个employees 表为后面的测试做准备
CREATE TABLE employees (id INT AUTO_INCREMENT, -- 自增的ID作为主键first_name VARCHAR(50) NOT NULL, -- 姓名,最大长度50,不能为空email VARCHAR(100) UNIQUE, -- 电子邮件,最大长度100,必须唯一hire_date DATE, -- 入职日期PRIMARY KEY (id) -- 指定id列为表的主键) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 使用InnoDB存储引擎,字符集为utf8mb4支持更多字符
在第一次全量备份之后,你可以进行增量备份。增量备份只备份自上次备份以来发生变化的数据。
xtrabackup --backup --incremental-basedir=/data/full_backup --target-dir=/data/incr_backup_1 --user=root --password=123456 --host=172.17.0.2 --port=3306
--incremental-basedir=/data/full_backup
指定了增量备份的基础全量备份目录。--target-dir=/data/incr_backup_1
指定了这次增量备份的目标目录。
这里xtrabackup_checkpoints的 from_lsn
是备份的起始LSN,对于增量备份,它必须与上一个/基本备份的to_lsn
(如果是最后一个检查点)相同 备份.
3.3.第三步:再次增量备份
如果你需要进行多次增量备份,只需重复执行增量备份命令,并每次更改--target-dir
的值即可。例如,第二次增量备份:
这里我们登陆数据库再次创建一个employees 1表为后面的测试做准备
CREATE TABLE employees1 (id INT AUTO_INCREMENT, -- 自增的ID作为主键first_name VARCHAR(50) NOT NULL, -- 姓名,最大长度50,不能为空email VARCHAR(100) UNIQUE, -- 电子邮件,最大长度100,必须唯一hire_date DATE, -- 入职日期PRIMARY KEY (id) -- 指定id列为表的主键) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 使用InnoDB存储引擎,字符集为utf8mb4支持更多字符
xtrabackup --backup --incremental-basedir=/data/incr_backup_1 --target-dir=/data/incr_backup_2 --user=root --password=123456 --host=172.17.0.2 --port=3306
这里xtrabackup_checkpoints的 from_lsn
是备份的起始LSN,对于增量备份,它必须与上一个/增量备份的to_lsn
(如果是最后一个检查点)相同 备份.
4.准备备份
当您完成了全量备份以及一系列增量备份后,若需要恢复数据到某个时间点,您需要按照以下步骤准备增量备份:
4.1.准备全量备份
首先,需要准备全量备份,这一步通常会应用日志文件到数据文件上,确保数据的一致性。命令如下:
xtrabackup --prepare --apply-log-only --target-dir=/data/full_backup
4.2.逐个应用增量备份
接下来,按照时间顺序,对每个增量备份执行准备操作,将增量备份中的变化应用到前一个备份(全量或上一个增量)的准备结果上。例如,对于第一个增量备份:
xtrabackup --prepare --apply-log-only --incremental-dir=/data/incr_backup_1 --target-dir=/data/full_backup
对于后续的增量备份,重复上述命令,每次更新--incremental-dir
指向下一个增量备份目录,而--target-dir
保持不变,指向已准备好的全量备份目录。
xtrabackup --prepare --apply-log-only --incremental-dir=/data/incr_backup_2 --target-dir=/data/full_backup
4.3.最终准备
一旦所有增量备份都已应用,全量备份目录中的数据就反映了所有备份点的累计变化,处于一个可以恢复的状态。如果这是最后一个步骤,您可能不再需要使用--apply-log-only
选项,而是直接执行--apply-log
来最终准备数据以供使用或恢复到MySQL服务器:
xtrabackup --prepare --target-dir=/data/full_backup
5.备份恢复
首先登陆数据库删除之前创建的2个表为后面测试做准备
停止MySQL服务进行恢复数据
systemctl stop mysqld
rsync -avrP /data/full_backup/ /var/lib/mysql/
恢复数据时,一定要记得更改数据目录下的文件拥有者以及所属组权限,否则mysql无法启动
重启数据库查看数据是否恢复,可以看到之前被删除的表已经成功恢复
6.总结
- 对于全量备份,在准备阶段中,需要将已提交事务从日志文件写入数据文件,回滚未提交的事务,确保数据处于一致性状态。
- 对于增量备份,在准备阶段中,不能回滚未提交的事务,因为事务可能在下次备份中提交。因此必须使用 --apply-log-only选项来阻止回滚阶段,否则你的增量备份将毫无用处。事务回滚后,无法应用下一次的增量备份。
- 如果有多次增量备份,最后一次增量备份prepare准备阶段则不能使用–apply-log-only选项,之前的增量备份则需要使用–apply-log-only选项。
- 要恢复到不同时间点的增量备份只需利用不同时间点的增量备份 在全量备份的基础上进行准备备份 然后恢复即可