it-swarm-eu.dev

Berechnung des Speicherplatzverbrauchs pro MySQL-Datenbank

Ich verwende derzeit information_schema.TABLES, um die gesamte Speicherplatznutzung zu berechnen, gruppiert nach dem Datenbanknamen, aber es läuft furchtbar langsam. Auf Servern mit Hunderten von Datenbanken kann die Berechnung Minuten dauern.

Was ist die schnellste Methode zur Berechnung der Speicherplatznutzung durch die Datenbank? Sollte ich mir nur das Dateisystem ansehen? Gibt es eine Methode zur Beschleunigung des Informationsschemas?

29
GoldenNewby

Es gibt 3 Szenarien.

  1. Wenn Sie MyISAM verwenden, ist es am einfachsten, sich das Dateisystem anzusehen und du -sh /var/lib/mysql/database Zu verwenden.
  2. Wenn Sie InnoDB mit innodb_file_per_table set verwenden, können Sie mit du -sh Eine ungefähre Antwort erhalten. Dies ist ungefähr, da in der Datei ibdata1 noch einige Daten gespeichert sind, sodass Sie ein wenig auf der niedrigen Seite sind. Diese Technik funktioniert auch mit gemischten MyISAM/InnoDB-Datenbanken (innodb_file_per_table).
  3. Wenn Sie InnoDB ohne innodb_file_per_table set Verwenden, müssen Sie sich INFORMATION_SCHEMA ansehen.

In jedem der oben genannten Fälle können Sie die folgende Abfrage ausführen, um die gesuchten Informationen abzurufen.

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)

Wenn Sie eine sehr große Anzahl von Tabellen haben, kann dies langsam sein, wie Sie bereits festgestellt haben.

50
Aaron Brown

Mit diesem Befehl können Sie Informationen in GB abrufen:

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)

Die Antwort von Aaron Brown wurde angepasst, um die Größe in GB anzugeben. Siehe Aaron Browns Antwort für weitere Details.

ODER um freien/zurückforderbaren Speicherplatz einzuschließen, verwenden Sie:

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 |
+--------------------+---------------+------------------------------+

Der Speicherplatz kann mit Befehl OPTIMIZE TABLE für InnoDB-, MyISAM- und ARCHIVE-Tabellen zurückgefordert werden.

Siehe auch So erhalten Sie die wahre Größe der MySQL-Datenbank? Weitere Informationen.

4
user9269906

Damit ich sehen kann, wo Speicherplatz belegt ist (unabhängig davon, ob er sich in einer MySQL-Tabelle befindet oder nicht), verwende ich meinen vertrauenswürdigen Befehl "du". Hier ist ein Beispiel dafür, wie ich herausfinde, wo der gesamte Raum aufgefressen wird.

$ 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

Sie können sehen, dass der größte Teil des Speicherplatzes von diesem Ordner verwendet wird./mysql

Dieser Ordner enthält Datentabellen. Um zu sehen, welche Tabellen den gesamten Speicherplatz belegen, können Sie mit der Option "human" oder "-h" so vorgehen. Ich mache gerne Speicherplatzverwaltung auf diese Weise, weil Sie sich manchmal nicht einmal bei MySQL anmelden können, weil Sie das Passwort oder den Benutzer nicht kennen.

$ 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

Sie können sehen, dass der gesamte Speicherplatz von einigen Tabellen belegt wird, die viele Datenmengen enthalten. Hoffe das hilft.

1
Russell Lego

Um Informationen über den Namen der Tabelle und die Anzahl der Datensätze zu erhalten, kann die folgende Abfrage verwendet werden:

SELECT * 
FROM information_schema.TABLES ;

Um Informationen zu Datenbanken auf den Servern mit ihrer jeweiligen Größe zu erhalten, kann die folgende Abfrage verwendet werden:

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
Mathew

Ich würde nach der Größe der Datei in Ihrem Datenwörterbuch suchen. Es ist augenblicklich und genau.

Warnung: Laut Speicher-Engine werden Indizes in der Hauptdatei oder in einer anderen Datei gespeichert. Vergessen Sie nicht, sie bei Bedarf zusammenzufassen.

0
Spredzy

Ich weiß, dass dies alt ist, aber jemand kann dies relevant finden.

In MySQL verwende ich:

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;

Da meine Datenbank InnoDB ist, ist dies nur eine Schätzung.

Ich vergleiche diese Ausgabe mit:

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

Hoffe das hilft dir

0
AJinSD

Am besten (nach apt-get install ncdu):

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

um die Gesamtgröße der MySQL-Datenbanken in Ihrem VPS zu erhalten.

0
T.Todua