restaurar tabla de .frm y .ibd?

36

Anteriormente he guardado una copia del directorio / var / lib / mysql / ddms ("ddms" es el nombre del esquema). Ahora instalé un nuevo MySQL en un Ubuntu 10.04.3 LTS recién instalado al ejecutar apt-get install mysql-server, creo que se instaló la versión 5.1. Después de copiar el directorio ddms en / var / lib / mysql, algunas de sus tablas funcionan bien, estas son las tablas con un conjunto asociado de tres archivos: un archivo .frm, un archivo .MYD y un archivo .MYI.

Sin embargo, hay dos tablas con un conjunto diferente de archivos: un archivo .frm y un archivo .ibd. Estas dos tablas no aparecieron en la lista de tablas en phpMyAdmin. Cuando miro el registro de errores, dice:

[ERROR] Cannot find or open table ddms/dictionary_item from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?
or, the table contains indexes that this version of the engine
doesn't support.

Por favor, ayuda con la restauración de estas dos tablas. Gracias.

Tong Wang
fuente
Esta cita del 23 y 12 de abril por Rolando todavía es válida hoy. "Copiar los archivos .frm y .ibd de una ubicación a otra es un problema". Utilice alternativas como mysqldump para obtener sus datos antiguos en un formulario que pueda cargarse como estaba planeado hace años. También conocido como respaldo.
Wilson Hauck

Respuestas:

37

Las tablas InnoDB no se pueden copiar de la misma manera que las tablas MyISAM.

Solo copiar los archivos .frm y .ibd de una ubicación a otra es un problema. Copiar el archivo .frm y .ibd de una tabla InnoDB solo es bueno si y solo si puede garantizar que el id del espacio de tabla del archivo .ibd coincida exactamente con la entrada de id del espacio de tabla en los metadatos del archivo ibdata1 .

Escribí dos publicaciones en DBA StackExchange sobre este concepto de id de espacio de tabla

Aquí hay un excelente enlace sobre cómo volver a adjuntar cualquier archivo .ibd a ibdata1 en caso de id. De espacio de tabla no coincidentes: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Después de leer esto, debe darse cuenta inmediatamente de que copiar archivos .ibd es simplemente una locura.

Puede aplicar las sugerencias desde el enlace del Calendario Chris, o puede volver a la antigua instalación de mysql, iniciar mysql y luego mysqldump la ddmsbase de datos. Luego, importe ese mysqldump en su nueva instancia de mysql. Confía en mí, esto sería mucho más fácil.

RolandoMySQLDBA
fuente
Entonces, una sola tabla podría no ser una buena idea, pero ¿qué pasa con una base de datos completa en ese momento? Tenía mi tabla de usuario fallando y tuve que hacer un --inicializar en mysqld. ¿Puedo copiar toda la carpeta de la base de datos InoDB de la carpeta data_backup?
FMaz008
Rolando, por si me puedes ayudar: serverfault.com/q/908988/224334
Ionică Bizău
Tu publicación How to Recover an InnoDB table whose files were moved around literalmente me salvó la vida. Muchas gracias.
Paulo Griiettner
20

Recientemente experimenté este mismo problema. Estos son los pasos que utilicé para resolverlo sin tener que perder el tiempo con la id de tablespace como RolandoMySQLDBA menciona anteriormente. Estoy en una Mac y, por lo tanto, utilicé MAMP para restaurar la base de datos a un punto donde podría exportarla en un volcado de MySQL.

Puede leer la publicación completa del blog aquí: http://www.quora.com/Jordan-Ryan/Web-Dev/How-to-Recover-innoDB-MySQL-files-using-MAMP-on-a-Mac

Debes tener:

-ibdata1

-ib_logfile0

-ib_logfile1

-.FRM archivos de su carpeta mysql_database

-Instalación fresca de MAMP / MAMP Pro que está dispuesto a destruir (si es necesario)

  1. SSH en su servidor web (desarrollo, producción, sin diferencia) y busque su carpeta mysql (la mía estaba en / var / lib / mysql para una instalación de Plesk en Linux)
  2. Comprime la carpeta mysql
  3. Descargue un archivo de la carpeta mysql que debe contener todas las bases de datos mySQL, ya sea MyISAM o innoDB (puede scp este archivo, o moverlo a un directorio descargable, si es necesario)
  4. Instalar MAMP (Mac, Apache, MySQL, PHP)
  5. Vaya a / Aplicaciones / MAMP / db / mysql /
  6. Copia de seguridad / Aplicaciones / MAMP / db / mysql en un archivo zip (por si acaso)
  7. Copie en todas las carpetas y archivos incluidos en el archivo de la carpeta mysql desde el servidor de producción (entorno mt Plesk en mi caso) EXCEPTO NO SOBRESCRIBIR:

    - / Aplicaciones / MAMP / db / mysql / mysql /

    - / Aplicaciones / MAMP / db / mysql / mysql_upgrade_info

    - / Aplicaciones / MAMP / db / mysql / performance_schema

  8. Y listo, ahora debería poder acceder a las bases de datos desde phpMyAdmin, ¡qué alivio!

Pero no hemos terminado, ahora debe realizar un mysqldump para restaurar estos archivos a su entorno de producción, y la interfaz phpmyadmin agota el tiempo de espera para grandes bases de datos. Sigue los pasos aquí:

http://nickhardeman.com/308/export-import-large-database-using-mamp-with-terminal/

Copiado a continuación para referencia. Tenga en cuenta que en una instalación MAMP predeterminada, la contraseña es "root".

Cómo ejecutar mysqldump para MAMP usando Terminal

BASE DE DATOS DE EXPORTACIÓN DESDE MAMP [1]

Paso uno: abra una nueva ventana de terminal

Paso dos: navegue a la instalación de MAMP ingresando la siguiente línea en el terminal cd / aplicaciones / MAMP / library / bin Presione la tecla enter

Paso tres: escriba el comando de volcado ./mysqldump -u [USERNAME] -p [DATA_BASENAME]> [PATH_TO_FILE] Presione la tecla Intro

Ejemplo:

./mysqldump -u root -p wp_database > /Applications/MAMP/htdocs/symposium10_wp/wp_db_onezero.sql

Consejo rápido: para navegar a una carpeta rápidamente, puede arrastrar la carpeta a la ventana del terminal y escribirá la ubicación de la carpeta. Fue un gran día cuando alguien me mostró esto.

Paso cuatro: esta línea de texto debe aparecer después de presionar enter Ingresar contraseña: así que adivina qué, escribe tu contraseña, ten en cuenta que las letras no aparecerán, pero están ahí Presiona la tecla enter

Paso cinco: Verifique la ubicación donde almacenó su archivo, si está allí, ÉXITO Ahora puede importar la base de datos, que se describirá a continuación.

Ahora que tiene una exportación de su base de datos mysql, puede importarla en el entorno de producción.

jordan8037310
fuente
1
Todavía funciona a partir de 2018. Esta respuesta es oro. La parte importante para mí es el # 7, esos son los archivos que absolutamente debes mantener (no se menciona en ningún otro lado en soluciones similares, gracias por eso @jordan).
Bigood
@Bigood me alegra que siga ayudando!
jordan8037310
obtener la tabla de error 1146 no existe al hacer el volcado
Robert Sinclair
15

He recuperado mis archivos MySQL 5.5 * .ibd y * .frm con MySQL Utilites y MariaDB 10.

1) Generando Crear SQLs.
Puede obtener su creación de sql del archivo frm. Debe usar: https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html

shell> mysqlfrm --server = root: pass @ localhost: 3306 c: \ MY \ t1.frm - -port = 3310 De

otra manera, puede hacer que cree sql's.

2) Crea tus tablas
Crea tus tablas en la base de datos.

3) alterar tabla xxx descartar espacio de tabla
Deseche sus tablas que desea reemplazar sus archivos * .ibd.

4) Copie sus archivos * .ibd (MySQL o MariaDB) a la ruta de datos de MariaDB.
Primero trato de usar MySQL 5.5 y 5.6 para restaurar, pero la base de datos se bloquea e inmediatamente se detiene por un error de id. ( ERROR 1030 (HY000): Recibí el error -1 del motor de almacenamiento )
Después de haber usado MariaDB 10.1.8, y he recuperado con éxito mis datos.

5) alter table xxx import tablespace
Cuando ejecuta esta declaración, MariaDB advierte sobre el archivo pero no es importante que recuperar sus datos :) La base de datos aún continúa y puede ver sus datos.

Espero que esta información te sea útil.

Ecd
fuente
1
Esto funcionó para mí. Aunque mysqlfrm(las versiones probadas 1.3.5 y 1.6.5 con MySQL 5.6 y 5.7) no dieron la CREATEdefinición correcta , incluso cuando se usa MySQL 5.7 ( el valor predeterminado ROW_FORMAT cambió en MySQL 5.7.9 ) lo que resulta Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)al importar el espacio de tabla. Agregar manualmente ROW_FORMAT=compactal final de la CREATEdeclaración hizo el truco.
Jānis Elmeris
@ JānisElmeris> Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick.Eso también funcionó para mí. ¡Gracias! 👍
Synetech
3

He tenido exactamente el mismo problema solo teniendo los archivos como copia de seguridad.

Lo que hice para resolverlo fue copiar los archivos de la base de datos en / var / lib / mysql / yourdb y el ibdata1 que se encuentra en / var / lib / mysql.

Luego pude verificar que podía acceder a las tablas mysql -u root -p dbname y consultar algunas de las tablas que estaban dañadas anteriormente.

Luego volqué la base de datos con mysqldump -u root -p [root_password] [database_name]> dumpfilename.sql

mar
fuente
2

Si está utilizando MAMP y no puede hacer que MySQL se inicie después de copiar sus archivos, lo puse innodb_force_recovery = 2dentro my.iniy luego pude hacer que mysql se iniciara y exportara mi db.

Peter Wakeman
fuente
1

Si puede restaurar el archivo * .ibd en el servidor MySQL original, no olvide restaurar también los derechos de acceso al archivo. En mi caso (MySQL8 en CentOS7), restauré el archivo a /var/lib/mysql/db/tablename.ibd y ejecuté:

chown mysql tablename.ibd
chgrp mysql tablename.ibd
chmod 0640 tablename.ibd

Antes de corregir los derechos de acceso, el acceso a la tabla dio como resultado el error "El servidor MySQL 2006 se ha ido". Después de corregir los derechos de acceso, la tabla funcionó (incluso sin reiniciar el servicio mysqld).

Samuraj
fuente
0

He recopilado publicaciones de temas similares (cuyas respuestas no se publicaron aquí):

solución 1: https://dba.stackexchange.com/a/59978

solución 2: https://dba.stackexchange.com/a/71785 (+ otra publicación allí)

solución 3: kit de recuperación para tablas: https://twindb.com/how-to-recover-innodb-dictionary/

solución 4: Recupere la base de datos MySQL de la carpeta de datos sin ibdata1 de los archivos ibd

solución 5: usando el mysqlfrmcomando

solución 6: https://dba.stackexchange.com/a/159001

solución 7: https://dba.stackexchange.com/a/144573

T.Todua
fuente
Esto parece sospechosamente como una respuesta de solo enlace.
mustaccio
Debido a que todos los enlaces son de nuestro propio sitio, no es probable que desaparezcan, así que estoy de acuerdo con esto @mustaccio
jcolebrand
3
Esto no parece agregar mucho valor, dado que la mayoría de estos también aparecen en la lista "Relacionado" pocos píxeles a la derecha.
mustaccio
@jcolebrand gracias por ser despreocupado. mucha gente no puede ver la utilidad incluso de tales respuestas "no directas". Solo pueden detectar la ruptura de las reglas.
T.Todua
1
No, pero debes entender que tiene razón. No agregaste ningún valor. Estaba respondiendo con un juicio de reglas, sin tolerar su respuesta. En realidad es una respuesta bastante mala.
jcolebrand
0

Solo quiero agregar una cosa más para los usuarios de macos El Capitan. Las utilidades MySQL no son compatibles con esta versión, por lo que el comando mysqlfrm no es útil. Lo que hice fue recuperar las estructuras de mi tabla con dbsake como se muestra en este enlace: https://www.percona.com/blog/2015/12/16/recovering-table-structure-from-frm-files-using-dbsake/

Todo lo que necesitas hacer es instalar dbsake:

# curl -s http://get.dbsake.net > dbsake
# chmod u+x dbsake

luego use el comando frmdump y proporcione la ruta a su archivo .frm:

# ./dbsake frmdump /var/lib/mysql/sakila/staff.frm

obtendrá la declaración de creación. Una vez que he hecho esto, simplemente seguí los pasos 2 a 5 ya mencionados por @Ecd. Espero que ayude a alguien.

usuario2804064
fuente
0

Realmente aprecio Ecd. Lo que funcionó para mí:

1.- que tenía una copia de seguridad de la base hace unos meses esto me ayudó a levantar esta copia de seguridad en XAMPP en Windows 10 y crear las tablas para tener la estructura (configuración: Windows 10, XAMPP-windows-x64-7.1.30- 5-VC14) mysql my.ini configuración archivo al final

NOTE: Some tables did not have ROW_FORMAT = COMPACT, so I went to operations on each 
    table and changed it manually.
    (If I did not do that, an error appeared and I did not let the import).

NOTE2: I had the backup of months ago but it should also work by first recovering 
    the structure of the .frm files in case of not having a backup at hand.
    (You can try this link:
    https://www.percona.com/blog/2014/01/02/recover-table-structure-frm-files-mysql- 
    utilities/)

2.- Tener la base de datos antigua, me puse a ejecutar alter table xxx descarte de tabla para cada tabla en la base de datos que quería recuperar, a continuación, los archivos .ibd de la carpeta de datos en C: / xampp / mysql / datos / sistemas había sido eliminado (en este caso, es este camino)

3.- procedí a copiar los archivos de la base de datos .ibd quería recuperar a la carpeta xampp de la antigua base de datos

4.- Tener los archivos copiados, ejecute: Modificar tabla xxx de tablas de importación para cada tabla en la base de datos, aparecerá una advertencia, pero vamos a ignorarlo, los datos se cargan en la tabla y se pueden exportar más tarde.

5.- exportar toda la base de datos en un archivo sql y proceder a construir en la producción y el éxito!

# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# You can copy this file to
# C:/xampp/mysql/bin/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is C:/xampp/mysql/data) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client] 
# password       = your_password 
port            = 3306 
socket          = "C:/xampp/mysql/mysql.sock"


# Here follows entries for some specific programs 

# The MySQL server
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 160M
max_allowed_packet = 300M
sort_buffer_size = 1204K
net_buffer_length = 80K
read_buffer_size = 512K
read_rnd_buffer_size = 1024K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"

# Change here for bind listening
# bind-address="127.0.0.1" 
# bind-address = ::1          # for ipv6

# Where do all the plugins live
plugin_dir = "C:/xampp/mysql/lib/plugin/" 

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
# commented in by lampp security
#skip-networking
#skip-federated

# Replication Master Server (default)
# binary logging is required for replication
# log-bin deactivated by default since XAMPP 1.4.11
#log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id   = 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin


# Point the following paths to different dedicated disks
#tmpdir = "C:/xampp/tmp"
#log-update = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 40M
#bdb_max_lock = 10000

# Comment the following if you are using InnoDB tables
#skip-innodb
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
#innodb_log_arch_dir = "C:/xampp/mysql/data"
## You can set .._buffer_pool_size up to 50 - 80 %
## of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 50M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 600

## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
#collation_server=utf8_unicode_ci
#character_set_server=utf8
#skip-character-set-client-handshake
#character_sets-dir="C:/xampp/mysql/share/charsets"
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION
log_bin_trust_function_creators = 1

[mysqldump]
quick
max_allowed_packet = 160M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Espero que ayude a alguien que tiene esta situación, saludos.

Inglés proporcionada por Google

Yersskit
fuente