Rails数据库迁移失败:提示无法加载MariaDB缺失的http.so插件共享库
问题核心成因
- 报错本质是Rails连接数据库所用的业务账号,在远端独立部署的MariaDB服务端被配置为
http插件认证方式,但Rails所在的Debian服务器本地,没有安装MariaDB客户端依赖对应的http插件动态库,导致mysql2 gem调用底层libmariadb客户端库时,找不到报错路径下的http.so文件。 - 日常mysql命令行连接操作完全正常,是因为命令行测试时使用的账号(比如root、普通测试账号)并未配置
http插件认证,和Rails配置文件中使用的业务账号不是同一身份,因此不会触发插件加载流程,自然不会出现报错。
修复方案
两种路径任选其一执行即可,优先推荐第一种,生产环境兼容性最好:
方案1:调整业务账号的认证插件为通用方式
- 先用可正常连接远端MariaDB的mysql客户端登录数据库,执行以下语句确认Rails所用业务账号的认证插件配置,命令中替换为你实际的Rails业务账号名:
SELECT user, host, plugin FROM mysql.user WHERE user = '你的Rails业务账号'; - 确认该账号的
plugin字段值为http后,执行命令将其切换为MariaDB通用的mysql_native_password认证方式,替换为实际的账号名、Rails服务器出口IP段、账号对应的密码:ALTER USER '你的Rails业务账号'@'Rails服务器出口IP段' IDENTIFIED VIA mysql_native_password USING PASSWORD('账号实际密码'); FLUSH PRIVILEGES; - 这种方式不需要在本地额外安装任何依赖,不会出现版本兼容问题,是生产场景下最稳妥的处理方式。
方案2:补装本地缺失的http插件包
如果业务规则要求必须保留账号的http插件认证方式,直接在Debian服务器上通过官方apt源补全对应插件,匹配报错中提示的mariadb19版本插件目录:
- 执行安装命令:
apt update && apt install mariadb-plugin-http - 安装完成后可验证插件文件是否落位:
ls /usr/lib/x86_64-linux-gnu/mariadb19/plugin/http.so
避坑提示
- 禁止从第三方渠道下载零散的http.so文件放到系统插件目录,这类零散文件大概率和本地MariaDB客户端库的版本不匹配,会触发更难排查的符号缺失、版本不兼容类报错。所有插件依赖一定要通过Debian官方apt源安装,保证和本地已安装的MariaDB客户端库版本自动对齐。
- 修复完成后可先执行连接测试命令验证连通性,确认无报错后再执行数据库迁移操作:
rails runner 'puts ActiveRecord::Base.connection.active?'
内容的提问来源于stack exchange,提问作者Mlok
相关产品推荐
相关产品推荐

