Esta página discute problemas conhecidos com tabelas órfãs no MySQL.
O que são tabelas órfãs?
Tabelas órfãs são tabelas com definições desconectadas em dicionários de dados do MySQL e podem ocorrer no MySQL 5.6 ou no MySQL 5.7. Qualquer um dos cenários a seguir pode bloquear um upgrade de versão principal (MVU, na sigla em inglês) do MySQL 5.7 para o MySQL 8.0:
- A presença de arquivos de dados
InnoDB(.ibd) sem arquivos de definição correspondentes (.frm) ou vice-versa. - A presença de tabelas intermediárias deixadas de instruções
ALTER TABLEque não são mais referenciadas ou usadas por nenhuma lógica de aplicativo ativa.
Tabelas temporárias órfãs
Os nomes de tabelas temporárias órfãs começam com o #sql- prefixo, como #sql-123.
Use a consulta a seguir para ajudar a identificar tabelas temporárias órfãs:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';
Você pode usar o comando DROP TABLE para descartar tabelas temporárias órfãs sem outras etapas adicionais. Isso resolve a maioria dos casos:
DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;
Substitua DB pelo nome do banco de dados que você quer usar.
Um exemplo pode ser assim:
DROP TABLE `testdb`.`#mysql50##sql-1234`;
Se o comando de tabela DROP anterior não funcionar, o arquivo de definição (.frm) poderá ser reutilizado por outra operação ALTER TABLE. Nesses casos, um arquivo .frm de marcador precisa ser criado no disco para remover a tabela. Entre em contato com o
suporte do Cloud SQL para receber ajuda.
Se você não tiver um contrato de suporte, consulte Métodos de autoatendimento
para etapas de solução de problemas.
Tabelas intermediárias órfãs
Os nomes de tabelas intermediárias órfãs começam com o #sql-ib prefixo, por
exemplo, #sql-ib23-343224.
Use a consulta a seguir para identificar tabelas intermediárias órfãs:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';
Para remover tabelas órfãs intermediárias, primeiro mude o nome do arquivo de definição órfão (.frm) para corresponder ao nome da tabela e, em seguida, descarte a tabela na linha de comando.
Para remover tabelas órfãs intermediárias, entre em contato com a equipe de suporte do Cloud SQL para receber ajuda. Se você não tiver um contrato de suporte, consulte Métodos de autoatendimento para etapas de solução de problemas.
Tabelas normais órfãs
Uma tabela InnoDB órfã ocorre quando o arquivo de dados correspondente (.ibd) permanece no sistema de arquivos, mas o dicionário de dados não referencia mais o arquivo de dados corretamente. Esse cenário exige intervenção manual.
Para resolver esse problema, entre em contato com o suporte do Cloud SQL. A equipe de suporte pode criar um arquivo .frm de marcador e usar um comando DROP TABLE para tentar remover a tabela. Se não for possível, o arquivo InnoDB (.ibd) provavelmente exigirá remoção manual do diretório de dados.
Depois que o arquivo for removido manualmente, você poderá fazer backup de todas as tabelas e estruturas de banco de dados.
Descarte um banco de dados usando DROP DATABASE e crie um banco de dados usando CREATE DATABASE. Essa última etapa pode exigir tempo de inatividade para aplicativos conectados ao banco de dados afetado.
Se você não tiver um contrato de suporte, consulte Métodos de autoatendimento para etapas de solução de problemas.
Solução de problemas de autoatendimento
Os métodos de solução de problemas de autoatendimento a seguir envolvem descartar ou migrar todo o banco de dados para remover as tabelas órfãs quando o descarte de uma tabela individual não funciona. Esse método é destrutivo. Se sua organização estiver sob um contrato de suporte, recomendamos entrar em contato com a equipe de suporte do Cloud SQL para receber ajuda.
Para remover tabelas temporárias órfãs, siga as etapas em
Tabelas temporárias órfãs primeiro. Se o comando DROP TABLE não for bem-sucedido, tente as sugestões a seguir.
Antes de começar
Recomendamos fazer um backup completo da instância para reduzir o risco de perda de dados.
Para reduzir o tempo de inatividade do aplicativo, recomendamos clonar a instância e verificar as etapas de migração a seguir antes de concluí-las em um ambiente de produção.
Para mais informações, consulte Clonar instâncias.
Descartar o esquema usando a migração de objetos
A migração de objetos de banco de dados é um processo de várias etapas para mover objetos de banco de dados, como tabelas, para um esquema temporário:
- Faça backup de outros objetos de banco de dados, incluindo procedimentos, funções e visualizações.
- Descarte e recrie o esquema afetado.
- Importe os objetos com backup de volta para o esquema original.
Esse método de migração normalmente causa tempo de inatividade do aplicativo. Para minimizar a interrupção, prepare todos os scripts necessários com antecedência. Por exemplo, verifique se os scripts estão prontos para processar:
- Renomear tabelas e movê-las para um esquema temporário.
- Fazer backup de outros objetos de banco de dados, como procedimentos, funções, visualizações e outros.
- Restaurar todos os objetos de banco de dados para o esquema original.
Depois que esses scripts estiverem prontos, siga estas etapas:
- Crie um esquema temporário (exemplo:
fix_orphan_tables) na mesma instância. - Interrompa o tráfego de aplicativos no esquema afetado.
Mova todas as tabelas para o esquema temporário usando
RENAME TABLE:RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;Faça as seguintes substituições:
DB: o nome do banco de dados que você quer usar.TABLE_NAME: o nome da tabela.
Faça backup de objetos de banco de dados, como visualizações, rotinas, procedimentos armazenados, gatilhos e eventos. Uma maneira de fazer isso é 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.sqlFaça as seguintes substituições:
USER: o nome de usuário.PASSWORD: a senha do banco de dados.HOST_IP: o endereço IP do host.DB: o nome do banco de dados que você quer usar.
Recomendamos fazer backup manual das visualizações usando o
SHOW CREATE VIEWsnippet de comando.Descarte o esquema que contém tabelas órfãs.
Crie o esquema com o nome original.
Verifique se a tabela órfã foi removida:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';Substitua
ORPHAN_TABLE_NAMEpelo nome da tabela órfã.Copie as tabelas de volta para o esquema original:
RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;Faça as seguintes substituições:
TABLE_NAME: o nome da tabela.DB: o nome do banco de dados que você quer usar.
Copie todos os objetos de banco de dados do backup feito na etapa 4.
mysql -u USER \ --password=PASSWORD \ -h <var>HOST_IP \ -D<var>DB < >varDB_export.sqlFaça as seguintes substituições:
USER: o nome de usuário.PASSWORD: a senha do banco de dados.HOST_IP: o endereço IP do host.DB: o nome do banco de dados que você quer usar.
Recomendamos restaurar manualmente as visualizações criando-as novamente usando a
CREATE VIEWinstrução.Retome o tráfego de aplicativos que você interrompeu anteriormente.
Descartar o esquema usando o despejo e o carregamento na mesma instância
Outra maneira de remover uma tabela órfã é fazer um despejo completo do esquema afetado, descartar e recriar o esquema e, em seguida, restaurar o despejo. Em alguns cenários, esse método pode ser mais rápido e menos complexo. Para minimizar a interrupção, prepare todos os scripts de backup e restauração com antecedência.
Depois que esses scripts estiverem prontos, siga estas etapas:
- Interrompa o tráfego de aplicativos no esquema afetado.
- Faça backup do esquema em que a tabela órfã está localizada, incluindo todos os procedimentos armazenados, gatilhos, visualizações e eventos usando
mysqldump. - Descarte o esquema.
- Crie o esquema novamente e restaure o arquivo de backup.
- Retome o tráfego de aplicativos interrompido na primeira etapa.
Despejar e carregar em uma instância nova ou recriada
Em determinadas condições, o esquema que contém a tabela órfã não pode ser descartado. Nesses casos, é necessário migrar para uma nova instância ou recriar a instância atual usando um despejo e carregamento lógico. Qualquer uma das abordagens pode causar interrupções no aplicativo e pode exigir a reconfiguração dos aplicativos para apontar para a instância de banco de dados recém-criada ou recriada. As seções a seguir abrangem os dois métodos.
Migrar dados para uma nova instância usando o Database Migration Service (DMS)
- Use o Database Migration Service para criar uma nova instância do Cloud SQL para MySQL.
- Depois que a instância de réplica terminar de replicar os dados associados à nova instância, interrompa todos os aplicativos que se conectam à instância de origem.
- Promova a instância de réplica do Cloud SQL para MySQL.
- Mude todas as conexões de aplicativos para apontar para a instância recém-promovida do Cloud SQL para MySQL e reinicie os aplicativos.
Despejo e restauração manual
- Se você estiver criando uma nova instância de banco de dados, crie uma instância com a mesma configuração da instância atual.
- Interrompa todo o tráfego de aplicativos na instância de banco de dados atual.
- Faça backup de todos os esquemas usando
mysqldumpou um utilitário semelhante. - Se você estiver usando a mesma instância, exclua e recrie a instância.
- Usando o backup criado na terceira etapa, restaure o backup para a nova instância ou para a mesma instância recriada.
- Aponte seus aplicativos para a nova instância ou para a mesma instância recriada e retome as operações do aplicativo.