ejabberd 23.4配置MariaDB后MySQL连接失败求助
针对你遇到的ejabberd切换MariaDB后连接失败、认证被中止的问题,以下是分步诊断和解决建议:
诊断步骤
核对
ejabberd.yml的SQL配置细节
确认已明确设置sql_type: mysql(仅设置default_db: sql不够,需指定数据库类型);检查sql_server、sql_database、sql_username、sql_password是否完全匹配MariaDB配置,注意密码含特殊字符(如#、!)时需用反斜杠转义;确认sql_port与MariaDB监听端口一致(默认3306);若MariaDB未开启SSL,必须设置sql_ssl: false。验证MariaDB用户认证插件与权限
登录MariaDB执行:SELECT user,host,plugin FROM mysql.user WHERE user='你的ejabberd用户名';,确认插件为mysql_native_password(ejabberd对caching_sha2_password兼容性差)。若插件不符,重新授权:GRANT ALL PRIVILEGES ON ejabberd数据库名.* TO 'ejabberd用户名'@'ejabberd主机IP或localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;同时确认用户的
host限制正确,避免主机名解析问题,优先用IP或localhost(本地连接时)。测试ejabberd系统用户的连通性
切换到ejabberd运行的系统用户(如ejabberd),执行:mysql -h MariaDB主机 -u ejabberd用户名 -p ejabberd数据库名,输入密码后确认能正常连接。若远程连接,用nc -zv MariaDB主机 3306测试端口是否放行。检查ejabberd驱动依赖
执行ejabberdctl modules_available | grep mysql,确认MySQL驱动模块已可用;查看ejabberd启动日志,排查是否有驱动加载失败的提示。
解决建议
- 修正
ejabberd.yml配置,示例正确片段:default_db: sql sql_type: mysql sql_server: "127.0.0.1" sql_database: "ejabberd" sql_username: "ejabberd_user" sql_password: "your_escaped_password" sql_port: 3306 sql_ssl: false - 强制使用
mysql_native_password认证:这是此类连接失败的常见原因,ejabberd目前对新的SHA2认证插件支持有限。 - 排查系统安全限制:如SELinux可能阻止ejabberd进程连接数据库,可临时执行
setenforce 0测试,若恢复正常,需添加SELinux规则允许ejabberd访问MariaDB端口。 - 重新验证数据导入完整性:备份当前MariaDB数据后,用
ejabberdctl export2sql重新导出Mnesia数据并导入MariaDB,确保表结构和数据无损坏。
内容的提问来源于stack exchange,提问作者AndW99

