2009-01-20 97 views
12

我在machine1上创建了Mnesia数据库/ Schema。该节点被命名为mypl @ machine1。然后我将所有文件移动到machine2,因为machine1崩溃了。只要代码以名称“mypl @ machine1”运行,所有代码都可以正常运行。显然这有点混乱,因为它现在在machine2上运行。如何重命名运行mnesia数据库的节点

如果我以节点名称“mypl @ machine2”启动Erlang,则Mnesia数据库显示为空。

如何将Mnesia数据库中的节点从machine1重命名为machine2?

回答

11

我不认为这可以在单个节点(任何人?)上联机完成,但除了运行两个节点和添加表副本之外,还可以通过备份/恢复来完成。在Mnesia User's guide的第6.9.1节中,您会发现一些代码使用mnesia:traverse_backup来更改mnesia备份文件中架构表(如下所示)中的节点名称。您应该使用的模块名称是mnesia_backup

有了这个代码,您需要:

%% On [email protected] 
mnesia:backup("/path/to/mnesia.backup"). 
change_node_name(mnesia_backup, [email protected], [email protected], 
       "/path/to/mnesia.backup", "/path/to/new.mnesia.backup"). 
%% On [email protected] 
mnesia:restore("/path/to/new.mnesia.backup", []). 

我不知道,如果你需要在[email protected]首先创建模式。

从用户指南的变化节点名称代码:

change_node_name(Mod, From, To, Source, Target) -> 
    Switch = 
     fun(Node) when Node == From -> To; 
      (Node) when Node == To -> throw({error, already_exists}); 
      (Node) -> Node 
     end, 
    Convert = 
     fun({schema, db_nodes, Nodes}, Acc) -> 
       {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc}; 
      ({schema, version, Version}, Acc) -> 
       {[{schema, version, Version}], Acc}; 
      ({schema, cookie, Cookie}, Acc) -> 
       {[{schema, cookie, Cookie}], Acc}; 
      ({schema, Tab, CreateList}, Acc) -> 
       Keys = [ram_copies, disc_copies, disc_only_copies], 
       OptSwitch = 
        fun({Key, Val}) -> 
          case lists:member(Key, Keys) of 
           true -> {Key, lists:map(Switch, Val)}; 
           false-> {Key, Val} 
          end 
        end, 
       {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc}; 
      (Other, Acc) -> 
       {[Other], Acc} 
     end, 
    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched). 
+0

我遵循有关步骤,但失败的恢复,什么建议吗? 1.备份的原始数据库 2.更改节点名称 3.副本李明博放到另一台机子 4.还原新备份文件 的错误信息是:{中止,{“EXIT”,{中止,{bad_commit, {missing_lock, 'web_server @ anothernode'}}}}} – 2016-07-24 13:39:29

1

解决方法是迁移。只需启动mnesia集群并将所有表和架构迁移到其他节点。比从原来的删除和忘记。