RHEL 8安装mysql2 v0.3.21 gem失败编译报错求助
问题根因
日志里的checking for rb_thread_blocking_region()... no不是报错原因,直接忽略即可。安装失败的核心原因是mysql2 0.3.21是适配MySQL 5.7及更早版本的老版本,和当前安装的MySQL 8.0客户端库API不兼容:
- MySQL 8.0 移除了旧版本作为布尔类型别名的
my_bool定义,统一使用C标准bool类型 - MySQL 8.0 直接删除了
MYSQL_SECURE_AUTH配置宏——8.0版本默认强制开启安全认证,不允许手动关闭,因此这个配置项被彻底移除,老版本mysql2代码里引用这个宏就会触发编译报错。
解决步骤(无需升级mysql2版本)
全程不需要改动mysql2版本,也不需要降级MySQL,通过编译时补全兼容定义即可完成安装:
- 先确认基础编译依赖已经安装:
dnf install -y mysql-devel gcc make
- 直接安装gem时传入兼容编译参数即可:
gem install mysql2 -v 0.3.21 -- --with-cflags="-Dmy_bool=bool -DMYSQL_SECURE_AUTH=10"
如果你是通过bundle install安装依赖,先给bundle配置mysql2的全局编译参数,再执行安装即可:
bundle config set build.mysql2 --with-cflags="-Dmy_bool=bool -DMYSQL_SECURE_AUTH=10" bundle install
参数说明:
-Dmy_bool=bool是给编译器加宏定义,让代码里所有的my_bool直接替换为bool,匹配MySQL 8.0的类型定义-DMYSQL_SECURE_AUTH=10是补全被删除的常量,这里填10是因为旧版本MySQL中MYSQL_SECURE_AUTH对应的枚举值就是10,不会和现有其他配置项冲突,仅用于通过编译,不会影响实际运行逻辑。
后续注意事项
安装完成后,业务代码的数据库连接配置里不要加secure_auth: false的配置即可,MySQL 8.0本身不支持关闭安全认证,保留默认配置就能正常连接。
可以用下面的命令快速验证gem安装是否正常:
irb -r mysql2 -e "puts Mysql2::VERSION"
命令输出0.3.21就代表安装成功。
内容的提问来源于stack exchange,提问作者Egilzzz
相关产品推荐
相关产品推荐

