如何将 ejabberd 数据库从 SQL 后端迁移到 Mnesia?

如何将 ejabberd 数据库从 SQL 后端迁移到 Mnesia?

有相当多的支持操作可以将 Mnesia 迁移到 SQL,这是一个特殊命令ejabberdctl export2sql(在旧版本中它曾被称为export2odbc)。某些设置可能需要它,因为 Mnesia 限制为 2GiB 等等。

就我的情况而言,确实不需要外部数据库。活跃用户大约有 10-15 个,总用户数不超过 30 个,从 SQL 数据库导出的大小约为 200 kB。

以前有人做过这样的事情,将数据库导出到 SQL(具体来说,MySQL)。我该如何恢复该更改?

能帮export_piefxis我吗?它有什么用?


更新 1。经过一番探索,我发现只有两个模块在 SQL 数据库中有一些数据:mod_rostermod_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 中...

好消息:有一种方法可以用帐户填充身份验证缓存:

  1. 以某种方式手动获取注册账户列表

  2. 使能够auth_use_cache在 ejabberd 中并重新启动

  3. 对要导出的每个帐户运行此命令。这将确保为该帐户运行 extauth,并且身份验证缓存存储此提示:

    ejabberdctl check_account user123 localhost

  4. 只是出于好奇,您可以查看已注册帐户的列表(实际上它只是经过身份验证的缓存帐户的列表......)

    ejabberdctl registered_users localhost 管理员 user123

  5. 现在你终于可以运行export_piefxis了

  6. 请记住:当 ejabberd 停止时,身份验证缓存信息将被删除。

  7. 导出后,您可以恢复配置

答案2

export_piefxis 能以某种方式帮助我吗?它有什么作用?

是的,这应该是您想要的命令:在 SQL 存储仍在使用时运行它。一旦您将内容保存在 XML 文件中,请配置 ejabberd 以使用 Mnesia 并导入这些文件。

此外,export_piefxis 似乎没有帮助。

它崩溃了?还是它只是输出了零内容?

相关内容