Загрузка записей из дамп мнезии не пишет на диск
Перед тем, как начать этот проект, я определил, что моя БД была повреждена так, что все новые записи были вставлены как 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
,