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()?
También debería ver http://stackoverflow.com/questions/463400/how-to-rename-the-node-running-a-mnesia-database. –