4.5 数据库与迁移

数据库与迁移

木雷短网址支持 MySQL、PostgreSQL 和 SQLite。安装向导与正常启动都使用 GORM 建立连接,并由 Goose 管理结构迁移。

数据库选择

驱动 适用场景 关键配置
sqlite 单实例、轻量部署 DATABASE_FILEPATH
mysql 标准生产、多实例 host、port、dbname、username、password
postgresql 标准生产、多实例 host、port、dbname、username、password

SQLite 使用 database.filepath;TCP 数据库使用 database.host。不要把带协议的 DSN 填入 host,IPv6 地址可以使用有效的 IPv6 主机值。

最小权限

安装和升级期间,数据库账号需要对指定数据库执行建表、建索引和结构变更,并读写业务表。不要授予全局管理员权限,也不要允许公网任意来源连接。

MySQL 示例只展示授权范围,账号和密码请自行替换:

CREATE DATABASE dwz CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'dwz'@'10.%' IDENTIFIED BY '随机强密码';
GRANT ALL PRIVILEGES ON dwz.* TO 'dwz'@'10.%';

Goose 迁移

迁移位于三个方言目录:

migrations/mysql/
migrations/postgresql/
migrations/sqlite/

服务根据 database.driver 选择目录并执行 goose up。迁移状态记录在 goose_db_version。从早期 AutoMigrate 版本升级时,程序会在检测到旧业务表且 Goose 尚无版本记录时建立兼容基线。

升级步骤

  1. 停止写流量或进入维护窗口。
  2. 备份数据库和 config/
  3. 只启动一个新版本实例,观察迁移完成。
  4. 请求 /health,确认数据库状态为 UP
  5. 验证登录、创建测试短链和跳转,再恢复其他实例。

不要手工修改已发布迁移,也不要直接删除 goose_db_version。迁移失败时保留日志和现场,先恢复应用版本或数据库备份,再分析失败 SQL。

SQLite 备份

最稳妥的方式是停止服务后复制数据库文件:

cp -a config/sqlite.db "backup/sqlite-$(date +%Y%m%d%H%M%S).db"

运行中备份应使用 SQLite 官方备份机制,避免只复制主文件时遗漏 WAL 中尚未合并的数据。

数据库切换

当前没有自动把 SQLite 数据搬到 MySQL/PostgreSQL 的命令。切换驱动前需要停机,导出并转换数据,核对主键、时间、布尔值与唯一索引,再在目标库运行当前迁移并导入。务必先在副本上演练。

相关章节:缓存、Redis 与 ID 发号器开发中的迁移约定