安装MediaWiki时遇到MyISAM被禁用
使用云服务商 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 建表语句。
解决思路是:
- 备份 MediaWiki 的 MySQL 建表 SQL 文件;
- 将
ENGINE = MyISAM替换为ENGINE = InnoDB; - 清空安装失败后残留的数据库;
- 重新运行 MediaWiki 安装程序;
- 安装完成后检查所有表是否都是 InnoDB;
- 后续升级 MediaWiki 时重新检查 SQL 文件,避免 MyISAM 建表语句再次出现。
对于使用 Oracle Cloud MySQL、阿里云 RDS、腾讯云数据库、AWS RDS 等云服务商数据库系统的用户来说,这类问题并不罕见。云数据库通常更偏向稳定、安全和统一管理,因此会禁用一些旧式或不推荐的特性。安装传统 PHP 程序时,如果遇到类似报错,应优先检查程序的建表 SQL 是否使用了云数据库不支持的存储引擎。