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。
答案 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
。