安装MediaWiki时遇到MyISAM被禁用

Doge24190留言 | 贡献2026年6月11日 (四) 06:01的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

使用云服务商 MySQL 安装 MediaWiki 时遇到 MyISAM 被禁用的解决记录

问题背景

在安装 MediaWiki 时,如果数据库使用的不是本机自建 MySQL,而是云服务商提供的托管数据库系统,例如:

  • Oracle Cloud MySQL HeatWave
  • 阿里云 RDS MySQL
  • 腾讯云云数据库 MySQL
  • AWS RDS / Aurora MySQL
  • Google Cloud SQL for MySQL

那么在安装过程中可能会遇到与传统自建 MySQL 不同的问题。

我这次使用的是 Oracle Cloud 创建的 MySQL 数据库系统,并让同一 VCN 内的服务器通过内网连接该数据库。前面的数据库连接、用户授权都处理完成后,MediaWiki 在创建数据表时出现了如下错误:

Error 3161: Storage engine MyISAM is disabled (Table creation is disallowed).

Function: Wikimedia\Rdbms\Database::sourceFile(
/www/wwwroot/mediawiki-1.45.3/sql/mysql/tables-generated.sql
)

Query:
CREATE TABLE `my_wikisearchindex` (
  si_page INT UNSIGNED NOT NULL,
  si_title MEDIUMTEXT NOT NULL,
  si_text MEDIUMTEXT NOT NULL,
  FULLTEXT INDEX si_title (si_title),
  FULLTEXT INDEX si_text (si_text),
  PRIMARY KEY(si_page)
) ENGINE = MyISAM DEFAULT CHARSET = utf8mb4

核心错误是:

Storage engine MyISAM is disabled

也就是说,MediaWiki 的安装 SQL 尝试创建一个使用 MyISAM 存储引擎的数据表,但云服务商的 MySQL 数据库系统禁用了 MyISAM,因此建表失败。

为什么云数据库会出现这个问题?

MySQL 早期有多个存储引擎,其中比较常见的是:

  • InnoDB
  • MyISAM

现代 MySQL 默认推荐使用 InnoDB。相比 MyISAM,InnoDB 支持事务、崩溃恢复、行级锁、外键等特性,更适合现代 Web 应用。

而 MyISAM 是较旧的存储引擎,它没有事务支持,崩溃恢复能力和并发处理能力也较弱。很多云服务商为了安全性、稳定性和统一管理,会直接禁用 MyISAM。

因此在自建 MySQL 中可能还能正常执行的建表语句:

ENGINE = MyISAM

到了云服务商的托管 MySQL 环境中,就可能直接报错。

MediaWiki 为什么会用到 MyISAM?

报错中出问题的表是:

searchindex

如果安装时设置了表前缀,例如我这里使用了:

my_wiki

那么实际表名会变成:

my_wikisearchindex

这个表主要用于 MediaWiki 的站内全文搜索。

MediaWiki 历史上将搜索索引表设置为 MyISAM,主要是因为早期 MySQL 中 FULLTEXT 全文索引主要依赖 MyISAM。后来 MySQL 的 InnoDB 也已经支持 FULLTEXT,因此在现代 MySQL 版本中,将该表改为 InnoDB 通常是可行的。

解决方法:将 MyISAM 替换为 InnoDB

MediaWiki 1.45.3 中,相关建表 SQL 文件位于:

/www/wwwroot/mediawiki-1.45.3/sql/mysql/tables-generated.sql

在修改前,建议先备份原文件:

cd /www/wwwroot/mediawiki-1.45.3

sudo cp sql/mysql/tables-generated.sql \
sql/mysql/tables-generated.sql.bak

然后将其中的 MyISAM 替换为 InnoDB:

sudo sed -i 's/ENGINE = MyISAM/ENGINE = InnoDB/g' \
sql/mysql/tables-generated.sql

sudo sed -i 's/ENGINE=MyISAM/ENGINE=InnoDB/g' \
sql/mysql/tables-generated.sql

替换后可以检查是否还存在 MyISAM:

grep -n "MyISAM" sql/mysql/tables-generated.sql

如果没有输出,说明这个文件中已经没有 MyISAM 建表语句。

也可以检查 InnoDB 替换结果:

grep -n "ENGINE = InnoDB" sql/mysql/tables-generated.sql

注意:安装失败后建议清空数据库重新安装

如果 MediaWiki 已经安装到一半失败,数据库中可能已经创建了一部分表。为了避免残留表影响后续安装,建议删除并重新创建数据库。

进入 MySQL 管理员账号后执行:

DROP DATABASE IF EXISTS mediawiki;

CREATE DATABASE mediawiki
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

如果数据库用户已经创建过,也可以重新授权:

GRANT ALL PRIVILEGES ON mediawiki.* TO 'mediawiki'@'10.0.0.47';

FLUSH PRIVILEGES;

其中:

10.0.0.47

需要替换成实际 Web 服务器的内网 IP。

如果当前只是为了先跑通安装,也可以临时使用:

GRANT ALL PRIVILEGES ON mediawiki.* TO 'mediawiki'@'%';

FLUSH PRIVILEGES;

不过长期使用时,更推荐限制为指定内网 IP,而不是使用通配符 %

安装完成后检查表引擎

安装完成后,建议检查数据库中是否还有 MyISAM 表。

进入 MySQL 后执行:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mediawiki'
ORDER BY ENGINE, TABLE_NAME;

如果想只检查 MyISAM 表,可以执行:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mediawiki'
  AND ENGINE = 'MyISAM';

如果返回空结果,说明当前数据库中没有 MyISAM 表。

也可以单独检查搜索索引表:

SHOW CREATE TABLE my_wikisearchindex\G

如果没有设置表前缀,则表名可能是:

SHOW CREATE TABLE searchindex\G

重点确认其中包含:

ENGINE=InnoDB

以及 FULLTEXT 索引是否正常存在。

这样修改会不会有后患?

从实际使用角度看,将 MediaWiki 的搜索索引表从 MyISAM 改为 InnoDB,一般不会影响正常运行。

因为 MyISAM / InnoDB 是建表时指定的存储引擎。一旦表已经创建为 InnoDB,MediaWiki 后续运行时主要执行的是:

  • INSERT
  • UPDATE
  • SELECT
  • DELETE
  • ALTER TABLE
  • CREATE INDEX

它不会在普通访问、编辑页面、上传文件、搜索页面时自动把表切回 MyISAM。

对于现代 MySQL 来说,InnoDB 反而是更推荐的选择。它具有更好的事务支持、崩溃恢复能力和并发处理能力,也更符合云数据库系统的默认管理策略。

后续维护和升级时的注意事项

这个问题真正需要注意的是后续升级。

由于这次修改的是 MediaWiki 源码目录中的 SQL 文件:

sql/mysql/tables-generated.sql

所以以后升级 MediaWiki 时,如果换成了新的源码目录,或者覆盖了原来的 SQL 文件,官方包中的 ENGINE = MyISAM 可能会再次出现。

因此后续升级前后建议检查:

grep -Rni "MyISAM" /www/wwwroot/mediawiki-1.45.3/sql

如果已经升级到新目录,例如:

/www/wwwroot/mediawiki-1.46.x/

则需要改成对应的新路径:

grep -Rni "MyISAM" /www/wwwroot/mediawiki-1.46.x/sql

如果发现新的安装或升级 SQL 中仍然存在:

ENGINE = MyISAM

就需要再次评估是否替换为:

ENGINE = InnoDB

另外,升级 MediaWiki 后通常还需要运行维护脚本:

cd /www/wwwroot/mediawiki-1.45.3
php maintenance/run.php update

升级后也建议再次检查表引擎:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mediawiki'
  AND ENGINE = 'MyISAM';

总结

这次问题的根本原因不是 MediaWiki 数据库连接失败,也不是用户权限错误,而是:

云服务商托管 MySQL 禁用了 MyISAM 存储引擎,而 MediaWiki 安装 SQL 中仍然存在 MyISAM 建表语句。

解决思路是:

  1. 备份 MediaWiki 的 MySQL 建表 SQL 文件;
  2. ENGINE = MyISAM 替换为 ENGINE = InnoDB
  3. 清空安装失败后残留的数据库;
  4. 重新运行 MediaWiki 安装程序;
  5. 安装完成后检查所有表是否都是 InnoDB;
  6. 后续升级 MediaWiki 时重新检查 SQL 文件,避免 MyISAM 建表语句再次出现。

对于使用 Oracle Cloud MySQL、阿里云 RDS、腾讯云数据库、AWS RDS 等云服务商数据库系统的用户来说,这类问题并不罕见。云数据库通常更偏向稳定、安全和统一管理,因此会禁用一些旧式或不推荐的特性。安装传统 PHP 程序时,如果遇到类似报错,应优先检查程序的建表 SQL 是否使用了云数据库不支持的存储引擎。