【问题标题】:loading records from mnesia dump is not writing to disk从 mnesia 转储加载记录未写入磁盘
【发布时间】:2016-05-01 08:45:50
【问题描述】:

在我开始这个项目之前,我确定我的数据库已损坏,因此所有新记录都作为 ram_copies 而不是 disc_copies 插入。

所以我做了备份:

mnesia:dump_to_textfile("fixerupper99.txt").

我浏览了文本文件并将 disc_copies 属性添加到文本文件的表列表部分。

此时我停止了我的应用程序和所有额外的节点。我还删除了 mnesia 目录中的所有文件。

rm DECISION_TAB.LOG LATEST.LOG schema.DAT *.DC[DL]

它生成了一个包含所有内容的好文件。架构和记录。经过实验,我意识到它缺少用于持久保存到磁盘 {disc_copies, [metagate@KS0002]}create table 属性。

我遵循的步骤:

  • mnesia:stop().
  • mnesia:create_schema([nodes()]).
  • mnesia:start().
  • mnesia:info().

此时一切看起来都还不错。但是是空的。接下来我开始从转储文件中加载数据。 mnesia:load_textfile("fixerupper99.txt").

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

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

我尝试了change_table_copy_type(),但没有正常工作。

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

【问题讨论】:

  • 您能解释一下当您尝试拨打mnesia:change_table_copy_type/3 时发生了什么吗?你收到错误了吗?或者它根本没有改变mnesia:info/0的输出?
  • 另外,您能否提供有关 Mnesia 集群中节点的更多信息?他们都在一台机器上吗?它们都正确连接了吗?你能 ping 通他们吗?

标签: erlang mnesia


【解决方案1】:

更改表格副本类型的正确方法是执行以下操作:

% 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

【讨论】:

  • disc_copies 不是 disk_copies
  • 您是说将 {disc_copies, [metagate@KS0002]} 添加到加载文件的架构部分不起作用吗?通过我的实验,包括删除所有 DCD、DCL、LOG 和模式文件,我能够让 load_textfile() 将表设置为 disc_copies。在一些测试中,我尝试了 change_table_copy_type,虽然它改变了 mnesia:info() 中的类型 (1) 写入表的操作从未写入磁盘 (2) 记录计数从未增加。您能否参考表明这是最好的课程的文档?谢谢。
  • 我不知道更改架构文件的架构部分是否有效。我不认为对 Mnesia 中的文件进行手动更改会记录在任何地方。 mnesia modules API 有很好的文档记录,应该优于其他方法。我并不是说它不起作用,只是据我所知,更改表格副本类型的方法没有记录。不确定你是否看过这个,但它确实谈到了change_table_copy_typeerlang.org/doc/apps/mnesia/Mnesia_chap5.html
  • 文档确实讨论了文本文件的文件格式,除了仅用于教育目的。
【解决方案2】:

当我意识到同一系统上的两个节点使用相同的 Mnesia 目录时,问题就解决了。因此,节点之间可能存在竞争条件,基本上阻止了任何合理的事情发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 2013-08-12
    • 2017-07-28
    • 2014-02-20
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多