关于mnesia分布的问题

时间:2010-11-23 08:19:24

标签: database erlang mnesia

我有两个运行mnesia的节点。我在节点1 上创建了模式和一些表,并在节点2 上使用mnesia:add_table_copy将表从节点1复制到节点2

一切正常,直到我在节点1 上调用q(),然后在节点2 上调用q()。我发现当我再次启动节点1 时,mnesia:wait_for_tables([sometable], infinity)将不会返回。它只会在我再次启动节点2 时返回。

有没有办法解决这个问题?这是一个问题,因为如果节点2 关闭,我将无法再次启动节点1

1 个答案:

答案 0 :(得分:2)

this discussion中,会出现类似于您所面临的情况。

从该来源阅读:

  

在启动时,Mnesia尝试连接   与其他节点,如果那样   超过它加载它的表   他们。如果其他节点已关闭,则为   在其中寻找mnesia_down标记   本地事务日志以便   确定它是否具有一致性   是否复制其表。节点   这是最后关闭的   mnesia_down来自所有其他人   节点。这意味着它可以安全地进行   加载它的表。如果其他一些   首先启动的节点(如在您的   案例)Mnesia将无限期地等待   为另一个节点按顺序连接   加载其表格

您首先关闭节点1,因此它没有来自其他节点的mnesia_down。如果您撤销关闭订单会怎样?

此外,应该可以通过force_load_table/1函数强制加载表格:

force_load_table(Tab) -> yes | ErrorDescription
  

用于表加载的Mnesia算法   可能导致某种情况发生   表无法加载。这个情况   在节点启动时发生   Mnesia总结或怀疑这一点   该表的另一个副本是活动的   此本地副本变为非活动状态后   由于系统崩溃。

     

如果这种情况不可接受,   此功能可用于覆盖   Mnesia表加载的策略   算法。这可能导致一个   一些交易的情况   效果会因不一致而丢失   数据库作为结果,但对于一些人   应用程序的高可用性更多   比一致的数据更重要。