Esta página aborda problemas conhecidos com tabelas órfãs no MySQL.
O que são tabelas órfãs?
As tabelas órfãs são tabelas com definições desligadas nos dicionários de dados do MySQL e podem ocorrer no MySQL 5.6 ou no MySQL 5.7. Qualquer um dos seguintes cenários pode bloquear uma atualização da versão principal (MVU) do MySQL 5.7 para o MySQL 8.0:
- A presença de
InnoDBficheiros de dados (.ibd) sem ficheiros de definição correspondentes (.frm) ou vice-versa. - A presença de tabelas intermédias que restam de declarações
ALTER TABLEque já não são referenciadas nem usadas por nenhuma lógica de aplicação 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 seguinte consulta para ajudar a identificar tabelas temporárias (temp) órfãs:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';
Pode usar o comando DROP TABLE para eliminar tabelas temporárias órfãs
sem outros passos adicionais. Isto resolve a maioria dos casos:
DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;
Substitua DB pelo nome da base de dados que quer usar.
Um exemplo pode ter o seguinte aspeto:
DROP TABLE `testdb`.`#mysql50##sql-1234`;
Se o comando DROP table anterior não funcionar, o ficheiro de definição (.frm) pode ser reutilizado por outra operação ALTER TABLE. Nestes casos, tem de criar um ficheiro de marcador de posição
.frm no disco para remover a tabela. Contacte o
apoio técnico do Cloud SQL para receber assistência.
Se não tiver um contrato de apoio técnico, consulte os métodos de autosserviço
para ver os passos de resolução de problemas.
Tabelas intermédias órfãs
Os nomes das tabelas intermédias órfãs começam com o prefixo #sql-ib, por exemplo, #sql-ib23-343224.
Use a seguinte consulta para identificar tabelas intermédias órfãs:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';
Para remover tabelas órfãs intermédias, primeiro, altere o nome do ficheiro (.frm) da definição de órfãos para corresponder ao nome da tabela e, em seguida, elimine a tabela da linha de comandos.
Para remover tabelas órfãs intermédias, contacte a equipa de apoio técnico do Cloud SQL para receber assistência. Se não tiver um contrato de apoio técnico, consulte os métodos de autosserviço para ver os passos de resolução de problemas.
Tabelas normais órfãs
Ocorre uma tabela InnoDB órfã quando o ficheiro de dados correspondente (ficheiro .ibd) permanece no sistema de ficheiros, mas o dicionário de dados já não faz referência ao ficheiro de dados corretamente. Este cenário requer intervenção manual.
Para resolver este problema, contacte o apoio técnico do Cloud SQL. A equipa de apoio técnico pode
criar um ficheiro .frm de marcador de posição e, em seguida, usar um
comando DROP TABLE para tentar remover a tabela. Se não tiver êxito,
é provável que o ficheiro InnoDB (.ibd) exija a remoção manual
do diretório de dados.
Depois de remover manualmente o ficheiro, pode fazer uma cópia de segurança de todas as tabelas e estruturas da base de dados.
Elimine uma base de dados com DROP DATABASE e crie uma base de dados com CREATE DATABASE. Este último passo pode exigir tempo de inatividade para as
aplicações ligadas à base de dados afetada.
Se não tiver um contrato de apoio técnico, consulte os métodos de autosserviço para ver os passos de resolução de problemas.
Resolução de problemas self-service
Os seguintes métodos de resolução de problemas de autosserviço envolvem a eliminação ou a migração de toda a base de dados para remover as tabelas órfãs quando a eliminação de uma tabela individual não funciona. Este método é disruptivo. Se a sua organização tiver um contrato de apoio técnico, recomendamos vivamente que contacte a equipa de apoio técnico do Cloud SQL para receber assistência.
Para remover tabelas temporárias órfãs, certifique-se de que segue primeiro os passos descritos no artigo
Tabelas temporárias órfãs. Se o comando
DROP TABLE não for bem-sucedido, experimente as seguintes sugestões.
Antes de começar
Recomendamos vivamente que faça uma cópia de segurança completa da instância para ajudar a reduzir o risco de perda de dados.
Para ajudar a reduzir a duração da possível indisponibilidade da aplicação, recomendamos vivamente que clone a instância e valide os seguintes passos de migração antes de os concluir num ambiente de produção.
Para mais informações, consulte o artigo Clone instâncias.
Elimine o esquema através da migração de objetos
A migração de objetos da base de dados é um processo de vários passos para mover objetos da base de dados, como tabelas, para um esquema temporário:
- Fazer uma cópia de segurança de outros objetos da base de dados, incluindo procedimentos, funções e vistas.
- Elimine e volte a criar o esquema afetado.
- Importe os objetos de cópia de segurança novamente para o esquema original.
Normalmente, este método de migração provoca indisponibilidade da aplicação. Para minimizar a interrupção, prepare todos os scripts necessários antecipadamente. Por exemplo, certifique-se de que os seus scripts estão preparados para processar:
- Mudar o nome das tabelas e movê-las para um esquema temporário.
- Fazer uma cópia de segurança de outros objetos da base de dados, como procedimentos, funções, vistas e outros.
- Restaurar todos os objetos da base de dados para o esquema original.
Depois de estes scripts estarem prontos, conclua os seguintes passos:
- Crie um esquema temporário (exemplo:
fix_orphan_tables) na mesma instância. - Pare o tráfego da aplicação no esquema afetado.
Mova todas as tabelas para o esquema temporário através de
RENAME TABLE:RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;Faça as seguintes substituições:
DB: o nome da base de dados que quer usar.TABLE_NAME: o nome da tabela.
Fazer uma cópia de segurança de objetos da base de dados, como vistas, rotinas, procedimentos armazenados, acionadores e eventos. Uma forma de o fazer é 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 utilizador.PASSWORD: a palavra-passe da base de dados.HOST_IP: o endereço IP do anfitrião.DB: o nome da base de dados que quer usar.
Recomendamos vivamente que faça uma cópia de segurança manual das visualizações através do fragmento de comando
SHOW CREATE VIEW.Elimine 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 da base de dados que quer usar.
Copie todos os objetos da base de dados da cópia de segurança feita no passo 4.
mysql -u USER \ --password=PASSWORD \ -h <var>HOST_IP \ -D<var>DB < <var>DB_export.sqlFaça as seguintes substituições:
USER: o nome de utilizador.PASSWORD: a palavra-passe da base de dados.HOST_IP: o endereço IP do anfitrião.DB: o nome da base de dados que quer usar.
Recomendamos vivamente que restaure manualmente as vistas criando-as novamente com a declaração
CREATE VIEW.Retome o tráfego de aplicações que parou anteriormente.
Elimine o esquema através da exportação e do carregamento para a mesma instância
Outra forma de remover uma tabela órfã é fazer um despejo completo do esquema afetado, eliminar e recriar o esquema e, em seguida, restaurar o despejo. Em alguns cenários, este método pode ser mais rápido e menos complexo. Para minimizar a interrupção, certifique-se de que prepara todos os scripts de cópia de segurança e restauro com antecedência.
Depois de estes scripts estarem prontos, conclua os seguintes passos:
- Pare o tráfego da aplicação no esquema afetado.
- Faça uma cópia de segurança do esquema onde a tabela órfã está localizada, incluindo todos os procedimentos armazenados, acionadores, vistas e eventos, através de
mysqldump. - Elimine o esquema.
- Crie novamente o esquema e restaure o ficheiro de cópia de segurança.
- Retome qualquer tráfego de aplicações parado no primeiro passo.
Despeje e carregue para uma instância nova ou recriada
Em determinadas condições, não é possível eliminar o esquema que contém a tabela órfã. Nestes casos, tem de migrar para uma nova instância ou recriar a instância existente através de uma descarga e um carregamento lógicos. Qualquer uma das abordagens pode causar interrupções nas aplicações e pode exigir a reconfiguração das aplicações para apontar para a instância da base de dados criada ou recriada recentemente. As secções seguintes abordam ambos os métodos.
Migre dados para uma nova instância através do Database Migration Service (DMS)
- Use o serviço de migração de base de dados para criar uma nova instância do Cloud SQL para MySQL.
- Depois de a instância de réplica terminar a replicação dos dados associados à nova instância, pare todas as aplicações que se ligam à instância de origem.
- Promova a instância do Cloud SQL para MySQL da réplica.
- Altere todas as ligações da aplicação para apontarem para a instância do Cloud SQL para MySQL recém-promovida e reinicie as aplicações.
Restauro e descarga manuais
- Se estiver a criar uma nova instância da base de dados, crie uma instância com a mesma configuração da instância atual.
- Pare todo o tráfego de aplicações na instância da base de dados atual.
- Faça uma cópia de segurança de todos os esquemas através do
mysqldumpou de um utilitário semelhante. - Se estiver a usar a mesma instância, elimine-a e volte a criá-la.
- Usando a cópia de segurança que criou no terceiro passo, restaure a cópia de segurança na nova instância ou na mesma instância recriada.
- Direcione as suas aplicações para a nova instância ou para a mesma instância recriada e retome as operações da aplicação.