摘要:站点文章在库里,只拷文件不够。本文按 MariaDB / MySQL 官方文档,把逻辑备份(mariadb-dump / mysqldump)怎么做一致性导出、怎么压缩、怎么推到对象存储,以及生命周期保留怎么设写清楚。只放官网普通链接;查询日期 2026-10-27。

依据:MariaDB · Making Backups with mariadb-dump、mariadb-dump 参考、Restoring Data from Dump Files;MySQL 8.4 Reference Manual · mysqldump;rclone sync;阿里云 OSS《生命周期概述》《基于最后一次修改时间的生命周期规则》。查询日期:2026-10-27(北京时间)。只放官网普通链接(affiliate_later);不写单价;菜单名以控制台为准。

有一天你发现后台文章列表空了半截,或者插件把表结构改坏了。云盘快照能整盘回滚,但有时你只想把库回到昨晚;站点文件还在,真正丢的是库。本站已有网站定期备份和对象存储整站备份。本文只收窄到数据库这一层:逻辑备份怎么导出、怎么压小、怎么推到对象存储,以及桶上保留多久再降冷或删。

一、逻辑备份是什么,和物理备份差在哪

MariaDB / MySQL 官方都把 mariadb-dump / mysqldump 归为逻辑备份:输出是一套 SQL(CREATE TABLE、INSERT 等),服务器可以不停机导出。物理备份拷的是数据目录文件,恢复路径不同,本文不展开。

MariaDB 文档写明:工具现名 mariadb-dump,以前叫 mysqldump,Linux 上常仍有同名符号链接;从 MariaDB 11.0 起,官方 Docker 镜像里 mysqldump 符号链接已弃用并移除。MySQL 8.4 手册仍以 mysqldump 为主条目。下面命令两边都能对照:MariaDB 优先写 mariadb-dump,MySQL 环境把命令名换成 mysqldump 即可。

MariaDB/MySQL 逻辑备份到对象存储:mysqldump、压缩与保留策略-有序
MariaDB 官方《Making Backups with mariadb-dump》:逻辑备份、不停机、输出为 SQL dump(2026-10-27 截图)
MariaDB/MySQL 逻辑备份到对象存储:mysqldump、压缩与保留策略-有序
MariaDB mariadb-dump 参考页:原名 mysqldump;MariaDB 11.0 起官方 Docker 镜像移除 mysqldump 符号链接(2026-10-27 截图)
MariaDB/MySQL 逻辑备份到对象存储:mysqldump、压缩与保留策略-有序
MySQL 8.4 手册:mysqldump 做逻辑备份,生成可重建对象与数据的 SQL(2026-10-27 截图)

二、导出前先定三件事

  1. 备哪个库:WordPress 通常是单个业务库;不要随手 --all-databases 把系统库和无关库一起推公网桶。
  2. 存储引擎:表以 InnoDB 为主时,官方更推荐 --single-transaction 拿一致性快照,少用长时间 --lock-tables。混有 MyISAM 时,锁表策略要另核官方说明。
  3. 账号权限:至少要有被导表的 SELECT;用 --lock-tables 还要 LOCK TABLES;--routines / --events / SHOW VIEW 等按你是否导出例程、事件、视图来补。密码不要写进 crontab 明文,优先 ~/.my.cnf(权限 600)或环境注入。

三、一条能落地的导出命令(InnoDB)

MariaDB 备份指南对 InnoDB 给出的方向是:--single-transaction,在事务里读一致快照,避免长时间锁全库。例程与事件默认不一定进 dump,需要时显式加上 --routines、--events(参考页也提醒:触发器一般随表,过程/视图/事件要额外参数)。

# MariaDB;MySQL 把 mariadb-dump 换成 mysqldump 即可
# 日期用本地日历;密码放 ~/.my.cnf,勿写进命令历史
STAMP=$(date +%F)
OUTDIR=/backup/db
mkdir -p "$OUTDIR"

mariadb-dump --single-transaction --routines --events --triggers \
  --databases your_wp_db \
  | gzip -9 > "$OUTDIR/your_wp_db_${STAMP}.sql.gz"

# 立刻看体积与可读性(应能 gunzip -c | head 看到 SQL)
ls -lh "$OUTDIR/your_wp_db_${STAMP}.sql.gz"
gunzip -c "$OUTDIR/your_wp_db_${STAMP}.sql.gz" | head -n 20

核对要点:

  1. --databases:dump 里会带 CREATE DATABASE / USE,换机恢复时少一步手写建库。只导单表时按官方「库名 + 表名」写法,不要误加 --databases。
  2. 管道进 gzip:逻辑 dump 文本重复多,压缩后体积通常明显下降,上传对象存储也省流量。也可用 zstd;工具链以你机器已装为准。
  3. 文件名带日期:后面生命周期按前缀/修改时间扫对象时,日备文件一眼能对上。
  4. 导出后立刻 gunzip -c | head:确认不是空文件或半截管道错误。

大库若导出过久、影响写入,再考虑分表、物理备份或官方提到的并行工具;个人内容站多数一天一次逻辑备足够起步。

四、推到对象存储:先 copy,慎 sync

对象存储桶建议私有,用子账号最小权限(该前缀的 List/Get/Put;Delete 是否开放按你保留策略定)。不要和图床公共读桶混用。推送可用 rclone(跨云)或云厂商 CLI。

rclone 文档对 rclone sync 加粗提醒:会让目标与源一致,可能删除目标上源没有的文件;正式跑之前先 --dry-run 或 --interactive。日备场景更稳妥的是:

# 只把本地日备目录「补」到桶,不按 sync 清远端历史
rclone copy /backup/db/ ossbackup:my-bucket/db-logical/ \
  --include "*.sql.gz" --progress

# 若坚持用 sync:必须先 dry-run,并确认远端不会被误删周/月归档
rclone sync --dry-run /backup/db/ ossbackup:my-bucket/db-logical-daily/

整站文件与生命周期总览见用对象存储做整站备份。库 dump 建议单独前缀,例如 db-logical/2026/,别和 uploads/ 混在同一规则前缀里。

五、保留策略:本地几天 + 桶上生命周期

本地磁盘别无限堆 .sql.gz。常见做法:本地留 7~14 天日备;对象存储再留更长,用生命周期降冷或过期删除。

阿里云 OSS 生命周期说明:规则创建后约 24 小时内加载;之后通常按日扫描执行(文档写明常见为 UTC 0 点,对应北京时间上午 8 点后)。规则由控制对象(前缀/标签/大小,不支持通配后缀与正则)、动作(转低频/归档、过期删除、清理未合并分片)、触发条件组成。

MariaDB/MySQL 逻辑备份到对象存储:mysqldump、压缩与保留策略-有序
阿里云 OSS:按最后修改时间配置生命周期,可转低频/归档或到期删除(2026-10-27 截图)

内容站可参考的阶梯(天数按你合规与磁盘账单改;先在测试桶验证前缀):

阶段示例动作说明
近 14 天标准存储方便随时拉回演练
15~90 天转低频偶尔恢复仍可接受取回成本
90 天以后转归档或直接过期删除归档有最短存放与取回流程,删前算清
未合并分片单独清理规则大文件上传中断会留下分片占空间

注意:多规则命中同一对象时,删除通常优先于转换;删除天数务必长于转换天数。开了版本控制,还要单独清历史版本,否则「过期」只清当前版本不够。用 API 一次性提交生命周期可能覆盖整桶规则,改前先导出当前配置。

六、恢复演练:有文件不等于能还原

MariaDB 恢复指南写明:用 mariadb 客户端(MySQL 侧为 mysql)执行 dump 里的 SQL;mariadb-dump 负责导出,客户端负责导入。

MariaDB/MySQL 逻辑备份到对象存储:mysqldump、压缩与保留策略-有序
MariaDB《Restoring Data from Dump Files》:用 mariadb 客户端重定向执行 dump 文件(2026-10-27 截图)
# 先在测试实例建空库或确认 dump 自带 CREATE DATABASE
gunzip -c /backup/db/your_wp_db_2026-10-27.sql.gz \
  | mariadb --user=restore_user --password

# 或先解压再导入
gunzip -c remote-downloaded.sql.gz > /tmp/restore.sql
mariadb --user=restore_user --password your_wp_db < /tmp/restore.sql

每月至少做一次:从对象存储下载一份日备 → 导入测试机 → 打开后台文章列表与关键用户表,确认行数大致对得上。生产机直接灌 dump 会按文件里的 DROP/CREATE 覆盖同名表,动手前先确认影响范围。

定时触发可把上述导出 + rclone copy 写进系统 cron;若站点是 WordPress 且仍依赖页面触发的 WP-Cron,先看WP-Cron 禁用与系统 cron,避免「备份脚本以为跑了、其实主机上根本没按时叫醒」。

七、常见坑(按出现频率)

  1. 只备了文件没备库:恢复后主题在,文章没了。
  2. 密码写进 crontab:历史与进程列表都能看见;改用选项文件。
  3. rclone sync 误删远端周归档:日备目录一空,远端也被掏空。日备用 copy 更稳。
  4. 生命周期前缀写太宽:把仍在用的配置文件或证书一并删掉。
  5. 从未演练:gzip 坏了、权限不够、字符集不对,都要到恢复那天才暴露。

相关阅读

来源与查询日期

风险提示:备份脚本权限过大、密钥泄露或恢复操作失误都可能导致数据丢失或费用异常。操作前在测试环境验证;规则与命令行选项以各官方文档当时版本为准。