一、先看懂这个报错在说什么
正在读取配置信息→正在加载物品数据库→服务器启动异常!!!nosuchtable:StdItems
后面还跟着一句:select*fromStdItemsorderbyidx
这说明服务端已经走到数据库查询阶段,并且用的是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*fromStdItems,基本可以锁定是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环境:
sqlite3D:\MirServer\Data\Game.db
进去后执行:
SELECTnameFROMsqlite_masterWHEREtype='table'ORDERBYname;
看返回里有没有StdItems。如果没有,就是表真没建。
再确认当前连的是不是这个文件:
PRAGMAdatabase_list;
如果引擎实际连的是另一个路径下的空db,你会看到表列表是空的,但文件大小也很小(几KB甚至0字节)。
3.为什么表会没建出来
•首次启动没跑初始化脚本,引擎只建了账号表没建物品表
•启动顺序错了,先起了M2再初始化,M2读到一半报错退出
•数据库文件是后来手动新建的空文件,没导入结构
•同版本端拷贝时只拷了exe和配置,漏了Data目录的初始db
•杀软把初始化脚本拦了,建表语句没执行完
4.建表修复(通用最小结构)
进sqlite3后执行:
CREATETABLEIFNOTEXISTSStdItems(
idxINTEGERPRIMARYKEY
NameTEXTDEFAULT''
StdModeINTEGERDEFAULT0
ShapeINTEGERDEFAULT0
WeightINTEGERDEFAULT0
LooksINTEGERDEFAULT0
DuraMaxINTEGERDEFAULT0
ACINTEGERDEFAULT0
AC2INTEGERDEFAULT0
MACINTEGERDEFAULT0
MAC2INTEGERDEFAULT0
DCINTEGERDEFAULT0
DC2INTEGERDEFAULT0
MCINTEGERDEFAULT0
MC2INTEGERDEFAULT0
SCINTEGERDEFAULT0
SC2INTEGERDEFAULT0
NeedINTEGERDEFAULT0
NeedLevelINTEGERDEFAULT0
PriceINTEGERDEFAULT0
);
建完再查:
SELECTcount(*)FROMStdItems;
返回0是正常的,表存在但没数据。这时候重启M2,报错会从nosuchtable变成“物品库为空”或者能正常进游戏(进游戏后没物品再补数据)。
注意:上面是通用最小字段,不同引擎列更多(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.BDEAdministrator配置
控制面板打开BDEAdministrator:
•传奇世界端别名不一定是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一查表就nosuchtable。
六、最快验证法
不改任何配置,做三步:
1.备份当前Data目录
2.从同版本完整端把整个Data目录原样覆盖过来
3.绝对路径配好,冷启动一次
能起来就证明是原库缺失/没建表,不是配置全错。起来后再把自己改的内容小步加回去。
七、几个容易踩的暗坑
•数据库文件被杀软隔离,表面看着在,实际读不到
•SQLite连错文件,引擎工作目录和配置目录不一致
•只建了StdItems表,Magic、Monster没建,下一步又报nosuchtable:Magic
•自己建表字段少了引擎必读列,启动能过但进游戏物品属性全0
•用了:memory:临时库,重启就没表(一般配置文件误写才会触发)
八、建表脚本一次把常用表都建了(参考)
如果同版本端实在拿不到原库,可先按通用结构把三张核心表建出来:
CREATETABLEIFNOTEXISTSStdItems(
idxINTEGERPRIMARYKEY
NameTEXT
StdModeINTEGER
ShapeINTEGER
WeightINTEGER
LooksINTEGER
DuraMaxINTEGER
ACINTEGERAC2INTEGER
MACINTEGERMAC2INTEGER
DCINTEGERDC2INTEGER
MCINTEGERMC2INTEGER
SCINTEGERSC2INTEGER
NeedINTEGER
NeedLevelINTEGER
PriceINTEGER
);
CREATETABLEIFNOTEXISTSMagic(
MagIDINTEGERPRIMARYKEY
MagNameTEXT
JobINTEGER
TrainLevelINTEGER
NeedLevelINTEGER
SpellINTEGER
PowerINTEGER
DelayINTEGER
DefSpellINTEGER
DefPowerINTEGER
MaxTrainINTEGER
ModeINTEGER
SpeedINTEGER
);
CREATETABLEIFNOTEXISTSMonster(
idxINTEGERPRIMARYKEY
NameTEXT
ApprINTEGER
RaceINTEGER
RaceImgINTEGER
LevelINTEGER
HPINTEGER
MPINTEGER
ACINTEGER
MACINTEGER
DCINTEGER
DCMaxINTEGER
MCINTEGER
SCMinINTEGER
SCINTEGER
SpeedINTEGER
HitINTEGER
ViewRangeINTEGER
EscapeINTEGER
EyeRangeINTEGER
);
建完重启,能过启动关。但字段覆盖不全,后续高级功能(内功、元素、套装、绑定)可能异常,最终还是建议换回同版本原库。
九、优先处理顺序总结
1.确认是SQLite还是DBC链路
2.SQLite:用sqlite3打开配置里那个db,查sqlite_master有没有StdItems
3.没有就建表,或直接从同版本端覆盖Data目录
4.配置里数据库路径改绝对路径,避免连错空库
5.保证DBServer先初始化完再起M2
6.同版本原库优先,自己建表只作应急
nosuchtable不是文件丢了,是“连着的那个库里没这张表”。把库文件、表结构、连接路径三件事对齐,报错立刻消失。
正在读取配置信息→正在加载物品数据库→服务器启动异常!!!nosuchtable:StdItems
后面还跟着一句:select*fromStdItemsorderbyidx
这说明服务端已经走到数据库查询阶段,并且用的是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*fromStdItems,基本可以锁定是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环境:
sqlite3D:\MirServer\Data\Game.db
进去后执行:
SELECTnameFROMsqlite_masterWHEREtype='table'ORDERBYname;
看返回里有没有StdItems。如果没有,就是表真没建。
再确认当前连的是不是这个文件:
PRAGMAdatabase_list;
如果引擎实际连的是另一个路径下的空db,你会看到表列表是空的,但文件大小也很小(几KB甚至0字节)。
3.为什么表会没建出来
•首次启动没跑初始化脚本,引擎只建了账号表没建物品表
•启动顺序错了,先起了M2再初始化,M2读到一半报错退出
•数据库文件是后来手动新建的空文件,没导入结构
•同版本端拷贝时只拷了exe和配置,漏了Data目录的初始db
•杀软把初始化脚本拦了,建表语句没执行完
4.建表修复(通用最小结构)
进sqlite3后执行:
CREATETABLEIFNOTEXISTSStdItems(
idxINTEGERPRIMARYKEY
NameTEXTDEFAULT''
StdModeINTEGERDEFAULT0
ShapeINTEGERDEFAULT0
WeightINTEGERDEFAULT0
LooksINTEGERDEFAULT0
DuraMaxINTEGERDEFAULT0
ACINTEGERDEFAULT0
AC2INTEGERDEFAULT0
MACINTEGERDEFAULT0
MAC2INTEGERDEFAULT0
DCINTEGERDEFAULT0
DC2INTEGERDEFAULT0
MCINTEGERDEFAULT0
MC2INTEGERDEFAULT0
SCINTEGERDEFAULT0
SC2INTEGERDEFAULT0
NeedINTEGERDEFAULT0
NeedLevelINTEGERDEFAULT0
PriceINTEGERDEFAULT0
);
建完再查:
SELECTcount(*)FROMStdItems;
返回0是正常的,表存在但没数据。这时候重启M2,报错会从nosuchtable变成“物品库为空”或者能正常进游戏(进游戏后没物品再补数据)。
注意:上面是通用最小字段,不同引擎列更多(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.BDEAdministrator配置
控制面板打开BDEAdministrator:
•传奇世界端别名不一定是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一查表就nosuchtable。
六、最快验证法
不改任何配置,做三步:
1.备份当前Data目录
2.从同版本完整端把整个Data目录原样覆盖过来
3.绝对路径配好,冷启动一次
能起来就证明是原库缺失/没建表,不是配置全错。起来后再把自己改的内容小步加回去。
七、几个容易踩的暗坑
•数据库文件被杀软隔离,表面看着在,实际读不到
•SQLite连错文件,引擎工作目录和配置目录不一致
•只建了StdItems表,Magic、Monster没建,下一步又报nosuchtable:Magic
•自己建表字段少了引擎必读列,启动能过但进游戏物品属性全0
•用了:memory:临时库,重启就没表(一般配置文件误写才会触发)
八、建表脚本一次把常用表都建了(参考)
如果同版本端实在拿不到原库,可先按通用结构把三张核心表建出来:
CREATETABLEIFNOTEXISTSStdItems(
idxINTEGERPRIMARYKEY
NameTEXT
StdModeINTEGER
ShapeINTEGER
WeightINTEGER
LooksINTEGER
DuraMaxINTEGER
ACINTEGERAC2INTEGER
MACINTEGERMAC2INTEGER
DCINTEGERDC2INTEGER
MCINTEGERMC2INTEGER
SCINTEGERSC2INTEGER
NeedINTEGER
NeedLevelINTEGER
PriceINTEGER
);
CREATETABLEIFNOTEXISTSMagic(
MagIDINTEGERPRIMARYKEY
MagNameTEXT
JobINTEGER
TrainLevelINTEGER
NeedLevelINTEGER
SpellINTEGER
PowerINTEGER
DelayINTEGER
DefSpellINTEGER
DefPowerINTEGER
MaxTrainINTEGER
ModeINTEGER
SpeedINTEGER
);
CREATETABLEIFNOTEXISTSMonster(
idxINTEGERPRIMARYKEY
NameTEXT
ApprINTEGER
RaceINTEGER
RaceImgINTEGER
LevelINTEGER
HPINTEGER
MPINTEGER
ACINTEGER
MACINTEGER
DCINTEGER
DCMaxINTEGER
MCINTEGER
SCMinINTEGER
SCINTEGER
SpeedINTEGER
HitINTEGER
ViewRangeINTEGER
EscapeINTEGER
EyeRangeINTEGER
);
建完重启,能过启动关。但字段覆盖不全,后续高级功能(内功、元素、套装、绑定)可能异常,最终还是建议换回同版本原库。
九、优先处理顺序总结
1.确认是SQLite还是DBC链路
2.SQLite:用sqlite3打开配置里那个db,查sqlite_master有没有StdItems
3.没有就建表,或直接从同版本端覆盖Data目录
4.配置里数据库路径改绝对路径,避免连错空库
5.保证DBServer先初始化完再起M2
6.同版本原库优先,自己建表只作应急
nosuchtable不是文件丢了,是“连着的那个库里没这张表”。把库文件、表结构、连接路径三件事对齐,报错立刻消失。

