Tablas huérfanas

En esta página, se analizan 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 aparecer en MySQL 5.6 o MySQL 5.7. Cualquiera de las siguientes situaciones puede bloquear una actualización de versión principal (MVU) de MySQL 5.7 a MySQL 8.0:

  • La presencia de archivos de datos InnoDB (.ibd) sin archivos de definición correspondientes (.frm), o viceversa.
  • Presencia de tablas intermedias que quedaron de las sentencias ALTER TABLE 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 comienzan con el prefijo #sql-, como #sql-123.

Usa la siguiente consulta para identificar tablas temporales (temp) huérfanas:

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

Puedes usar el comando DROP TABLE para descartar tablas temporales huérfanas sin ningún otro paso adicional. Esto abarca la mayoría de los casos:

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

Reemplaza DB por el nombre de la base de datos que deseas usar.

Un ejemplo podría verse de la siguiente manera:

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

Si el comando de tabla DROP anterior no funciona, es posible que otra operación ALTER TABLE reutilice el archivo de definición (.frm). En esos casos, se debe crear un archivo de marcador de posición .frm en el disco para quitar la tabla. Comunícate con el equipo de asistencia de Cloud SQL para obtener ayuda. Si no tienes un contrato de asistencia, consulta los métodos de autoservicio para ver los pasos para solucionar problemas.

Tablas intermedias huérfanas

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

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

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

Para quitar 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, luego, descarta la tabla desde la línea de comandos.

Para quitar las tablas huérfanas intermedias, comunícate con el equipo de asistencia de Cloud SQL para obtener ayuda. Si no tienes un contrato de asistencia, consulta los métodos de servicio automático para ver los pasos para solucionar problemas.

Tablas normales huérfanas

Una tabla InnoDB huérfana 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. Esta situación requiere intervención manual.

Para resolver este problema, comunícate con el equipo de asistencia de Cloud SQL. El equipo de asistencia puede crear un archivo .frm de marcador de posición y, luego, usar un comando DROP TABLE para intentar quitar la tabla. Si no se realiza correctamente, es probable que el archivo InnoDB (.ibd) requiera una eliminación manual del directorio de datos.

Después de quitar el archivo de forma manual, puedes crear una copia de seguridad de todas las tablas y estructuras de la base de datos.

Descarta una base de datos con DROP DATABASE y crea una con CREATE DATABASE. Este último paso podría requerir 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 autoservicio para ver los pasos para solucionar problemas.

Solución de problemas de autoservicio

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

Para quitar las tablas temporales huérfanas, primero asegúrate de seguir los pasos que se indican en Tablas temporales huérfanas. Si el comando DROP TABLE no se ejecuta correctamente, prueba las siguientes sugerencias.

Antes de comenzar

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

  • Para ayudar a reducir la duración del posible tiempo de inactividad de la aplicación, recomendamos clonar la instancia y verificar los siguientes pasos de migración antes de completarlos en un entorno de producción.

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

Cómo soltar el esquema con 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, incluidos los procedimientos, las funciones y las vistas.
  2. Descarta y vuelve a crear el esquema afectado.
  3. Importa los objetos de la copia de seguridad al esquema original.

Por lo general, este método de migración provoca un tiempo de inactividad de la aplicación. Para minimizar las interrupciones, prepara todas las secuencias de comandos necesarias con anticipación. Por ejemplo, asegúrate de que tus secuencias de comandos estén listas para controlar 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
  • Se restablecen todos los objetos de la base de datos al esquema original.

Cuando las secuencias de comandos estén listas, completa los siguientes pasos:

  1. Crea un esquema temporal (por ejemplo, fix_orphan_tables) en la misma instancia.
  2. Detén el tráfico de la aplicación 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;
    

    Realiza los siguientes reemplazos:

    • DB: El nombre de la base de datos que deseas usar
    • TABLE_NAME: el nombre de la tabla.
  4. Copia de seguridad de objetos de la base 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
    

    Realiza los siguientes reemplazos:

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

    Te recomendamos que realices copias de seguridad de las vistas de forma manual con el fragmento de código del comando SHOW CREATE VIEW.

  5. Descarta el esquema que contiene tablas huérfanas.

  6. Crea el esquema con el nombre original.

  7. Verifica si se quitó la tabla huérfana:

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

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

  8. Copia las tablas de nuevo en el esquema original:

    RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;
    

    Realiza los siguientes reemplazos:

    • TABLE_NAME: el nombre de la tabla.
    • DB: Es el nombre de la base de datos que deseas usar.
  9. Copia todos los objetos de la base de datos de la copia de seguridad que se creó en el paso 4.

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

    Realiza los siguientes reemplazos:

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

    Te recomendamos que restablezcas las vistas de forma manual creándolas de nuevo con la declaración CREATE VIEW.

  10. Reanuda el tráfico de aplicaciones que detuviste anteriormente.

Descarta el esquema con volcado y carga en la misma instancia

Otra forma de quitar una tabla huérfana es realizar un volcado completo del esquema afectado, quitar y volver a crear el esquema, y, luego, restablecer el volcado. En algunas situaciones, este método puede ser más rápido y menos complejo. Para minimizar las interrupciones, asegúrate de preparar todos los scripts de copia de seguridad y restauración con anticipación.

Cuando las secuencias de comandos estén listas, completa los siguientes pasos:

  1. Detén el tráfico de la aplicación 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 con mysqldump.
  3. Descarta el esquema.
  4. Vuelve a crear el esquema y restablece el archivo de copia de seguridad.
  5. Reanuda el tráfico de aplicaciones que se detuvo en el primer paso.

Volcado y carga en una instancia nueva o recreada

En ciertas condiciones, no se puede descartar el esquema que contiene la tabla huérfana. En estos casos, debes migrar a una instancia nueva o volver a crear la instancia existente con una volcado y carga lógicos. Cualquiera de los dos enfoques puede causar interrupciones en la aplicación y podría requerir que vuelvas a configurar tus aplicaciones para que apunten a la instancia de la base de datos recién creada o recreada. En las siguientes secciones, se describen ambos métodos.

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

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

Volcado y restablecimiento manuales

  1. Si creas una instancia de base de datos nueva, 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. Haz una copia de seguridad de todos los esquemas con mysqldump o una utilidad similar.
  4. Si usas la misma instancia, bórrala y vuelve a crearla.
  5. Con la copia de seguridad que creaste en el tercer paso, restablécela en la instancia nueva o en la misma instancia recreada.
  6. Apunta tus aplicaciones a la instancia nueva o a la misma instancia recreada y reanuda las operaciones de la aplicación.

¿Qué sigue?

  1. Solución de problemas
  2. Actualiza la versión principal de la base de datos de manera local