跳到正文

database.yml:SQLite 与 MySQL

完整默认文件见 从零服主实战。这里逐项解释范围、重启要求与故障处理。

后端与连接

默认范围/规则生效
config-version1固定启动/重载校验
typeSQLITESQLITE/MYSQL重启
sqlite.filestorage/sealattributes.db相对路径,不得含 .. 逃出目录重启
mysql.host127.0.0.1非空,最多 255 字符重启
mysql.port33061~65535重启
mysql.databasesealattributes1~64 个字母、数字、下划线重启
mysql.usernamesealattributes非空,最多 128 字符重启
mysql.passwordchange-me最多 1024 字符重启;生产必须替换
mysql.use-sslfalse布尔重启
mysql.allow-public-key-retrievalfalse布尔重启;仅明确理解风险时开启

生产 MySQL 示例:

yaml
config-version: 1
type: MYSQL
sqlite:
  file: storage/sealattributes.db
mysql:
  host: db.internal.example
  port: 3306
  database: sealattributes_prod
  username: sealattributes_app
  password: "replace-with-secret"
  use-ssl: true
  allow-public-key-retrieval: false
pool:
  minimum-idle: 1
  maximum-pool-size: 4
  connection-timeout-ms: 5000
  validation-timeout-ms: 2000
  idle-timeout-ms: 600000
  maximum-lifetime-ms: 1800000
queue:
  storage-threads: 2
  capacity: 4096
timeouts:
  query-seconds: 5
  startup-seconds: 15
  preload-seconds: 15
  shutdown-seconds: 8
health-checkpoint:
  interval-seconds: 60
reconnect:
  interval-seconds: 15
migration:
  mysql-backup-confirmed: false

不要提交含密码的文件。插件会在错误输出中清理密码,但这不能替代最小权限账户、网络 ACL 和凭据轮换。

连接池与队列

默认范围
pool.minimum-idle10~16,且 ≤ maximum
pool.maximum-pool-size11~16
connection-timeout-ms50001000~30000
validation-timeout-ms2000250~connection timeout
idle-timeout-ms6000000 或 ≥10000
maximum-lifetime-ms18000000 或 ≥30000
queue.storage-threads11~8;SQLite 必须为 1
queue.capacity2048128~16384

这些字段全部要求重启。SQLite 的 pool maximum 和 storage threads 必须为 1。扩大池和队列不能修复慢 SQL;先测延迟、索引、网络和消费速率。

超时与后台周期

默认范围热重载
timeouts.query-seconds51~30
timeouts.startup-seconds152~60配置可重载,实际启动预算在下次启动使用
timeouts.preload-seconds151~60
timeouts.shutdown-seconds51~30
health-checkpoint.interval-seconds600 或 10~600是;0 关闭周期检查点
reconnect.interval-seconds155~300
migration.mysql-backup-confirmedfalse布尔可读入,但仅下次完整启动迁移使用

迁移确认

全新 MySQL schema 保持 false。只有版本说明明确要求、并且你已完成外部备份与恢复演练时,才在维护窗口临时设为 true。插件不会替你创建可靠的 MySQL 备份。未来 schema 比当前代码新时会拒绝启动;禁止手改 sa_schema_version

后端切换不等于迁移

type: SQLITE 改成 MYSQL 只会连接另一套空/已有数据库,不会复制任何数据。正确流程是停服、备份、在隔离环境使用经过审计的迁移工具导入、验证行数/约束/登录,再切换。当前插件没有导出、导入或恢复命令。

故障行为

  • 启动数据库失败会停止插件,不自动回退 SQLite;
  • READY 前持久数据预载超时会让该会话 fail closed;
  • 队列有界,满时拒绝新写入而不是无限占内存;
  • 永久来源写入失败会保留旧持久事实,不伪装成功;
  • 断线后按 reconnect 周期探测;恢复连接不代表此前失败写入都自动重试;
  • /sa database flush 使用 shutdown timeout,busy/timeout 需要先查数据库而不是无限重复。

/sa database status 观察后端、连接和队列;正常停服必须确认 storage stopped: drained=true

Minecraft 服务端插件使用与开发文档