11 2015年08月

discuz x3系列帖子分表出现问题进行手动分表

发布于:10时06分 | 来源:湛蓝天空  |   编辑:湛蓝  |   日志分类:DISCUZ  |   已聚集:人围观

今天发现论坛使用的discuz帖子页面出现打开访问很慢的情况,mysql的CPU占用率已经近100%,查看mysql慢日志,最后发现帖子表已经近5G了。很可能是帖子表太大了导致mysql查询变慢负载过高,下面我们来试试分表吧~

mysql的CPU占用率接近200%

在后台 - 站长 - 帖子分表中尝试分表,但在分表过程中跳转到空白,分表失败。再进行分表依旧显示空白,看来是某些记录出现异常了。

帖子分表提示

discuz帖子分表失败(图)

在与discuz官方技术人员沟通后,建议手动分表。官方只提供了手动分表思路,下面我总结了一下手动分表的具体流程给大家参考:

(建议使用Navicat for MySQL等PC客户端或命令行手动分表,以免分表过程中浏览器运行页面出现中断就杯具了~)

1. 后台 - 全局 - 站点信息 - 关闭站点,并进行数据备份。

2. 创建帖子分表,如
 

CREATE TABLE IF NOT EXISTS `pre_forum_post_13` (
  `pid` int(10) unsigned NOT NULL,
  `fid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `tid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `first` tinyint(1) NOT NULL DEFAULT '0',
  `author` varchar(15) NOT NULL DEFAULT '',
  `authorid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `subject` varchar(80) NOT NULL DEFAULT '',
  `dateline` int(10) unsigned NOT NULL DEFAULT '0',
  `message` mediumtext NOT NULL,
  `useip` varchar(15) NOT NULL DEFAULT '',
  `useport` char(6) NOT NULL DEFAULT '0',
  `invisible` tinyint(1) NOT NULL DEFAULT '0',
  `anonymous` tinyint(1) NOT NULL DEFAULT '0',
  `usesig` tinyint(1) NOT NULL DEFAULT '0',
  `htmlon` tinyint(1) NOT NULL DEFAULT '0',
  `bbcodeoff` tinyint(1) NOT NULL DEFAULT '0',
  `smileyoff` tinyint(1) NOT NULL DEFAULT '0',
  `parseurloff` tinyint(1) NOT NULL DEFAULT '0',
  `attachment` tinyint(1) NOT NULL DEFAULT '0',
  `rate` smallint(6) NOT NULL DEFAULT '0',
  `ratetimes` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `status` int(10) NOT NULL DEFAULT '0',
  `tags` varchar(255) NOT NULL DEFAULT '0',
  `comment` tinyint(1) NOT NULL DEFAULT '0',
  `replycredit` int(10) NOT NULL DEFAULT '0',
  `position` int(8) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`tid`,`position`),
  UNIQUE KEY `pid` (`pid`),
  KEY `fid` (`fid`),
  KEY `dateline` (`dateline`),
  KEY `invisible` (`invisible`),
  KEY `displayorder` (`tid`,`invisible`,`dateline`),
  KEY `first` (`tid`,`first`),
  KEY `authorid` (`authorid`,`invisible`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4522633 ;

3. 确定大致每次分表操作的数据量,以免数据过大。如displayorder>0且lastpost在1420041600和1422720000时间区间的帖子

SELECT tid FROM pre_forum_thread WHERE displayorder>0 AND lastpost > 1420041600 AND lastpost <1422720000

下面开始手动分表以上数据:

INSERT INTO pre_forum_post_13 SELECT * FROM pre_forum_post WHERE tid IN(select tid from pre_forum_thread WHERE displayorder>=0 AND lastpost > 1420041600 AND lastpost <1422720000);

UPDATE pre_forum_thread set posttableid=13 WHERE displayorder>=0 AND lastpost > 1420041600 AND lastpost <1422720000;

DELETE FROM pre_forum_post WHERE tid in (select distinct tid from pre_forum_post_13);

这样就把`pre_forum_post`表中 displayorder>=0 AND lastpost > 1420041600 and lastpost <1422720000 的数据手动分表到`pre_forum_post_13`了

4. 优化`pre_forum_post`表。

OPTIMIZE TABLE  `pre_forum_post`

以此思路可以手动分表多个,分表完毕。

【如主题表的posttableid出现问题可执行:update pre_forum_thread set posttableid=13 where tid in (select distinct tid from pre_forum_post_13 where first=1 );】

更多有关discuz的问题请参阅:http://skyhome.cn/discuz/

除非注明,均为湛蓝天空原创,转载请注明本文网址:http://skyhome.cn/discuz/502.html

标签:discuz(10)手动分表(1)
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)