一、XtraBackup 的特点
非阻塞备份
热备份:XtraBackup 能够在数据库运行时进行备份,无需停止数据库服务或锁定表。这使得备份过程对数据库的正常运行几乎没有影响,特别适合高负载的生产环境。
无锁表操作:备份过程中不会打断正在进行的事务,确保数据的一致性,同时不影响数据库性能。
备份和恢复速度快
物理备份:XtraBackup 采用物理备份方式,直接备份数据文件,而不是逻辑备份(如 mysqldump)。这种方式备份和恢复速度更快,特别适合大规模数据库。
增量备份:支持基于时间点的增量备份,只备份自上次备份以来发生更改的数据,节省存储空间和备份时间。
压缩和流式备份:支持备份数据的压缩和流式传输,减少磁盘空间和网络带宽的使用,进一步提高备份效率。
版本兼容性
XtraBackup 8.0:专为 MySQL 8.0 设计,支持 MySQL 8.0 的所有新特性和功能。
向下兼容性限制:XtraBackup 8.0 不支持备份 MySQL 8.0 之前的版本。如果需要备份 MySQL 5.6 或 5.7,应使用 XtraBackup 2.4 版本。
版本匹配:确保 XtraBackup 版本与 MySQL 版本匹配,以避免兼容性问题。
二、下载
下载地址,选择对应MySQL版本的Percona XtraBackup
wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.25-17/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.25-17.1.el8.x86_64.rpm
yum install percona-xtrabackup-80-8.0.25-17.1.el8.x86_64.rpm -y
三、XtraBackup的备份原理
1. 记录 LSN,复制 InnoDB 的数据文件,复制 redo log
LSN(Log Sequence Number) 是 InnoDB 的日志系统中用于标识事务日志位置的编号。LSN 是一个递增的值,用于记录数据库的更改。
XtraBackup 会记录备份开始时的 LSN,并复制 InnoDB 的数据文件(如
.ibd
和ibdata1
文件)。同时,它会持续复制 redo log(重做日志),用于在备份过程中捕获所有对数据库的更改。
2. 加备份锁
在备份过程中,XtraBackup 会对事务引擎(如 InnoDB)的数据加一个轻量级的备份锁。这个锁的作用是确保在备份过程中不会丢失事务的更改。
这种锁不会阻塞事务的正常运行,因此 XtraBackup 可以在数据库运行时进行备份。
3. 备份完事务引擎的数据和日志后,锁定非事务表
事务引擎(如 InnoDB)的数据和日志备份完成后,XtraBackup 会锁定非事务引擎的表(如 MyISAM 引擎的表)。
锁定非事务表的目的是为了确保这些表的数据在备份时不会被修改,从而保证备份的一致性。
4. 复制非事务引擎的表数据文件
在非事务表被锁定后,XtraBackup 会直接复制这些表的数据文件(如
.frm
和.MYD
文件)。由于非事务表没有事务日志,直接复制数据文件即可。
5. 查询 GTID 信息和 binlog 位点
GTID(Global Transaction Identifier) 是 MySQL 5.6 引入的一种全局事务标识符,用于标识每个事务的唯一性。
binlog 位点 是 MySQL 的二进制日志(binlog)的偏移量,用于记录事务的执行位置。
XtraBackup 会查询当前的 GTID 信息和 binlog 位点,以便在恢复时能够定位到正确的日志位置。
6. 停止复制 redo log
在备份完成后,XtraBackup 会停止复制 redo log,以确保备份的 redo log 是完整的。
7. 释放锁
在备份完成后,XtraBackup 会释放之前加的备份锁和对非事务表的锁定,以允许数据库继续正常运行。
8. 备份完成
XtraBackup 会将备份的数据文件、redo log、binlog 位点等信息打包,生成一个完整的备份集。
四、XtraBackup的恢复原理
Prepare 阶段
模拟崩溃恢复,将 redo log 回放到数据文件中
在 Prepare 阶段,XtraBackup 会启动一个嵌入的 InnoDB 实例,模拟数据库的崩溃恢复过程。
应用 redo log:将备份期间捕获的 redo log 应用到数据文件中,确保所有已提交的事务都被同步到数据文件。
回滚未提交的事务:将未提交的事务回滚,使数据文件处于一致性状态。
重建 redo log
在 Prepare 阶段完成后,XtraBackup 会重建 redo log,确保在恢复后的数据文件中,redo log 是空的。
这一步是为了确保 MySQL 在启动时不会再次应用备份期间的 redo log,从而避免数据不一致。
恢复阶段
将数据文件复制或者移动到 MySQL 数据目录
在 Prepare 阶段完成后,备份数据文件已经处于一致性状态,可以将其复制或移动到 MySQL 的数据目录中。
使用
--copy-back
参数可以将备份数据文件复制到 MySQL 数据目录。确保 MySQL 服务对数据目录有正确的读写权限。
还原完成
数据文件成功复制到 MySQL 数据目录后,恢复过程基本完成。
启动 MySQL
启动 MySQL 服务,使用恢复后的数据文件。
在启动过程中,MySQL 会检查数据文件的状态,并确保其一致性。