2012-04-14 12 views
11

ADVERTENCIA: la información de fondo es bastante larga. Salte al final si cree que necesita la pregunta antes de la información de fondo. ¡Aprecie el tiempo que esto tomará!¿Cuál es la forma correcta de hacer una copia de seguridad/restaurar una base de datos de mnesia?

He estado en la web (leer google) y no he encontrado una buena respuesta. SÍ, hay muchos enlaces y referencias a la documentación de Mnesia en el sitio erlang.org, pero incluso esos enlaces sufren de versión-itis.

Así que en el caso más simple donde el nodo() al que está conectado actualmente es el mismo que el propietario de la tabla, entonces la copia de seguridad/restauración va a funcionar. Por ejemplo:

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

¡Esto funciona muy bien!

Sin embargo, si la base de datos se está ejecutando en un nodo remoto() o un nodo remoto() en un acoplamiento remoto entonces usted tiene que iniciar la copia de seguridad de esta manera:

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

Por supuesto, esto era simple también. Ahora aquí están las cosas difíciles ...

  • Digamos que está tomando copias de seguridad diarias. Y el servidor de la base de datos de mnesia muere y se ve obligado a reemplazar el hardware. Si desea restaurar el DB tal como está, debe nombrar el NUEVO hardware con el mismo nombre que tenía anteriormente y también debe nombrar los nodos de la misma manera.
  • si desea cambiar el nombre del hardware y/o el nodo() ... o desea restaurar en una máquina diferente, entonces necesita pasar por el proceso node_change. (descrito here y en los documentos de mnesia)

Pero aquí es donde las cosas se complican. Mientras que conocidos míos, que son expertos en erlang y mnesia, sugieren que la replicación de mnesia es gravemente defectuosa y que no debería usarla (actualmente no hay alternativas que conozca y cuáles son las posibilidades de que implemente una mejor versión; probable)

Tiene dos nodos() que están replicando las tablas basadas en discos y discos. Ha estado manteniendo una política de copia de seguridad de la base de datos regularmente con la copia de seguridad estándar utilizando el BackupMod predeterminado. Y un día un gerente le pide que verifique las copias de seguridad. Sólo cuando se intenta restaurar la base de datos que se obtiene:

{atomic,[]} 

Y de acuerdo con la documentación, esto significa que no hubo errores ... y sin embargo, no se restauraron las tablas.

No desea ejecutar el procedimiento change_node, recuerda que el nodo() y el nombre de host deben coincidir, por lo que debe cambiar el nombre de host y el parámetro -sname para que coincida con la máquina donde se realizó la copia de seguridad. Esta vez, sin embargo, se obtiene un error extraño:

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

Aún no querer ejecutar el procedimiento change_node rápidamente clon restaurar mi servidor, de modo que tengo dos máquinas similares. Nombro apropiadamente para que coincida con los servidores de producción. Y comienzo el proceso de restauración. Eureka! Ahora tengo datos de trabajo reales en los servidores de restauración.

Me gustaría decir que este fue el final del camino ... pero aún no he hecho una pregunta y ese es el punto de SO ... ¿aquí está?

PREGUNTA: si quiero restaurar una copia de seguridad que fue tomada de un grupo de nodos Mnesia replicados, ¿cómo puedo modificar el archivo (similar al procedimiento change_node) para que los otros nodos son ignoradas o retirados de ¿la copia de seguridad?

Preguntado de manera ligeramente diferente: ¿Cómo restauro una base de datos mnesia replicada-multi-node() en un solo nodo()?

+0

También debería ver http://stackoverflow.com/questions/463400/how-to-rename-the-node-running-a-mnesia-database. –

Respuesta

7

creo que este problema cae en la categoría más amplia de preguntas Mnesia que están relacionados con un simple:

How do I rename a Mnesia node?

La primera y más sencilla solución, si su base de datos no es enorme, es utilizar el mnesia : función de copia de seguridad_traversa (ver Mnesia User guide). siguiente es un ejemplo de la guía del usuario Mnesia:

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

La parte más importante aquí es la manipulación de la {schema, db_nodes, Nodes} tupla que le permiten cambiar el nombre o reemplazar los nodos db.

Por cierto, he usado esa función en el pasado y una cosa que noté es que el formato de los términos de respaldo cambia entre las versiones de mnesia, pero tal vez fue simplemente yo escribiendo código incorrecto. Simplemente imprima un registro de respaldo para una pequeña base de datos de mnesia para verificar el formato del término de respaldo, si quiere estar seguro.

Espero que esto ayude!

+0

Tengo el texto y no dice nada sobre el respaldo o la restauración de un clúster de servidores de mnesia. – Richard

+0

Ha mencionado en su pregunta que conoce el ejemplo del nodo de cambio, que también está incluido en el documento que he señalado. Si entiendo correctamente su pregunta, en el mismo ejemplo puede ver que se examina la tupla {schema, db_nodes, Nodes}: esta tupla contiene los nodos registrados para la base de datos de Mnesia. –

+0

¡Ah! Me perdí eso en el código change_node. (su respuesta no dice nada al respecto, sin embargo, change_node() hubiera sido la respuesta correcta.) Gracias. – Richard

Cuestiones relacionadas