在我开始这个项目之前,我确定我的数据库已经损坏,所有新记录都被插入为ram_copies而不是disc_copies。
所以我做了一个备份:
mnesia:dump_to_textfile("fixerupper99.txt").
我浏览了文本文件,并将disc_copies属性添加到文本文件的表格列表部分。
此时我停止了我的应用程序和所有额外节点。我还删除了mnesia目录中的所有文件。
rm DECISION_TAB.LOG LATEST.LOG schema.DAT *.DC[DL]
它生成了一个包含所有内容的好文件。架构和记录。在进行实验后,我意识到它缺少create table
属性来保存到磁盘{disc_copies, [metagate@KS0002]}
。
我遵循的步骤:
此时一切看起来还不错,但是空的。接下来,我开始从dump-file加载数据。 mnesia:load_textfile("fixerupper99.txt").
我立即检查了信息mnesia:info().
,一切都如我所料。然后我退出erl
并查看我存储mnesia数据的文件夹。我希望在文件夹中存在disc_copies的所有文件,但所有文件实际上都是空的。
好吧,无论我做什么,似乎文件/表仍被视为ram_copies,因此它们不会被写入磁盘。
我尝试了change_table_copy_type()
,但这无法正常使用。
Mnesia:info说我的文件在磁盘上,但重启应用程序会导致所有数据消失。想法?
答案 0 :(得分:0)
更改表格副本类型的正确方法是执行以下操作:
% Assume we have a list of all the nodes in the mnesia cluster
% (I assume you have more than one node)
Nodes = [node1, node2],
Table = some_table_name,
% You probably want to make the copy type change on all nodes
% (again, assuming you have more than one node)
lists:foreach(fun(Node) ->
{atomic, ok} = mnesia:change_table_copy_type(Table, Node, disc_copies),
end, Nodes).
运行此更改后mnesia:info/0
应显示更新的表,并使用正确的副本类型:
mnesia:info().
<强>更新强>
已将disk_copies
更正为disc_copies
。
答案 1 :(得分:0)
当我意识到同一系统上的两个节点使用相同的Mnesia目录时,问题就被隔离了。因此,节点之间可能存在竞争条件,从根本上阻止任何理性发生。