李魁的博客

有时候心情美丽的像一杯咖啡,
一张很大的圆桌上铺着洁白的桌布,
没有花瓶和花,因为有你...

Discuz论坛数据灾难性恢复总结

栏目:技术 发布日期:2010-09-04 阅读量:0
TAG:Discuz数据灾难性恢复总结

  这几天遇到最为麻烦的一件事,论坛的数据意外的损坏了,备份的数据压缩包也出现意外,在解压缩的时候提示“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的用户密码与以往的版本有了一些区别,因此,在导入的时候需要做一些特别的处理

发表评论