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://stackoverflow.com/questions/26868956/restore-table-structure-from-frm-and-ibd-files/48207488#48207488

https://github.com/abg/dbsake/


Versiones:

  • MySQL 10.4.21 (Maria DB)
  • Ubuntu
Consideraciones:
  • 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:

  1. Para el servicio de la base de datos.
  2. Hacer un respaldo de los archivos de la base de datos, por lo general se encuentran en: C:\xampp\mysql\data
  3. Instalar Linux, en mi caso Ubuntu.
  4. En el Linux, instalar dbsake (https://github.com/abg/dbsake/)
    1. $ curl -s http://get.dbsake.net > dbsake
    2. $ chmod u+x dbsake    // dar permisos de ejecución.
  5. Subir los archivos frm de la base de datos al Linux.
  6. Ejecutar dbsake para obtener las consultas que nos permitirán crear la estructura de nuestras tablas.
    1. $ ./dbsake frmdump --type-codes /backup/*.frm > mysqlSchemas.sql
  7. Verificar que el archivo mysqlSchemas.sql tenga las consultas de CREATE ATBLE.
  8. 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.
  9. En la nueva BBDD ejecutar el script mysqlSchemas.sql

Sección A: Para tablas engine InnoDB

  1. En la nueva BBDD ejecutar la consulta que nos permitirá quitar el IDB  para luego reemplazarlo por el IDB que queremos recuperar.
    1. ALTER TABLE `nombre_tabla` DISCARD TABLESPACE;
  2. 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.
    1. ALTER TABLE ....
  3. Ahora copiar el IDB a recuperar en la carpeta de la nueva BBDD creada
    1. cp /bakcup/nombre_tabla.idb /servidor/mysql/data/nombre_basedatos/nombre_tabla.idb
  4. Dar los permisos al archivo IDB
    1. chown mysql:mysql /servidor/mysql/data/nombre_basedatos/nombre_tabla.idb
  5. Ejecutar la siguiente consulta para volver asociar la la tabla al IDB.
    1. ALTER TABLE `nombre_tabla` IMPORT TABLESPACE;
  6. Verificar:
    1. SELECT * FROM nombre_tabla LIMIT 10;

Sección B: Para tablas engine Aria

  1. Se usa por lo general para restaurar las tablas donde se encuentran los procedimientos almacenados, funciones, eventos, disparadores de la base de datos MYSQL.
  2. Pausar el servicio de MYSQL.
  3. Borrar los archivos con extensión MAD y MAI de la tabla a recuperar de la ubicación donde esta instalado MYSQL
  4. Copiar los archivos MAD y MAI de la tabla desde la carpeta backup a la ubicación donde esta instalado MYSQL.
    1. cp /bakcup/nombre_tabla.mad /servidor/mysql/data/nombre_basedatos/nombre_tabla.mad
    2. cp /bakcup/nombre_tabla.mai /servidor/mysql/data/nombre_basedatos/nombre_tabla.mai
  5. Iniciar el servicio de MYSQL.
  6. Verificar:
    1. SELECT * FROM nombre_tabla LIMIT 10;


Sección C: Consulta para recuperar los Procedimientos Almacenados

  1. Consulta para generar los scripts de creación de los procedimientos almacenados desde la tabla proc de la base de datos mysql.

SELECT db, TYPE, 
    CONCAT('DELIMITER $$', '\n',
           'CREATE PROCEDURE ', `name`, '(', `param_list` , ') ', '\n',
           `body`, '$$\n',
           'DELIMITER ;', '\n') AS script
FROM 
    `proc`
WHERE db='nombre_basedatos'
AND TYPE='PROCEDURE'
-- and type='FUNCTION'


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