Restaurar la base de datos MySQL desde archivos físicos

139

¿Es posible restaurar una base de datos MySQL desde los archivos físicos de la base de datos? Tengo un directorio que tiene los siguientes tipos de archivos:

client.frm
client.MYD
client.MYI

pero por unas 20 mesas más.

Por lo general, uso mysqldump o una herramienta similar para obtener todo en 1 archivo SQL, entonces, ¿cuál es la forma de manejar este tipo de archivos?

Abdullah Jibaly
fuente
Tengo el mismo problema: múltiples archivos con extensiones FRM, MYD y MYI. También tengo los archivos ib_logfile0, ib_logfile1 e ibdata1. No puedo acceder a un servidor en ejecución o crear un volcado. Intenté ejecutar un nuevo servidor MySQL y usar los archivos, pero no tuve éxito ... ¿Alguien tiene un procedimiento claro?
flo5783

Respuestas:

132

Una tabla MySQL MyISAM es la combinación de tres archivos:

  • El archivo FRM es la definición de la tabla.
  • El archivo MYD es donde se almacenan los datos reales.
  • El archivo MYI es donde se almacenan los índices creados en la tabla.

Debería poder restaurarlos copiándolos en la carpeta de su base de datos (en Linux, la ubicación predeterminada es /var/lib/mysql/)

Debe hacerlo mientras el servidor no se está ejecutando.

Vincent
fuente
64
Esto es cierto solo para las tablas MyISAM. InnoDB almacena sus tablas e índices en un único espacio de tabla *, que por defecto consta de los 3 archivos ibdata1, ib_logfile0 e ib_logfile1. para restaurar una base de datos, también necesitaría esos archivos. * los espacios de tabla por tabla son posibles, pero no predeterminados
ax.
21
Dice que tiene archivos .frm .myi y .myd. Entonces supuse que eran tablas MyISAM.
Vincent
55
Respuesta valiosa, pero tuve que ir un paso más allá para que las cosas funcionen bien: como tenía que iniciar sesión como root para restaurar los archivos, el mysqlusuario que ejecutaba el mysqldproceso no podía acceder a ellos. Hacer un chmod -R mysql:mysql .en el directorio de datos mysql es rápido y fácil, pero antes de eso, descubrir por qué todas mis bases de datos resoterd parecía no tener tablas tomó un poco más de tiempo.
Edurne Pascual
10
herenvardo Creo que te refieres a chown no chmod
Oliver M Grech
2
Para recapitular algunas de las notas importantes, puede que tenga que chowncopiar los archivos así:sudo chown -R mysql:mysql /var/lib/mysql
Jacksonkr
50

De la respuesta de @Vicent, ya restauro la base de datos MySQL de la siguiente manera:

Paso 1. Apagar el servidor Mysql

Paso 2. Copie la base de datos en su carpeta de base de datos (en Linux, la ubicación predeterminada es / var / lib / mysql). Mantenga el mismo nombre de la base de datos y el mismo nombre de la base de datos en modo mysql.

sudo cp -rf   /mnt/ubuntu_426/var/lib/mysql/database1 /var/lib/mysql/

Paso 3: Cambia el modo propio y cambia la carpeta:

sudo chown -R mysql:mysql /var/lib/mysql/database1
sudo chmod -R 660 /var/lib/mysql/database1
sudo chown  mysql:mysql /var/lib/mysql/database1 
sudo chmod 700 /var/lib/mysql/database1

Paso 4: copie ibdata1 en la carpeta de su base de datos

sudo cp /mnt/ubuntu_426/var/lib/mysql/ibdata1 /var/lib/mysql/

sudo chown mysql:mysql /var/lib/mysql/ibdata1

Paso 5: copie los archivos ib_logfile0 e ib_logfile1 en la carpeta de su base de datos.

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile0 /var/lib/mysql/

sudo cp /mnt/ubuntu_426/var/lib/mysql/ib_logfile1 /var/lib/mysql/

Recuerde cambiar propio y cambiar la raíz de esos archivos:

sudo chown -R mysql:mysql /var/lib/mysql/ib_logfile0

sudo chown -R mysql:mysql /var/lib/mysql/ib_logfile1

o

sudo chown -R mysql:mysql /var/lib/mysql

Paso 6 (Opcional): mi sitio tiene configuración para almacenar archivos en una ubicación específica, luego los copio a la ubicación correspondiente, exactamente.

Paso 7: Inicie su servidor Mysql. Todo vuelve y disfrútalo.

Eso es.

Ver más información en: https://biolinh.wordpress.com/2017/04/01/restoring-mysql-database-from-physical-files-debianubuntu/

biolinh
fuente
44
+1 para obtener instrucciones detalladas paso a paso. Pero edité algunas declaraciones para reflejar realmente lo que deberían ser.
Peter
Tengo un error # 1932, no se puede acceder a los datos. Aparecen las bases de datos, pero no se puede acceder a los datos. Ejecutando XAMPP 7.2.12 en MAC OS X Mojave.
Steve1754a
@ Steve1754a el error puede por muchas razones 1. ¿Mueve una base de datos de Mac OS a Mac OS? 2. Verifique el permiso de esos archivos / datos / tabla
biolinh
Respuestas: 1. Sí; 2. Lo hice. Tuve que emprender una reconstrucción completa de mi DB. No se pudo encontrar una solución. Moraleja de la historia: siempre cree una copia de seguridad de la base de datos. Desearía que hubiera una manera fácil de hacerlo automáticamente en XAMPP.
Steve1754a
1
me salvaste la vida
SpongePablo
8

Si está restaurando la carpeta, no olvide poner los archivos en mysql: mysql; de lo

chown -R mysql:mysql /var/lib/mysql-data

contrario, obtendrá errores al intentar soltar una base de datos o agregar una nueva columna, etc.

y reiniciar MySQL

service mysql restart
Joel Davey
fuente
2
Esto no es realmente una respuesta a la pregunta, pero fue muy útil.
ryantuck
en realidad no deberías compartir todo con mysql, la carpeta de la base de datos mysql debería retener el grupo raíz
Galvani
8

Tengo el mismo problema pero no pude recuperar con éxito la base de datos, según las instrucciones anteriores.

Solo pude recuperar carpetas de la base de datos mysql de mi sistema operativo Ubuntu. Mi problema es cómo recuperar mi base de datos con esas carpetas de datos mysql ilegibles. Así que volví al sistema operativo win7 para el entorno de desarrollo.

* NOTA: Tengo un servidor de base de datos existente ejecutándose en win7 y solo necesito pocos archivos de base de datos para recuperar los archivos recuperados. Para recuperar con éxito los archivos de la base de datos del sistema operativo Ubuntu, necesito instalar recientemente el servidor de base de datos mysql (la misma versión del sistema operativo Ubuntu en mi sistema operativo win7) para recuperar todo en ese antiguo servidor de base de datos.

  1. Cree otra nueva versión del servidor de base de datos mysql con los archivos recuperados.

  2. Detenga el servidor mysql

  3. copie la carpeta recuperada y péguela en la base de datos mysql (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data).

  4. copie el archivo ibdata1 ubicado en la carpeta instalada de Linux mysql y péguelo en (C: \ ProgramData \ MySQL \ MySQL Server 5.5 \ data). Simplemente sobrescriba el existente o haga una copia de seguridad antes de reemplazarlo.

  5. inicie el servidor mysql y verifique si ha recuperado con éxito los archivos de la base de datos.

  6. Para usar la base de datos recuperada en mi servidor mysql actualmente utilizado, simplemente exporte la base de datos recuperada e impórtela en mi servidor mysql existente.

Espero que esto ayude, porque nada más funcionó para mí.

Ivan Igniter
fuente
1
El método también funciona en ubuntu / debian con los archivos ibdata1, ib_logfile0 e ib_logfile1 y la carpeta de la base de datos. el usuario no se copiará, pero luego puede agregar un nuevo usuario a la base de datos y volcarlo con eso.
bokorben
2

Con MySql 5.1 (Win7). Para recrear DBs (InnoDbs), he reemplazado todo el contenido de los siguientes directorios (my.ini params):

datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"
innodb_data_home_dir="C:/MySQL Datafiles/"

Después de eso comencé el servicio MySql y todo funciona bien.

sergey.olifirenko
fuente
1

¡Sí lo es! Simplemente agréguelos a su carpeta de base de datos (según el sistema operativo) y ejecute un comando como "Permisos de reparación de MySQL". Esto volvió a almacenar la base de datos. Observe también que también se establecen los permisos correctos en los archivos.

Filip Ekberg
fuente
Lo hice, pero no reconoce las tablas. Como dije en mi comentario sobre la respuesta anterior.
orezvani
0

Una vez copié estos archivos en la carpeta de almacenamiento de la base de datos para una base de datos mysql que funcionaba, inicié el db y esperé a que "reparara" los archivos, luego los extraje con mysqldump.

Spikolynn
fuente
-1

En mi caso, simplemente eliminar el tc.log en / var / lib / mysql fue suficiente para iniciar mariadb / mysql nuevamente.

SirJohnFranklin
fuente
Este no es un problema de poder iniciar / reiniciar el servidor mysql.
Oluwatumbi