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:
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:
-
Detenga MySQL.
service mysql stop
-
Elimine ib_logfile0 e ib_logfile1.
cd /var/lib/mysql; rm ib_logfile0 ib_logfile1
-
Elimina los archivos tblname. ADVERTENCIA: ESTO BORRARÁ PERMANTENTEMENTE SUS DATOS
cd /var/lib/mysql/dbname; rm tblname*
-
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).
-
tomar una copia de seguridad de
/var/lib/mysql
-
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
-
crear una nueva tabla (con un nuevo nombre) con el esquema exportado.
-
descartar nuevos datos de la tabla con este comando:
ALTER TABLE `tbl-new` DISCARD TABLESPACE;
- 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]
- importar datos a una nueva tabla.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
- ¡bien! tenemos datos en una nueva tabla y podemos eliminar la anterior.
DROP TABLE `tbl`;
- cheque
/var/lib/mysql/database-name
y si hay datos (.ibd
file) para la tabla anterior, elimínela.
rm tbl.ibd
- y finalmente cambie el nombre de la nueva tabla al nombre original
ALTER TABLE `tbl-new` RENAME `tbl`;