我参加聚会的时间非常晚,但是在寻找解决同一问题的方法时,在文档中发现了以下信息:
“函数调用 mnesia:del_table_copy(schema, mynode@host) 从 Mnesia 系统中删除节点 'mynode@host'。如果 mnesia 在 'mynode@host' 上运行,则调用失败。其他 mnesia 节点永远不会尝试连接再次到那个节点。注意,如果节点'mynode@host'上有一个磁盘驻留模式,则应该删除整个mnesia目录。这可以通过mnesia:delete_schema/1来完成。如果mnesia在节点 'mynode@host' 并且目录尚未被清除,mnesia 的行为未定义。” (http://www.erlang.org/doc/apps/mnesia/Mnesia_chap5.html#id74278)
我认为以下内容可能会满足您的要求:
AllTables = mnesia:system_info(tables),
DataTables = lists:filter(fun(Table) -> Table =/= schema end,
AllTables),
RemoveTableCopy = fun(Table,Node) ->
Nodes = mnesia:table_info(Table,ram_copies) ++
mnesia:table_info(Table,disc_copies) ++
mnesia:table_info(Table,disc_only_copies),
case lists:member(Node,Nodes) of
true -> mnesia:del_table_copy(Table,Node);
false -> ok
end
end,
[RemoveTableCopy(Tbl,'gone@gone_host') || Tbl <- DataTables].
rpc:call('gone@gone_host',mnesia,stop,[]),
rpc:call('gone@gone_host',mnesia,delete_schema,[SchemaDir]),
RemoveTablecopy(schema,'gone@gone_host').
不过,我没有测试它,因为我的情况略有不同。