更新:2026-09-05 16:11

数据库迁移与备份还原

日常备份、还原,以及表结构升级(InstallController 机制)。

1. 备份

# 全库备份(含表结构与数据)
mysqldump -utypecho -p typechoapi --single-transaction --default-character-set=utf8mb4 \
  > /backup/typechoapi_$(date +%F_%H%M).sql

# 只备份表结构(升级前快照)
mysqldump -utypecho -p typechoapi --no-data --default-character-set=utf8mb4 \
  > /backup/typechoapi_schema_$(date +%F).sql

# 定时备份(crontab 示例:每天凌晨 3 点,保留 7 天)
0 3 * * * mysqldump -utypecho -p'密码' typechoapi --single-transaction --default-character-set=utf8mb4 | gzip > /backup/typechoapi_$(date +\%F).sql.gz && find /backup -name '*.sql.gz' -mtime +7 -delete

2. 还原

mysql -utypecho -p typechoapi < /backup/typechoapi_2026-01-01.sql

还原前建议停掉后端写入(./ruleapi.sh stop),还原后清 Redis:redis-cli FLUSHALL(谨慎)或只清业务缓存。

3. 表结构升级机制(重点)

后端 InstallController 提供幂等建表/迁移,由 RuleApiVisible 管理端「刷新数据表」触发:

管理端「刷新数据表」
  → newInstall(基础表)
  → proInstall(Pro 表):
       executeSqlScript("xxx.sql")     # CREATE TABLE IF NOT EXISTS(新装)
       ALTER ADD COLUMN(老库缺列时)   # information_schema 检测 + 补列
       ADD INDEX(缺索引时)

关键规则

  • 新表 → 写 resources/*.sqlCREATE TABLE IF NOT EXISTS)。
  • 加列/索引 → 在 proInstall 写幂等迁移段(先 select count(*) from information_schema... 判缺,再 ALTER)。
  • 修改代码后重启 + 管理端「刷新数据表」即完成升级,无需手工 SQL

4. 升级演练(示例:软件库付费字段)

旧库升级到含付费下载版本:

  1. 部署新 jar(配置外置不变)。
  2. 管理端 → 首页 →「刷新数据表」。
  3. proInstall 自动执行:soft_module_ddl.sql(若无 soft 表则建)+ 为旧 typecho_softprice/saleStatus 列与索引、为 typecho_soft_contributecategoryId/price/saleStatus 列。
  4. 验证:SHOW COLUMNS FROM typecho_soft;pricesaleStatus

5. 数据一致性建议

  • 每天备份 + 至少每周一次还原演练。
  • 大表操作(加列)在低峰执行(MySQL 5.7 加列可能锁表,8.0 开启 instant 快)。
  • 涉及支付/资产的环境,备份保留时间拉长并异地存储。