- 精华
- 阅读权限
- 50
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2022-12-20
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
事情起因:手贱错误刷了废案武器 15505:悬黎千钧(不太确定)
物品虽然在游戏中能显示,但是重新上线后会提示无法初始化数据库
如下:
在gameserver目录中使用tail -f nohup.out查看日志
会一直报
LOG_WARNING 2023-01-28 02:23:47 302 959802 [./src/player/item/weapon.cpp:123][init] invalid equip_level, item_id:15504 [uid:100007, cmd:PlayerLoginRsp_AsyncTask]
LOG_WARNING 2023-01-28 02:23:47 302 959802 [./src/player/item/player_item_comp.cpp:450][init] init for pack failed [uid:100007, cmd:PlayerLoginRsp_AsyncTask]
其中item_id明确指向了报错的物品
前置条件:Mysql已开启Binlog,我的端是删库塔搭的,在默认路径,其他端请自行了解Mysql存放位置,更改下对应路径即可
查询是否开启binlog
在Navicat中执行
show variables like 'log_%'
如果显示为ON可继续下一步
如果是OFF,下面可以不用看了,点下右上角关闭
MySQL自带的binlog工具回滚不了BLOB,试了几次没成功。所以只能手动回滚了。如果有懂Mysql数据库的大佬希望指导一下。
PS:只说重点,搭建教程里有的内容简单带过,不懂的重新翻架设教程
1.使用Navicat备份db_hk4e_user_gio全库,不怕二炸的可以跳过这步
2.下载一个WINHEX,用于数据提取
3.把服务端的数据库下载到Windows上。我用的是删库塔安装的,默认在/www/server/data,把data整个目录拉到本地,可以借用winscp。其他方式安装的请自行查找
4.在db_hk4e_user_gio库中找到你的存档位置,我的存档放在t_player_data_4这个表里,打开t_player_data_xxx这些表,根据UID找到你自己账号存档的序号
5.打开刚才下载的数据库目录,你的存档在哪一个bin里面需要自己判断,这个文件一般是每重启一次服务器就会生成一个的。大体上可以看修改时间确认。
我自己本次的存档在mysql-bin.000018这个文件里。如果是库里有多给账号同时玩的,请自行甄别。步骤一样,这里不再阐述。
6(重点).使用WINHEX打开mysql-bin文件,越往后存档越新。如果自己不确定在哪里炸的,建议从头开始翻
搜索十六进制值5A4C49
右键这里选择为起始位
再搜索0A0A0801
在0A0A之前选择为结束位
随后右键编辑,复制选快,十六进制数值,粘贴到记事本里
我的存档在t_player_data_4表里,后面的数字根据你实际的情况去修改
打开t_player_data_4这个表,选中这条数据,右键复制,Insert语句
新建一个SQL窗口,粘贴,大概就是这个效果
这里需要做以下魔改,把下面蓝色的字替换为刚才复制到记事本里的十六进制值
INSERT INTO `db_hk4e_user_gio`.`t_player_data_4`(`uid`, `nickname`, `level`, `exp`, `vip_point`, `json_data`, `bin_data`, `extra_bin_data`, `data_version`, `tag_list`, `create_time`, `last_save_time`, `is_delete`, `reserved_1`, `reserved_2`, `before_login_bin_data`) VALUES (100007, 'emo', 59, 166770, 0, '{\n \"is_proficient_player\": true\n}\n', 0x5A4C494此处省略无数字, 0x0A0A08011206080118733873, 1541, '', '2022-12-11 01:17:47', '2023-01-28 00:58:21', 0, 0, 0, 0x0A24E907EA07EB07EC07ED07EE07D10FD20FD30FD40FD50FD80FD90FE20FE60FE80F8A27C53E);
替换完成后,确保没毛病后点下运行,绿色箭头图标
再刷新一下t_player_data_4这个表就会多出一条数据
这里需要把上一条数据删除掉,否则会无法进入

一切准备就绪后重新进入游戏,这里不用重启整个服务端,实时生效的
再次重新进入游戏,如果正常就会进入到之前的存档,如果失败,证明这个存档有问题,需要找更早的重新再来一遍
注意:有较少的概率可能会提示数据错误,可能原因是Redis上的缓存刷新有问题,这里只需要找到对应的t_block_data_xx表,把这个表给截断即可。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|