查看“︁安装MediaWiki时遇到MyISAM被禁用”︁的源代码
←
安装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 在创建数据表时出现了如下错误: <code>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</code> 核心错误是: <code>Storage engine MyISAM is disabled</code> 也就是说,MediaWiki 的安装 SQL 尝试创建一个使用 MyISAM 存储引擎的数据表,但云服务商的 MySQL 数据库系统禁用了 MyISAM,因此建表失败。 == 为什么云数据库会出现这个问题? == MySQL 早期有多个存储引擎,其中比较常见的是: * InnoDB * MyISAM 现代 MySQL 默认推荐使用 InnoDB。相比 MyISAM,InnoDB 支持事务、崩溃恢复、行级锁、外键等特性,更适合现代 Web 应用。 而 MyISAM 是较旧的存储引擎,它没有事务支持,崩溃恢复能力和并发处理能力也较弱。很多云服务商为了安全性、稳定性和统一管理,会直接禁用 MyISAM。 因此在自建 MySQL 中可能还能正常执行的建表语句: <code>ENGINE = MyISAM</code> 到了云服务商的托管 MySQL 环境中,就可能直接报错。 == MediaWiki 为什么会用到 MyISAM? == 报错中出问题的表是: <code>searchindex</code> 如果安装时设置了表前缀,例如我这里使用了: <code>my_wiki</code> 那么实际表名会变成: <code>my_wikisearchindex</code> 这个表主要用于 MediaWiki 的站内全文搜索。 MediaWiki 历史上将搜索索引表设置为 MyISAM,主要是因为早期 MySQL 中 FULLTEXT 全文索引主要依赖 MyISAM。后来 MySQL 的 InnoDB 也已经支持 FULLTEXT,因此在现代 MySQL 版本中,将该表改为 InnoDB 通常是可行的。 == 解决方法:将 MyISAM 替换为 InnoDB == MediaWiki 1.45.3 中,相关建表 SQL 文件位于: <code>/www/wwwroot/mediawiki-1.45.3/sql/mysql/tables-generated.sql</code> 在修改前,建议先备份原文件: <code>cd /www/wwwroot/mediawiki-1.45.3 sudo cp sql/mysql/tables-generated.sql \ sql/mysql/tables-generated.sql.bak</code> 然后将其中的 MyISAM 替换为 InnoDB: <code>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</code> 替换后可以检查是否还存在 MyISAM: <code>grep -n "MyISAM" sql/mysql/tables-generated.sql</code> 如果没有输出,说明这个文件中已经没有 MyISAM 建表语句。 也可以检查 InnoDB 替换结果: <code>grep -n "ENGINE = InnoDB" sql/mysql/tables-generated.sql</code> == 注意:安装失败后建议清空数据库重新安装 == 如果 MediaWiki 已经安装到一半失败,数据库中可能已经创建了一部分表。为了避免残留表影响后续安装,建议删除并重新创建数据库。 进入 MySQL 管理员账号后执行: <code>DROP DATABASE IF EXISTS mediawiki; CREATE DATABASE mediawiki CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;</code> 如果数据库用户已经创建过,也可以重新授权: <code>GRANT ALL PRIVILEGES ON mediawiki.* TO 'mediawiki'@'10.0.0.47'; FLUSH PRIVILEGES;</code> 其中: <code>10.0.0.47</code> 需要替换成实际 Web 服务器的内网 IP。 如果当前只是为了先跑通安装,也可以临时使用: <code>GRANT ALL PRIVILEGES ON mediawiki.* TO 'mediawiki'@'%'; FLUSH PRIVILEGES;</code> 不过长期使用时,更推荐限制为指定内网 IP,而不是使用通配符 <code>%</code>。 == 安装完成后检查表引擎 == 安装完成后,建议检查数据库中是否还有 MyISAM 表。 进入 MySQL 后执行: <code>SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'mediawiki' ORDER BY ENGINE, TABLE_NAME;</code> 如果想只检查 MyISAM 表,可以执行: <code>SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'mediawiki' AND ENGINE = 'MyISAM';</code> 如果返回空结果,说明当前数据库中没有 MyISAM 表。 也可以单独检查搜索索引表: <code>SHOW CREATE TABLE my_wikisearchindex\G</code> 如果没有设置表前缀,则表名可能是: <code>SHOW CREATE TABLE searchindex\G</code> 重点确认其中包含: <code>ENGINE=InnoDB</code> 以及 FULLTEXT 索引是否正常存在。 == 这样修改会不会有后患? == 从实际使用角度看,将 MediaWiki 的搜索索引表从 MyISAM 改为 InnoDB,一般不会影响正常运行。 因为 MyISAM / InnoDB 是建表时指定的存储引擎。一旦表已经创建为 InnoDB,MediaWiki 后续运行时主要执行的是: * INSERT * UPDATE * SELECT * DELETE * ALTER TABLE * CREATE INDEX 它不会在普通访问、编辑页面、上传文件、搜索页面时自动把表切回 MyISAM。 对于现代 MySQL 来说,InnoDB 反而是更推荐的选择。它具有更好的事务支持、崩溃恢复能力和并发处理能力,也更符合云数据库系统的默认管理策略。 == 后续维护和升级时的注意事项 == 这个问题真正需要注意的是后续升级。 由于这次修改的是 MediaWiki 源码目录中的 SQL 文件: <code>sql/mysql/tables-generated.sql</code> 所以以后升级 MediaWiki 时,如果换成了新的源码目录,或者覆盖了原来的 SQL 文件,官方包中的 <code>ENGINE = MyISAM</code> 可能会再次出现。 因此后续升级前后建议检查: <code>grep -Rni "MyISAM" /www/wwwroot/mediawiki-1.45.3/sql</code> 如果已经升级到新目录,例如: <code>/www/wwwroot/mediawiki-1.46.x/</code> 则需要改成对应的新路径: <code>grep -Rni "MyISAM" /www/wwwroot/mediawiki-1.46.x/sql</code> 如果发现新的安装或升级 SQL 中仍然存在: <code>ENGINE = MyISAM</code> 就需要再次评估是否替换为: <code>ENGINE = InnoDB</code> 另外,升级 MediaWiki 后通常还需要运行维护脚本: <code>cd /www/wwwroot/mediawiki-1.45.3 php maintenance/run.php update</code> 升级后也建议再次检查表引擎: <code>SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'mediawiki' AND ENGINE = 'MyISAM';</code> == 总结 == 这次问题的根本原因不是 MediaWiki 数据库连接失败,也不是用户权限错误,而是: <code>云服务商托管 MySQL 禁用了 MyISAM 存储引擎,而 MediaWiki 安装 SQL 中仍然存在 MyISAM 建表语句。</code> 解决思路是: # 备份 MediaWiki 的 MySQL 建表 SQL 文件; # 将 <code>ENGINE = MyISAM</code> 替换为 <code>ENGINE = InnoDB</code>; # 清空安装失败后残留的数据库; # 重新运行 MediaWiki 安装程序; # 安装完成后检查所有表是否都是 InnoDB; # 后续升级 MediaWiki 时重新检查 SQL 文件,避免 MyISAM 建表语句再次出现。 对于使用 Oracle Cloud MySQL、阿里云 RDS、腾讯云数据库、AWS RDS 等云服务商数据库系统的用户来说,这类问题并不罕见。云数据库通常更偏向稳定、安全和统一管理,因此会禁用一些旧式或不推荐的特性。安装传统 PHP 程序时,如果遇到类似报错,应优先检查程序的建表 SQL 是否使用了云数据库不支持的存储引擎。 [[分类:MediaWiki]]
返回
安装MediaWiki时遇到MyISAM被禁用
。
导航菜单
个人工具
创建账号
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息