Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Use OPTIMIZE TABLE to reclaim MySQL tablespace

Última atualização: Jul 10, 2026

A instrução DELETE não libera espaço em disco imediatamente. O MySQL 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 em disco disponível na 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 expanda o espaço em disco. Após a conclusão da otimização, reduza a escala conforme necessário. O sistema reembolsará a diferença de preço.

Observações de uso

  • Exclua uma grande quantidade de dados antes: O comando OPTIMIZE TABLE só reduz o uso do espaço da tabela se você excluir previamente uma quantidade significativa de dados com a instrução DELETE.

  • Aumento temporário no uso de disco: A execução do OPTIMIZE TABLE cria uma tabela temporária para reorganização dos dados, o que aumenta momentaneamente o consumo de disco. Essa tabela temporária é removida após a conclusão da operação, normalizando o uso do disco.

  • Estatísticas da tabela e índices 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 imediatamente. Para mais informações, consulte Por que o uso de armazenamento da minha instância ApsaraDB RDS for MySQL permanece inalterado após executar OPTIMIZE TABLE?.

  • Impacto no desempenho e riscos em horários de pico: No ApsaraDB RDS for MySQL 5.7 e 8.0, o OPTIMIZE TABLE utiliza DDL online, permitindo operações DML simultâneas. No entanto, otimizar uma tabela grande pode causar picos de I/O e uso de buffer. Isso gera bloqueios de tabela ou contenção de recursos, levando à indisponibilidade da instância ou interrupções no monitoramento durante horários de pico. Realize essa operação em horários de baixa demanda.

Uso da linha de comando

  1. Conecte-se à instância ApsaraDB RDS for MySQL usando um cliente.

  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, o sistema retorna a seguinte mensagem. Essa mensagem é esperada e pode ser ignorada. A operação foi bem-sucedida se a saída contiver "ok". Para mais informações, consulte Instrução OPTIMIZE TABLE.

      Table does not support optimize, doing recreate + analyze instead

Uso do DMS

  1. Faça login na instância ApsaraDB RDS for MySQL usando o 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

Recuperar espaço da fragmentação de tabelas

Perguntas frequentes

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

Problema

Após excluir dados com a instrução DELETE e executar o OPTIMIZE TABLE para recuperar espaço, você consulta o campo DATA_FREE em information_schema.tables e percebe que o valor não mudou. Isso pode indicar falha na operação e que o espaço em disco não foi liberado.

Causa

O espaço em disco foi liberado, mas as estatísticas da tabela no MySQL não foram atualizadas prontamente. Esse problema afeta 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, o OPTIMIZE TABLE não atualiza automaticamente as estatísticas de tabelas e índices. Consequentemente, o valor de DATA_FREE em information_schema.tables mantém o valor antigo. 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 versão secundária do mecanismo 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 de 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. Isso força a reconstrução da tabela e a atualização de suas estatísticas. O campo DATA_FREE em information_schema.tables passará então a refletir 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, a instrução DELETE apenas marca as posições dos registros ou páginas de dados como reutilizáveis, sem alterar o tamanho do arquivo em disco. O espaço da tabela não é recuperado imediatamente, resultando em fragmentação de armazenamento.

É possível recuperar espaço com comandos DDL nativos ou com o recurso de alteração de esquema sem bloqueio no DMS. 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 usando comandos: Execute operações DDL como OPTIMIZE TABLE ou ALTER TABLE <table_name> ENGINE=InnoDB; para reorganizar os dados da tabela e as estruturas de índice, recuperando o espaço fragmentado.

    Importante

    Ao utilizar comandos DDL nativos, realize as operações em horários de baixa demanda para evitar bloqueios de metadados. Para mais informações, consulte Observações de uso.

  • Usar o recurso de alteração de esquema sem bloqueio no DMS: Para evitar problemas relacionados a bloqueios de metadados, utilize este recurso para recuperar espaço da fragmentação de armazenamento.

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

Se o espaço em disco não for 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, monitore o uso de armazenamento da instância para confirmar se o espaço foi liberado. Geralmente, a reduçã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. Utilize a métrica geral de uso de armazenamento da instância como indicador principal.

  3. Impacto da exclusão assíncrona

    Se o recurso de exclusão assíncrona (como o Purge Large File Asynchronously da Alibaba Cloud) estiver ativado na sua instância, o espaço do arquivo da tabela não será liberado imediatamente. Um processo em segundo plano limpa os dados gradualmente, e o espaço em disco só é liberado após a conclusão desse processo.