有相当多的支持操作可以将 Mnesia 迁移到 SQL,这是一个特殊命令ejabberdctl export2sql
(在旧版本中它曾被称为export2odbc
)。某些设置可能需要它,因为 Mnesia 限制为 2GiB 等等。
就我的情况而言,确实不需要外部数据库。活跃用户大约有 10-15 个,总用户数不超过 30 个,从 SQL 数据库导出的大小约为 200 kB。
以前有人做过这样的事情,将数据库导出到 SQL(具体来说,MySQL)。我该如何恢复该更改?
能帮export_piefxis
我吗?它有什么用?
更新 1。经过一番探索,我发现只有两个模块在 SQL 数据库中有一些数据:mod_roster
和mod_vcard
。因此只有那些需要转换。有没有办法在外部转换它们的数据并加载到 ejabberd 中?我的意思是,有一个ejabberdctl dump_table
,但同样没有反向命令。
而且,export_piefxis
似乎没有帮助。它只是导出零内容,而数据库中有数据,当我连接到例如新实例化的客户端时,它会被提取。
更新 2apt
。软件:在 Proxmox VE 6.4-1 主机上运行的 Debian 11.2 LXC 容器。从标准 Debian 存储库安装 Ejabberd 21.01-2 。
数据库是从旧版 Ejabberd(大约 2.1 版)迁移而来的,该版本在 Gentoo 上运行,上次更新于 2015 年。我不再有那台机器了。Mnesia 数据库迁移如下:
# on the old machine
ejabberdctl backup /tmp/[email protected]
ejabberdctl mnesia_change_nodename ejabberd@localhost ejabberd@jabber2 \
/tmp/[email protected] /tmp/[email protected]
# on the new machine (starting with empty database)
ejabberdctl install_fallback /tmp/[email protected]
ejabberdctl stop
ejabberdctl start
新机器上的配置只是引用mod_roster
和的相同 MySQL 数据库mod_vcard
。
ejabberd.yml
:
loglevel: info
log_rotate_count: 0
hosts:
- "example.org"
host_config:
"rterm.ru":
sql_type: mysql
sql_server: "dbserver"
sql_database: "ejabberd"
sql_username: "ejabberd"
sql_password: "password"
auth_method: [external]
certfiles:
- "/etc/ejabberd/ejabberd.pem"
acme:
auto: false
define_macro:
'TLS_CIPHERS': "HIGH:!aNULL:!eNULL:!3DES:@STRENGTH"
'TLS_OPTIONS':
- "no_sslv3"
- "no_tlsv1"
- "no_tlsv1_1"
- "cipher_server_preference"
- "no_compression"
c2s_ciphers: 'TLS_CIPHERS'
s2s_ciphers: 'TLS_CIPHERS'
c2s_protocol_options: 'TLS_OPTIONS'
s2s_protocol_options: 'TLS_OPTIONS'
listen:
-
port: 5222
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
starttls_required: true
protocol_options: 'TLS_OPTIONS'
-
port: 5223
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
tls: true
protocol_options: 'TLS_OPTIONS'
-
port: 5269
ip: "::"
module: ejabberd_s2s_in
max_stanza_size: 524288
-
port: 5443
ip: "::"
module: ejabberd_http
tls: true
protocol_options: 'TLS_OPTIONS'
request_handlers:
/admin: ejabberd_web_admin
/api: mod_http_api
/bosh: mod_bosh
/upload: mod_http_upload
/ws: ejabberd_http_ws
-
port: 5280
ip: "::"
module: ejabberd_http
tls: false
request_handlers:
# This runs behind reverse HTTP proxy with Let's Encrypt, which is neighbour container on the same host, so this is safe
/admin: ejabberd_web_admin
/bosh: mod_bosh
/upload: mod_http_upload
-
port: 1883
ip: "::"
module: mod_mqtt
backlog: 1000
auth_method: [external]
extauth_program: "/etc/ejabberd/auth_mysql.py"
extauth_pool_size: 5
disable_sasl_mechanisms:
- "X-OAUTH2"
s2s_use_starttls: required
acl:
admin:
user:
- "[email protected]"
local:
user_regexp: ""
loopback:
ip:
- 127.0.0.0/8
- ::1/128
access_rules:
local:
allow: local
c2s:
deny: blocked
allow: all
announce:
allow: admin
configure:
allow: admin
muc_create:
allow: local
pubsub_createnode:
allow: local
trusted_network:
allow: loopback
api_permissions:
"console commands":
from:
- ejabberd_ctl
who: all
what: "*"
"admin access":
who:
access:
allow:
- acl: loopback
- acl: admin
oauth:
scope: "ejabberd:admin"
access:
allow:
- acl: loopback
- acl: admin
what:
- "*"
- "!stop"
- "!start"
"public commands":
who:
ip: 127.0.0.1/8
what:
- status
- connected_users_number
shaper:
normal:
rate: 3000
burst_size: 20000
fast: 200000
shaper_rules:
max_user_sessions: 10
max_user_offline_messages:
5000: admin
100: all
c2s_shaper:
none: admin
normal: all
s2s_shaper: fast
modules:
mod_adhoc: {}
mod_admin_extra: {}
mod_announce:
access: announce
mod_avatar: {}
mod_blocking: {}
mod_bosh: {}
mod_caps: {}
mod_carboncopy: {}
mod_client_state: {}
mod_configure: {}
mod_disco: {}
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: https://@HOST@:5443/upload
custom_headers:
"Access-Control-Allow-Origin": "https://@HOST@"
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
"Access-Control-Allow-Headers": "Content-Type"
mod_last: {}
mod_mqtt: {}
mod_muc:
access:
- allow
access_admin:
- allow: admin
access_create: muc_create
access_persistent: muc_create
access_mam:
- allow
default_room_options:
mam: true
mod_muc_admin: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
mod_pres_counter:
count: 5
interval: 60
mod_privacy: {}
mod_private: {}
mod_proxy65:
access: local
max_connections: 5
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
- flat
- pep
force_node_config:
"eu.siacs.conversations.axolotl.*":
access_model: open
storage:bookmarks:
access_model: whitelist
mod_push: {}
mod_push_keepalive: {}
mod_roster:
db_type: sql # This is what I want to get rid of
versioning: true
mod_s2s_dialback: {}
mod_shared_roster: {}
mod_sic: {}
mod_stream_mgmt:
resend_on_timeout: if_offline
mod_stun_disco: {}
mod_vcard:
db_type: sql # And this
search: false
mod_vcard_xupdate: {}
mod_version: {}
答案1
好的,存在功能不兼容的情况:您正在向 ejabberd 询问有关已注册帐户的详细信息,但 ejabberd 不知道存在哪些帐户。
您已将 ejabberd 配置为使用外部认证,这意味着 ejabberd 使用该脚本来检查帐户是否存在或不...但该脚本从不报告注册账户列表。
当你想要知道注册账户列表的时候就会出现这个问题:
- 使用 export_piefxis 导出现有帐户
- 在 ejabberd WebAdmin 中查看账户列表
据报道 https://github.com/processone/ejabberd/issues/3705
一个解决方案是启用该选项auth_use_cache这样每次登录尝试都会给出 ejabberd 存储的提示。等待几天或几周,稍后当您请求“注册帐户”列表时,ejabberd 会读取该身份验证缓存并使用它。
问题是您需要等待所有注册帐户登录并将缓存信息留在 ejabberd 中...
好消息:有一种方法可以用帐户填充身份验证缓存:
以某种方式手动获取注册账户列表
使能够auth_use_cache在 ejabberd 中并重新启动
对要导出的每个帐户运行此命令。这将确保为该帐户运行 extauth,并且身份验证缓存存储此提示:
ejabberdctl check_account user123 localhost
只是出于好奇,您可以查看已注册帐户的列表(实际上它只是经过身份验证的缓存帐户的列表......)
ejabberdctl registered_users localhost 管理员 user123
现在你终于可以运行export_piefxis了
请记住:当 ejabberd 停止时,身份验证缓存信息将被删除。
导出后,您可以恢复配置
答案2
export_piefxis 能以某种方式帮助我吗?它有什么作用?
是的,这应该是您想要的命令:在 SQL 存储仍在使用时运行它。一旦您将内容保存在 XML 文件中,请配置 ejabberd 以使用 Mnesia 并导入这些文件。
此外,export_piefxis 似乎没有帮助。
它崩溃了?还是它只是输出了零内容?