应将mysql全量备份存入s3 glacier_ir存储类:它比standard便宜4–10倍,支持分钟级恢复,适合rto要求不苛刻的长期归档场景。

备份文件直接扔 S3 标准存储,钱烧得很快
MySQL 备份(比如 mysqldump 或 Percona XtraBackup 生成的文件)一旦进 S3,如果长期放在 STANDARD 存储类,费用会随时间指数级上涨——尤其当备份保留 30 天以上、每天全量 + binlog 归档时。S3 的标准存储按 GB/月计费,而归档类(GLACIER_IR 或 DEEP_ARCHIVE)便宜 4–10 倍,但访问成本和延迟更高。
实操建议:
- 全量备份(如每周一次
mysqldumpSQL 文件或xtrabackup增量基线)默认存到GLACIER_IR:它支持分钟级恢复,适合 RTO - 最近 7 天的 binlog 或增量备份保留在
STANDARD_IA(低频访问),兼顾成本与可读性 - 绝对不要用生命周期规则把未加密的备份自动转归档——S3 生命周期不校验加密状态,可能触发未加密上传失败
- 所有上传必须带
ServerSideEncryption参数(如AES256或aws:kms),否则后续无法用 KMS 密钥解密归档对象
用 aws s3 cp 传备份时,没加 --storage-class 就等于默认烧钱
命令行工具默认使用 STANDARD,哪怕你配置了生命周期策略,上传那一刻已经按高价计费了。而且 S3 不允许对已上传对象直接修改存储类——只能复制再删原对象。
正确写法示例(上传时就定死归档类):
aws s3 cp /backup/full_20240515.sql.gz s3://my-backup-bucket/mysql/full_20240515.sql.gz \ --storage-class GLACIER_IR \ --sse AES256 \ --metadata-directive REPLACE
注意点:
-
--storage-class必须显式指定,不能依赖后置策略 -
--sse AES256要配--metadata-directive REPLACE,否则已有元数据会阻止加密头写入 - 如果用脚本批量上传,检查
aws s3 cp是否在循环里漏了参数——一个没加,整批都按标准价算 - 别用
aws s3 sync推备份目录:它不会继承--storage-class,每个文件需单独控制
还原归档备份时,restore-object 不是“点一下就出来”
S3 归档类对象不是随时可读的。调用 restore-object 后,文件实际处于“挂起中”,要等服务完成取回(restore)才变可读状态。此时若程序立刻 aws s3 cp 下载,大概率报错:An error occurred (NoSuchKey) when calling the GetObject operation。
关键动作:
- 发起恢复请求必须用
aws s3api restore-object,并设好--restore-request Days=1(GLACIER_IR最小 1 天) - 恢复后查状态:用
aws s3api head-object --bucket my-backup-bucket --key full_20240515.sql.gz,看响应里Restore字段是否含ongoing-request="false"和expiry-date - MySQL 恢复脚本里必须加轮询逻辑(比如每 5 分钟查一次
head-object),不能假设发完 restore 就能立刻读 -
DEEP_ARCHIVE类型恢复耗时 12 小时起,不适合应急恢复;日常测试还原流程时,务必用真实归档类对象,别只测STANDARD_IA
备份文件名不含时间戳或校验值,归档后基本等于丢数据
S3 对象没有“创建时间”语义(只有最后修改时间,且可被覆盖篡改),一旦文件名是静态的(如 latest.sql.gz),每次上传都会覆盖前一个,归档策略也只会作用于最新版本——旧备份彻底不可追溯。
必须做到:
- 文件名包含完整时间戳 + 哈希,例如:
mysql_full_20240515T020000Z_8a3f2b1.sql.gz(其中8a3f2b1是备份内容 SHA256 前 6 位) - 用
aws s3 ls s3://bucket/path/列表时,靠名字就能判断新旧和完整性,不用下载再校验 - 避免用 MySQL 实例名或 IP 当唯一标识——换主从、重建实例后,备份路径就乱了;统一用逻辑库名 + 环境标签(如
prod-account-db) - 归档后的对象删不得:S3 版本控制开启后,删除只是打删除标记,但费用照算;真要清理,得用
aws s3api delete-object显式删版本
归档不是“存进去就完事”,它是另一套读写契约——上传时定类、命名即索引、还原需轮询、删前先确认版本。少走一步,半年后找不回那个凌晨三点的 binlog。











