MYSQL: Recuperar base de datos mediante los archivos FRM, IDB, MAD, MAI
Fuentes:
https://medium.com/@dennis.garcia/recuperar-datos-desde-archivos-frm-ibd-de-mysql-server-ae88d5b9c0fc (El más útil)
https://www.youtube.com/watch?v=SqQaR-1Noso
https://www.youtube.com/watch?v=NngseaqS7jk&ab_channel=Mat%C3%ADasTato
https://www.youtube.com/watch?v=qeEAKVF33Y0&ab_channel=CodeForYou
https://downloads.mysql.com/archives/utilities/
https://github.com/abg/dbsake/
Versiones:
- MySQL 10.4.21 (Maria DB)
- Ubuntu
- Los pasos de la sección A aplican para tablas con engine InnoDB que tienen archivo FRM y IDB.
- Los pasos de la sección B aplican para tablas con engine Aria que tienen archivos FRM, MAD y MAI
- Comando para listar las tablas de una base de datos: SHOW TABLES;
- Las tablas en las que se encuentran:
- Procedimientos almacenados:
- SELECT * FROM mysql.proc WHERE type='PROCEDURE'
- Funciones:
- SELECT * FROM mysql.proc WHERE type='FUNCTION'
- SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION';
- Eventos:
- SELECT * FROM information_schema .event
- Vistas:
- SELECT * FROM information_schema .views
- Disparadores:
- SELECT * FROM information_schema .triggers
Pasos que me funcionaron:
- Para el servicio de la base de datos.
- Hacer un respaldo de los archivos de la base de datos, por lo general se encuentran en: C:\xampp\mysql\data
- Instalar Linux, en mi caso Ubuntu.
- En el Linux, instalar dbsake (https://github.com/abg/dbsake/)
- $ curl -s http://get.dbsake.net > dbsake
- $ chmod u+x dbsake // dar permisos de ejecución.
- Subir los archivos frm de la base de datos al Linux.
- Ejecutar dbsake para obtener las consultas que nos permitirán crear la estructura de nuestras tablas.
- $ ./dbsake frmdump --type-codes /backup/*.frm > mysqlSchemas.sql
- Verificar que el archivo mysqlSchemas.sql tenga las consultas de CREATE ATBLE.
- Iniciar el servicio de mysql y crear una nueva base de datos donde restauraremos la información. Asegurar que la base de datos tenga el mimo CHARSET y COLLATION que la base de datos original.
- En la nueva BBDD ejecutar el script mysqlSchemas.sql
Sección A: Para tablas engine InnoDB
- En la nueva BBDD ejecutar la consulta que nos permitirá quitar el IDB para luego reemplazarlo por el IDB que queremos recuperar.
- ALTER TABLE `nombre_tabla` DISCARD TABLESPACE;
- Deben eliminar/deshabilitar todos los KEY y UNIQUE de la tabla (en seccion D y E encontrarás ayuda), para que no les muestre el siguiente mensaje de error: #1815 - Internal error: Drop all secondary indexes before importing table onlinelogistics/users when .cfg file is missing.
- ALTER TABLE ....
- Ahora copiar el IDB a recuperar en la carpeta de la nueva BBDD creada
- cp /bakcup/nombre_tabla.idb /servidor/mysql/data/nombre_basedatos/nombre_tabla.idb
- Dar los permisos al archivo IDB
- chown mysql:mysql /servidor/mysql/data/nombre_basedatos/nombre_tabla.idb
- Ejecutar la siguiente consulta para volver asociar la la tabla al IDB.
- ALTER TABLE `nombre_tabla` IMPORT TABLESPACE;
- Verificar:
- SELECT * FROM nombre_tabla LIMIT 10;
Sección B: Para tablas engine Aria
- Se usa por lo general para restaurar las tablas donde se encuentran los procedimientos almacenados, funciones, eventos, disparadores de la base de datos MYSQL.
- Pausar el servicio de MYSQL.
- Borrar los archivos con extensión MAD y MAI de la tabla a recuperar de la ubicación donde esta instalado MYSQL
- Copiar los archivos MAD y MAI de la tabla desde la carpeta backup a la ubicación donde esta instalado MYSQL.
- cp /bakcup/nombre_tabla.mad /servidor/mysql/data/nombre_basedatos/nombre_tabla.mad
- cp /bakcup/nombre_tabla.mai /servidor/mysql/data/nombre_basedatos/nombre_tabla.mai
- Iniciar el servicio de MYSQL.
- Verificar:
- SELECT * FROM nombre_tabla LIMIT 10;
Sección C: Consulta para recuperar los Procedimientos Almacenados
- Consulta para generar los scripts de creación de los procedimientos almacenados desde la tabla proc de la base de datos mysql.
Sección D: Consulta para generar los script de creación de índices de las tablas
SELECT DISTINCT CONCAT('ALTER TABLE `', TABLE_NAME, '` ADD ',
CASE WHEN non_unique = 1 THEN 'INDEX' ELSE 'UNIQUE INDEX' END,
' `', index_name, '` (`', GROUP_CONCAT(COLUMN_NAME ORDER BY seq_in_index), '`);') AS script
FROM information_schema.statistics
WHERE table_schema = 'nombre_basedatos'
AND index_name <> 'PRIMARY'
GROUP BY TABLE_NAME, index_name, non_unique;
Sección E: Consulta para generar los script de eliminación de índices de las tablas
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` DROP INDEX `', index_name, '`;') AS script
FROM information_schema.statistics
WHERE table_schema = 'nombre_basedatos'
AND index_name <> 'PRIMARY'
ORDER BY TABLE_NAME, index_name;
Comentarios
Publicar un comentario
Incluye información que aporte al tema