Saltar al contenido

MySQL InnoDB perdió tablas pero existen archivos

Solución:

Aquí es por qué MySQL no puede ver esos archivos: El espacio de tabla del sistema (ibdata1) tiene un diccionario de datos específico de Storage-Engine que permite a InnoDB mapear el uso potencial de la tabla:

Arquitectura InnoDB

Mover tablas InnoDB de un lugar a otro requiere comandos como

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

Aquí hay una parte de la documentación de MySQL 5.5 que explica lo que debe tenerse en cuenta

Consideraciones de portabilidad para archivos .ibd

No puede mover libremente archivos .ibd entre directorios de bases de datos como puede hacerlo con los archivos de tabla MyISAM. La definición de tabla almacenada en el espacio de tabla compartido de InnoDB incluye el nombre de la base de datos. Los ID de transacción y los números de secuencia de registro almacenados en los archivos de espacio de tabla también difieren entre las bases de datos.

Para mover un archivo .ibd y la tabla asociada de una base de datos a otra, use una instrucción RENAME TABLE:

CAMBIAR EL NOMBRE DE LA TABLA db1.tbl_name TO db2.tbl_name; Si tiene una copia de seguridad “limpia” de un archivo .ibd, puede restaurarla en la instalación de MySQL desde la que se originó de la siguiente manera:

La tabla no debe haberse eliminado o truncado desde que copió el archivo .ibd, porque al hacerlo, cambia el ID de la tabla almacenado dentro del espacio de tabla.

Emita esta instrucción ALTER TABLE para eliminar el archivo .ibd actual:

ALTER TABLE tbl_name DISCARD TABLESPACE; Copie el archivo .ibd de respaldo en el directorio de base de datos adecuado.

Emita esta instrucción ALTER TABLE para decirle a InnoDB que use el nuevo archivo .ibd para la tabla:

ALTER TABLE tbl_name IMPORT TABLESPACE; En este contexto, una copia de seguridad de un archivo .ibd “limpia” es aquella para la que se cumplen los siguientes requisitos:

No hay modificaciones no confirmadas por transacciones en el archivo .ibd.

No hay entradas de búfer de inserción no fusionadas en el archivo .ibd.

Purge ha eliminado todos los registros de índice marcados como eliminación del archivo .ibd.

mysqld ha vaciado todas las páginas modificadas del archivo .ibd del grupo de búferes al archivo.

Dadas estas advertencias y protocolos, aquí hay un curso de acción sugerido

Para este ejemplo, intentemos restaurar el tags mesa a la mydb base de datos

PASO 1

Asegúrese de tener copias de seguridad de esos .frm y .ibd archivos en /tmp/innodb_data

PASO 2

Consigue el CREATE TABLE tags declaración y ejecutarla como CREATE TABLE mydb.tags .... Asegúrese de que sea exactamente la misma estructura que el original tags.frm

PASO 3

Eliminar el vacío tags.ibd usando MySQL

ALTER TABLE mydb.tags DISCARD TABLESPACE;

PASO 4

Traiga la copia de seguridad de tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

PASO # 5

Agregar tags tabla al Diccionario de datos InnoDB

ALTER TABLE mydb.tags IMPORT TABLESPACE;

PASO 6

Prueba la accesibilidad de la mesa

SHOW CREATE TABLE mydb.tagsG
SELECT * FROM mydb.tags LIMIT 10;

Si obtiene resultados normales, felicidades por importar una tabla InnoDB.

PASO 7

En el futuro, no elimine ibdata1 y sus registros

Darle una oportunidad !!!

He hablado de cosas como esta antes

  • Apr 23, 2012 : MySQL: ¿cómo restaurar una tabla almacenada en un archivo .frm y .ibd?
  • Sep 28, 2011 : Cómo recuperar una tabla InnoDB cuyos archivos se movieron

CONSIDERACIÓN

¿Qué pasa si no conoce la estructura de la tabla del tags ?

Hay herramientas para obtener la declaración CREATE TABLE simplemente usando el .frm expediente. También escribí una publicación sobre esto: ¿Cómo puedo extraer el esquema de la tabla solo del archivo .frm? En esa publicación, copié un archivo .frm a una máquina con Windows desde una caja de Linux, ejecuté la herramienta de Windows y obtuve la CREATE TABLE declaración.

Tengo la misma situación, no puedo soltar o crear un tblname específico. Mi procedimiento de reparación es:

  1. Detenga MySQL.

    service mysql stop
    
  2. Elimine ib_logfile0 e ib_logfile1.

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Elimina los archivos tblname. ADVERTENCIA: ESTO BORRARÁ PERMANTENTEMENTE SUS DATOS

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. Inicie MySQL.

    service mysql start
    

También tuve este problema. Yo borré ibdata1 accidentalmente y todos mis datos se perdieron.

Después de 1-2 días de búsqueda en Google y SO, finalmente encontré una solución que me salvó la vida (tenía tantas bases de datos y tablas con registros enormes).

  1. tomar una copia de seguridad de /var/lib/mysql

  2. recuperar esquema de tabla de .frm archivo con dbsake (¡había otra opción! mysqlfrm. pero no funcionó para mí)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. crear una nueva tabla (con un nuevo nombre) con el esquema exportado.

  2. descartar nuevos datos de la tabla con este comando:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. copie los datos de la tabla anterior y péguelos en lugar de uno nuevo y establezca el permiso correcto para ello.
cp tbl.ibd [email protected] && chown mysql:mysql [email protected]
  1. importar datos a una nueva tabla.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. ¡bien! tenemos datos en una nueva tabla y podemos eliminar la anterior.
DROP TABLE `tbl`;
  1. cheque /var/lib/mysql/database-name y si hay datos (.ibd file) para la tabla anterior, elimínela.
rm tbl.ibd
  1. y finalmente cambie el nombre de la nueva tabla al nombre original
ALTER TABLE `tbl-new` RENAME `tbl`;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *