当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇世界单机启动报nosuchtableStdItems的修复思路

热度:
一、先看懂这个报错在说什么

正在读取配置信息→正在加载物品数据库→服务器启动异常!!!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不是文件丢了,是“连着的那个库里没这张表”。把库文件、表结构、连接路径三件事对齐,报错立刻消失。
[顶部]