找回密码
 新建账号

Discuz! X 3.4 InnoDB 支持 让不支持 MyISAM 的云数据库也能做论坛

[复制链接]
 楼主| php 发表于 2022/7/1 17:28 | 显示全部楼层 |阅读模式
让 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 访问时也会出现以下错误。
  1. Discuz! Database Error
  2. (1146) Table '<database>.forum_post' doesn't exist
  3. 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,找到创建数据表的语句如下
  1. CREATE TABLE `wuxiancheng_common_member_grouppm` (
  2.   `uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  3.   `gpmid` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  4.   `status` tinyint(1) NOT NULL DEFAULT '0',
  5.   `dateline` int(10) unsigned NOT NULL DEFAULT '0',
  6.   PRIMARY KEY (`uid`,`gpmid`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
复制代码
将 PRIMARY KEY (`uid`,`gpmid`) 中的两个字段对调,也就是说将 PRIMARY KEY (`uid`,`gpmid`) 改成 PRIMARY KEY (`gpmid`, `uid`) 然后保存文件
搜索 forum_post,找到创建数据表的语句如下
  1. CREATE TABLE `wuxiancheng_forum_post` (
  2.   `pid` int(10) unsigned NOT NULL,
  3.   `fid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  4.   `tid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  5.   `first` tinyint(1) NOT NULL DEFAULT '0',
  6.   `author` varchar(15) NOT NULL DEFAULT '',
  7.   `authorid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  8.   `subject` varchar(80) NOT NULL DEFAULT '',
  9.   `dateline` int(10) unsigned NOT NULL DEFAULT '0',
  10.   `message` mediumtext NOT NULL,
  11.   `useip` varchar(15) NOT NULL DEFAULT '',
  12.   `port` smallint(6) unsigned NOT NULL DEFAULT '0',
  13.   `invisible` tinyint(1) NOT NULL DEFAULT '0',
  14.   `anonymous` tinyint(1) NOT NULL DEFAULT '0',
  15.   `usesig` tinyint(1) NOT NULL DEFAULT '0',
  16.   `htmlon` tinyint(1) NOT NULL DEFAULT '0',
  17.   `bbcodeoff` tinyint(1) NOT NULL DEFAULT '0',
  18.   `smileyoff` tinyint(1) NOT NULL DEFAULT '0',
  19.   `parseurloff` tinyint(1) NOT NULL DEFAULT '0',
  20.   `attachment` tinyint(1) NOT NULL DEFAULT '0',
  21.   `rate` smallint(6) NOT NULL DEFAULT '0',
  22.   `ratetimes` tinyint(3) unsigned NOT NULL DEFAULT '0',
  23.   `status` int(10) NOT NULL DEFAULT '0',
  24.   `tags` varchar(255) NOT NULL DEFAULT '0',
  25.   `comment` tinyint(1) NOT NULL DEFAULT '0',
  26.   `replycredit` int(10) NOT NULL DEFAULT '0',
  27.   `position` int(8) unsigned NOT NULL AUTO_INCREMENT,
  28.   PRIMARY KEY (`tid`,`position`),
  29.   UNIQUE KEY `pid` (`pid`),
  30.   KEY `fid` (`fid`),
  31.   KEY `dateline` (`dateline`),
  32.   KEY `invisible` (`invisible`),
  33.   KEY `displayorder` (`tid`,`invisible`,`dateline`),
  34.   KEY `first` (`tid`,`first`),
  35.   KEY `authorid` (`authorid`,`invisible`)
  36. ) ENGINE=MyISAM AUTO_INCREMENT=<N> DEFAULT CHARSET=utf8;
复制代码
将 PRIMARY KEY (`tid`,`position`) 中的两个字段对调,即将 PRIMARY KEY (`tid`,`position`) 改成 PRIMARY KEY (`position`, `tid`) 然后保存文件
搜索 forum_postposition,找到创建数据表的语句如下
  1. CREATE TABLE `wuxiancheng_forum_postposition` (
  2.   `tid` mediumint(8) unsigned NOT NULL,
  3.   `position` int(10) unsigned NOT NULL AUTO_INCREMENT,
  4.   `pid` int(10) unsigned NOT NULL,
  5.   PRIMARY KEY (`tid`,`position`),
  6.   KEY `pid` (`pid`)
  7. ) 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/

手机版|轻松E站

GMT+8, 2024/4/25 00:10

快速回复 返回顶部 返回列表