一、先看懂这个报错在说什么
正在读取配置信息 → 正在加载物品数据库 → 服务器启动异常!!!no such table: StdItems
后面还跟着一句:select * from StdItems order by idx
这说明服务端已经走到数据库查询阶段,并且用的是 SQL 方式查表,不是单纯找不到 StdItems.DB 文件。引擎当前连的那个数据库文件里,根本没有叫 StdItems 的表。常见情况就三种:
1. 数据库文件本身是空的,只有壳子没建表
2. 引擎连错了库文件,连到了别的空 db
3. 原库是 DBF/DBC 结构,但你用的引擎是 SQLite 关系库,没做初始化建表
先别急着换端,按下面顺序查。
二、确认引擎用的是什么数据库
进服务端根目录,看有没有这些特征:
• 有 Mud2\DB\StdItems.DB、Magic.DB、Monster.DB → 老 DBC/BDE 链路(HERO、BLUE、LEG 系)
• 有 .db、.sqlite、.sqlite3、Data/.db → SQLite 链路(新 GOM/GEE/部分传奇世界单机端)
• 有 DBServer.ini 里写 SQLite=1 或 DbType=sqlite → 明确走 SQL
你报错里出现了 select * from StdItems,基本可以锁定是 SQLite 链路,或者引擎封装了一层 SQL 接口。
三、SQLite 链路排查(重点)
1. 找到真正的数据库文件
别只看 Mud2\DB,搜整个服务端目录:
• *.db
• *.sqlite
• *.sqlite3
• Account.db、Game.db、Log.db、StdItems 相关 db
找到后记住完整路径,比如:
D:\MirServer\Data\Game.db
2. 用 sqlite3 或 DB 工具打开验证
命令行进到 sqlite3 环境:
sqlite3 D:\MirServer\Data\Game.db
进去后执行:
SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;
看返回里有没有 StdItems。如果没有,就是表真没建。
再确认当前连的是不是这个文件:
PRAGMA database_list;
如果引擎实际连的是另一个路径下的空 db,你会看到表列表是空的,但文件大小也很小(几 KB 甚至 0 字节)。
3. 为什么表会没建出来
• 首次启动没跑初始化脚本,引擎只建了账号表没建物品表
• 启动顺序错了,先起了 M2 再初始化,M2 读到一半报错退出
• 数据库文件是后来手动新建的空文件,没导入结构
• 同版本端拷贝时只拷了 exe 和配置,漏了 Data 目录的初始 db
• 杀软把初始化脚本拦了,建表语句没执行完
4. 建表修复(通用最小结构)
进 sqlite3 后执行:
CREATE TABLE IF NOT EXISTS StdItems (
idx INTEGER PRIMARY KEY,
Name TEXT DEFAULT '',
StdMode INTEGER DEFAULT 0,
Shape INTEGER DEFAULT 0,
Weight INTEGER DEFAULT 0,
Looks INTEGER DEFAULT 0,
DuraMax INTEGER DEFAULT 0,
AC INTEGER DEFAULT 0,
AC2 INTEGER DEFAULT 0,
MAC INTEGER DEFAULT 0,
MAC2 INTEGER DEFAULT 0,
DC INTEGER DEFAULT 0,
DC2 INTEGER DEFAULT 0,
MC INTEGER DEFAULT 0,
MC2 INTEGER DEFAULT 0,
SC INTEGER DEFAULT 0,
SC2 INTEGER DEFAULT 0,
Need INTEGER DEFAULT 0,
NeedLevel INTEGER DEFAULT 0,
Price INTEGER DEFAULT 0
);
建完再查:
SELECT count(*) FROM StdItems;
返回 0 是正常的,表存在但没数据。这时候重启 M2,报错会从 no such table 变成“物品库为空”或者能正常进游戏(进游戏后没物品再补数据)。
注意:上面是通用最小字段,不同引擎列更多(Source、Reserved、Bind、UniqueItem、Overlap、Smite 等)。强行用最小表能过启动,但部分新属性会读不到。稳妥做法是拿同版本原端的 Game.db 直接覆盖,别自己凑字段。
5. 相对路径坑(高频)
SQLite 用相对路径时,工作目录不对会新建一个空 db。比如引擎在 D:\MirServer\Mir200 启动,配置里写 Data/Game.db,实际可能在 Mir200 下又建了一个空 Data/Game.db。
处理:
• 配置文件里改成绝对路径:D:\MirServer\Data\Game.db
• 或者确认引擎工作目录,删掉误生成的空 db 再重启
四、DBC 链路排查(老引擎情况)
如果实际是 DBC 端但报错也带 SQL(有些封装层会这样):
1. 检查 Mud2\DB 目录
确认有这些文件且不是 0KB:
• StdItems.DB
• Magic.DB
• Monster.DB
• StdItems.DBF(部分端双份)
文件大小异常就说明解压损坏,从原包重新解压覆盖。
2. BDE Administrator 配置
控制面板打开 BDE Administrator:
• 传奇世界端别名不一定是 HeroDB,可能是 MirDB 或 MirWorldDB
• PATH 必须精确指向 Mud2\DB 目录,比如 D:\MirServer\Mud2\DB
• 别指到 Mud2 上层,也别带中文和空格
• 点 Apply 保存,关掉重开
3. 引擎配置对齐
打开 !Setup.txt 或 DBConfig.ini:
• DBCName= 后面填的和 BDE 别名一字不差
• DBPath= 后面是 Mud2\DB 绝对路径,反斜杠用 \
• 参数后面别多空格
4. 权限和杀软
• Mud2\DB 文件夹取消只读,给当前用户完全控制
• 杀软加白名单,DBServer.exe、M2Server.exe、整个 MirServer 目录都加
• 以管理员身份运行引擎控制器
五、启动顺序别乱
正确顺序:
1. 先确认数据库文件/表结构就绪
2. 起 DBServer(或数据库初始化模块)
3. 看 DBServer 日志有没有“数据库初始化完成”“建表成功”
4. 再起 LoginSrv → Gate → M2
如果 DBServer 没正常初始化就起 M2,M2 一查表就 no such table。
六、最快验证法
不改任何配置,做三步:
1. 备份当前 Data 目录
2. 从同版本完整端把整个 Data 目录原样覆盖过来
3. 绝对路径配好,冷启动一次
能起来就证明是原库缺失/没建表,不是配置全错。起来后再把自己改的内容小步加回去。
七、几个容易踩的暗坑
• 数据库文件被杀软隔离,表面看着在,实际读不到
• SQLite 连错文件,引擎工作目录和配置目录不一致
• 只建了 StdItems 表,Magic、Monster 没建,下一步又报 no such table: Magic
• 自己建表字段少了引擎必读列,启动能过但进游戏物品属性全 0
• 用了 :memory: 临时库,重启就没表(一般配置文件误写才会触发)
八、建表脚本一次把常用表都建了(参考)
如果同版本端实在拿不到原库,可先按通用结构把三张核心表建出来:
CREATE TABLE IF NOT EXISTS StdItems (
idx INTEGER PRIMARY KEY,
Name TEXT,
StdMode INTEGER,
Shape INTEGER,
Weight INTEGER,
Looks INTEGER,
DuraMax INTEGER,
AC INTEGER, AC2 INTEGER,
MAC INTEGER, MAC2 INTEGER,
DC INTEGER, DC2 INTEGER,
MC INTEGER, MC2 INTEGER,
SC INTEGER, SC2 INTEGER,
Need INTEGER,
NeedLevel INTEGER,
Price INTEGER
);
CREATE TABLE IF NOT EXISTS Magic (
MagID INTEGER PRIMARY KEY,
MagName TEXT,
Job INTEGER,
TrainLevel INTEGER,
NeedLevel INTEGER,
Spell INTEGER,
Power INTEGER,
Delay INTEGER,
DefSpell INTEGER,
DefPower INTEGER,
MaxTrain INTEGER,
Mode INTEGER,
Speed INTEGER
);
CREATE TABLE IF NOT EXISTS Monster (
idx INTEGER PRIMARY KEY,
Name TEXT,
Appr INTEGER,
Race INTEGER,
RaceImg INTEGER,
Level INTEGER,
HP INTEGER,
MP INTEGER,
AC INTEGER,
MAC INTEGER,
DC INTEGER,
DCMax INTEGER,
MC INTEGER,
SCMin INTEGER,
SC INTEGER,
Speed INTEGER,
Hit INTEGER,
ViewRange INTEGER,
Escape INTEGER,
EyeRange INTEGER
);
建完重启,能过启动关。但字段覆盖不全,后续高级功能(内功、元素、套装、绑定)可能异常,最终还是建议换回同版本原库。
九、优先处理顺序总结
1. 确认是 SQLite 还是 DBC 链路
2. SQLite:用 sqlite3 打开配置里那个 db,查 sqlite_master 有没有 StdItems
3. 没有就建表,或直接从同版本端覆盖 Data 目录
4. 配置里数据库路径改绝对路径,避免连错空库
5. 保证 DBServer 先初始化完再起 M2
6. 同版本原库优先,自己建表只作应急
no such table 不是文件丢了,是“连着的那个库里没这张表”。把库文件、表结构、连接路径三件事对齐,报错立刻消失。
传奇世界单机启动报no such table StdItems的修复思路
来源:
作者:
点击:

