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