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 ocurrir 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. - La presencia de tablas intermedias que quedaron de las instrucciones
ALTER TABLEque ya no se usan ni a las que ya no se hace referencia en ninguna lógica de aplicación activa.
Tablas temporales huérfanas
Los nombres de las tablas temporales huérfanas comienzan con el #sql- prefijo, como #sql-123.
Usa la siguiente consulta para identificar las 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 las tablas temporales huérfanas sin ningún otro paso adicional. Esto aborda 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 DROP de la tabla anterior no funciona, es posible que otro ALTER TABLE reutilice el archivo de definición (.frm). En esos casos, se debe crear un archivo .frm de marcador de posición 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 Métodos de autoservicio
para ver los pasos de solución de 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 las tablas intermedias huérfanas:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';
Para quitar las tablas intermedias huérfanas, primero cambia el nombre de archivo de definición huérfano (.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 intermedias huérfanas, comunícate con el equipo de asistencia de Cloud SQL para obtener ayuda. Si no tienes un contrato de asistencia, consulta Métodos de autoservicio para ver los pasos de solución de problemas.
Tablas normales huérfanas
Una tabla InnoDB huérfana ocurre 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 de forma correcta. 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 tiene éxito, es probable que el archivo InnoDB (.ibd) requiera la 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 base de datos con CREATE DATABASE. Este último paso puede requerir tiempo de inactividad para las aplicaciones conectadas a la base de datos afectada.
Si no tienes un contrato de asistencia, consulta Métodos de autoservicio para ver los pasos de solución de 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, asegúrate de seguir primero los pasos que se indican en
Tablas temporales huérfanas. Si el comando DROP TABLE no tiene éxito, prueba las siguientes sugerencias.
Antes de comenzar
Te recomendamos que crees una copia de seguridad completa de la instancia para reducir el riesgo de pérdida de datos.
Para reducir la duración del posible 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 Clona instancias.
Descarta el esquema con la migración de objetos
La migración de objetos de base de datos es un proceso de varios pasos para mover objetos de base de datos, como tablas, a un esquema temporal:
- Crea una copia de seguridad de otros objetos de base de datos, incluidos los procedimientos, las funciones y las vistas.
- Descarta y vuelve a crear el esquema afectado.
- Importa los objetos de 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 la interrupción, 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 una copia de seguridad de otros objetos de base de datos, como procedimientos, funciones, vistas y cualquier otro
- Restablecer todos los objetos de base de datos al esquema original
Una vez que estas secuencias de comandos estén listas, completa los siguientes pasos:
- Crea un esquema temporal (ejemplo:
fix_orphan_tables) en la misma instancia. - Detén el tráfico de la aplicación en el esquema afectado.
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.
Crea una copia de seguridad de los objetos de 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.sqlRealiza los siguientes reemplazos:
USER: el nombre de usuarioPASSWORD: la contraseña de la base de datosHOST_IP: la dirección IP del hostDB: el nombre de la base de datos que deseas usar.
Te recomendamos que crees una copia de seguridad manual de las vistas con el
SHOW CREATE VIEWfragmento de código del comando.Descarta el esquema que contiene tablas huérfanas.
Crea el esquema con el nombre original.
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_NAMEpor el nombre de la tabla huérfana.Copia las tablas de nuevo al 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: el nombre de la base de datos que deseas usar.
Copia todos los objetos de base de datos de la copia de seguridad que se tomó en el paso 4.
mysql -u USER \ --password=PASSWORD \ -h <var>HOST_IP \ -D<var>DB < >varDB_export.sqlRealiza los siguientes reemplazos:
USER: el nombre de usuarioPASSWORD: la contraseña de la base de datosHOST_IP: la dirección IP del hostDB: el nombre de la base de datos que deseas usar.
Te recomendamos que restablezcas las vistas de forma manual volviéndolas a crear con la
CREATE VIEWinstrucción.Reanuda el tráfico de la aplicación 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, descartar 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 la interrupción, asegúrate de preparar todas las secuencias de comandos de copia de seguridad y restablecimiento con anticipación.
Una vez que estas secuencias de comandos estén listas, completa los siguientes pasos:
- Detén el tráfico de la aplicación en el esquema afectado.
- 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. - Descarta el esquema.
- Vuelve a crear el esquema y restablece el archivo de copia de seguridad.
- Reanuda el tráfico de la aplicación 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 un volcado y una carga lógicos. Cualquiera de los enfoques puede causar interrupciones en la aplicación y puede requerir que vuelvas 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.
Migra datos a una instancia nueva con Database Migration Service (DMS)
- Usa Database Migration Service para crear una nueva instancia de Cloud SQL para MySQL.
- 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.
- Promueve la instancia de Cloud SQL para MySQL de réplica.
- 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 manual
- Si creas una instancia de base de datos nueva, crea una instancia con la misma configuración que la instancia actual.
- Detén todo el tráfico de la aplicación en la instancia de base de datos actual.
- Crea una copia de seguridad de todos los esquemas con
mysqldumpo una utilidad similar. - Si usas la misma instancia, borra y vuelve a crear la instancia.
- Con la copia de seguridad que creaste en el tercer paso, restablece la copia de seguridad en la instancia nueva o en la misma instancia recreada.
- Haz que tus aplicaciones apunten a la instancia nueva o a la misma instancia recreada y reanuda las operaciones de la aplicación.