Questa pagina illustra i problemi noti relativi alle tabelle orfane in MySQL.
Che cosa sono le tabelle orfane?
Le tabelle orfane sono tabelle con definizioni disconnesse nei dizionari di dati MySQL e possono verificarsi in MySQL 5.6 o MySQL 5.7. Uno dei seguenti scenari può bloccare un upgrade della versione principale (MVU) da MySQL 5.7 a MySQL 8.0:
- La presenza di file di dati
InnoDB(.ibd) senza i file di definizione corrispondenti (.frm) o viceversa. - La presenza di tabelle intermedie rimaste dalle istruzioni
ALTER TABLEche non sono più referenziate o utilizzate da alcuna logica applicativa attiva.
Tabelle temporanee orfane
I nomi delle tabelle temporanee orfane iniziano con il #sql- prefisso, ad esempio #sql-123.
Utilizza la seguente query per identificare le tabelle temporanee (temp) orfane:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';
Puoi utilizzare il comando DROP TABLE per eliminare le tabelle temporanee orfane senza ulteriori passaggi. Questo risolve la maggior parte dei casi:
DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;
Sostituisci DB con il nome del database che vuoi utilizzare.
Un esempio potrebbe essere il seguente:
DROP TABLE `testdb`.`#mysql50##sql-1234`;
Se il comando DROP table precedente non funziona, il file di definizione (.frm) potrebbe essere riutilizzato da un'altra operazione ALTER TABLE. In questi casi, è necessario creare un file .frm segnaposto sul disco per rimuovere la tabella. Contatta
l'assistenza Cloud SQL per ricevere aiuto.
Se non hai un contratto di assistenza, consulta Metodi self-service
per i passaggi di risoluzione dei problemi.
Tabelle intermedie orfane
I nomi delle tabelle intermedie orfane iniziano con il prefisso #sql-ib, per
esempio, #sql-ib23-343224.
Utilizza la seguente query per identificare le tabelle intermedie orfane:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';
Per rimuovere le tabelle orfane intermedie, modifica prima il nome del file di definizione orfano (.frm) in modo che corrisponda al nome della tabella, quindi elimina la tabella dalla riga di comando.
Per rimuovere le tabelle orfane intermedie, contatta il team di assistenza Cloud SQL per ricevere aiuto. Se non hai un contratto di assistenza, consulta Metodi self-service per i passaggi di risoluzione dei problemi.
Tabelle normali orfane
Una tabella InnoDB orfana si verifica quando il file di dati corrispondente (.ibd) rimane nel file system, ma il dizionario di dati non fa più riferimento correttamente al file di dati. Questo scenario richiede un intervento manuale.
Per risolvere il problema, contatta l'assistenza Cloud SQL. Il team di assistenza può creare un file .frm segnaposto e quindi utilizzare un comando DROP TABLE per provare a rimuovere la tabella. Se l'operazione non va a buon fine, è probabile che il file InnoDB (.ibd) richieda la rimozione manuale dalla directory dei dati.
Dopo aver rimosso manualmente il file, puoi eseguire il backup di tutte le tabelle e le strutture del database.
Elimina un database utilizzando DROP DATABASE e creane uno utilizzando CREATE DATABASE. Questo ultimo passaggio potrebbe richiedere tempi di inattività per le applicazioni connesse al database interessato.
Se non hai un contratto di assistenza, consulta Metodi self-service per i passaggi di risoluzione dei problemi.
Risoluzione dei problemi self-service
I seguenti metodi di risoluzione dei problemi self-service prevedono l'eliminazione o la migrazione dell'intero database per rimuovere le tabelle orfane quando l'eliminazione di una singola tabella non funziona. Questo metodo è distruttivo. Se la tua organizzazione ha un contratto di assistenza, ti consigliamo vivamente di contattare il team di assistenza Cloud SQL per ricevere aiuto.
Per rimuovere le tabelle temporanee orfane, assicurati di seguire prima i passaggi descritti in
Tabelle temporanee orfane. Se il comando DROP TABLE non va a buon fine, prova i seguenti suggerimenti.
Prima di iniziare
Ti consigliamo vivamente di eseguire un backup completo dell'istanza per ridurre il rischio di perdita di dati.
Per ridurre la durata dei possibili tempi di inattività dell'applicazione, ti consigliamo vivamente di clonare l'istanza e verificare i seguenti passaggi di migrazione prima di completarli in un ambiente di produzione.
Per saperne di più, vedi Clonare le istanze.
Eliminare lo schema utilizzando la migrazione degli oggetti
La migrazione degli oggetti di database è un processo in più passaggi per spostare gli oggetti di database, come le tabelle, in uno schema temporaneo:
- Esegui il backup di altri oggetti di database, tra cui procedure, funzioni e viste.
- Elimina e ricrea lo schema interessato.
- Importa di nuovo gli oggetti di cui hai eseguito il backup nello schema originale.
Questo metodo di migrazione in genere causa tempi di inattività dell'applicazione. Per ridurre al minimo le interruzioni, prepara in anticipo tutti gli script necessari. Ad esempio, assicurati che gli script siano pronti per gestire:
- Rinominare le tabelle e spostarle in uno schema temporaneo.
- Eseguire il backup di altri oggetti di database, come procedure, funzioni, viste e altri.
- Ripristinare tutti gli oggetti di database nello schema originale.
Dopo aver preparato questi script, completa i seguenti passaggi:
- Crea uno schema temporaneo (ad esempio
fix_orphan_tables) sulla stessa istanza. - Interrompi il traffico dell'applicazione nello schema interessato.
Sposta tutte le tabelle nello schema temporaneo utilizzando
RENAME TABLE:RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;Esegui le seguenti sostituzioni:
DB: il nome del database che vuoi utilizzare.TABLE_NAME: il nome della tabella.
Esegui il backup degli oggetti di database, come viste, routine, stored procedure, trigger ed eventi. Un modo per farlo è utilizzare
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.sqlEsegui le seguenti sostituzioni:
USER: il nome utente.PASSWORD: la password del database.HOST_IP: l'indirizzo IP dell'host.DB: il nome del database che vuoi utilizzare.
Ti consigliamo vivamente di eseguire manualmente il backup delle viste utilizzando lo
SHOW CREATE VIEWsnippet di comando.Elimina lo schema contenente le tabelle orfane.
Crea lo schema con il nome originale.
Verifica se la tabella orfana è stata rimossa:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';Sostituisci
ORPHAN_TABLE_NAMEcon il nome della tabella orfana.Copia di nuovo le tabelle nello schema originale:
RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;Esegui le seguenti sostituzioni:
TABLE_NAME: il nome della tabella.DB: il nome del database che vuoi utilizzare.
Copia tutti gli oggetti di database dal backup eseguito nel passaggio 4.
mysql -u USER \ --password=PASSWORD \ -h <var>HOST_IP \ -D<var>DB < >varDB_export.sqlEsegui le seguenti sostituzioni:
USER: il nome utente.PASSWORD: la password del database.HOST_IP: l'indirizzo IP dell'host.DB: il nome del database che vuoi utilizzare.
Ti consigliamo vivamente di ripristinare manualmente le viste creandole di nuovo utilizzando l'
CREATE VIEWistruzione.Riprendi il traffico dell'applicazione che hai interrotto in precedenza.
Eliminare lo schema utilizzando dump e caricamento nella stessa istanza
Un altro modo per rimuovere una tabella orfana è eseguire un dump completo dello schema interessato, eliminare e ricreare lo schema e poi ripristinare il dump. In alcuni scenari, questo metodo potrebbe essere più veloce e meno complesso. Per ridurre al minimo le interruzioni, assicurati di preparare in anticipo tutti gli script di backup e ripristino.
Dopo aver preparato questi script, completa i seguenti passaggi:
- Interrompi il traffico dell'applicazione nello schema interessato.
- Esegui il backup dello schema in cui si trova la tabella orfana, incluse tutte le stored procedure, i trigger, le viste e gli eventi utilizzando
mysqldump. - Elimina lo schema.
- Crea di nuovo lo schema e ripristina il file di backup.
- Riprendi il traffico dell'applicazione interrotto nel primo passaggio.
Eseguire il dump e il caricamento in una nuova istanza o in un'istanza ricreata
In determinate condizioni, non è possibile eliminare lo schema contenente la tabella orfana. In questi casi, devi eseguire la migrazione a una nuova istanza o ricreare l'istanza esistente utilizzando un dump e un caricamento logici. Entrambi gli approcci possono causare interruzioni dell'applicazione e potrebbero richiedere la riconfigurazione delle applicazioni in modo che puntino all'istanza del database appena creata o ricreata. Le sezioni seguenti trattano entrambi i metodi.
Eseguire la migrazione dei dati a una nuova istanza utilizzando Database Migration Service (DMS)
- Utilizza Database Migration Service per creare una nuova istanza Cloud SQL per MySQL.
- Una volta completata la replica dei dati associati alla nuova istanza, interrompi tutte le applicazioni che si connettono all'istanza di origine.
- Promuovi l'istanza di replica Cloud SQL per MySQL.
- Modifica tutte le connessioni dell'applicazione in modo che puntino all'istanza Cloud SQL per MySQL appena promossa e riavvia le applicazioni.
Dump e ripristino manuali
- Se stai creando una nuova istanza del database, crea un'istanza con la stessa configurazione dell'istanza attuale.
- Interrompi tutto il traffico dell'applicazione sull'istanza del database attuale.
- Esegui il backup di tutti gli schemi utilizzando
mysqldumpo un'utilità simile. - Se utilizzi la stessa istanza, eliminala e ricreala.
- Utilizzando il backup creato nel terzo passaggio, ripristina il backup nella nuova istanza o nella stessa istanza ricreata.
- Fai in modo che le applicazioni puntino alla nuova istanza o alla stessa istanza ricreata e riprendi le operazioni dell'applicazione.