Не могу настроить Mnesia - PullRequest
       11

Не могу настроить Mnesia

4 голосов
/ 13 октября 2011
setup_mnesia(Name) ->
    ?VALUE(application:start(mnesia)),
    ?VALUE(mnesia:create_schema([node()|[Name]])),
    ?VALUE(mnesia:create_table(muppet, [
                        {attributes, record_info(fields, muppet)},
                        {disc_copies, [foo@kos13]}])),
    ?VALUE(mnesia:wait_for_tables([muppet], infinity)),
    ok.

результат

"приложение: старт (мнезия)" = нормально

"mnesia: create_schema ([node () | [Name]])" = {error, {Foo @ kos13, {уже существует, Foo @ kos13}}}

"mnesia: create_table (muppet, [{attribute, record_info ( fields, muppet)}, {disc_copies, [foo @ kos13]}]) "= {aborted, {Bad_type, Muppet, disc_copies, Foo @ kos13}}

отредактировано, добавлено если переписать оба процесса для вызова приложения: запустите после mnesia: create_schema, оно выдаст «Невозможно установить запасной вариант». В текущем каталоге появляются два файла - FALLBACK.BUP и foo@kos13131851070846165246847780.

Ответы [ 2 ]

11 голосов
/ 13 октября 2011

Я думаю, что, поскольку вы пытаетесь создать таблицу disc_copies, вам нужно указать местоположение каталога mnesia при запуске узла erlang.

erl -mnesia dir db_dir

Редактировать: Хорошо, я создал свойсобственный пример, и у меня есть немного больше информации для вас, и я буду публиковать команды, которые я выполнил

Запустите ваш узел erlang:

erl -sname mnesiatest -mnesia dir db

Запустите mnesia и проверьте информацию

(mnesiatest@host)1> mnesia:start().
 ok
(mnesiatest@host)2> mnesia:info().
...
opt_disc. Directory "/home/user/test/db" is NOT used.
use fallback at restart = false
running db nodes   = [mnesiatest@host]
stopped db nodes   = []
master node tables = []
remote             = []
ram_copies         = [schema]
disc_copies        = []
disc_only_copies   = []
[{mnesiatest@host,ram_copies}] = [schema]

Проверьте третью строку, и вы увидите, что "/ home / user / test / db" НЕ используется. "

Решение:

Перед запуском mnesia вы должны создать схему, а не наоборот. Я знаю, что это не кажется логичным, но похоже на первый конфиг и второй старт.

Итак, вы делаете:

 (mnesiatest@host)3> mnesia:stop().
  ...
 (mnesiatest@host)4> mnesia:create_schema([node()]).
 ok
 (mnesiatest@host)5> mnesia:start().
 ok
 (mnesiatest@host)6> mnesia:info().
  ...
  opt_disc. Directory "/home/user/test/db" is used. 
  ...

Теперь, если вы запустите mnesia: create_table (...), вы должны иметь успех. Опять же, если вы перезапустите узел с тем же каталогом, у вас будет создана таблица с постоянными данными.

Надеюсьэта помощь.

4 голосов
/ 13 октября 2011

Если ваша схема имеет тип ram_copies, mnesia не может разрешить размещение любой другой таблицы на диске, все таблицы, созданные в схеме ram_copies, также будут в ОЗУ.

Еще одна вещь, укажите Mnesia Dir, как это:

erl -name MY_NODE_NAME -mnesia dir '"./Databases/MY_NODE_NAME_DATABASE"'

Где, ./Databases/MY_NODE_NAME_DATABASE должна быть существующей папкой. После этого вы можете создать свою схему и таблицы в соответствии с документацией.

Еще одна вещь, которую вы можете сделать, если ваша схема находится в ОЗУ, это функция: mnesia:change_table_copy_type(Table_name, On_which_Node, To_new_type). После изменения типа схемы на disc_copies или disc_only_copies, вы также можете изменить тип ваших таблиц на disc. Если схема относится к типу disc_copies, как обычно, вы можете иметь таблицы любой природы по вашему выбору, будь то RAM, Disc или Disc_only_copies.

С помощью mnesia:delete_schema/1 можно избавиться от нежелательных схем, но будьте очень осторожны с этим методом.

Любая вещь, кроме этого, пожалуйста, обратитесь к mnesia users guide.

...