Загрузка записей из дамп мнезии не пишет на диск

Перед тем, как начать этот проект, я определил, что моя БД была повреждена так, что все новые записи были вставлены как ram_copies вместо disc_copies.

Итак, я взял резервную копию:

mnesia:dump_to_textfile("fixerupper99.txt").

Я просмотрел текстовый файл и добавил атрибут disc_copies в раздел списка таблиц текстового файла.

В этот момент я остановил свое приложение и все дополнительные узлы. Я также удалил все файлы в Mnesia DIR.

rm DECISION_TAB.LOG LATEST.LOG schema.DAT *.DC[DL]

Он создал хороший файл, в котором было все. Схема и записи. После экспериментов я понял, что create table атрибуты для сохранения на диск {disc_copies, [metagate@KS0002]},

Шаги, которые я выполнил:

  • Mnesia: остановка ().
  • Mnesia:create_schema([узлы ()]).
  • Mnesia: старт ().
  • Mnesia: Информация ().

В этот момент все выглядело нормально, но пусто. Далее я начал загружать данные из дамп-файла. mnesia:load_textfile("fixerupper99.txt").

Я сразу проверил информацию mnesia:info(). и все было так, как я ожидал. Я тогда вышел erl и пошел посмотреть на папку, в которой я хранил данные о мнезии. Все файлы, которые я ожидал иметь disc_copies, существовали в папке, но все файлы были практически пустыми.

Ну, независимо от того, что я делаю, кажется, что файлы / таблицы все еще рассматриваются как ram_copies, и поэтому они не записываются на диск.

Я старался change_table_copy_type() но это не сработало правильно.

Mnesia: информация говорит, что мои файлы находятся на диске, но перезапуск приложения вызывает исчезновение всех данных. идеи?

2 ответа

Проблема была изолирована, когда я понял, что два узла в одной системе используют один и тот же Mnesia dir. В результате между узлами, вероятно, возникло состояние гонки, по существу препятствующее осуществлению чего-либо рационального.

Правильный метод изменения типа копии таблицы заключается в следующем:

% Assume we have a list of all the nodes in the mnesia cluster 
% (I assume you have more than one node)
Nodes = [node1, node2],
Table = some_table_name,

% You probably want to make the copy type change on all nodes
% (again, assuming you have more than one node)
lists:foreach(fun(Node) ->
  {atomic, ok} = mnesia:change_table_copy_type(Table, Node, disc_copies),
end, Nodes).

После запуска этого изменения mnesia:info/0 должен показать обновленные таблицы с правильным типом копии:

mnesia:info().

Обновить

Исправленный disk_copies в disc_copies,

Другие вопросы по тегам