不能设置Mnesia

时间:2011-10-13 10:59:39

标签: erlang mnesia

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.

结果是

  

“application:start(mnesia)”= ok ok

     

“mnesia:create_schema([node()| [Name]])”= {error,                                                           {FOO @ kos13,                                                            {已经存在,                                                             FOO @ kos13}}}

     

“mnesia:create_table(muppet,[{attributes,record_info(   fields,muppet)},{disc_copies,[foo @ kos13]}])“= {aborted,                                                                                                                                  {bad_type,                                                                                                                                   布偶,                                                                                                                                   disc_copies,                                                                                                                                   FOO @ kos13}}

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

2 个答案:

答案 0 :(得分:11)

我确实认为,因为您正在尝试创建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(...),您应该会成功。 再次,如果您使用相同的目录重新启动节点,您将创建表并使用持久数据。

希望得到这个帮助。

答案 1 :(得分:4)

如果您的架构是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_copies类型,则可以使用任何性质的表,无论是RAM,Disc还是Disc_only_copies。

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

除此之外,请参阅 mnesia users guide