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()]}
таблица создана правильно.
3 ответа
Проверьте права на запись в родительском каталоге mnesia dir, через который вы указываете application:set_env/3
, Если родительский каталог mnesia dir не позволяет вам писать, вы получите эту ошибку. (Другой способ получить эту ошибку - забыть полностью установить mnesia dir, но ваш set_env
Звонок явно делает это.)
Обновление: более внимательно изучив сообщение об ошибке, я вижу узел, упомянутый в сообщении об ошибке, отсутствует в списке:
{прервано,{bad_type, ссылка,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)
Из документов mnesia:
Эту функцию также можно использовать для изменения типа хранения таблицы с именем schema. Таблица схемы может иметь только ram_copies или disc_copies в качестве типа хранения. Если тип хранения схемы - ram_copies, никакая другая таблица не может быть резидентной на этом узле.
После этого вы сможете создать disc_copies
таблицы на узле.
Я столкнулся с той же проблемой. я получил{aborted {bad_type,account,disc_copies,nonode@nohost}}
потому что я звонилmnesia:wait_for_tables
до создания схемы. Изменение порядка решило эту проблему для меня.