Calcolo dell'utilizzo dello spazio su disco per DB MySQL


28

Attualmente sto utilizzando information_schema.TABLES per calcolare l'utilizzo totale dello spazio su disco raggruppato per il nome del database, ma sta funzionando terribilmente lentamente. Sui server con centinaia di database, il calcolo può richiedere alcuni minuti.

Qual è il metodo più rapido per calcolare l'utilizzo dello spazio su disco da parte del database? Dovrei solo guardare il filesystem? Esiste un metodo per accelerare information_schema?

Risposte:


46

Ci sono 3 scenari.

  1. Se stai usando MyISAM, è più semplice guardare il filesystem e usarlo du -sh /var/lib/mysql/database.
  2. Se si utilizza InnoDB con set innodb_file_per_table , è possibile ottenere una risposta approssimativa utilizzando du -sh. È approssimativo perché ci sono ancora alcuni dati memorizzati nel file ibdata1, quindi sarai un po 'basso. Questa tecnica funziona anche con innodb_file_per_tabledatabase misti MyISAM / InnoDB ( ).
  3. Se stai utilizzando InnoDB senza innodb_file_per_table set, dovrai dare un'occhiata a INFORMATION_SCHEMA.

In uno dei casi precedenti, è possibile eseguire la query seguente per ottenere le informazioni che si stanno cercando.

mysql> select table_schema, sum((data_length+index_length)/1024/1024) AS MB from information_schema.tables group by 1;
+--------------------+-----------------+
| table_schema       | MB              |
+--------------------+-----------------+
| prod               | 298025.72448921 |
| information_schema |      0.00781248 |
| maatkit            |     70.77330779 |
| mysql              |      0.66873168 |
| test               |   4752.31449127 |
+--------------------+-----------------+
5 rows in set (0.01 sec)

Se hai un numero molto elevato di tabelle, può essere lento, come hai già scoperto.


Ho visto altrove che l'opzione 3 non tiene conto delle dimensioni di VARCHAR.
Joe,

3

È possibile utilizzare questo comando per ottenere informazioni in GB:

mysql> select table_schema "DB name (table_schema)", 
sum((data_length+index_length)/1024/1024/1024) AS "DB size in GB" from 
information_schema.tables group by table_schema;
+-------------------------------------+-----------------+
| table_schema DB name (table_schema) | DB size in GB   |
+-------------------------------------+-----------------+
| prod                                |     29.72448921 |
| information_schema                  |      0.00781248 |
| miscDB                              |      0.77330779 |
| mysql                               |      0.66873168 |
| test                                |     47.31449127 |
+-------------------------------------+-----------------+
5 rows in set (0.01 sec)

Adattata la risposta di Aaron Brown per fornire dimensioni in GB. Vedi la risposta di Aaron Brown per maggiori dettagli.

O per includere spazio libero / recuperabile, utilizzare:

mysql> SELECT table_schema "database name",
sum( data_length + index_length ) / 1024 / 1024 "database size in MB",
sum( data_free )/ 1024 / 1024 "free reclaimable space in MB"
FROM information_schema.TABLES
GROUP BY table_schema; 

+--------------------+---------------+------------------------------+
| DB name            | DB size in GB | free/reclaimable space in GB |
+--------------------+---------------+------------------------------+
| prod               |          1.26 |                         0.03 |
| information_schema |         38.77 |                         3.75 |
| miscDB             |          0.00 |                         0.00 |
| mysql              |          0.00 |                         0.00 |
| test               |          0.00 |                         0.00 |
+--------------------+---------------+------------------------------+

Lo spazio può essere recuperato utilizzando il comando OPTIMIZE TABLE per le tabelle InnoDB, MyISAM e ARCHIVE.

Vedi anche Come ottenere le dimensioni reali del database MySQL? per ulteriori dettagli.


1

Per ottenere informazioni sul nome della tabella e sul numero di record in essa contenuti, è possibile utilizzare la query seguente,

SELECT * 
FROM information_schema.TABLES ;

Per ottenere informazioni sui database sui server con le rispettive dimensioni, è possibile utilizzare la query seguente,

SELECT 
TABLE_SCHEMA  AS `Database`,
SUM((data_length + index_length) / (1024 * 1024)) AS `Database_Size`
FROM information_schema.TABLES 
GROUP BY table_schema 
ORDER BY `Database_Size` DESC;

1

Per poter vedere dove viene utilizzato lo spazio su disco (indipendentemente dal fatto che sia in una tabella mysql o meno), uso il mio fidato comando "du". Ecco un esempio di me che trovo da dove viene consumato tutto lo spazio.

$ sudo du -cks /* | sort -rn
954881224   total
945218092   /mysql
5299904 /usr
1781376 /opt
1166488 /var
671628  /home
343332  /run
213400  /root
93476   /lib
30784   /boot
20652   /etc
15940   /bin
13708   /sbin
12388   /tmp
24  /mnt
16  /lost+found
4   /srv
4   /snap
4   /media
4   /lib64
0   /vmlinuz
0   /sys
0   /proc
0   /initrd.img
0   /dev

Puoi vedere che la maggior parte dello spazio viene utilizzata da questa cartella. / mysql

Quella cartella contiene tabelle di dati. Per vedere quali tabelle occupano tutto lo spazio, puoi procedere in questo modo usando l'opzione "umana" o "-h". Mi piace fare la gestione dello spazio su disco in questo modo perché a volte non è nemmeno possibile accedere a mysql perché non si conosce la password o l'utente.

$ sudo du -chs /mysql/*
2.3M    /mysql/blacklist
18M /mysql/clientservices
2.5G    /mysql/data
4.0K    /mysql/doubleverify
137G    /mysql/ias
4.0K    /mysql/IAS
2.2G    /mysql/innodb
16K /mysql/lost+found
4.0K    /mysql/ml_centroids
16G /mysql/moat
4.0K    /mysql/test
4.0K    /mysql/tmp
4.0K    /mysql/var
282G    /mysql/verticaAdFees
4.0K    /mysql/verticaViewability
247G    /mysql/Whiteops
217G    /mysql/Whiteops_TLX
902G    total

Puoi vedere che tutto lo spazio viene bloccato da alcune tabelle che contengono molti dati GiG. Spero che sia di aiuto.


0

Vorrei cercare la dimensione del file sul tuo dizionario dei dati. È istantaneo e preciso.

Avvertenza : in base al motore di archiviazione, gli indici sono memorizzati nel file principale o in un altro file, se necessario, non dimenticare di riassumerli.


2
Sì, ma dov'è?
Magne,

0

So che è vecchio ma qualcuno potrebbe trovarlo rilevante.

In MySQL utilizzo:

SELECT concat(table_schema) 'Database Name',
concat(round(SUM(data_length/power(1024,3)),2),'G') DATA,
concat(round(SUM(index_length/power(1024,3)),2),'G') 'INDEX',
concat(round(SUM(data_free/power(1024,3)),2),'G') 'DATA FREE',
concat(round(sum(data_free)/(SUM(data_length+index_length))*100,2)) '% FRAGMENTED',
concat(round(SUM(data_length+index_length)/power(1024,3),2),'G') TOTAL
FROM information_schema.TABLES
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
GROUP BY table_schema;

Dato che il mio DB è InnoDB, questa è solo una stima.

Confronto questo output con:

du -sch /location/of_Mysql/* | sort -hr | head -n20

Spero che questo ti aiuti


0

I migliori (dopo aver fatto apt-get install ncdu):

cd "/var/lib/mysql" && ncdu

per ottenere tutte le dimensioni totali dei database Mysql nel tuo VPS.

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.