为何数据库在Plesk运行正常,迁移到RunCloud服务器后仅部分功能可用
问题根因排查及解决方法
- 第一优先级:字符集不匹配
你两边数据库的核心差异是Plesk侧使用utf8mb4字符集,RunCloud侧使用的是utf8(即MariaDB原生的utf8mb3,仅支持最多3字节的Unicode字符)。当你的程序需要写入emoji、生僻汉字等4字节字符时,RunCloud侧的数据库会直接报错或截断数据,触发程序崩溃。
解决方法:
- 修改RunCloud侧MariaDB的全局配置,将默认字符集改为
utf8mb4,排序规则对应改为utf8mb4_general_ci或和旧库一致的规则 - 删除已导入的数据库,确认从Plesk导出的SQL文件本身编码为utf8mb4后重新导入
- 检查程序数据库配置中的字符集参数,确保配置为
utf8mb4
- 第二优先级:MariaDB版本兼容问题
Plesk使用的是MariaDB 10.1,RunCloud使用的是10.4,跨3个大版本的默认配置差异很大:
- SQL_MODE默认值不同:10.4默认开启严格模式(
STRICT_TRANS_TABLES等规则),旧版本不规范的SQL写法(比如非空字段无默认值插入时不给值、GROUP BY字段不完整)在旧库可以运行,在严格模式下会直接抛出错误 - 时间字段规则不同:10.4默认禁止零值日期
0000-00-00,对CURRENT_TIMESTAMP的使用限制也和10.1有差异
解决方法:
先查询Plesk侧的SQL_MODE配置:SHOW VARIABLES LIKE 'sql_mode';,将RunCloud侧的SQL_MODE临时调整为和旧库完全一致,验证功能正常后再逐步优化SQL写法适配高版本规则。
第三优先级:数据库用户权限差异
虽然两边的用户名都是prod@localhost,但RunCloud侧的用户可能缺少部分必要权限(比如LOCK TABLES、CREATE ROUTINE、ALTER等),程序执行对应操作时会触发权限错误。
解决方法:
分别在两边执行SHOW GRANTS FOR 'prod'@'localhost';,对比权限列表,补充RunCloud侧用户缺失的权限即可。关于UNIX socket连接的调整方法
你只需要将程序数据库配置中的host参数从127.0.0.1改为localhost,MariaDB默认会对localhost走UNIX socket连接,127.0.0.1才会走TCP/IP。不过连接方式差异不会导致功能崩溃,最多是性能差异,可以放在最后验证。
内容的提问来源于stack exchange,提问作者Scott L
相关产品推荐
相关产品推荐

