存储与完整性
选哪一种
| 类型 | 适合 | 特点 |
|---|---|---|
本地(默认) | 单服 | 写在玩家存档(PDC)里,和背包一起由服务器保存;当机回档时背包与饰品一起回到同一个时间点,不会复制;零数据库开销 |
SQLite | 单服、想要历史版本 | 本地数据库文件 data.db,多了历史版本、还原、完整性检查 |
MySQL | 多台子服共用饰品 | 跨服交接、版本锁、历史、检查;每台子服都要装 CloudAcces 并连同一个数据库 |
config.yml
保存:
类型: MySQL
MySQL:
主机: 127.0.0.1
连接埠: 3306
数据库: cloudacces
使用者: root
密码: '******'
参数: useSSL=false&characterEncoding=utf8&serverTimezone=UTC&createDatabaseIfNotExist=true
表前缀: cloudacces_
服务器名称: '生存1' # 每台子服不同;留空自动产生(server-id.txt)
保留历史: 20
跨服等待秒数: 5
写入延迟: 800
同步保存玩家存档: 是
启动时检查: 是
从本地改成数据库
改 类型 后重启。每位玩家第一次登录时,如果数据库里还没有他的资料、存档里却有旧饰品,会自动搬进数据库(存档里的旧资料改名保留,不会删除),控制台会显示「已把 X 存档里的 N 件饰品搬进 MySQL」。
为什么不卡
- 登录前就读好:资料在玩家登录的异步阶段读取,进服那一刻已经就绪,菜单马上能开。
- 操作即时:放入、拿起只改内存,画面与属性立刻更新;写入数据库排到后台。
- 合并写入:变更后等
写入延迟(默认 0.8 秒)再写,连续换好几件只写一次。 - 单一数据库线程:所有读写依序在同一条线程执行,同一位玩家的「离线保存 → 重新登录读取」不会颠倒;主线程从不等数据库。
- 数据库连不上时不会踢人:玩家的饰品状态停在「读取中 / 暂时无法读取」,菜单暂停操作,背景每 10 秒重试;绝不会用空资料覆盖。
跨服交接
每笔资料记录「目前持有的子服」与心跳时间:
- 玩家从 A 服换到 B 服,A 服在离线时保存并释放持有权。
- B 服在登录阶段(异步,不卡服)看到 A 还持有,就每 0.1 秒检查一次,等 A 保存完再读取 —— 不会读到旧资料。
- A 服当机、
跨服等待秒数(默认 5 秒)内都没释放:B 服接手,控制台警告「子服 A 未在时限内释放,已直接接手」。 - 接手之后 A 服若还有晚到的写入,会因为版本号不符而失败,内容存成「冲突」历史,不会覆盖 B 服的新资料。
版本锁与历史
- 每次写入都带着「我读到的版本号」,数据库版本对不上就不写(乐观锁),改存一份
conflict历史,并通知玩家「已重新同步」。 - 每次保存另存一份历史;一般保存每位玩家保留
保留历史份,损坏、冲突、还原前的纪录永远保留。 - 每份资料都有 SHA-256 校验码:读取时校验码或结构不对,自动改用最近一份正确的历史版本,损坏的原始资料存成
corrupt历史。 - 物品用 Paper 的格式保存(含资料版本),升级 Minecraft 版本时自动转换;万一某件物品读不出来,它的原始资料会原封不动跟着保存,不会被丢掉。
/acces history Steve
#6 v9 10-08 01:13:27 修复 生存1 · 2 件 · 正常
#5 v8 10-08 01:13:27 还原前 生存1 · ? 件 · 损坏
#4 v3 10-08 01:13:19 冲突 生存1 · 2 件 · 正常
#3 v3 10-08 01:13:04 保存 生存1 · 1 件 · 正常
/acces restore Steve 3 还原到 #3:玩家在线时立即换上并写入新版本;离线时直接写数据库(原本的资料先存成「还原前」)。
完整性检查
/acces check 只检查
/acces check fix 检查并修复
/acces check deep 额外逐件确认每个物品能被这个服务器版本读出来
在后台分页读取,deep 的物品读取回到主线程、每 tick 一页,不会卡服。检查项目:
| 项目 | 说明 | fix 会做什么 |
|---|---|---|
| 损坏资料 | 校验码不符、格式损坏 | 改用最近一份正确的历史版本(原资料存成「还原前」);在线玩家不动 |
| 过期持有锁 | 子服很久没心跳却还持有玩家(上次当机) | 清除 |
| 疑似复制 | 同一件 CloudItems 物品(含随机属性,位元组完全相同)出现在两个以上的位置 | 只列出,交给管理员判断 |
| 无法读取的物品 | (deep)这个服务器版本读不出来的物品 | 只列出 |
报告写在 plugins/CloudAcces/reports/check-<时间>.txt。启动时检查: 是 会在开服 10 秒后自动做一次只读检查。
出事时的备份
| 位置 | 什么时候出现 |
|---|---|
corrupt/ | 本地模式读到损坏的存档资料:原始资料备份在这里,玩家从空的饰品栏开始 |
failed-saves/ | 玩家离线后数据库一直写不进去(重试约 5 分钟):资料存成文件,修好数据库后 /acces importfile <文件> 汇回 |