Diferença substancial entre o tamanho do banco de dados no MySQL e o tamanho real no disco

8

Quando verifico o tamanho dos meus bancos de dados no MySQL, recebo o seguinte:

MariaDB [(none)]> SELECT table_schema "Data Base Name",  sum( data_length + index_length ) / 1024 /  1024 "Data Base Size in MB",  sum( data_free )/ 1024 / 1024 "Free Space in MB"  FROM information_schema.TABLES  GROUP BY table_schema;
+--------------------+----------------------+------------------+
| Data Base Name     | Data Base Size in MB | Free Space in MB |
+--------------------+----------------------+------------------+
| alfresco           |         245.75000000 |      34.00000000 |
| drupal             |         892.15625000 |     216.00000000 |
+--------------------+----------------------+------------------+

Quando verifico o tamanho do disco, recebo o seguinte:

$ sudo du -h --max-depth=1 /var/lib/mysql/
317M    /var/lib/mysql/alfresco
1.4G    /var/lib/mysql/drupal

Se eu combinar o espaço usado e o espaço livre fornecido pelo Maria DB e compará-lo com as figuras do disco, tenho o seguinte:

alfresco: DB=279MB  DISK=317MB (+14%)
drupal: DB=1100MB   DISK=1433MB (+30%)

P: É normal ter muita sobrecarga no disco / há algo que eu possa fazer para reduzi-la?

Para sua informação, pensei que executar uma otimização do mysql ajudaria ( usando esse comando ), reduzia o tamanho dos bancos de dados, mas não alterava o tamanho dos arquivos no disco.

Informação adicional:

server:             ubuntu server 10.04 LTS
DB server:          MariaDB
DB engine:          InnoDB v10 (for all tables)
Table collation:    utf8_general_ci
Nb Drupal tables:   416  (0.80MB overhead per table)
Nb Alfresco tables: 84   (0.45MB overhead per table)
Máx.
fonte
Todas as tabelas do InnoDB? Quantas mesas?
gbn 25/01

Respostas:

5

Se você estiver usando tabelas do InnoDB, o tamanho dos seus arquivos ibdata aumentará com o tempo. Portanto, se você emitir uma DELETEinstrução, o tamanho do banco de dados será reduzido, mas o arquivo ibdata permanecerá o mesmo (não será reduzido).

Se você não estiver usando a innodb_file_per_tableopção, a única maneira de recuperar o espaço é descartando o banco de dados e restaurando a partir do arquivo de despejo.

No entanto, se você estiver usando innodb_file_per_table, poderá emitir um

ALTER TABLE foo ENGINE=InnoDB;

em tabelas que crescem muito para recuperar o espaço em disco.

Derek Downey
fonte
por que o tamanho dos arquivos ibdata reduz se o tamanho do banco de dados diminui?
Max
Aparentemente, é uma 'decisão de design' feita pelos desenvolvedores do innodb, explicada brevemente nos comentários deste bug . Uma solicitação de recurso semelhante foi feita há alguns anos, mas nada foi feito sobre isso. Não concordo pessoalmente com a decisão de design, mas é o que é.
Derek Downey
por que não otimizar o espaço de recuperação de tabela? ou isso é apenas "arrumado" e não "encolher"?
gbn 25/01
11
@gbn "Para tabelas do InnoDB, OPTIMIZE TABLE é mapeado para ALTER TABLE, que reconstrói a tabela para atualizar estatísticas do índice e liberar espaço não utilizado no índice clusterizado." src Então, sim, apenas um arrumado. O mesmo motivo que um AlTER TABLE foo ENGINE=InnoDBsem innodb_file_per_table=1não encolhe ibdata.
Derek Downey