systemadmin.es > DBA > Recuperación de una tabla InnoDB sin borrar la actual

Recuperación de una tabla InnoDB sin borrar la actual

Anteriormente ya vimos que podemos recuperar los datos de una tabla InnoDB mediante DISCARD TABLESPACE / IMPORT TABLESPACE. El problema viene cuando queremos recuperar la tabla manteniendo la tabla anterior.

Para el el caso de MyISAM es tan simple como copiar del backup los ficheros frm, MYD y MYI con otro nombre, pero esto no nos va a servir para InnoDB.

Una opción, en el caso que el parámetro innodb_file_per_table este habilitado, es levantar otro MySQL en otro puerto únicamente con los datos mínimos para recuperar dicha tabla. Para ello deberemos crear el datadir en cualquier otro punto del sistema con:

  • ibdata1: Contiene el diccionario con datos de todas las tablas InnoDB
  • ib_logfile0 y ib_logfile1: Contienen buffers y logs necesarios para InnoDB
  • mysql (y su contenido): Base de datos con los permisos para el MySQL

En el nuevo datadir deberemos añadir los ficheros .frm y idb de la tabla que queremos restaurar y ya tendremos la instancia lista para arrancarla.

Para ello simplemente deberemos modificar las siguientes opciones, que podemos pasar por parámetro al mysqld para sobrescribirlas:

  • –datadir: El directorio que hemos creado con la tabla a resturar
  • –pid-file: Fichero que almacenará el PID del nuevo daemon que vamos a levantar
  • –port: Nuevo puerto que escuchará el MySQL con la tabla restaurada
  • –socket: Nuevo socket que escuchará el mysqld

Además para no pisar los fichero deberíamos cambiar los ficheros de logs:

  • –log-error: Log de errores de MySQL
  • –slow_query_log_file: Log de slow queries, no es deseable que se mezclen

El comando de arranque del MySQL para resturar la tabla quedaría:

/usr/local/mysql/libexec/mysqld --datadir=/var/restore \
                                --user=mysql \
                                --pid-file=/var/mysql/mysqld2.pid \
                                --port=3307 --socket=/tmp/mysql2.sock \
                                --log-error=/var/log/mysql/mysqld2.log \
                                --slow_query_log_file=/var/log/mysql/mysqld-slow2.log

A continuación simplemente deberíamos usar esta instancia de MySQL para consultar los datos que nos interesen.

3 comments to “Recuperación de una tabla InnoDB sin borrar la actual”

  1. ¿Recomiendas en tablas InnoDB tener activado innodb_file_per_table?

  2. Sí, por un lado esta lo de la recuperación de una única tabla y por otro esta el tema que el ibdata no se puede reducir. Me parece mucho más práctico tener el innodb_file_per_table a 1

  3. ¿Basta con cambiar la configuración de innodb_file_per_table a 1 y reiniciar? ¿Al reiniciar se crean todos los ficheros o hay que hacer algo más?
    Saludos

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>