从mnesia转储加载记录不写入磁盘

时间:2016-01-25 05:45:14

标签: erlang mnesia

在我开始这个项目之前,我确定我的数据库已经损坏,所有新记录都被插入为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]}

我遵循的步骤:

  • Mnesia的:停止()
  • 的Mnesia:create_schema([节点()])
  • Mnesia的:启动()
  • Mnesia的:信息()

此时一切看起来还不错,但是空的。接下来,我开始从dump-file加载数据。 mnesia:load_textfile("fixerupper99.txt").

我立即检查了信息mnesia:info().,一切都如我所料。然后我退出erl并查看我存储mnesia数据的文件夹。我希望在文件夹中存在disc_copies的所有文件,但所有文件实际上都是空的。

好吧,无论我做什么,似乎文件/表仍被视为ram_copies,因此它们不会被写入磁盘。

我尝试了change_table_copy_type(),但这无法正常使用。

Mnesia:info说我的文件在磁盘上,但重启应用程序会导致所有数据消失。想法?

2 个答案:

答案 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目录时,问题就被隔离了。因此,节点之间可能存在竞争条件,从根本上阻止任何理性发生。