私はパーティーに非常に遅れていますが、同じ問題の解決策を探しているときにドキュメントでこの情報に出くわしました:
"関数呼び出しmnesia:del_table_copy(schema、mynode @ host)は、ノード'mynode@host'をMnesiaシステムから削除します。mnesiaが'mynode@ host'で実行されている場合、呼び出しは失敗します。他のmnesiaノードは接続を試みません。ノード'mynode@ host'にディスク常駐スキーマがある場合は、mnesiaディレクトリ全体を削除する必要があることに注意してください。これはmnesia:delete_schema/1で実行できます。ノード'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').
ただし、シナリオが少し異なるため、テストは行っていません。