Ir para o conteúdo

Por que minha instância de banco de dados do Amazon RDS para MySQL usa mais armazenamento que o esperado?

5 minuto de leitura
0

Quero saber por que minha instância de banco de dados Amazon Relational Database Service (Amazon RDS) para MySQL usa mais espaço do que eu esperava. Também quero otimizar o armazenamento em disco.

Resolução

É possível usar a métrica FreeStorageSpace do Amazon CloudWatch para monitorar o espaço de armazenamento disponível em uma instância de banco de dados do RDS. No entanto, a métrica FreeStorageSpace não mostra o que usa armazenamento na instância de banco de dados. Para determinar o que está usando seu armazenamento e recuperar espaço de armazenamento, use os métodos a seguir.

Execute OPTIMIZE TABLE

As tabelas usam somente o espaço que não está sendo usado ativamente. No entanto, o Amazon RDS ainda aloca espaço para as tabelas. Se você ativou innodb_file_per_table, poderá executar o comando OPTIMIZE TABLE para recuperar o espaço. Para mais informações, consulte a instrução OPTIMIZE TABLE no site do MySQL.

É possível usar OPTIMIZE TABLE para tabelas InnoDB, MyISAM e ARCHIVE. OPTIMIZE TABLE funciona se a tabela for criada em um espaço para tabela separado, de acordo com a configuração padrão de innodb_file_per_table usada pelo Amazon RDS. Para obter mais informações, consulte Espaços de tabela de arquivo por tabela no site do MySQL.

Apesar do Amazon RDS aceitar o comando OPTIMIZE TABLE, na verdade ele executa o comando ALTER TABLE...FORCE. Quando isso ocorre, você recebe uma mensagem de aviso parecida com esta:

“Table does not support optimize, doing recreate + analyze instead.”

Atualize suas estatísticas e, em seguida, execute a seguinte consulta information_schema.tables para estimar o uso do armazenamento com base nas estatísticas:

SELECT    table_name,
    data_length,
    max_data_length,
    index_length,
    data_free
FROM
    information_schema.tables
WHERE table_schema='schema_name'
;

Observação: na consulta anterior, adicione os valores para seu caso de uso.

A coluna data_free destaca a quantidade de espaço livre alocado a uma tabela que não está sendo usado ativamente.

Reduza o armazenamento das tabelas das aplicações

Para ver quanto armazenamento as tabelas de aplicações usam em sua instância de banco de dados MySQL do RDS, execute a seguinte consulta:

SELECT TABLESPACE_NAME,
ROUND(DATA_FREE/EXTENT_SIZE,0) FREE_DATA_MB,
 FREE_EXTENTS FREE_EXTENTS_MB, TOTAL_EXTENTS
TOTAL_EXTENTS_MB FROM
INFORMATION_SCHEMA.FILES;

Para localizar a maior tabela de aplicações em sua instância de banco de dados MySQL do RDS, execute a seguinte consulta:

SELECT TABLESPACE_NAME,  
ROUND(DATA_FREE/EXTENT_SIZE,0) FREE_DATA_MB,  
FREE_EXTENTS FREE_EXTENTS_MB,
TOTAL_EXTENTS  TOTAL_EXTENTS_MB FROM  
INFORMATION_SCHEMA.FILES
ORDER BY TOTAL_EXTENTS_MB DESC;

Observação: se um banco de dados incluir tabelas com colunas de comprimento variável com mais de 768 bytes, não será possível calcular o armazenamento individual que o banco de dados e a tabela usam. Essa limitação inclui os comandos BLOB, TEXT, VARCHAR e VARBINARY.

Reduza o armazenamento dos logs binários

Se você adicionar uma réplica de leitura a uma instância do Amazon RDS, o log binário da instância de origem usará armazenamento adicional. Verifique a métrica BinLogDiskUsage do CloudWatch para descobrir quanto armazenamento o log binário da instância de origem está usando. Se o log binário usa cada vez mais armazenamento, talvez seja necessário sincronizar suas réplicas de leitura.

Reduza ou desative o armazenamento do log geral e do log de consulta lenta

Quando você desativa os parâmetros do log geral e do log de consulta lenta, sua instância começa a armazenar os logs e os backups dos logs. Para alternar esses arquivos e controlar o uso do disco, consulte mysql.rds_rotate_general_log e mysql.rds_rotate_slow_log.

Observação: quando você não está solucionando problemas, é uma prática recomendada desativar os logs de consultas gerais e lentos.

Gerencie ou reduza o tamanho do tablespace do sistema do InnoDB

O espaço de tabela do sistema começa com 10 MB de espaço e contém o dicionário de dados do InnoDB e o espaço para desfazer. Depois de alocar o espaço, o arquivo tem pelo menos 10 MB e pode usar mais armazenamento disponível.

Por padrão, o Amazon RDS define innodb_file_per_table como 1 para que o banco de dados armazene dados de cada espaço de tabela em seu próprio arquivo .ibd. Para recuperar espaço reutilizável para tabelas relacionadas, use OPTIMIZE TABLE para redimensionar cada arquivo de tablespace da tabela. Ou você pode descartar uma mesa.

Se você definir innodb_file_per_table como 0, o Amazon RDS aloca todas as tabelas para o espaço de tabela do sistema. Se você descartar tabelas ou índices, ou excluir ou truncar dados das tabelas alocadas no sistema, o espaço de tabela marcará o espaço como reutilizável. No entanto, innodb_file_per_table não libera espaço para o sistema de arquivos.

Não é possível reduzir o espaço de tabela do sistema na instância em que ele está localizado. Em vez disso, exporte os dados do seu banco de dados atual e importe-os para uma nova instância. Para reduzir o tempo de inatividade, configure sua nova instância do MySQL como réplica da instância de origem do Amazon RDS. Depois de sincronizar a réplica com a instância de origem do Amazon RDS, mude para a nova instância.

Observação: ao restaurar a partir de um snapshot ou criar uma réplica de leitura, você não recupera espaço do espaço de tabela do sistema. Os dois métodos usam um snapshot do volume de armazenamento da instância de origem que contém o tablespace do sistema.

Informações relacionadas

Instância de banco de dados do Amazon RDS ficando sem espaço de armazenamento

Modificar uma instância de banco de dados do Amazon RDS

Como posso solucionar o erro “MySQL HA_ERR_RECORD_FILE_FULL” ao usar o Amazon RDS para MySQL?