【问题标题】:Cant setup Mnesia无法设置 Mnesia
【发布时间】:2011-12-06 20:59:01
【问题描述】:
setup_mnesia(Name) ->
    ?VALUE(application:start(mnesia)),
    ?VALUE(mnesia:create_schema([node()|[Name]])),
    ?VALUE(mnesia:create_table(muppet, [
                        {attributes, record_info(fields, muppet)},
                        {disc_copies, [foo@kos13]}])),
    ?VALUE(mnesia:wait_for_tables([muppet], infinity)),
    ok.

结果是

"应用程序:启动 (mnesia)" = ok

"mnesia : create_schema ([node () | [Name]])" = {​​error, {foo@kos13, {已经存在, foo@kos13}}}

"mnesia : create_table ( 木偶 , [ { 属性 , record_info ( 字段,布偶)},{ disc_copies,[foo@kos13]}])“= {中止, {坏类型, 木偶, 光盘副本, foo@kos13}}

已编辑,已添加 如果重写两个进程以在 mnesia:create_schema 之后调用 application:start 它会吐出“无法安装后备”。在当前目录中出现两个文件 - FALLBACK.BUP 和 foo@kos13131851070846165246847780。

【问题讨论】:

  • 答案中没有明确指出,但问题在于我对两个节点使用相同的目录。 两个节点可能永远不会共享同一个目录。

标签: erlang mnesia


【解决方案1】:

如果您的架构是ram_copies 类型,mnesia 不能允许任何其他表驻留在磁盘上,您在 ram_copies 架构中创建的所有表也将在 RAM 中。

另外,像这样指定一个 mnesia 目录:

erl -name MY_NODE_NAME -mnesia dir '"./Databases/MY_NODE_NAME_DATABASE"'

其中,./Databases/MY_NODE_NAME_DATABASE 必须是现有文件夹。在此之后,您可以按照文档创建架构和表。

如果您的架构在 RAM 中,您可以做的另一件事是函数:mnesia:change_table_copy_type(Table_name, On_which_Node, To_new_type). 将架构类型更改为 disc_copies 或 disc_only_copies 后,您也可以将表的类型更改为 disc。如果架构是通常的 disc_copies 类型,那么您可以拥有任何您想要的性质的表,无论是 RAM、Disc 还是 Disc_only_copies。

使用mnesia:delete_schema/1 可以删除不需要的模式,但使用此方法时要非常小心。

除此之外的任何事情,请参考mnesia users guide

【讨论】:

  • 对不起,但它在“mnesia:create_schema”处给出错误。这里没有关于创建表的内容。
  • 删除架构并重新创建架构。当存在现有模式时,Mnesia 不会创建模式。阅读用户指南
【解决方案2】:

我确实认为,由于您正在尝试创建 disc_copies 表,因此您需要在启动 erlang 节点时设置 mnesia 目录的位置。

erl -mnesia dir db_dir

编辑: 好的,我创建了自己的示例,并为您提供了更多信息,我将发布我运行的命令

运行你的 erlang 节点:

erl -sname mnesiatest -mnesia dir db

启动 mnesia 并检查信息

(mnesiatest@host)1> mnesia:start().
 ok
(mnesiatest@host)2> mnesia:info().
...
opt_disc. Directory "/home/user/test/db" is NOT used.
use fallback at restart = false
running db nodes   = [mnesiatest@host]
stopped db nodes   = []
master node tables = []
remote             = []
ram_copies         = [schema]
disc_copies        = []
disc_only_copies   = []
[{mnesiatest@host,ram_copies}] = [schema]

检查第三行,你会发现 "/home/user/test/db" 没有被使用。"

解决办法:

在开始 mnesia 之前,您必须创建模式,而不是相反。我知道这似乎不合逻辑,但就像先配置然后再开始。

所以你这样做:

 (mnesiatest@host)3> mnesia:stop().
  ...
 (mnesiatest@host)4> mnesia:create_schema([node()]).
 ok
 (mnesiatest@host)5> mnesia:start().
 ok
 (mnesiatest@host)6> mnesia:info().
  ...
  opt_disc. Directory "/home/user/test/db" is used. 
  ...

现在如果你运行 mnesia:create_table(...) 你应该成功了。 同样,如果您使用相同的目录重新启动节点,您将创建表并包含持久数据。

希望对您有所帮助。

【讨论】:

  • 感谢您的帮助,但我的问题源于两个节点。只有一个一切正常。
  • 如果您的节点运行良好,那么this 可能会有所帮助。
  • 你知道,这一切都在控制台上工作。将寻找我的故障。并感谢您的回答。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 2019-07-13
  • 2023-03-26
  • 2019-02-20
  • 2017-06-10
  • 2020-09-03
  • 2018-11-21
  • 1970-01-01
相关资源
最近更新 更多