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 尚无版本记录时建立兼容基线。
升级步骤
- 停止写流量或进入维护窗口。
- 备份数据库和
config/。 - 只启动一个新版本实例,观察迁移完成。
- 请求
/health,确认数据库状态为UP。 - 验证登录、创建测试短链和跳转,再恢复其他实例。
不要手工修改已发布迁移,也不要直接删除 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 发号器、开发中的迁移约定。