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重新启动节点,则将创建表并使用持久数据.
希望这有帮助.
| 归档时间: |
|
| 查看次数: |
4155 次 |
| 最近记录: |