jaki jest właściwy sposób tworzenia kopii zapasowej / przywracania bazy danych mnesia?

OSTRZEŻENIE: informacje o tle są dość długie. Przejdź na dół, jeśli uważasz, że potrzebujesz pytania przed informacjami w tle. Doceń czas, jaki to zajmie!

Byłem w sieci (czytaj google) i nie znalazłem dobrej odpowiedzi. TAK, istnieje wiele linków i odniesień do dokumentacji Mnesii na stronie erlang.org, ale nawet te linki cierpią z powodu wersji-itis.

Tak więc w najprostszym przypadku, w którym węzeł (), z którym aktualnie jesteś połączony, jest taki sam jak właściciel zestawu tabel, wówczas kopia zapasowa / przywracanie będzie działać. Na przykład:

<code>$ erl -sname mydatabase

> mnesia:start().
> mnesia:create_schema(...).
> mnesia:create_table(...).
> mnesia:backup("/tmp/backup.bup").
> mnesia:restore("/tmp/backup.bup", [{default_op, recreate_tables}]).
</code>

Hej, to działa świetnie!

Jeśli jednak baza danych faktycznie działa na zdalnym węźle () lub zdalnym węźle () na zdalnym łączeniu, musisz zainicjować kopię zapasową w ten sposób:

<code>$ erl -sname mydbadmin

> rpc:call(mydatabase@host, mnesia, backup, ["/tmp/backup.bup"]).
> rpc:call(mydatabase@host, mnesia, restore, ["/tmp/backup.bup", [{default_op, recreate_tables}]]).
</code>

Oczywiście to też było proste. Teraz są trudne rzeczy ....

Powiedzmy, że robisz codzienne kopie zapasowe. A serwer bazy danych Mnesia umiera i jesteś zmuszony do wymiany sprzętu. Jeśli chcesz przywrócić bazę danych jako taką, musisz nazwać NOWY sprzęt o tej samej nazwie, która była poprzednio, a także musisz nazwać te same węzły.Jeśli chcesz zmienić nazwę sprzętu i / lub węzła () ... lub chcesz przywrócić na innym komputerze, musisz przejść przez proces node_change. (opisanetutaj iw dokumentach mnesia)

Ale tutaj sprawy się komplikują. Podczas gdy moi znajomi, którzy są ekspertami erlang i mnesia sugerują, że replikacja mnesii jest poważnie wadliwa i że nie powinieneś jej używać (obecnie nie ma alternatyw, które znam i jakie są szanse, że zamierzasz wdrożyć lepszą wersję; nie prawdopodobne)

Mamy więc dwa węzły (), które replikują tabele oparte na pamięci RAM i dyskach. Zachowujesz zasadę regularnego tworzenia kopii zapasowej bazy danych przy użyciu standardowej kopii zapasowej przy użyciu domyślnego BackupMod. A pewnego dnia menedżer prosi o sprawdzenie kopii zapasowych. Dopiero gdy spróbujesz przywrócić bazę danych, otrzymasz:

<code>{atomic,[]}
</code>

I zgodnie z dokumentacją oznacza to, że nie było błędów ... a mimo to nie przywrócono żadnych tabel.

Nie chcąc uruchamiać procedury change_node, pamiętaj, że węzeł () i nazwa hosta muszą być zgodne, aby zmienić nazwę hosta i parametr -sname, aby dopasować maszynę, na której dane zostały zarchiwizowane. Tym razem jednak pojawia się dziwny błąd:

<code>{aborted,{'EXIT',{aborted,{bad_commit,{missing_lock,mydatabase@otherhost}}}}}
</code>

Nadal nie chcę uruchamiać procedury change_node. Szybko klonuję przywracanie mojego serwera, dzięki czemu mam dwie podobne maszyny. Nazywam się wtedy odpowiednio do serwerów produkcyjnych. I zaczynam proces przywracania. Eureka! Mam teraz prawdziwe dane robocze na serwerach przywracania.

Chciałbym powiedzieć, że to był koniec drogi ... ale nie zadałem jeszcze pytania i że chodzi o to, że tak .... to jest?

PYTANIE: jeśli chcę przywrócić kopię zapasową pobraną z klastra replikowanych węzłów mnesia, jak zmodyfikować plik (podobnie jak w procedurze change_node), aby pozostałe węzły były ignorowane lub usuwane z kopii zapasowej?

Zapytany nieco inaczej: Jak przywrócić replikowaną bazę danych mnesia z wieloma węzłami () na pojedynczym węźle ()?

questionAnswers(2)

yourAnswerToTheQuestion