不能设置Mnesia

Yol*_*ola 4 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.
Run Code Online (Sandbox Code Playgroud)

结果是

"application:start(mnesia)"= ok

"mnesia:create_schema([node()| [Name]])"= {error,{foo @ kos13,{already_exists,foo @ kos13}}}

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

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

Nun*_*tas 11

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

erl -mnesia dir db_dir
Run Code Online (Sandbox Code Playgroud)

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

运行你的erlang节点:

erl -sname mnesiatest -mnesia dir db
Run Code Online (Sandbox Code Playgroud)

启动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]
Run Code Online (Sandbox Code Playgroud)

检查第三行,你会看到"/ 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. 
  ...
Run Code Online (Sandbox Code Playgroud)

现在,如果您运行mnesia:create_table(...),您应该获得成功.同样,如果使用相同的dir重新启动节点,则将创建表并使用持久数据.

希望这有帮助.