Mnesia - 在指定存储策略时使用bad_type中止

时间:2016-12-19 15:07:31

标签: erlang mnesia

所以我得到{aborted,{bad_type,link,disc_copies, 'my_server@127.0.0.1'}}(由我的init_db/0函数返回):

-record(link, {hash, original, timestamp}).
init_db() ->
    application:set_env(mnesia, dir, "/tmp/mnesia_db"),
    mnesia:create_schema([node()]),
    mnesia:start(),
    mnesia:create_table( link,[
        {index,[timestamp]},
        {attributes, record_info(fields, link)},
        {disc_copies, [node()]}]).

没有正确创建{disc_copies, [node()]}表。

2 个答案:

答案 0 :(得分:3)

验证您通过application:set_env/3指定的mnesia目录的父目录的写权限。如果mnesia dir父目录不允许您编写,则会收到此错误。 (获得此错误的另一种方法是忘记完全设置mnesia目录,但是set_env调用显然正在这样做。)

更新:仔细查看报告的错误,我看到错误中提到的节点不在列表中:

  

{aborted,{bad_type,link,disc_copies,' my_server@127.0.0.1'}}

这可能意味着您在问题中显示的代码与实际运行的代码不匹配。具体来说,如果您调用mnesia:create_table/2传递节点而不是disc_copies元组中的节点列表,如下所示,您将得到同样的错误:

mnesia:create_table(link,[{index,[timestamp]},
                          {attributes, record_info(fields, link)},
                          {disc_copies, node()}]). % note no list here, should be [node()]

答案 1 :(得分:0)

您可能需要将schema表更改为disc_copies,这似乎会影响整个节点。

mnesia:change_table_copy_type(schema, node(), disc_copies)

来自mnesia文档:

  

此函数还可用于更改名为schema的表的存储类型。模式表只能将ram_copies或disc_copies作为存储类型。如果架构的存储类型为ram_copies,则该表上不能再有其他表驻留在磁盘上。

此后,您应该能够在节点上创建disc_copies表。