阿里云RDS物理备份仅支持高性能本地盘实例,下载链接一小时后失效;需确认实例大版本、存储类型及TDE状态,解压须用xbstream与qpress按序操作。

确认物理备份类型和下载链接时效性
阿里云RDS的物理备份文件只对高性能本地盘实例开放,且下载链接**一小时后自动失效**。拿到 https://xxx/backup.tar.gz 这类地址后必须立刻下载,过期需回控制台刷新。别等解压一半才发现链接 403 —— 这是高频失败起点。
同时检查 RDS 实例基本信息页:大版本(5.7 / 8.0)、存储类型(必须是「高性能本地盘」)、TDE 状态(rds_encrypt_data=false)。任一不满足,xtrabackup --prepare 阶段就会报 Unknown compression algorithm 或直接 segfault。
用 xbstream + qpress 解压 RDS 特殊压缩包
RDS 物理备份不是普通 tar.gz,而是 xbstream 封装 + qpress 压缩的流式格式。直接 tar -zxvf 会解出一堆乱码文件或报错 gzip: stdin: not in gzip format。
必须按顺序执行:
- 安装工具:
yum install percona-xtrabackup-80 qpress libev(MySQL 8.0)或percona-xtrabackup-24(MySQL 5.7) - 用 xbstream 解包:
xbstream -x - 再用 qpress 解压所有
.qp文件:find ./ -name "*.qp" -exec qpress -d {} \;
完成后目录里应有 ibdata1、ib_logfile0、mysql/、performance_schema/ 等标准 InnoDB 文件结构。少任何一项,后续 --apply-log 必失败。
修改 backup-my.cnf 并跳过 RDS 特有参数
RDS 导出的 backup-my.cnf 包含大量云厂商私有配置,比如 rds_encrypt_data、innodb_encrypt_algorithm、innodb_log_block_size=512。这些在自建 MySQL 中要么不存在,要么值非法,会导致 mysqld 启动时拒绝加载。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
安全做法是:把整个 [mysqld] 段落里除 datadir、innodb_data_file_path、innodb_log_files_in_group、innodb_log_file_size 外的所有行全部注释掉。尤其注意这三行必须删或注释:
-
innodb_checksum_algorithm=innodb(MySQL 8.0.20+ 默认 crc32,不兼容) -
innodb_page_size=16384(若本地 MySQL 编译时用了不同 page size) -
rds_encrypt_data=false(自建库无此参数,启动直接报错)
改完后手动加一行:datadir = /your/mysql/data,路径必须和你准备存放恢复数据的目录完全一致。
应用日志并启动 mysqld,注意权限与账号继承
执行 xtrabackup --defaults-file=./backup-my.cnf --apply-log ./ 成功后,把整个目录 mv 到目标 datadir 路径下,再 chown -R mysql:mysql /your/mysql/data。漏掉 chown 会导致 mysqld 启动时提示 Can't start server: Bind on unix socket。
启动命令别用 mysqld_safe —— 它在新版 MySQL 中已被弃用。直接跑:
mysqld --defaults-file=/your/mysql/data/backup-my.cnf --user=mysql --datadir=/your/mysql/data --socket=/tmp/mysql.sock --port=3307 --skip-networking
重点参数:--skip-networking 防止外部连接干扰;--port=3307 避免和已有 MySQL 冲突。首次启动成功后,RDS 的原账号(如 aliyun_root)可直接登录,密码不变;但 root 用户默认无密码,也无远程权限 —— 这不是 bug,是 RDS 的账号模型决定的。
真正容易被忽略的是:恢复后的库表字符集、SQL mode、time_zone 全部继承自 RDS 备份时刻的状态,不会自动适配你本地 my.cnf 的设置。如果业务依赖 sql_mode=STRICT_TRANS_TABLES,而 RDS 备份里是空的,那恢复后 insert null 到 not null 字段也不会报错 —— 这类隐性差异必须人工核对。

















