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



所以我得到了{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()]}表,则正确创建表。

验证通过application:set_env/3指定的助记符目录的父目录的写入权限。如果 mnesia dir 父目录不允许您写入,您将收到此错误。(出现此错误的另一种方法是完全忘记设置记忆膜目录,但您的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()]

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

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

来自记忆症文档:

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

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

相关内容

最新更新