我有两个运行mnesia的节点。我在节点1 上创建了模式和一些表,并在节点2 上使用mnesia:add_table_copy
将表从节点1复制到节点2
一切正常,直到我在节点1 上调用q()
,然后在节点2 上调用q()
。我发现当我再次启动节点1 时,mnesia:wait_for_tables([sometable], infinity)
将不会返回。它只会在我再次启动节点2 时返回。
有没有办法解决这个问题?这是一个问题,因为如果节点2 关闭,我将无法再次启动节点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表加载的策略 算法。这可能导致一个 一些交易的情况 效果会因不一致而丢失 数据库作为结果,但对于一些人 应用程序的高可用性更多 比一致的数据更重要。