Как переименовать узел, на котором запущена база данных mnesia

Я создал базу данных / схему Mnesia на машине1. Узел был назван mypl @ machine1. Затем я переместил все файлы на машину2, потому что машина1 вышла из строя. Все работает нормально, пока код работает с именем «mypl @ machine1». Очевидно, это несколько сбивает с толку, потому что теперь он работает на machine2.

Если я запустил Erlang с именем узла «mypl @ machine2», база данных Mnesia окажется пустой.

Как мне переименовать узел в базе данных Mnesia с машины1 на машину2?


person max    schedule 20.01.2009    source источник


Ответы (2)


Я не думаю, что это можно сделать онлайн на одном узле (кто угодно?), Но это можно сделать с помощью резервного копирования / восстановления в дополнение к запуску двух узлов и добавлению копий таблиц. В разделе 6.9.1 Руководства пользователя Mnesia вы найдете код, который использует mnesia: traverse_backup для изменения имен узлов в таблице схемы (показано ниже) в файле резервной копии mnesia. Имя модуля, которое вам, вероятно, следует использовать, - mnesia_backup.

С помощью этого кода вам необходимо:

%% On mypl@machine1
mnesia:backup("/path/to/mnesia.backup").
change_node_name(mnesia_backup, mypl@machine1, mypl@machine2,
                 "/path/to/mnesia.backup", "/path/to/new.mnesia.backup").
%% On mypl@machine2
mnesia:restore("/path/to/new.mnesia.backup", []).

Я не уверен, нужно ли сначала создать схему на mypl@machine2.

Код изменения имени узла из руководства пользователя:

change_node_name(Mod, From, To, Source, Target) ->
    Switch =
        fun(Node) when Node == From -> To;
           (Node) when Node == To -> throw({error, already_exists});
           (Node) -> Node
        end,
    Convert =
        fun({schema, db_nodes, Nodes}, Acc) ->
                {[{schema, db_nodes, lists:map(Switch,Nodes)}], Acc};
           ({schema, version, Version}, Acc) ->
                {[{schema, version, Version}], Acc};
           ({schema, cookie, Cookie}, Acc) ->
                {[{schema, cookie, Cookie}], Acc};
           ({schema, Tab, CreateList}, Acc) ->
                Keys = [ram_copies, disc_copies, disc_only_copies],
                OptSwitch =
                    fun({Key, Val}) ->
                            case lists:member(Key, Keys) of
                                true -> {Key, lists:map(Switch, Val)};
                                false-> {Key, Val}
                            end
                    end,
                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
           (Other, Acc) ->
                {[Other], Acc}
        end,
    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
person archaelus    schedule 21.01.2009
comment
Я выполнил шаги, но не смог восстановить, есть предложения? 1. сделайте резервную копию исходной базы данных 2. измените имя узла 3. скопируйте bak на другую машину 4. восстановите новый файл резервной копии Сообщение об ошибке: {aborted, {'EXIT', {aborted, {bad_commit, {missing_lock, 'web_server] @anothernode '}}}}} - person Zhenguo Yang; 24.07.2016

Обходной путь - миграция. Просто запустите кластер mnesia и перенесите все свои таблицы и схему на другой узел. Потом удалил из оригинала и забыл.

person Hynek -Pichi- Vychodil    schedule 21.01.2009