Moodle跨版本恢复备份出现数据库读取错误问题咨询
Moodle跨版本迁移MySQL 8.0报错解决方案
问题根因
MySQL 8.0 已正式移除@@default_storage_engine和@@storage_engine两个系统变量,仅修改变量名称无法适配MySQL 8.0的查询逻辑。
可落地修复步骤
1. 修正数据库驱动的存储引擎查询逻辑
打开/lib/dml/mysqli_native_moodle_database.php文件,定位到获取默认存储引擎的SQL查询段,将原有使用系统变量的查询:
SELECT @@default_storage_engine AS engine -- 或 SELECT @@storage_engine AS engine
替换为全MySQL版本兼容的查询语句:
SELECT ENGINE AS engine FROM INFORMATION_SCHEMA.ENGINES WHERE SUPPORT = 'DEFAULT'
2. 调整MySQL 8.0兼容配置
编辑MySQL配置文件(my.cnf/my.ini),添加/修改以下参数:
[mysqld] # 适配Moodle的SQL模式要求 sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" # 适配Moodle旧版驱动的认证方式 default_authentication_plugin = mysql_native_password
修改后重启MySQL服务,执行以下SQL更新数据库账号的认证规则:
ALTER USER '你的Moodle数据库用户名'@'访问地址' IDENTIFIED WITH mysql_native_password BY '你的数据库密码'; FLUSH PRIVILEGES;
3. 校验跨版本迁移流程合规性
Moodle不支持直接将低版本整站备份恢复到高版本环境,需按以下流程操作:
- 先在原有PHP 5.5、MySQL 5.5环境中将Moodle 2.7逐步升级到Moodle 3.9,确认运行无异常后再导出整站备份,迁移到新服务器恢复
- 若仅迁移课程数据,导出Moodle 2.7课程备份时需勾选「兼容更高版本」选项,再导入Moodle 3.9环境
4. 字符集兼容性检查
确认MySQL 8.0中Moodle数据库的字符集为utf8mb4,排序规则为utf8mb4_unicode_ci,避免旧备份导入时出现字符集乱码或报错。
内容的提问来源于stack exchange,提问作者Flora
相关产品推荐
相关产品推荐

