Há várias coisas em jogo aqui ...
-
Cada tabela é armazenada em seu próprio espaço de tabela
Por padrão, o grupo de parâmetros para os clusters Aurora (denominado
default.aurora5.6
) defineinnodb_file_per_table = ON
. Isso significa que cada tabela é armazenada em um arquivo separado, no cluster de armazenamento do Aurora. Você pode ver qual tablespace é usado para cada uma de suas tabelas usando esta consulta:SELECT name, space FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;
Nota: Eu não tentei alterar
innodb_file_per_table
paraOFF
. Talvez isso ajudasse ..? -
O espaço de armazenamento liberado pela exclusão de tablespaces NÃO é reutilizado
Como citar o suporte premium da AWS:
Due to the unique design of the Aurora Storage engine to increase its performance and fault tolerance Aurora does not have a functionality to defragment file-per-table tablespaces in the same way as standard MySQL.
Currently Aurora unfortunately does not have a way to shrink tablespaces as standard MySQL does and all fragmented space are charged because it is included in VolumeBytesUsed.
The reason that Aurora cannot reclaim the space of a dropped table in the same way as standard MySQL is that the data for the table is stored in a completely different way to a standard MySQL database with a single storage volume.If you drop a table or row in Aurora the space is not then reclaimed on Auroras cluster volume due to this complicated design.
This inability to reclaim small amounts of storage space is a sacrifice made to get the additional performance gains of Auroras cluster storage volume and the greatly improved fault tolerance of Aurora.Mas há uma maneira obscura de reutilizar parte desse espaço perdido ...
Novamente, cite o suporte premium da AWS:Once your total data set exceeds a certain size (approximately 160 GB) you can begin to reclaim space in 160 GB blocks for re-use e.g. if you have 400 GB in your Aurora cluster volume and DROP 160 GB or more of tables Aurora can then automatically re-use 160 GB of data. However it can be slow to reclaim this space.
The reason for the large amount of data required to be freed at once is due to Auroras unique design as an enterprise scale DB engine unlike standard MySQL which cannot be used on this scale. -
O OPTIMIZE TABLE é malvado!
Como o Aurora é baseado no MySQL 5.6,
OPTIMIZE TABLE
é mapeado paraALTER TABLE ... FORCE
, que reconstrói a tabela para atualizar estatísticas de índice e liberar espaço não utilizado no índice clusterizado. Efetivamente, junto cominnodb_file_per_table = ON
, isso significa executar umOPTIMIZE TABLE
cria um novo arquivo de espaço de tabela e exclui o antigo. Como a exclusão de um arquivo de espaço de tabela não libera o armazenamento que estava sendo usado, isso significa queOPTIMIZE TABLE
sempre resultará em mais armazenamento sendo provisionado. Ai!Ref: link
-
Usando tabelas temporárias
Por padrão, o grupo de parâmetros para instâncias Aurora (denominado
default.aurora5.6
) definedefault_tmp_storage_engine = InnoDB
. Isso significa que toda vez que eu estou criando uma tabelaTEMPORARY
, ela é armazenada, junto com todas as minhas tabelas regulares , no cluster de armazenamento Aurora. Isso significa que um novo espaço é provisionado para conter essas tabelas, aumentando assim o volume totalBytesUsed.
A solução para isso é bastante simples: altere o valor do parâmetrodefault_tmp_storage_engine
paraMyISAM
. Isso forçará o Aurora a criar as tabelasTEMPORARY
no armazenamento local da instância.
Nota: o armazenamento local das instâncias é limitado; Veja aFree Local Storage
métrica no CloudWatch para ver quanto armazenamento suas instâncias têm. Instâncias maiores (mais caras) têm mais armazenamento local.Ref: nenhum ainda; a documentação atual do Amazon Aurora não menciona isso. Pedi à equipe de suporte da AWS para atualizar a documentação e atualizarei a minha resposta se / uma vez o fizerem.