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

5 minuto de leitura
0

Minha instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para MySQL está usando mais espaço do que o esperado. Por quê? Como faço para otimizar o armazenamento em disco?

Resolução

Você pode 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. Mas FreeStorageSpace não descreve como a instância está consumindo armazenamento.

Use as estratégias a seguir para recuperar espaço de armazenamento:

Execute OPTIMIZE TABLE

As tabelas consomem uma quantidade de espaço que não usam ativamente. Mesmo assim, o Amazon RDS ainda aloca essa quantidade às tabelas. Se innodb_file_per_table estiver ativado (fica ativado por padrão), você poderá recuperar esse espaço usando OPTIMIZE TABLE. OPTIMIZE TABLE funciona para tabelas InnoDB, MyISAM e ARCHIVE. 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: “A tabela não suporta a otimização; em vez disso, será realizada uma operação de recriação e análise”. Para mais informações, consulte a documentação do MySQL sobre o OPTIMIZE TABLE.

Para verificar se há fragmentação, execute uma consulta como esta:

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

A coluna data_free destaca a quantidade de espaço livre alocado a uma tabela que não está sendo usado ativamente. É possível tentar recuperar esse espaço usando OPTIMIZE TABLE. 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 mais informações, consulte a documentação do MySQL na página File-per-table tablespaces.

Reduza o armazenamento das tabelas das aplicações

Para ver quanto armazenamento é usado pelas tabelas das aplicações em uma instância de banco de dados, execute uma consulta como esta:

SELECT
	table_schema,
	SUM(data_length + index_length + data_free)/1024/1024 AS total_mb,
	SUM(data_length)/1024/1024 AS data_mb,
	SUM(index_length)/1024/1024 AS index_mb,
	SUM(data_free)/1024/1024 AS free_mb,
	COUNT(*) AS tables,
	CURDATE() AS today
FROM
	information_schema.tables
	GROUP BY table_schema
	ORDER BY 2 DESC
;

Para localizar a maior tabela de aplicação em uma instância de banco de dados, execute uma consulta como esta:

SELECT
	table_schema,
	table_name,
	(data_length + index_length + data_free)/1024/1024 AS total_mb,
	(data_length)/1024/1024 AS data_mb,
	(index_length)/1024/1024 AS index_mb,
	(data_free)/1024/1024 AS free_mb,
	CURDATE() AS today
FROM
	information_schema.tables
	ORDER BY 3 DESC
;

Observação: não é possível calcular o armazenamento total usado por um banco de dados e uma tabela individuais se o banco de dados incluir tabelas com colunas de tamanho variável com mais de 768 bytes. Por exemplo, isso inclui BLOB, TEXT, VARCHAR e VARBINARY.

Reduza o armazenamento dos logs binários

Criar uma réplica de leitura faz com que o log binário da instância de origem use mais armazenamento. Verifique a métrica BinLogDiskUsage do CloudWatch para descobrir quanto armazenamento o log binário da instância de origem está usando. Um aumento muito grande pode indicar que uma ou mais réplicas de leitura não estão sincronizadas.

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 esses logs. Ela também armazena 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: desative os logs gerais e os logs de consulta lenta quando você não os estiver usando para solucionar problemas.

Gerencie ou reduza o tamanho do tablespace do sistema do InnoDB

O tablespace do sistema contém o dicionário de dados do InnoDB e o espaço do undo, e começa com 10 MB. Depois que o espaço é alocado, o arquivo sempre terá pelo menos esse tamanho, embora transações de execução prolongada possam consumir mais armazenamento disponível.

Por padrão, o Amazon RDS define o valor de innodb_file_per_table como 1. Isso significa que os dados de cada espaço para tabela são armazenados em seu próprio arquivo .ibd. Para recuperar o espaço marcado como reutilizável e usá-lo em tabelas relacionadas, use OPTIMIZE TABLE para redimensionar por tabela os arquivos de tablespace. Também é possível descartar uma tabela para recuperar o espaço.

Se innodb_file_per_table for definido como 0, todas as tabelas também serão alocadas no tablespace do sistema. Descartar tabelas ou índices, ou excluir os dados das tabelas alocadas no tablespace do sistema, ou até mesmo truncá-los, marca o espaço que estava ocupado como reutilizável. No entanto, innodb_file_per_table não libera espaço no sistema de arquivos.

Como não é possível reduzir no local o tablespace do sistema, exporte os dados do seu banco de dados atual. Em seguida, importe os dados 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. Quando a réplica estiver sincronizada com a instância de origem do Amazon RDS, alterne para a nova instância.

Observação: restaurar a partir de um snapshot ou criar uma réplica de leitura não ajudará você a recuperar espaço do tablespace do sistema. Isso ocorre porque 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 quase sem espaço de armazenamento Modificar uma instância de banco de dados do Amazon RDS

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