Ruby2.5.1+Rails5.2升级至MySQL8后程序崩溃求助
问题背景
本地基于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

