1

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

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

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

4

1 回答 1

2

此讨论中,呈现了与您所面临的情况类似的情况。

从该来源阅读:

在启动时,Mnesia 尝试与其他节点连接,如果成功,它会从它们加载它的表。如果其他节点已关闭,它会在其本地事务日志中查找 mnesia_down 标记,以确定它是否具有其表的一致副本。最后关闭的节点具有来自所有其他节点的 mnesia_down。这意味着它可以安全地加载其表。如果首先启动的其他一些节点(如您的情况)Mnesia 将无限期地等待另一个节点连接以加载其表

您首先关闭节点 1,因此它没有mnesia_down来自其他节点的。如果您颠倒关闭命令会发生什么?

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

force_load_table(Tab) -> yes | ErrorDescription

用于表加载的 Mnesia 算法可能会导致无法加载表的情况。当一个节点启动并且 Mnesia 断定或怀疑该表的另一个副本在此本地副本由于系统崩溃而变得不活动后处于活动状态时,就会发生这种情况。

如果这种情况不可接受,可以使用该函数覆盖 Mnesia 表加载算法的策略。这可能会导致某些事务效果因数据库不一致而丢失的情况,但对于某些应用程序而言,高可用性比一致的数据更重要。

于 2010-11-23T10:40:11.380 回答