Tabelas órfãs

Nesta página, discutimos 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 5.7. Qualquer um dos seguintes cenários pode bloquear um upgrade de versão principal (MVU) 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 TABLE que 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 prefixo #sql-, como #sql-123.

Use a consulta a seguir para identificar tabelas temporárias (temp) órfãs:

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

Use 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, talvez o arquivo de definição (.frm) seja reutilizado por outra operação ALTER TABLE. Nesses casos, um arquivo .frm 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 conferir as etapas de solução de problemas.

Tabelas intermediárias órfãs

Os nomes de tabelas intermediárias órfãs começam com o prefixo #sql-ib, 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 de órfãos (.frm) para corresponder ao nome da tabela e, em seguida, descarte a tabela da 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 faz mais referência a ele 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 de posição e usar um comando DROP TABLE para tentar remover a tabela. Se não der certo, o arquivo InnoDB (.ibd) provavelmente vai precisar ser removido manualmente 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.

Remova 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 conferir as etapas de solução de problemas.

Solução de problemas por autoatendimento

Os seguintes métodos de solução de problemas de autoatendimento envolvem descartar ou migrar todo o banco de dados para remover as tabelas órfãs quando descartar uma tabela individual não funciona. Esse método é destrutivo. Se sua organização tiver 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 funcionar, tente as seguintes sugestões.

Antes de começar

  • Recomendamos fazer um backup completo da instância para reduzir o risco de perda de dados.

  • Para ajudar a reduzir o tempo de inatividade possível do aplicativo, recomendamos clonar a instância e verificar as seguintes etapas de migração antes de concluí-las em um ambiente de produção.

    Para mais informações, consulte Clonar instâncias.

Remover 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:

  1. Faça backup de outros objetos de banco de dados, incluindo procedimentos, funções e visualizações.
  2. Solte e recrie o esquema afetado.
  3. Importe os objetos armazenados em 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 lidar com:

  • 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 do banco de dados para o esquema original.

Depois que esses scripts estiverem prontos, siga estas etapas:

  1. Crie um esquema temporário (por exemplo, fix_orphan_tables) na mesma instância.
  2. Interrompa o tráfego de aplicativos no esquema afetado.
  3. 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.
  4. Faça backup de objetos do banco de dados, como visualizações, rotinas, procedimentos armazenados, gatilhos e eventos. Uma maneira de fazer isso é usando 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
    

    Faç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 snippet de comando SHOW CREATE VIEW.

  5. Remova o esquema que contém tabelas órfãs.

  6. Crie o esquema com o nome original.

  7. Verifique se a tabela órfã foi removida:

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

    Substitua ORPHAN_TABLE_NAME pelo nome da tabela órfã.

  8. 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.
  9. Copie todos os objetos do banco de dados do backup feito na etapa 4.

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

    Faç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 que você restaure manualmente as visualizações criando-as novamente usando a instrução CREATE VIEW.

  10. Retome o tráfego de aplicativos que você interrompeu anteriormente.

Remover o esquema usando despejo e 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 restaurar o despejo. Em alguns casos, 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:

  1. Interrompa o tráfego de aplicativos no esquema afetado.
  2. Faça backup do esquema em que a tabela órfã está localizada, incluindo todos os procedimentos armazenados, triggers, visualizações e eventos usando mysqldump.
  3. Remova o esquema.
  4. Crie o esquema novamente e restaure o arquivo de backup.
  5. Retome o tráfego de aplicativos interrompido na primeira etapa.

Despejar e carregar para uma instância nova ou recriada

Em determinadas condições, não é possível remover o esquema que contém a tabela órfã. 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 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 abordam os dois métodos.

Migrar dados para uma nova instância usando o Database Migration Service (DMS)

  1. Use o Database Migration Service para criar uma instância do Cloud SQL para MySQL.
  2. Depois que a instância de réplica terminar de replicar os dados associados à nova instância, pare todos os aplicativos que se conectam à instância de origem.
  3. Promova a instância de réplica do Cloud SQL para MySQL.
  4. Mude todas as conexões de aplicativos para apontar para a instância promovida do Cloud SQL para MySQL e reinicie os aplicativos.

Despejo e restauração manuais

  1. Se você estiver criando uma nova instância de banco de dados, crie uma com a mesma configuração da instância atual.
  2. Interrompa todo o tráfego de aplicativos na instância de banco de dados atual.
  3. Faça backup de todos os esquemas usando mysqldump ou um utilitário semelhante.
  4. Se você estiver usando a mesma instância, exclua e recrie-a.
  5. Usando o backup criado na terceira etapa, restaure-o na nova instância ou na mesma instância recriada.
  6. Aponte seus aplicativos para a nova instância ou para a mesma instância recriada e retome as operações do aplicativo.

A seguir

  1. Solução de problemas
  2. Atualize a versão principal do banco de dados no local