2012-04-14 22 views
11

WARNUNG: Die Hintergrundinformationen sind ziemlich lang. Springe nach unten, wenn du denkst, dass du die Frage vor der Hintergrundinformation brauchst. Schätzen Sie die Zeit, die das dauert!Wie kann eine MNS-Datenbank gesichert/wiederhergestellt werden?

Ich war überall im Web (lesen Sie Google) und ich habe keine gute Antwort gefunden. JA, es gibt viele Links und Verweise auf die Mernia-Dokumentation auf der erlang.org-Seite, aber selbst diese Links leiden unter version-itis.

Also im einfachsten Fall, wo der Knoten(), mit dem Sie gerade verbunden sind, derselbe ist wie der Besitzer des Tabellensatzes, dann wird das Backup/Restore funktionieren. Zum Beispiel:

$ 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}]). 

Hey das funktioniert super!

Wenn jedoch die Datenbank tatsächlich auf einem entfernten Knoten() oder einen entfernten Knoten() auf einem entfernten Gegenlauf dann müssen Sie die Sicherung auf diese Weise einleiten:

$ erl -sname mydbadmin 

> rpc:call([email protected], mnesia, backup, ["/tmp/backup.bup"]). 
> rpc:call([email protected], mnesia, restore, ["/tmp/backup.bup", [{default_op, recreate_tables}]]). 

Natürlich ist dies einfach war auch. Jetzt hier sind die kniffligen Dinge ....

  • Nehmen wir an, dass Sie tägliche Backups nehmen. Und Sie MN-Datenbank-Server stirbt und Sie sind gezwungen, die Hardware zu ersetzen. Wenn Sie die DB unverändert wiederherstellen möchten, müssen Sie die NEUE Hardware mit demselben Namen benennen, den sie zuvor hatte, und Sie müssen die Knoten auch gleich benennen.
  • Wenn Sie den Namen der Hardware und/oder des Knotens() ändern möchten ... oder auf einem anderen Rechner wiederherstellen möchten, müssen Sie den Prozess node_change durchlaufen. (beschrieben here und in der mnesia docs)

Aber hier ist, wo die Dinge kompliziert werden. Meine Bekannten, die Erlang- und Mnesia-Experten sind der Meinung, dass die Replikation von Mnesien schwerwiegend ist und dass man sie nicht verwenden sollte (es gibt derzeit keine Alternativen, die ich kenne und welche Chancen es gibt, bessere Versionen zu implementieren; nicht wahrscheinlich)

Sie haben also zwei Nodes(), die RAM- und Disc-basierte Tabellen replizieren. Sie haben eine Richtlinie zur regelmäßigen Sicherung der Datenbank mit der Standard-Sicherung unter Verwendung des Standard-BackupMods beibehalten. Und eines Tages fordert ein Manager Sie auf, die Backups zu überprüfen. Nur wenn Sie die Datenbank wiederherstellen versuchen Sie bekommen:

{atomic,[]} 

Und nach der Dokumentation bedeutet dies, dass keine Fehler aufgetreten sind ... und doch wurden keine Tabellen wiederhergestellt.

Wenn Sie die change_node-Prozedur nicht ausführen möchten, erinnern Sie sich daran, dass node() und hostname übereinstimmen müssen, damit Sie den Hostnamen und den Parameter -sname an die Maschine anpassen, auf der die Daten gesichert wurden. Dieses Mal jedoch erhalten Sie einen seltsamen Fehler:

{aborted,{'EXIT',{aborted,{bad_commit,{missing_lock,[email protected]}}}}} 

Noch nicht wollen, die change_node Prozedur auszuführen ich meinen Server schnell wiederherstellen zu klonen, so dass ich zwei ähnliche Maschinen. Ich nenne dann passend die Produktionsserver. Und ich beginne den Wiederherstellungsprozess. Eureka! Ich habe jetzt echte Arbeitsdaten auf den Wiederherstellungsservern.

Ich möchte sagen, dass dies das Ende der Straße war ... aber ich habe noch keine Frage gestellt und das ist der Punkt von SO .... also hier ist es?

FRAGE: wenn ich ein Backup wiederherstellen möchten, die aus einem Cluster von replizierten Mnesia Knoten genommen wurde, wie kann ich die Datei (ähnlich dem change_node Verfahren) ändern, so dass die anderen Knoten werden entweder ignoriert oder entfernt von Die Sicherungskopie?

Etwas anders gefragt: Wie stelle ich eine replicated-multi-node() mnesia-Datenbank auf einem einzelnen Knoten() wieder her?

+0

Sollte auch http://stackoverflow.com/questions/463400/how-to-rename-the-node-running-a-mnesia-database sehen. –

Antwort

7

Ich denke, dass dieses Problem in der breiteren Kategorie von Mnesia Fragen fällt, die auf eine einfache Beziehung stehen:

How do I rename a Mnesia node?

Die erste und einfachste Lösung, wenn Ihr db nicht sehr groß ist, ist die Mnesia zu verwenden : traverse_backup-Funktion (siehe Mnesia User guide). Es folgt ein Beispiel aus der Mnesia Gebrauchsanweisung:

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). 

view(Source, Mod) -> 
    View = fun(Item, Acc) -> 
        io:format("~p.~n",[Item]), 
        {[Item], Acc + 1} 
      end, 
    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0). 

Das wichtigste hier Teil der Manipulation des {schema, db_nodes, Nodes} Tupel mit dem Sie die db Knoten umbenennen lassen oder ersetzen.

BTW, ich habe diese Funktion in der Vergangenheit verwendet und eine Sache, die ich bemerkte, ist, dass die Backup-Begriffe Format zwischen Mnesien-Versionen ändert, aber vielleicht war es einfach ich schreibe schlechten Code. Drucken Sie einfach ein Backup-Protokoll für eine kleine Mnesien-Datenbank, um das Format der Backup-Begriffe zu überprüfen, wenn Sie sicher sein wollen.

Hoffe, das hilft!

+0

Ich habe den Text und es sagt nichts über die Unterstützung oder Wiederherstellung eines Clusters von MNS-Servern. – Richard

+0

Sie haben in Ihrer Frage darauf hingewiesen, dass Sie das Beispiel für einen Änderungsknoten kennen, das auch in dem Dokument enthalten ist, auf das ich hingewiesen habe. Wenn ich Ihre Frage richtig verstanden habe, können Sie im selben Beispiel sehen, dass das Tupel {schema, db_nodes, Knoten} untersucht wird: Dieses Tupel enthält die für die Mnesia-Datenbank registrierten Knoten. –

+0

Ah! Das habe ich im Change_node-Code verpasst. (Ihre Antwort sagt nichts darüber aus, aber change_node() wäre die richtige Antwort gewesen.) Danke. – Richard