26 01 2014

前言:    

    某论坛因性能不佳,升级到了X3.2版本.但是升级后却发现楼层乱了.仔细研究了一下发现,cdb_forum_post表新增了position字段,并且是自增属性.抽查帖子时,这个position字段不是按照1 2 3 4自增的,而是1 3 5 7 9这样的序列.
     导致这个问题的原因是mysql服务器是M-M架构,并且使用了如下两个选项来保证两个M不冲突:
auto-increment-increment = 2
auto-increment-offset = 1
于是我们的position自增时也根据这个属性来自增了.
下面就是针对此问题的处理过程.

处理步骤:

1.先在服务器上取消这两个参数

2.查找下数据库中有没有position是偶数的:
Select distinct tid FROM cdb_forum_post Where MOD(POSITION,2)=0;

3.把这些帖子的所有内容都移到临时表,后续对这部分帖子进行手工处理.

4.先处理position都是1 3 5 7这样增长的帖子:
为加快执行速度,可以对position增加索引,处理完后再删除索引.
for ((i=3;i 备注:这个i
5.手工处理刚才那个临时表中的position,然后再把这部分帖子灌回cdb_forum_posts.参考SQL如下:
update tmp_table set position=(position-1)/2+3 where tid=331335 and position>=7;
update tmp_table set position=(position-1)/2+28 where tid=362515 and position>=55;

6.使用下面的SQL处理最大楼层数和回复数:
update cdb_forum_thread a set maxposition=(select max(position) from cdb_forum_post b where a.tid=b.tid);
Update cdb_forum_thread SET replies=(CAST(maxposition AS SIGNED)-1) Where CAST(replies AS SIGNED)!=  (CAST(maxposition AS SIGNED)-1) and maxposition>0;

现在看看楼层是不是正常了.


延伸阅读