让 Discuz! X 3.4 支持 InnoDB: Discuz! X 3.4 InnoDB 支持需要修改三个数据表。
Discuz! X 3.4 数据表使用的是 MySQL 的 MyISAM 存储引擎,只有少数几张数据表使用了 Memory 存储引擎,而现在的云数据库都开始不支持 MyISAM 存储引擎了,甚至只支持 InnoDB 一种存储引擎,比如阿里云的云数据库 RDS MySQL 版就只支持 InnoDB 这一种存储引擎,所以,默认情况下阿里云 MySQL 云数据库不能运行 Discuz! X 3.4.
如果将数据库迁移到云数据库,不支持 MyISAM 和 Memory 引擎的云数据库会自动将数据表转成 InnoDB,而无论是主动把 Discuz! X 3.4 数据表转成 InnoDB 引擎的数据表,还是被云数据库自动转成 InnoDB 引擎数据表,wuxiancheng_common_member_grouppm wuxiancheng_forum_post wuxiancheng_forum_postposition 这三个原 MyISAM 数据表会报错,错误信息是 ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key,导致后续操作这三个数据表时出现 ERROR 1146 (42S02): Table '<name>' doesn't exist 的错误,Discuz! X 3.4 访问时也会出现以下错误。
- Discuz! Database Error
- (1146) Table '<database>.forum_post' doesn't exist
- SELECT * FROM forum_post WHERE tid=<tid> AND position>=1 AND position<<N> ORDER BY position
复制代码 其中 wuxiancheng_ 是数据表前缀,不同网站配置的前缀不同,默认的前缀为 pre_,默认前缀的情况下,这三个数据表分别是 pre_common_member_grouppm pre_forum_post pre_forum_postposition,请以实际配置为准;<name> 是数据表名,<database> 是数据库名,<tid> 是帖子编号,<N> 是一个数字,取决于相关论坛设置。
要想让 Discuz! X 3.4 支持 InnoDB,需要修改上面说到的这三个数据表。具体方法如下。
一、从支持 MyISAM 存储引擎的数据库导出 Discuz! X 3.4 数据库到一个 SQL 文件中。
二、用文本编辑软件打开 SQL 文件,搜索 common_member_grouppm,找到创建数据表的语句如下
- CREATE TABLE `wuxiancheng_common_member_grouppm` (
- `uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
- `gpmid` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
- `status` tinyint(1) NOT NULL DEFAULT '0',
- `dateline` int(10) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`uid`,`gpmid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
复制代码 将 PRIMARY KEY (`uid`,`gpmid`) 中的两个字段对调,也就是说将 PRIMARY KEY (`uid`,`gpmid`) 改成 PRIMARY KEY (`gpmid`, `uid`) 然后保存文件
搜索 forum_post,找到创建数据表的语句如下- CREATE TABLE `wuxiancheng_forum_post` (
- `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 '',
- `port` smallint(6) unsigned 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 AUTO_INCREMENT=<N> DEFAULT CHARSET=utf8;
复制代码 将 PRIMARY KEY (`tid`,`position`) 中的两个字段对调,即将 PRIMARY KEY (`tid`,`position`) 改成 PRIMARY KEY (`position`, `tid`) 然后保存文件
搜索 forum_postposition,找到创建数据表的语句如下
- CREATE TABLE `wuxiancheng_forum_postposition` (
- `tid` mediumint(8) unsigned NOT NULL,
- `position` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `pid` int(10) unsigned NOT NULL,
- PRIMARY KEY (`tid`,`position`),
- KEY `pid` (`pid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
复制代码 将 PRIMARY KEY (`tid`,`position`) 中的两个字段对调,即将 PRIMARY KEY (`tid`,`position`) 改成 PRIMARY KEY (`position`, `tid`) 然后保存文件
三、将修改后的 SQL 数据库文件导入到数据库,如果你是要自己转数据表为 InnoDB,则分别运行 ALTER TABLE `<表名>` ENGINE InnoDB; 将每一个数据表转成 InnoDB 存储引擎的数据表,当然,我们也可以批量转存储引擎,这不是本文讨论的重点,就不在此赘述了;如果你使用不支持 MyISAM 甚至只支持 InnoDB 的云数据库,在你导入 SQL 文件时云数据库会自动把存储引擎改成 InnoDB.
经过以上步骤,现在 Discuz! X 3.4 就可以完美支持 InnoDB 了,低于 3.4 版本的 Discuz! 版本理论上讲也一样能改。吴先成提醒大家:Discuz! 官方会在 Discuz! X 3.5 中解决这个问题,不过 Discuz! X 3.5 跳票了,正式版不知道什么时候能发布,不着急的话可以耐心等待官方发布。
Discuz! X 3.5 官方链接
https://gitee.com/Discuz/DiscuzX/tree/v3.5/ |
|