2011-10-13 96 views
3
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, [[email protected]]}])), 
    ?VALUE(mnesia:wait_for_tables([muppet], infinity)), 
    ok. 

结果是广东话设置的Mnesia

“应用:启动(Mnesia的)”= OK

“的Mnesia:create_schema([节点()| [名称]])”= {错误, {FOO @ kos13, {ALREADY_EXISTS, FOO @ kos13}}}

“的Mnesia:CREATE_TABLE(布偶,[{属性,record_info( 个字段,布偶)},{disc_copies,[富@ kos13]}])” = {中止, {bad_type, 布偶, disc_copies, FOO @ kos13}}

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

+0

答案并不那么清楚,但问题在于我为两个节点使用相同的目录。 **两个节点可能永远不会共享相同的目录** – Yola

回答

3

如果您的模式是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

+0

对不起,但它给了一个错误在“mnesia :create_schema“。这里没有关于表格创建的信息。 – Yola

+1

删除模式并重新创建模式。当存在模式时,Mnesia不会创建模式。 –

10

我的确认为,因为您正在尝试制作disc_copies表,您需要在启动erlang节点时设置mnesia目录的位置。

erl -mnesia dir db_dir 

编辑: 好吧,我创造了我自己的例子,我有一点点更多信息给你,我会发布的命令,我跑

运行你的Erlang节点:

erl -sname mnesiatest -mnesia dir db 

开始的Mnesia并为您的信息

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

检查第三行,你看到“/ home/user中/测试/ DB”不使用“

的解决方案:

启动Mnesia之前,你必须创建架构,而不是其他方式。我知道这似乎不符合逻辑,但是首先像配置,然后从第二个开始。

所以你做的事:

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

现在,如果你运行的Mnesia:CREATE_TABLE(...),你应该有所成就。 同样,如果使用相同的目录重新启动节点,则将创建表并使用持久数据。

希望得到这个帮助。

+0

看起来像它不帮助((。 – Yola

+1

)做了一些测试,并编辑了相应的答案 –

+0

感谢您的帮助,但我的问题源于两个节点。所有工作正常。 – Yola