Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Use OPTIMIZE TABLE to reclaim MySQL tablespace

Última atualização: Sep 02, 2026

Ao usar a instrução DELETE para remover dados de uma tabela MySQL grande, o espaço em disco não é liberado imediatamente. O banco de dados apenas marca os registros ou páginas de dados como reutilizáveis. Para recuperar o espaço da tabela e reduzir o uso do disco, execute a instrução OPTIMIZE TABLE.

Pré-requisitos

  • A instrução OPTIMIZE TABLE é compatível apenas com os mecanismos de armazenamento InnoDB e MyISAM.

  • O espaço disponível em disco da instância deve ser maior ou igual ao tamanho da tabela a ser otimizada.

    Nota

    Se o espaço em disco disponível for insuficiente, primeiro expand the disk space. Após a conclusão da operação, reduza a escala conforme necessário e o sistema refund the price difference.

Observações de uso

  • Exclua um grande volume de dados antes: Executar OPTIMIZE TABLE não reduz efetivamente o uso do espaço da tabela, a menos que você tenha excluído previamente uma quantidade significativa de dados com a instrução DELETE.

  • Aumento temporário no uso do disco: A execução de OPTIMIZE TABLE cria uma tabela temporária para armazenar os dados reorganizados, o que aumenta provisoriamente o consumo de espaço em disco. Ao final do processo, a tabela temporária é excluída e o uso do disco retorna ao normal.

  • Estatísticas podem não mudar após a recuperação: Embora o espaço em disco seja liberado, as estatísticas da tabela podem não ser atualizadas de imediato. Para mais informações, consulte Why does the storage usage of my ApsaraDB RDS for MySQL instance remain unchanged after I run OPTIMIZE TABLE?.

  • Impacto no desempenho e riscos em horários de pico: No ApsaraDB RDS for MySQL 5,7 e 8,0, a instrução OPTIMIZE TABLE usa DDL online, permitindo operações DML simultâneas. Contudo, executar essa operação em tabelas grandes pode causar picos repentinos no consumo de I/O e recursos de buffer. Isso pode gerar bloqueios de tabela ou contenção de recursos, levando potencialmente à indisponibilidade da instância ou a interrupções no monitoramento durante horários de pico. Portanto, realize essa operação fora dos horários de pico para evitar impactos nos negócios.

Uso da linha de comando

  1. Connect to the ApsaraDB RDS for MySQL instance by using a client.

  2. Use a instrução DELETE para remover dados desnecessários conforme suas necessidades de negócio.

  3. Execute a instrução OPTIMIZE TABLE para recuperar o espaço da tabela.

    OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
    Nota
    • <$Database1> e <$Database2> são nomes de bancos de dados. <Table1> e <Table2> são nomes de tabelas.

    • Ao executar a instrução OPTIMIZE TABLE no mecanismo de armazenamento InnoDB, a seguinte mensagem é retornada. Essa mensagem é esperada e pode ser ignorada. A operação foi bem-sucedida se a saída contiver "ok". Para mais detalhes, consulte Instrução OPTIMIZE TABLE.

      Table does not support optimize, doing recreate + analyze instead

Uso do DMS

  1. Log on to the ApsaraDB RDS for MySQL instance by using DMS.

  2. No painel de navegação à esquerda, selecione o ID da instância de destino, clique duas vezes no banco de dados desejado, clique com o botão direito em qualquer nome de tabela e selecione batch operation table.

  3. Selecione as tabelas das quais deseja recuperar espaço e escolha table maintenance > optimize table.优化表

  4. Na caixa de diálogo exibida, confirme se as informações estão corretas e clique em OK.

Documentos relacionados

Reclaim space from table fragmentation

Perguntas frequentes

Por que o uso de armazenamento permanece inalterado após o OPTIMIZE TABLE?

Problema

Após excluir uma grande quantidade de dados usando a instrução DELETE e executar o OPTIMIZE TABLE para recuperar espaço conforme descrito na official ApsaraDB RDS for MySQL documentation, você consulta o campo DATA_FREE em information_schema.tables e nota que o valor não foi atualizado. Isso pode levar à suposição de que a operação falhou e que o espaço em disco não foi liberado.

Causa

O espaço real em disco foi liberado, mas as estatísticas da tabela MySQL não foram atualizadas prontamente. Esse problema é comum em instâncias do ApsaraDB RDS for MySQL 5,6, 5,7 e 8,0 com versão secundária do mecanismo anterior a 20250531. Nessas versões, a execução do OPTIMIZE TABLE não atualiza automaticamente as estatísticas de tabelas e índices. Como resultado, o valor de DATA_FREE em information_schema.tables mantém o valor antigo, não refletindo com precisão o uso real do espaço. Para mais informações, consulte Bug #117426: optimize table does not update table and index stats.

Solução

  • Solução recomendada: Atualize a versão secundária do mecanismo para 20250531 (para MySQL 8.0)

    Esse problema foi corrigido na minor engine version 20250531 para o ApsaraDB RDS for MySQL 8.0. Após a atualização, o OPTIMIZE TABLE atualiza automaticamente as estatísticas, e o campo DATA_FREE reflete corretamente o uso real do espaço.

  • Solução alternativa temporária: Forçar atualização de estatísticasCaso não seja possível atualizar a versão do banco de dados a curto prazo, execute a instrução ALTER TABLE table_name ENGINE=InnoDB; na tabela otimizada. Essa instrução força a reconstrução da tabela e a atualização de suas estatísticas. Após a execução do comando, o campo DATA_FREE em information_schema.tables exibirá corretamente o espaço recuperado.

O que fazer se o espaço não for liberado após uma instrução DELETE?

No ApsaraDB RDS for MySQL, ao usar a instrução DELETE para remover dados, o comando apenas marca os locais dos registros ou páginas de dados como reutilizáveis. O tamanho do arquivo em disco não muda, o que significa que o espaço da tabela não é recuperado imediatamente. Isso gera fragmentação de armazenamento, consumindo espaço da instância.

É possível usar comandos DDL nativos ou o recurso de alteração de esquema sem bloqueio no DMS. Observe que antes de usar qualquer um dos métodos, garanta que sua instância tenha espaço em disco suficiente para evitar bloqueios.

  • Desfragmentar espaço via comandos: Execute operações DDL como OPTIMIZE TABLE ou ALTER TABLE <table_name> ENGINE=InnoDB; para reorganizar os dados da tabela e estruturas de índice, recuperando assim o espaço fragmentado.

    Importante

    Ao usar comandos DDL nativos, realize-os fora dos horários de pico para evitar bloqueios de metadados. Para mais informações, consulte Usage notes.

  • Usar o recurso de alteração de esquema sem bloqueio no DMS: Para evitar problemas relacionados a bloqueios de metadados, use esse recurso para recuperar espaço de storage fragmentation.

O que fazer se o espaço não for liberado após uma instrução TRUNCATE ou DROP?

No ApsaraDB RDS for MySQL, caso o espaço em disco não seja liberado após executar uma operação TRUNCATE ou DROP, siga estas etapas:

  1. Confirmar a lógica de recuperação de espaço

    Após executar uma instrução TRUNCATE ou DROP, monitor the storage usage of the instance para confirmar se o espaço foi liberado. Geralmente, a diminuição no uso de armazenamento reflete o tamanho da tabela excluída em relação ao espaço total da instância.

  2. Evitar confiar em informações desatualizadas

    Se você verificar o tamanho da tabela usando information_schema.tables ou o console do ApsaraDB RDS (Database Autonomy Service (DAS) > one-click diagnosis > space analysis), o espaço da tabela exibido pode não mudar devido a atrasos na atualização de dados. Portanto, utilize a métrica geral de uso de armazenamento da instância como base principal para avaliação.

  3. Impacto da exclusão assíncrona

    Se o recurso de exclusão assíncrona (como o recurso Purge Large File Asynchronously da Alibaba Cloud) estiver ativado para sua instância, o espaço ocupado pelo arquivo da tabela não é liberado imediatamente. Em vez disso, ele é limpo gradualmente por um processo em segundo plano. O espaço em disco só é liberado após a conclusão desse processo.