迁移 mnesia BD ejabberd v 2.1.5-3 -> 16.09-4

迁移 mnesia BD ejabberd v 2.1.5-3 -> 16.09-4

我有安装了 Debian 6 的旧服务器,ejabberd v. 2.1.5-3 和 mnesia BD,需要将用户和密码移到安装了 Debian 9.6、ejabberd 16.09-4 和 mnesia BD 的新服务器。服务器的节点名称不同。我在旧服务器上执行 ejabberd.dump 和 ejabberd.backup。当我在旧服务器上尝试执行:

root@oldserver ejabberdctl export_piefxis /var/lib/ejabberd/1/

Problem 'throw {error,exmpp_not_installed}' occurred executing the command.
Stacktrace: [{ejabberd_piefxis,try_start_exmpp,0},
             {ejabberd_piefxis,export_hosts,2},
             {ejabberd_ctl,call_command,3},
             {ejabberd_ctl,try_call_command,3},
             {ejabberd_ctl,process2,3},
             {ejabberd_ctl,process,1},
             {rpc,'-handle_call_call/6-fun-0-',5}]

我将 ejabberd.dump、ejabberd.backup 和 ejabberd 目录从旧服务器复制到新服务器中的 /var/lib/ejabberd_old/。在新服务器中,我尝试:

root@newserver: ejabberdctl 加载 /var/lib/ejabberd/old/ejabberd.dump

Can't load dump in "/var/lib/ejabberd/old/ejabberd.dump" at node ejabberd@Public: open

root@newserver: ejabberdctl mnesia_change_nodename ejabberd@oldserver ejabberd@newserver /var/lib/ejabberd/old/ejabberd.backup /var/lib/ejabberd/old/ejabberd_new.backup

Error: {file_error,"/var/lib/ejabberd/old/ejabberd_new.backup.BUPTMP",eacces}

root@newserver: ejabberdctl 恢复 /var/lib/ejabberd/old/ejabberd.backup

Problem 'error {case_clause,
               {aborted,
                   {file_error,"/var/lib/ejabberd/old/ejabberd.backup",
                       eacces}}}' occurred executing the command.
Stacktrace: [{ejabberd_admin,restore_mnesia,1,
                             [{file,"src/ejabberd_admin.erl"},{line,491}]},
             {ejabberd_ctl,call_command,4,
                           [{file,"src/ejabberd_ctl.erl"},{line,324}]},
             {ejabberd_ctl,try_call_command,4,
                           [{file,"src/ejabberd_ctl.erl"},{line,298}]},
             {ejabberd_ctl,process2,4,
                           [{file,"src/ejabberd_ctl.erl"},{line,247}]},
             {ejabberd_ctl,process,2,
                           [{file,"src/ejabberd_ctl.erl"},{line,225}]},
             {rpc,'-handle_call_call/6-fun-0-',5,
                  [{file,"rpc.erl"},{line,187}]}]

root@newserver: ejabberdctl import_dir /var/lib/ejabberd_old/

Problem 'error {badmatch,{error,eacces}}' occurred executing the command.
Stacktrace: [{jd2ejd,import_dir,1,[{file,"src/jd2ejd.erl"},{line,78}]},
             {ejabberd_admin,import_dir,1,
                             [{file,"src/ejabberd_admin.erl"},{line,436}]},
             {ejabberd_ctl,call_command,4,
                           [{file,"src/ejabberd_ctl.erl"},{line,324}]},
             {ejabberd_ctl,try_call_command,4,
                           [{file,"src/ejabberd_ctl.erl"},{line,298}]},
             {ejabberd_ctl,process2,4,
                           [{file,"src/ejabberd_ctl.erl"},{line,247}]},
             {ejabberd_ctl,process,2,
                           [{file,"src/ejabberd_ctl.erl"},{line,225}]},
             {rpc,'-handle_call_call/6-fun-0-',5,
                  [{file,"rpc.erl"},{line,187}]}]strong text

我还能做些什么来将数据库迁移到新版本的 ejabberd。

答案1

eacces 表示程序没有读取该文件的系统权限。也许该文件对于 root 来说是只读的,但 ejabberd 正在由用户“ejabberd”运行,或诸如此类。

您可以尝试另一件完全不同的事情:

  1. 您的旧 ejabberd 是否正常运行?请停止它。
  2. 在新路径中安装新的 ejabberd,或者至少确保它不使用旧的配置文件、旧的数据库文件和旧的日志……
  3. 您可以启动新的 ejabberd 以确保它至少可以完美运行。当然它不会有您的旧用户。
  4. 停止新的 ejabberd。
  5. 删除新数据库路径下的文件。将旧数据库文件复制到新数据库路径。
  6. 如果你现在尝试启动新的 ejabberd,它将会失败,因为 erlang 节点名称已经改变,因此请继续执行步骤 7:
  7. 配置新的 ejabberd 使用与旧 ejabberd 相同的“erlang 节点名称”。此选项位于文件 ejabberdctl.cfg 中,您需要输入类似以下内容:ERLANG_NODE=ejabberd@oldserver
  8. 现在再次启动新的 ejabberd,如步骤 6 所示。它应该使用旧的数据库文件,并且现在它应该接受它们,因为它也使用旧的节点名。
  9. 此外,它应该会自动检测数据库架构是否非常旧,并开始将其更新为新架构。根据数据库大小,可能需要几秒钟或几分钟。此过程应在日志文件中提及。
  10. 自动数据库模式更新后,ejabberd 终于启动并可以正常工作。

步骤很多,但对您来说唯一困难的步骤是 5(将旧数据库复制到新位置)和 7(在新安装中配置旧节点名称)。

相关内容