使用PostgreSQL时ejabberd添加新用户提示Error: conflict求助
Ejabberd 21.01迁移PostgreSQL后注册用户提示Conflict的解决方法
问题场景
Debian 11.7通过deb包安装ejabberd 21.01,初始使用默认Mnesia数据库并注册过账号;迁移至PostgreSQL后服务可通过systemd正常启动,但执行ejabberdctl register添加新用户时持续提示Error: conflict,而ejabberdctl check_account验证显示该账号并不存在于PostgreSQL数据库中。
安装信息:
apt info ejabberd Package: ejabberd Version: 21.01-2 Priority: optional Section: net Maintainer: Ejabberd Packaging Team <ejabberd@packages.debian.org> Installed-Size: 9,372 kB Provides: mqtt-broker, stun-server, turn-server, xmpp-server
排查与解决步骤
1. 清理残留Mnesia数据
迁移后ejabberd可能仍读取旧Mnesia存储的账号信息,导致冲突:
- 停止服务:
systemctl stop ejabberd - 备份并清空默认Mnesia目录:
mv /var/lib/ejabberd/mnesia /var/lib/ejabberd/mnesia_backup mkdir /var/lib/ejabberd/mnesia chown ejabberd:ejabberd /var/lib/ejabberd/mnesia - 重启服务:
systemctl start ejabberd - 重新尝试注册用户验证结果
2. 确认数据库配置完全生效
检查/etc/ejabberd/ejabberd.yml配置文件:
- 确保
sql_type设置为pgsql - 验证
sql_server、sql_database、sql_username、sql_password参数正确 - 确认
auth_method设置为sql(而非internal或mnesia) - 修改配置后重启服务:
systemctl restart ejabberd
3. 排查PostgreSQL数据与权限
- 登录PostgreSQL,检查用户表是否存在残留数据:
SELECT username FROM users WHERE username = '目标用户名' AND server_host = '你的域名'; - 若存在残留数据,手动删除:
DELETE FROM users WHERE username = '目标用户名' AND server_host = '你的域名'; - 确保ejabberd数据库用户拥有读写权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE users TO ejabberd;
4. 规范ejabberdctl命令参数
执行命令时指定完整域名,避免域名不匹配导致误判:
ejabberdctl register 目标用户名 你的域名 密码 ejabberdctl check_account 目标用户名 你的域名
内容的提问来源于stack exchange,提问作者Ronaldo Nascimento
相关产品推荐
相关产品推荐

