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

问题描述 投票:0回答:3

所以我得到

{aborted,{bad_type,link,disc_copies, '[email protected]'}}
(它由我的
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()]}
表已正确创建。

erlang mnesia
3个回答
3
投票

验证您通过

application:set_env/3
指定的 mnesia 目录的父目录的写入权限。如果 mnesia dir 父目录不允许您写入,您将收到此错误。 (出现此错误的另一种方法是忘记完全设置 mnesia dir,但您的
set_env
调用显然就是这样做的。)

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

{已中止,{bad_type,link,disc_copies,'[电子邮件受保护]'}}

这可能意味着您在问题中显示的代码与实际运行的代码不匹配。具体来说,如果您调用

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()]

0
投票

您可能需要将

schema
表更改为
disc_copies
,这似乎会影响整个节点。

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

来自 mnesia 文档:

该函数还可以用于更改名为schema的表的存储类型。 schema表只能使用ram_copies或disc_copies作为存储类型。如果模式的存储类型是 ram_copies,则没有其他表可以驻留在该节点上的磁盘上。

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

disc_copies
表。


0
投票

我也遇到了同样的问题。 我收到了

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

© www.soinside.com 2019 - 2024. All rights reserved.