You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby2.5.1+Rails5.2升级至MySQL8后程序崩溃求助

解决Ruby 2.5.1 Rails项目升级MySQL 8后的段错误问题

问题背景

本地基于Ruby 2.5.1的Rails项目,原使用兼容MySQL 5.7的MariaDB,升级到MySQL 8后出现段错误,即使升级mysql2 gem到0.5.4仍无法解决,而Ruby 3的Rails项目运行正常。

核心原因

Ruby 2.5.x属于较旧版本,其mysql2 gem的C扩展与MySQL 8的客户端库存在兼容性冲突,加上系统残留的MariaDB开发库可能干扰了mysql2的编译链接,导致连接数据库时触发段错误。

解决步骤

  • 彻底清理旧数据库依赖
    先卸载所有MariaDB相关包及开发库,避免残留文件干扰:

    sudo apt purge mariadb-server mariadb-client libmariadb-dev libmariadbclient-dev
    sudo apt autoremove && sudo apt autoclean
    

    执行dpkg -l | grep -E 'mysql|mariadb'确认无残留的开发类库。

  • 重新编译mysql2 gem并指定MySQL 8路径
    先卸载现有mysql2 gem,再基于MySQL 8的库重新编译:

    gem uninstall mysql2
    gem install mysql2 -v 0.5.4 -- --with-mysql-lib=/usr/lib/mysql --with-mysql-include=/usr/include/mysql --with-mysql-config=/usr/bin/mysql_config
    

    若使用Bundler,先配置编译参数再安装:

    bundle config build.mysql2 --with-mysql-lib=/usr/lib/mysql --with-mysql-include=/usr/include/mysql --with-mysql-config=/usr/bin/mysql_config
    bundle install
    

    注:若MySQL 8安装在自定义路径,需替换上述命令中的路径为实际路径

  • 调整MySQL 8用户认证方式
    Ruby 2.5.x搭配mysql2 0.5.x对MySQL 8默认的caching_sha2_password认证支持不足,需为项目数据库用户切换为旧认证方式:

    ALTER USER 'your_db_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_db_password';
    FLUSH PRIVILEGES;
    
  • 验证环境并重启服务
    检查Ruby的库链接情况,确认未关联旧MariaDB库:

    ldd $(which ruby)
    

    重启Rails服务器及相关进程,确保加载新编译的mysql2 gem。

为什么Ruby 3项目不受影响

Ruby 3.x对现代C库的兼容性更好,mysql2 gem在新版本Ruby环境下的适配更完善,能正确处理MySQL 8的客户端库及认证机制,因此不会出现类似段错误问题。

内容的提问来源于stack exchange,提问作者fcastillo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:56:01