您的位置
主页 > 网站技术 > 系列教程 > » 正文

Discuz!由6.0,6.1,7.0,7.2升级到X3

来源: 站长圈 点击:

升级历史回顾
2012年2月6日,我从6.0升级到6.1
2013年6月1日至9日利用业余时间,搭建测试环境反复调试,从6.1成功升级到X3,并解决诸多问题和配置调整。
相信从7.2及以下版本升级到X以上版本,很多人都会遇到和我相同的问题,有的在官方升级步骤中已经写明解决方法,但是有的没有,本人不是程序员,只是熟悉linux和mysql的运维工作,经过多次调试,借助论坛中前人的经验,在这里提供下官方没有的问题的解决方法。

我的论坛安装了社区银行和新天下游戏
从6.0升级到6.1,很顺利,插件工作正常,唯一的问题是
修正待处理事项 : 等待审核的会员数(x)
执行前可以备份cdb_validating表
DELETE FROM `cdb_validating` WHERE status='0';

从6.1升级到X3,我的步骤是:
升级Ucenter1.0.0-->Ucenter1.5.0
升级Discuz!6.1-->Discuz!7.0   此时插件工作正常,但样式有点不好看了,居中,如果升级到此为止,修改下样式应该就好了。所有问题暂时保留没去管。
升级Discuz!7.0-->Discuz!7.2   插件情况同上
升级Ucenter1.5.0-->Ucenter1.5.2
升级Ucenter1.5.2-->Ucenter1.6.0
安装Discuz!X2.0
升级Discuz!7.2程序-->Discuz!X2.0程序
转换Discuz!7.2数据库-->Discuz!X2.0数据库
升级Discuz!X2.0-->Discuz!X3.0

以上每个步骤的具体升级方法都尽可能参照官网提供的具体升级方法,同时下载相应的升级包。当然中间也有部分可以直升,6.1-->X2我没有去试了。
建议大家自已搭建个环境调试,如果你是虚拟主机,那更应该自已搭建个环境调试了,否则你通过FTP在线上修改起来很麻烦,也不方便分析修改MYSQL数据和它的普通日志。
其中注意的是,最后一步升级,比如我的最后一步是Discuz!X2.0-->Discuz!X3.0,上传程序可以覆盖原程序,也可以是先移走原程序再上传。
官方提供的升级步骤说得前后矛盾,先是说移走,后来又说升级成功后删除老备份,意思就是说之前的备份不是移走而是拷贝,经过调试,我发现其实两种方法都可以
但是,覆盖原程序,可以解决部分图片链接的问题,比如在新版中不存在images目录了,老目录若在,就不需要再去移动原来的图片到新版目录中,不过这种图片很少,我目前都只发现back.gif一个,即引用回复中的图片。
而先移走原程序再上传,可以避免很多被老程序干扰的问题,至于图片链接的问题,找到相应的地址复制一下就好了,然后通过SQL进行批量替换帖中链接是可以解决的,比如我在新版中建了data/attachment/custom目录,专门来放后台没提供上传功能,而通过FTP上传的自定义图片,及老程序中非集中的图片,方便今后备份或升级。
通过观察发现,官网BBS其实也是先移走老程序,上传新程序,再拷贝附件的,因为我发现官网BBS引用内容的back.gif不见了。
但是这种方法使用时,你得使用所有访客访问任何URL都跳转到维护页面,可以通过修改解析或修改web服务器所有URL跳转来,然后仅配置自已可以访问到升级中的网站。

好,现在按以上步骤升级完成,一般情况下都会遇到如下问题,其中插件新天下游戏我就放弃了,如果以后有恢复的方法,我愿意再装上,毕竟有怀念的数据记录嘛


一、论坛链接修改
如果没有静态化,这个BBS的链接肯定是要修改的,否则很多链接都还是老PHP程序,同时注意,尽量不要把http://域名/写到链接中,以绑定多个域名或以后更换域名时麻烦,有以下语句执行:
  1. 批量修改帖子内容:
  2. update 表名 set 字段名=replace(字段名,'原来的内容','替换后的内容')
  3. 修改回复引用链接(修改后仍和新的格式有区别,但也不影响使用):
  4. UPDATE pre_forum_post set message=REPLACE(message,'[url=http://www.hfutphy.cn/bbs/redirect.php?goto=findpost&pid=','[url=forum.php?mod=redirect&goto=findpost&pid=');
  5. UPDATE pre_forum_post set message=REPLACE(message,'[img]http://www.hfutphy.cn/bbs/images/common/back.gif[/img]','[img]data/attachment/custom/back.gif[/img]');
  6. 把原images/common/back.gif拷贝为data/attachment/custom/back.gif
  7. 截止2013年06月12日,官网BBS都仍有这个转换的引用内容找不到原链接和back.gif的问题,不过今天发现好了。
  8. 批量修改广告链接:
  9. UPDATE pre_common_advertisement set code=REPLACE(code,'viewthread.php?','forum.php?mod=viewthread&');
  10. 批量修改其它链接:
  11. UPDATE pre_forum_post set message=REPLACE(message,'viewthread.php?','forum.php?mod=viewthread&');
  12. UPDATE pre_forum_ratelog set reason=REPLACE(reason,'viewthread.php?','forum.php?mod=viewthread&');
  13.  
二、修复主题数
升级后发现每个会员的主题数统计全部为0,所以老会员发个帖都会显示是新手帖了,明显是有问题
通过MYSQL普通日志,发现每发表一条主题时,有如下SQL出现:
  1. UPDATE pre_common_member_count SET `extcredits2`=`extcredits2`+'2',`threads`=`threads`+'1',`posts`=`posts`+'1' WHERE uid IN ('1')
所以在老DB中查询准确数据:
  1. SELECT authorid,COUNT(tid) FROM `pre_forum_post` WHERE first=1 GROUP BY authorid;
然后在新DB中,执行下面的SQL,我的会员不多,其中发表过主题的总共才46个,所以通过UltraEdit批量编辑出下列SQL,
如果你的会员太多了,可以写个联表查询插入,就不用我这么麻烦了:
  1. UPDATE `pre_common_member_count` SET `threads`='220' WHERE `uid`='1';
  2. UPDATE `pre_common_member_count` SET `threads`='20' WHERE `uid`='2';
  3. UPDATE `pre_common_member_count` SET `threads`='2' WHERE `uid`='3';
  4. UPDATE `pre_common_member_count` SET `threads`='37' WHERE `uid`='4';
  5. UPDATE `pre_common_member_count` SET `threads`='53' WHERE `uid`='5';
  6. UPDATE `pre_common_member_count` SET `threads`='53' WHERE `uid`='6';
  7. ……
  8. 共46条,这里略了
三、社区银行恢复
升级后社区银行是不能用了,我大概找了下,也没有找到它的升级程序,去改的话,相对PHP程序员容易一些,所以我只好重新安装了适用于X3的社区银行
然后在SQL日志中查看开户,存活期,存定期的执行的关键SQL,找到如下:
  1. 开户:
  2. SELECT opstatus,opnum,extchar,begintime,endtime FROM pre_plugin_bankoperation WHERE bankid='1' AND uid='785' AND optype='0';
  3. INSERT INTO pre_plugin_bankoperation(uid,username,bankid,optype,opstatus,opnum,extchar,begintime,endtime) VALUES('785','测试账号2','1','0','0','0','5720e55b9e18b3d034c21cbe8c9c67ab','1370673186','1370673186')
  4. UPDATE pre_plugin_banklist SET bankroll=bankroll+0,usernum=usernum+1 WHERE id='1'
  5.  
  6. 存活期:
  7. UPDATE pre_plugin_bankoperation SET opnum=opnum+0+100,begintime='1370676138' WHERE bankid='1' AND uid='785' AND optype='0'
  8. UPDATE pre_plugin_banklist SET bankroll=bankroll-0,deposit=deposit+0+100 WHERE id='1'
  9.  
  10. 存定期:
  11. INSERT INTO pre_plugin_bankoperation(uid,username,bankid,optype,opstatus,opnum,extchar,begintime,endtime) VALUES('785','测试账号2','1','1','0','50','0.0005','1370682690','1378372290')
顺便发现了活期和定期的主要区别是optype和endtime,我为了省事,不考虑恢复定期,合并每个账户的全部金额存入活期
所以最终修改:
  1. INSERT INTO pre_plugin_bankoperation(uid,username,bankid,optype,opstatus,opnum,extchar,begintime,endtime) VALUES
  2. ('8','name1','1','0','0','0','45cb81b9159d29af906fc6d42ba38807','1370673186','1370673186'),
  3. ('10','name2','1','0','0','0','f6361c4a1ba0ed8cac472531e36f1607','1370673186','1370673186'),
  4. ('9','name3','1','0','0','5603','3ebf1da8f1c3791af6bb244796fc3901','1370673186','1370673186'),
  5. ('6','name4','1','0','0','0','0da2fffcfd5d3d5363735bd6e116c70b','1370673186','1370673186'),
  6. ('26','name5','1','0','0','460','3b711a20084f935a0bd2e7795a35fc69','1370673186','1370673186'),
  7. ('23','name6','1','0','0','164','28584bcfe9d2c1c5cee0ec15f4f5d91e','1370673186','1370673186'),
  8. ……
  9. 一共13条,略了
然后是:
  1. UPDATE pre_plugin_banklist SET bankroll=bankroll+0,usernum=usernum+14 WHERE id='1';
  2. UPDATE pre_plugin_banklist SET bankroll=bankroll-0,deposit=deposit+0+12633 WHERE id='1';
如果启用了discuz中的积分关联,要在discuz数据库中做相应修改,我会员不多,所以手工改的,以后会员在银行前台操作,就是自动的了。




四、批量修改某版块的主题阅读权限
这个其实并不是问题,只是我的论坛需要,我希望有一些版块,对游客开放浏览主题列表权限,但无查看内容权限,在论坛权限设置中,没有相关的配置,只有一项浏览权限,是把浏览主题列表和浏览内容绑在一起的权限配置。
所以我想通过阅读权限来实现我的目的。
在我的论坛中,游客及以下级别的阅读权限是小于2的,大于等于2的都是经过人工审核的会员,所以我的操作是:

对新发表的主题,通过修改发帖的默认阅读权限来控制,修改帖子是读取原阅读权限,不用担心,
适用于X版以后:
  1. 修改template\default\forum\post_editor_attribute.htm文件
  2. 查找
  3.     <option value="$val[readaccess]" title="{lang readperm}: $val[readaccess]" {if $thread['readperm'] == $val[readaccess]} selected="selected"{/if}>$val[grouptitle]</option>
  4. 修改为
  5.     <option  value="$val[readaccess]" title="{lang readperm}: $val[readaccess]"{if $_G[fid] == 4 || $_G[fid] == 5 || $_G[fid] == 6 || $_G[fid] == 13 && $val[readaccess] == 2} selected="selected"{/if}{if $thread['readperm'] == $val[readaccess]} selected="selected"{/if}>$val[grouptitle]</option>
  6. 4,5,6,13为fid,即版块的id,2为权限值。
  7. 也就是插入了:
  8. {if $_G[fid] == 4 || $_G[fid] == 5 || $_G[fid] == 6 || $_G[fid] == 13 && $val[readaccess] == 2} selected="selected"{/if}
X版以前,别人的解决方法是修改post.php 找到
$readperm=isset($readperm) ? intval($readperm) : 0;
在上面加上条件控制语句:
if($fid=='需要设置的板块fid')
$readperm=isset($readperm) ? intval($readperm) : 需要设置的阅读权限;
else
利用条件控制语句可以简单方便的给多个板块设置不同的阅读权限。



对现有帖子的批量设置:
适用于X版以后:
  1. select * from pre_forum_thread where fid=4 and readperm=0;
  2. update pre_forum_thread set readperm=2 where fid=4 and readperm=0;
  3. update pre_forum_thread set readperm=2 where fid=5 and readperm=0;
  4. update pre_forum_thread set readperm=2 where fid=6 and readperm=0;
  5. update pre_forum_thread set readperm=2 where fid=13 and readperm=0;
即把我要设的板块的主题中,当前阅读权限为0的,全部修改为2

另附X版以前的SQL:
  1. select * from cdb_threads where fid=4 and readperm=0;
  2. update cdb_threads set readperm=2 where fid=4 and readperm=0;




首页  - 关于站长圈  - 广告服务  - 联系我们  - 关于站长圈  - 网站地图  - 版权声明