Estou enfrentando um problema de espaço em disco com um banco de dados MariaDB e gostaria de receber suas informações sobre como resolvê-lo.
Aqui está o cenário:
Versão do MariaDB: 10.3
SO: Ubuntu 20.04
Motor: Innodb
Nome da tabela: 'foo'
Data_length: 26 GB
Índice_comprimento: 16 GB
Dados_livres: 7 GB
Fragmentação ~ 17%
innodb_file_per_table=ON
O problema é que o disco principal, onde ficam armazenados os dados do banco de dados, tem apenas 8 GB de espaço livre. Recentemente, encontramos uma operação de exclusão em massa na tabela 'foo', que resultou em fragmentação. Quero recuperar espaço de volta ao sistema operacional.
Considerando o espaço livre limitado, executar o OPTIMIZE TABLE
comando diretamente na tabela 'foo' não é viável. A operação exigiria espaço em disco adicional para criar uma cópia desfragmentada da tabela.
Eu tenho um disco extra com espaço mais do que suficiente, que pode ser utilizado para resolver o problema. O tempo de inatividade pode ser de até 6 horas durante a noite.
Aqui está a abordagem que estou considerando e gostaria de receber seus comentários sobre sua viabilidade:
- Parar o serviço MariaDB
- Altere a localização do datadir em mysqld.cnf para apontar para um disco extra
- Inicie o serviço MariDB
- Tabela OPTIMIZE usando esta consulta -
ALTER TABLE foo ENGINE innodb;
- Repita 1-3 para voltar a usar o disco principal.
Existem métodos alternativos que você sugere para lidar com esta situação de forma eficaz?
Para futuras "grandes exclusões", veja várias dicas aqui: https://mysql.rjweb.org/doc.php/deletebig
Grande parte do "Data_free" e "fragmentação" são inevitáveis. Em particular, é improvável que um 'Data_free' entre 4 MB e 7 MB desapareça. A fragmentação também é indescritível. Não se preocupe em tentar
OPTIMIZE
essas tabelas.Se várias tabelas tiverem mais Data_free do que 7 MB, otimize-as, começando pela menor. Mas verifique os tamanhos para ver se é provável que cada um seja bem-sucedido com o espaço em disco limitado. Isso pode liberar espaço suficiente para a mesa impertinente.
Outra abordagem que pode funcionar é mover tabelas pequenas para arquivos
ibdata1
. Isso ajudará especialmente seibdata1
houver muito espaço livre. Observe o tamanho desse arquivo, enquanto faz isso, começando com tabelas menores:Você parece precisar de cerca de 26 + 16 = 42 GB, mas tem apenas 8 GB. Não é óbvio que as Otimizações progressivas ou a movimentação de tabelas pequenas forneçam tanto espaço.
No futuro, evite ocupar mais da metade do disco. Ou pelo menos mantenha espaço livre suficiente para uma cópia da tabela maior. Planeje obter um disco maior em breve.
Você mencionou um disco sobressalente. Por que não simplesmente expandir para ele? Ou seja, não se preocupe em mover a tabela de volta para a unidade atual. Confira a sintaxe para especificar várias unidades de disco em
my.cnf
. (MySQL/MariaDB remonta aos dias em que 2 GB era o maior disco do mercado.)