使用 xtrabackup 热备恢复 InnoDB 表的完整流程
                           
天天向上
发布: 2025-07-06 14:14:32

原创
389 人浏览过

使用 Percona XtraBackup 对 InnoDB 表进行热备份与恢复,是企业级 MySQL 数据安全的核心技术之一。它支持不中断业务地备份 InnoDB 引擎表,而不像 mysqldump 一样只做逻辑导出。


一、XtraBackup 简介

特性说明
热备(Hot Backup)不锁表,在线备份 InnoDB 数据(也支持部分 MyISAM)
快速恢复直接恢复为物理文件(相比 mysqldump 快几十倍)
增量备份节省空间与时间,适合定期备份
适用于Percona Server, MySQL, MariaDB(5.6~8.0)

二、XtraBackup 安装

1.Linux(Ubuntu/Debian)

sudo apt update
sudo apt install percona-xtrabackup-80

2.CentOS/RHEL

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release enable tools release
sudo yum install percona-xtrabackup-80

三、全量热备流程

1. 执行完整热备份

xtrabackup --user=root --password='your_pwd' \
  --backup --target-dir=/data/backups/full_$(date +%F)
  • --backup:执行备份
  • --target-dir:指定输出目录(必须是空目录)
  • 建议用户授权只备份权限:
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';

2. 准备(Prepare)备份

xtrabackup --prepare --target-dir=/data/backups/full_2025-07-06

❗必须执行准备步骤:应用 redo log,生成一致性数据文件。


四、恢复流程(恢复整个数据库)

1. 停止 MySQL 服务

sudo systemctl stop mysql

2. 备份原数据目录

mv /var/lib/mysql /var/lib/mysql.bak.$(date +%F)

3. 拷贝备份数据回原目录

xtrabackup --copy-back --target-dir=/data/backups/full_2025-07-06

--copy-back 会将所有数据文件复制至 --datadir(默认 /var/lib/mysql

4. 赋予 MySQL 权限

chown -R mysql:mysql /var/lib/mysql

5. 重启 MySQL

sudo systemctl start mysql

五、恢复单张 InnoDB 表(表空间)

从 MySQL 5.6 开始,启用 innodb_file_per_table = ON,每个表一个 .ibd 文件,可以单独恢复单表

1. 备份获取 mytable.ibd

cp /data/backups/full_2025-07-06/dbname/mytable.ibd /tmp/

2. 在目标 MySQL 中创建相同结构表

CREATE TABLE mytable (...) ENGINE=InnoDB;

3. DISCARD TABLESPACE

ALTER TABLE mytable DISCARD TABLESPACE;

这一步会删除当前的 .ibd 文件。

4. 将备份的 .ibd 拷贝回数据目录

cp /tmp/mytable.ibd /var/lib/mysql/dbname/
chown mysql:mysql /var/lib/mysql/dbname/mytable.ibd

5. IMPORT TABLESPACE

ALTER TABLE mytable IMPORT TABLESPACE;

注意事项:

  • .ibd 文件只能用于原始环境(相同 innodb_page_size 和表结构)
  • 如果 innodb_checksum_algorithm 不兼容可能失败
  • 可使用 SHOW WARNINGS; 查看导入问题

六、增量备份与恢复

1. 首次备份(全量)

xtrabackup --backup --target-dir=/backup/base \
  --user=root --password=xxx

2. 第二次增量备份(基于 base)

xtrabackup --backup --target-dir=/backup/inc1 \
  --incremental-basedir=/backup/base \
  --user=root --password=xxx

3. 恢复顺序

# Step1: 准备全量备份
xtrabackup --prepare --apply-log-only --target-dir=/backup/base

# Step2: 应用第一次增量
xtrabackup --prepare --apply-log-only \
  --target-dir=/backup/base --incremental-dir=/backup/inc1

# Step3: 最终提交(不加 apply-log-only)
xtrabackup --prepare --target-dir=/backup/base

七、参考文档


八、常见问题与建议

问题解决
表导入时报错 checksum mismatch确保环境一致,表结构完全一致
xtrabackup 版本兼容性问题尽量用与 MySQL 相匹配的版本
备份数据太大开启增量备份策略
权限问题确保 mysql 用户有读写目标目录权限

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *