Tablas huérfanas

En esta página se describen los problemas conocidos con las tablas huérfanas en MySQL.

¿Qué son las tablas huérfanas?

Las tablas huérfanas son tablas con definiciones desconectadas en los diccionarios de datos de MySQL y pueden producirse en MySQL 5.6 o MySQL 5.7. Cualquiera de los siguientes casos puede impedir que se actualice a una versión principal de MySQL 5.7 a MySQL 8.0:

  • La presencia de InnoDB archivos de datos (.ibd) sin los archivos de definición correspondientes (.frm) o viceversa.
  • La presencia de tablas intermedias que quedan de ALTER TABLE instrucciones que ya no se referencian ni se usan en ninguna lógica de aplicación activa.

Tablas temporales huérfanas

Los nombres de las tablas temporales huérfanas empiezan por el prefijo #sql-, como #sql-123.

Usa la siguiente consulta para identificar las tablas temporales huérfanas:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';

Puedes usar el comando DROP TABLE para eliminar tablas temporales huérfanas sin tener que seguir ningún otro paso. De esta forma, se solucionan la mayoría de los casos:

DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;

Sustituye DB por el nombre de la base de datos que quieras usar.

Por ejemplo, podría tener este aspecto:

DROP TABLE `testdb`.`#mysql50##sql-1234`;

Si el comando de tabla DROP anterior no funciona, es posible que otro comando ALTER TABLE reutilice el archivo de definición (.frm). En estos casos, es necesario crear un archivo de marcador de posición .frm en el disco para eliminar la tabla. Ponte en contacto con el equipo de Asistencia de Cloud SQL para obtener ayuda. Si no tienes un contrato de asistencia, consulta los métodos de autogestión para ver los pasos que debes seguir para solucionar el problema.

Tablas intermedias huérfanas

Los nombres de las tablas intermedias huérfanas empiezan por el prefijo #sql-ib, por ejemplo, #sql-ib23-343224.

Usa la siguiente consulta para identificar las tablas intermedias huérfanas:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';

Para eliminar las tablas huérfanas intermedias, primero cambia el nombre de archivo de la definición de huérfana (.frm) para que coincida con el nombre de la tabla y, a continuación, elimina la tabla desde la línea de comandos.

Para quitar las tablas huérfanas intermedias, ponte en contacto con el equipo de Asistencia de Cloud SQL. Si no tienes un contrato de asistencia, consulta los métodos de autogestión para ver los pasos que debes seguir para solucionar el problema.

Tablas normales huérfanas

Una tabla huérfana InnoDB se produce cuando su archivo de datos correspondiente (.ibd) permanece en el sistema de archivos, pero el diccionario de datos ya no hace referencia al archivo de datos correctamente. Este caso requiere una intervención manual.

Para solucionar este problema, póngase en contacto con el equipo de Asistencia de Cloud SQL. El equipo de Asistencia puede crear un archivo .frm de marcador de posición y, a continuación, usar un comando DROP TABLE para intentar quitar la tabla. Si no se consigue, es probable que el archivo InnoDB (.ibd) deba eliminarse manualmente del directorio de datos.

Una vez que se haya eliminado el archivo manualmente, podrá crear una copia de seguridad de todas las tablas y estructuras de la base de datos.

Elimina una base de datos con DROP DATABASE y crea una base de datos con CREATE DATABASE. Este último paso puede requerir un tiempo de inactividad para las aplicaciones conectadas a la base de datos afectada.

Si no tienes un contrato de asistencia, consulta los métodos de autogestión para ver los pasos que debes seguir para solucionar el problema.

Solución de problemas de autoservicio

Los siguientes métodos de solución de problemas de autoservicio implican eliminar o migrar toda la base de datos para quitar las tablas huérfanas cuando no funciona la eliminación de una tabla individual. Este método es disruptivo. Si tu organización tiene un contrato de asistencia, te recomendamos que te pongas en contacto con el equipo de Asistencia de Cloud SQL para obtener ayuda.

Para quitar las tablas temporales huérfanas, primero debes seguir los pasos que se indican en la sección Tablas temporales huérfanas. Si el comando DROP TABLE no funciona, prueba las siguientes sugerencias.

Antes de empezar

  • Te recomendamos que hagas una copia de seguridad completa de la instancia para reducir el riesgo de pérdida de datos.

  • Para reducir el tiempo de inactividad de la aplicación, te recomendamos que clones la instancia y verifiques los siguientes pasos de migración antes de completarlos en un entorno de producción.

    Para obtener más información, consulta Clonar instancias.

Eliminar un esquema mediante la migración de objetos

La migración de objetos de bases de datos es un proceso de varios pasos para mover objetos de bases de datos, como tablas, a un esquema temporal:

  1. Crea copias de seguridad de otros objetos de la base de datos, como procedimientos, funciones y vistas.
  2. Elimina y vuelve a crear el esquema afectado.
  3. Importa los objetos de la copia de seguridad al esquema original.

Este método de migración suele provocar un tiempo de inactividad de la aplicación. Para minimizar las interrupciones, prepara todas las secuencias de comandos necesarias con antelación. Por ejemplo, asegúrate de que tus secuencias de comandos estén preparadas para gestionar lo siguiente:

  • Cambiar el nombre de las tablas y moverlas a un esquema temporal.
  • Crear copias de seguridad de otros objetos de la base de datos, como procedimientos, funciones, vistas y otros.
  • Restaurar todos los objetos de la base de datos al esquema original.

Cuando las secuencias de comandos estén listas, sigue estos pasos:

  1. Crea un esquema temporal (por ejemplo, fix_orphan_tables) en la misma instancia.
  2. Detén el tráfico de aplicaciones en el esquema afectado.
  3. Mueve todas las tablas al esquema temporal con RENAME TABLE:

    RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;
    

    Haz las siguientes sustituciones:

    • DB: el nombre de la base de datos que quieras usar.
    • TABLE_NAME: el nombre de la tabla.
  4. Crea copias de seguridad de objetos de bases de datos, como vistas, rutinas, procedimientos almacenados, activadores y eventos. Una forma de hacerlo es usar mysqldump:

    mysqldump -u USER --password=PASSWORD \
      -h HOST_IP --set-gtid-purged=OFF --no-data --no-create-db  \
      --no-create-info --routines --triggers --skip-opt --events \
      DB > DB_export.sql
    

    Haz las siguientes sustituciones:

    • USER: el nombre de usuario.
    • PASSWORD: la contraseña de la base de datos.
    • HOST_IP: la dirección IP del host.
    • DB: el nombre de la base de datos que quieras usar.

    Te recomendamos que hagas una copia de seguridad manual de las vistas con el fragmento de código del comando SHOW CREATE VIEW.

  5. Elimina el esquema que contiene las tablas huérfanas.

  6. Crea el esquema con el nombre original.

  7. Verifica si se ha eliminado la tabla huérfana:

    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';
    

    Sustituye ORPHAN_TABLE_NAME por el nombre de la tabla huérfana.

  8. Copia las tablas en el esquema original:

    RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;
    

    Haz las siguientes sustituciones:

    • TABLE_NAME: el nombre de la tabla.
    • DB: el nombre de la base de datos que quieras usar.
  9. Copia todos los objetos de la base de datos de la copia de seguridad que has creado en el paso 4.

    mysql -u USER \
      --password=PASSWORD \
      -h <var>HOST_IP \
      -D<var>DB < <var>DB_export.sql
    

    Haz las siguientes sustituciones:

    • USER: el nombre de usuario.
    • PASSWORD: la contraseña de la base de datos.
    • HOST_IP: la dirección IP del host.
    • DB: el nombre de la base de datos que quieras usar.

    Te recomendamos que restaures las vistas manualmente creándolas de nuevo con la instrucción CREATE VIEW.

  10. Reanuda el tráfico de aplicaciones que hayas detenido anteriormente.

Eliminar un esquema mediante volcado y carga en la misma instancia

Otra forma de eliminar una tabla huérfana es realizar un volcado completo del esquema afectado, eliminar y volver a crear el esquema y, a continuación, restaurar el volcado. En algunos casos, este método puede ser más rápido y menos complejo. Para minimizar las interrupciones, asegúrate de preparar todas las secuencias de comandos de copia de seguridad y restauración con antelación.

Cuando las secuencias de comandos estén listas, sigue estos pasos:

  1. Detén el tráfico de aplicaciones en el esquema afectado.
  2. Crea una copia de seguridad del esquema en el que se encuentra la tabla huérfana, incluidos todos los procedimientos almacenados, los activadores, las vistas y los eventos, mediante mysqldump.
  3. Elimina el esquema.
  4. Vuelve a crear el esquema y restaura el archivo de copia de seguridad.
  5. Reanuda el tráfico de aplicaciones que se haya detenido en el primer paso.

Volcado y carga en una instancia nueva o recreada

En determinadas condiciones, no se puede eliminar el esquema que contiene la tabla huérfana. En estos casos, debe migrar a una nueva instancia o volver a crear la instancia actual mediante un volcado y una carga lógicos. Cualquiera de estos métodos puede provocar interrupciones en las aplicaciones y puede que tengas que volver a configurar tus aplicaciones para que apunten a la instancia de base de datos recién creada o recreada. En las siguientes secciones se describen ambos métodos.

Migrar datos a una instancia nueva con Database Migration Service (DMS)

  1. Usa Database Migration Service para crear una instancia de Cloud SQL para MySQL.
  2. Una vez que la instancia réplica haya terminado de replicar los datos asociados a la nueva instancia, detén las aplicaciones que se conecten a la instancia de origen.
  3. Promociona la instancia de réplica de Cloud SQL para MySQL.
  4. Cambia todas las conexiones de la aplicación para que apunten a la instancia de Cloud SQL para MySQL recién ascendida y reinicia las aplicaciones.

Volcado y restauración manuales

  1. Si vas a crear una instancia de base de datos, crea una con la misma configuración que la instancia actual.
  2. Detén todo el tráfico de aplicaciones en la instancia de base de datos actual.
  3. Crea una copia de seguridad de todos los esquemas con mysqldump o una utilidad similar.
  4. Si usas la misma instancia, elimínala y vuelve a crearla.
  5. Con la copia de seguridad que has creado en el tercer paso, restaura la copia de seguridad en la nueva instancia o en la misma instancia recreada.
  6. Dirige tus aplicaciones a la nueva instancia o a la misma instancia recreada y reanuda las operaciones de la aplicación.

Siguientes pasos

  1. Solución de problemas
  2. Actualizar la versión principal de la base de datos in situ