2011-10-13 99 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