这几天遇到最为麻烦的一件事,论坛的数据意外的损坏了,备份的数据压缩包也出现意外,在解压缩的时候提示“CRC 失败。文件被破坏”错误,打开已经解压的部分,论坛的数据表不完整了,很多表缺失或不可用。面对这样的情况,只能做最大化的恢复工作。

很多类似这样的错误数据表
对于论坛来说,最重要的便是用户资料,其实就是论坛发贴,因为数据已经残缺,其中包括cdb_thread、cdb_forums这个表不存在,因此要想在这个基础上恢复原来的论坛数据已经不太可能了,那么只能采用其他的办法来使用这些仅存的数据。
最终使用的是全新安装一个新的论坛,然后对可以使用的数据,目前只有用户资料可以使用。论坛的安装不必多说,下面主要说一下数据的后期处理。
一、确认新的论坛已经安装完成,将损坏的数据库数据放入数据库文件夹。
二、设置数据库连接。
如果新安装的论坛是Discuz7.2以及此前的数个版本,操作就比较简单了。在config.inc.php文件里增加一个数据表,具体设置如下图:

在这里增加了oldname这个参数
然后再设置common.inc.php中创建数据库连接的代码。如下图

在这里增加了dbo数据库连接代码
三、编写代码
代码主要是用来导入用户资料的,但因为在此之前,已经安装了新版本的论坛,已经有用户注册了,完全覆盖或增量导入都不是可行的,会因为新旧数据存在相同的记录而让用户无法正常登录。因此导入程序是按以下步骤进行的。
首先将新论坛的用户读出并写入数组,我这里将数组保存在本地资料,这样可以减少数据库的读取,从而增快导入时间。但后来又做了其他的改进措施,因此,这一步显得有些浪费,因此,实际再操作的时候可以省去写入本地文件的操作。
其次,查询老用户表,并建立数组,之所以没有在查询的时候直接执行导入操作,主要是为了明析代码结构。

截图的时候代码不完整,但基本的内容已经在里面了,主要是查询cdb_member表
最后,通过对照将数据导入
对olduser这个数组进行循环处理即可。
这一步操作的关键点在于,要弄清用户相关的表有哪些,我导入的目标数据表是DiscuzX版本的,总共包括了以下的数据表:pre_ucenter_members、pre_ucenter_memberfields、pre_common_member、pre_common_member_count、pre_common_member_field_forum、pre_common_member_field_home、pre_common_member_log、pre_common_member_profile、pre_common_member_status
当然,数据导入也不可能一次性导入完,可能会因为程序执行时间太长造成页面无响应。因此,最好使用分页处理,每次导入一定数量的数据。
DiscuzX的用户密码与以往的版本有了一些区别,因此,在导入的时候需要做一些特别的处理。