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

0ve6wy6x  于 2023-10-14  发布在  Erlang
关注(0)|答案(3)|浏览(228)

所以我得到了{aborted,{bad_type,link,disc_copies, ' [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) '}}(它是由我的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()]}表是正确创建的。

fcy6dtqo

fcy6dtqo1#

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

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

{已中止,{bad_type,link,disc_copies,'email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)'}}
这可能意味着您在问题中显示的代码与实际运行的代码不匹配。具体来说,如果调用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()]
x6yk4ghg

x6yk4ghg2#

我也遇到了同样的问题。我收到了{aborted {bad_type,account,disc_copies,nonode@nohost}},因为我在模式创建之前调用了mnesia:wait_for_tables。改变顺序解决了这个问题。

mqkwyuun

mqkwyuun3#

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

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

来自Mnesia文档:
此函数还可以用于更改名为schema的表的存储类型。架构表只能将ram_copies或disc_copies作为存储类型。如果模式的存储类型是ram_copies,则没有其他表可以驻留在该节点上。
在此之后,您应该能够在节点上创建disc_copies表。

相关问题