Ubuntu22.04环境mysql2 0.5.3连接报Segmentation fault故障
mysql2 0.5.3 connect阶段段错误排查方案
该空指针段错误核心原因是Ubuntu 22.04源里的libmariadb-dev-compat兼容包和mysql2 0.5.3版本存在ABI不兼容问题,编译时链接到该库后,调用connect方法会访问空内存地址触发崩溃,和本地mysql-server运行状态无关,按以下步骤修复即可:
- 彻底清理之前安装的mariadb相关开发依赖,避免编译时链接到错误的库:
sudo apt remove --purge libmariadb-dev libmariadb-dev-compat -y sudo apt autoremove -y
- 安装官方MySQL客户端开发依赖:
sudo apt update sudo apt install default-libmysqlclient-dev build-essential -y
注意:网上旧教程提到的安装libmariadbclient-dev的方案仅适用于Ubuntu 20.04及更早版本,22.04版本源中已经移除该包,替换提供的libmariadb-dev-compat没有完全实现libmysqlclient的内部结构,编译0.5.x版本mysql2时链接到该库会导致内存访问错误,不要使用
- 清理旧的mysql2 gem编译缓存,强制重新编译链接到正确的库:
如果你直接用gem管理依赖,执行:
gem uninstall mysql2 -v 0.5.3 gem install mysql2 -v 0.5.3 -- --with-mysql-config=/usr/bin/mysql_config
如果你用bundler管理项目依赖,执行:
bundle config set --local build.mysql2 --with-mysql-config=/usr/bin/mysql_config bundle pristine mysql2
- 验证修复效果,先排除ActiveRecord/Rake层面的干扰,直接运行最小测试脚本:
require "mysql2" # 先走TCP连接测试,避开本地socket配置问题 client = Mysql2::Client.new( host: "127.0.0.1", username: "你的数据库账号", password: "你的数据库密码", database: "任意已存在的库名" ) puts client.query("SELECT VERSION() AS version").first
如果TCP连接正常,本地socket连接仍然报错,检查项目数据库配置文件里的socket路径,Ubuntu 22.04下MySQL默认socket路径为/var/run/mysqld/mysqld.sock,路径配置错误时老版本mysql2不会抛出明确配置错误,会直接触发段错误。
- 若以上操作后问题仍存在,直接升级mysql2到0.5.5及以上的0.5.x稳定版本,0.5.3版本未适配Ubuntu 22.04的新版系统库,存在已知兼容问题,升级小版本不会影响现有业务代码兼容性。
内容的提问来源于stack exchange,提问作者Karthick
相关产品推荐
相关产品推荐

