Em ambientes de banco de dados dinâmicos, é comum nos depararmos com situações onde precisamos validar a estrutura de duas tabelas. Seja após uma migração de emergência devido a uma corrupção de arquivos (como o erro SQL 1034), ou antes de realizar um deploy, garantir que a “Tabela A” possui as mesmas colunas que a “Tabela B” é crucial para a integridade do sistema.

Neste artigo, vamos explorar como utilizar o INFORMATION_SCHEMA para identificar discrepâncias estruturais de forma rápida e segura.

O Cenário de Problema Link para o cabeçalho

Imagine que você tem uma tabela principal (rel_vw_tarefas_backlog) que sofreu corrupção e uma tabela temporária (temp_rel_vw_tarefas_backlog) que deveria ser sua cópia fiel. Antes de renomear ou migrar os dados, você precisa responder: “Existe alguma coluna em uma que não está na outra?”

A Solução: Consultando Metadados Link para o cabeçalho

O MySQL armazena todas as definições de estrutura no banco INFORMATION_SCHEMA. A tabela COLUMNS é o nosso “mapa do tesouro” aqui, pois nos permite consultar nomes de colunas sem precisar acessar os dados físicos da tabela (o que é ideal se a tabela estiver corrompida).

O Script de Comparação Link para o cabeçalho

O script abaixo utiliza a cláusula UNION ALL para cruzar as informações de ambas as tabelas em uma única visualização:

SELECT 
    COALESCE(origem.column_name, destino.column_name) AS coluna,
    CASE 
        WHEN destino.column_name IS NULL THEN 'Faltando na TEMP'
        WHEN origem.column_name IS NULL THEN 'Faltando na ORIGINAL'
        ELSE 'Divergência de Tipo/Configuração'
    END AS situacao,
    origem.column_type AS tipo_original,
    destino.column_type AS tipo_temp,
    origem.is_nullable AS nulo_original,
    destino.is_nullable AS nulo_temp
FROM 
    (SELECT * FROM information_schema.columns 
     WHERE table_name = 'rel_vw_tarefas_backlog' AND table_schema = 'db_sgp_relatorio') AS origem
FULL OUTER JOIN 
    (SELECT * FROM information_schema.columns 
     WHERE table_name = 'temp_rel_vw_tarefas_backlog' AND table_schema = 'db_sgp_relatorio') AS destino
ON origem.column_name = destino.column_name
WHERE 
    origem.column_name IS NULL 
    OR destino.column_name IS NULL
    OR origem.column_type <> destino.column_type
    OR origem.is_nullable <> destino.is_nullable;

Entendendo o Script Link para o cabeçalho

  1. INFORMATION_SCHEMA.COLUMNS: Acessamos a lista global de colunas do servidor.
  2. TABLE_SCHEMA: Filtramos pelo nome do seu banco de dados para evitar conflitos com tabelas homônimas em outros bancos.
  3. NOT IN: Esta subquery identifica o que existe no conjunto A, mas está ausente no conjunto B.
  4. UNION ALL: Une os dois resultados para que você tenha uma lista completa de pendências de ambos os lados em um único relatório.

Por que isso é importante em Casos de Corrupção? Link para o cabeçalho

Quando uma tabela MyISAM reporta erro de Incorrect key file ou status Corrupt, os índices e dados estão comprometidos, mas o arquivo de definição (.frm no MySQL 5.7 ou o dicionário de dados no MySQL 8) geralmente permanece intacto.

Realizar essa comparação garante que, ao restaurar os dados para uma nova tabela, você não quebrará as queries da aplicação por falta de algum campo esperado.