Skip to content

选择数据库

主节点支持 PostgreSQL / MySQL / SQLite 三选一。同一套代码通过方言抽象适配三者(技术细节见 存储层与多方言抽象)。这里只讲怎么选、连接串怎么写。

怎么选

SQLitePostgreSQLMySQL
运维成本(单文件)
适合规模单机 / 小规模任意 / 生产推荐已有 MySQL 设施时
并发写一般(WAL 模式已优化)
备份复制一个文件pg_dumpmysqldump
跨节点共享❌ 不适合

没有特别理由就用 SQLite 起步,需要横向扩展或更强并发时再迁到 PostgreSQL。

副节点不需要数据库

只有主节点连数据库。副节点不碰库,所以"跨节点共享"那一栏只在你有多个主节点(罕见)时才相关。

连接串(CNV_DB_URL)

驱动按 DSN 前缀自动识别,你不需要额外指定驱动名。

SQLite

bash
# 标准形式
export CNV_DB_URL='sqlite:///srv/magireco/magireco.db'

# 也接受裸文件路径 / file: 前缀 / 内存库
export CNV_DB_URL='/srv/magireco/magireco.db'
export CNV_DB_URL='file:/srv/magireco/magireco.db'
export CNV_DB_URL=':memory:'        # 仅测试用,重启即丢

启动时会自动启用这些 PRAGMA(无需手动配置):

PRAGMA作用
journal_modeWAL预写日志,读写并发更好
synchronousNORMAL性能与安全的平衡点
foreign_keysON启用外键级联(如删账号连带删会话)
busy_timeout5000写锁竞争时最多等 5 秒

SQLite 目录要存在

连接串里的目录(如 /srv/magireco/)必须已存在且进程有写权限。文件本身会自动创建。

PostgreSQL(≥ 14)

bash
export CNV_DB_URL='postgres://user:pass@localhost:5432/magireco?sslmode=disable'

# 生产里应当启用 TLS:
export CNV_DB_URL='postgres://user:pass@db.internal:5432/magireco?sslmode=require'

用的是 pgx 驱动。postgresql:// 前缀也接受。

MySQL(≥ 5.7)

bash
export CNV_DB_URL='mysql://user:pass@localhost:3306/magireco?parseTime=true'

一定要带 parseTime=true

MySQL 驱动需要 parseTime=true 才能正确处理时间列。内部会把 mysql://host:port/db 规范化成 go-sql-driver 需要的 user:pass@tcp(host:port)/db 形式,你只管按上面写即可。

迁移(自动)

主节点启动时会自动执行内嵌迁移:

  • 全部是 CREATE TABLE IF NOT EXISTS / CREATE INDEX IF NOT EXISTS,幂等,重复启动安全。
  • 每种数据库有各自的建表 SQL(类型差异:JSONB vs JSON vs TEXT,自增主键写法不同等)。
  • 不需要手动建表。

如果你用外部工具(如 Flyway / Atlas)管理 schema,想关掉自动迁移:

bash
export CNV_SKIP_MIGRATE=1

表清单(概览)

迁移会创建约 18 张表。完整字段见 数据模型,这里给个全貌:

分类
身份admins, accounts
会话admin_sessions, account_sessions, client_sessions
设备/封禁devices, bans
玩家数据saves(云存档)
验证email_codes, cap_challenges, cap_tokens
配置/资源config(KV), mirror_groups, mirrors, hot_bundles, offline_package
运维audit_log, secondary_nodes

备份建议

数据库备份命令
SQLite停写后 cp magireco.db magireco.db.bak,或用 sqlite3 magireco.db ".backup bak.db" 热备
PostgreSQLpg_dump magireco > magireco.sql
MySQLmysqldump magireco > magireco.sql

最该备份的是 configaccountssaves 三张表 —— 分别是你的运行配置、玩家身份、玩家存档。把数据库整体定期快照即可。

切换数据库

想从 SQLite 迁到 PostgreSQL?目前没有内置迁移工具,但因为 schema 简单,可以:

  1. 用新的 CNV_DB_URL 启动一次,让它在目标库建好表结构(CNV_SKIP_MIGRATE 保持默认)。
  2. 用通用工具(如 pgloader for SQLite→PG)迁移数据,或写个一次性脚本按表搬运。
  3. 校验 config / accounts / saves 行数一致后切换。

数据量通常很小,手工搬运也不费事。

文档正文以 CC BY-NC-SA 4.0 授权 · 代码部分以 GPLv3 开源 · 本项目仅作学习研究使用,与版权方无任何关联