Differenza sostanziale tra le dimensioni del database in MySQL e le dimensioni effettive sul disco


8

Quando controllo le dimensioni dei miei database in MySQL ottengo questo:

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 controllo le dimensioni sul disco ottengo questo:

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

Se combino sia lo spazio utilizzato che quello libero fornito da Maria DB e lo confronto con le figure del disco, ho quanto segue:

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

D: È normale avere così tanto overhead sul disco / C'è qualcosa che posso fare per ridurlo?

Cordiali saluti, ho pensato che eseguire un mysql optimise avrebbe aiutato ( usando quel comando ), ha ridotto le dimensioni dei database, ma non ha cambiato le dimensioni dei file sul disco.

Informazioni addizionali:

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)

Tutte le tabelle InnoDB? Quanti tavoli?
gbn

Risposte:


5

Se si utilizzano tabelle InnoDB, le dimensioni dei file ibdata aumenteranno nel tempo. Quindi, se si rilascia DELETEun'istruzione, le dimensioni del database si ridurranno, ma il file ibdata rimarrà lo stesso (non si riduce).

Se non si utilizza l' innodb_file_per_tableopzione, l'unico modo per recuperare lo spazio è scaricando il database e ripristinandolo dal file di dump.

Tuttavia, se si utilizza innodb_file_per_table, è possibile emettere un

ALTER TABLE foo ENGINE=InnoDB;

su tabelle che diventano troppo grandi per recuperare lo spazio su disco.


perché la dimensione dei file ibdata non si riduce se la dimensione del database lo fa?
Max

Apparentemente è una "decisione di progettazione" presa dagli sviluppatori di innodb, spiegata brevemente nei commenti di questo bug . Una richiesta di funzionalità simile è stata fatta alcuni anni fa, ma non è stato fatto nulla al riguardo. Non concordo personalmente con la decisione di progettazione, ma è quello che è.
Derek Downey,

perché non ottimizzare lo spazio di recupero della tabella? o è solo "ordinato" non "restringere"?
gbn

1
@gbn "Per le tabelle InnoDB, OPTIMIZE TABLE è mappato su ALTER TABLE, che ricostruisce la tabella per aggiornare le statistiche dell'indice e liberare spazio inutilizzato nell'indice cluster." src Quindi sì, solo un ordine. Stesso motivo per cui AlTER TABLE foo ENGINE=InnoDBsenza innodb_file_per_table=1ridurre l'ibdata.
Derek Downey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.