Berechnen der Speicherplatznutzung gemäß MySQL DB
On Februar 9, 2021 by adminIch verwende derzeit information_schema.TABLES, um die gesamte Speicherplatznutzung zu berechnen, die nach dem Datenbanknamen gruppiert ist, aber sie wird schrecklich ausgeführt 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?
Antwort
Es gibt drei Szenarien.
- Wenn Sie MyISAM verwenden, ist es am einfachsten, sich nur das Dateisystem anzusehen und
du -sh /var/lib/mysql/database
zu verwenden. - Wenn ja Wenn Sie InnoDB mit innodb_file_per_table 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
). - Wenn Sie InnoDB ohne
innodb_file_per_table set
verwenden Dann 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.
Kommentare
- Ich habe irgendwo anders gesehen, dass Option 3 ‚ VARCHAR-Größen nicht berücksichtigt.
Antwort
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. Weitere Informationen finden Sie in der Antwort von Aaron Brown .
ODER 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 | +--------------------+---------------+------------------------------+
Speicherplatz kann mit dem Befehl OPTIMIZE TABLE für InnoDB-, MyISAM- und ARCHIVE-Tabellen zurückgefordert werden.
Weitere Informationen finden Sie unter So ermitteln Sie die wahre Größe der MySQL-Datenbank? .
Antwort
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 Speicherplatz 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 Großteil des Speicherplatzes von verwendet wird Dieser Ordner. / 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 Speicherplatzverwaltung auf diese Weise, da Sie sich manchmal nicht einmal bei MySQL anmelden können, weil Sie das Kennwort 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. Ich hoffe, dies hilft.
Antwort
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 abzurufen, 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;
Antwort
Ich würde nach der Größe der Datei in Ihrem Datenwörterbuch suchen. Sie ist augenblicklich und genau.
Warnung : Laut Speicher-Engine werden Indizes in der Hauptdatei oder in einer anderen Datei gespeichert. Vergessen Sie nicht, sie zusammenzufassen, wenn benötigt.
Kommentare
- Ja, aber wo ist das?
Antwort
Ich weiß, dass dies alt ist, aber jemand findet dies möglicherweise relevant.
I. n Ich verwende MySQL:
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
Ich hoffe, dies hilft Ihnen
Antwort
Am besten (nachdem Sie apt-get install ncdu
ausgeführt haben):
cd "/var/lib/mysql" && ncdu
, um die Gesamtgröße der MySQL-Datenbanken in Ihrem VPS abzurufen.
Antwort
Angenommen, Ihr MySQL-Host läuft unter Linux.
Sie können die folgende Abfrage an ausführen Suchen Sie den Pfad, in dem MySQL-Daten gespeichert sind.
select @@datadir;
Sobald Sie wissen, wo sich die Daten befinden gespeichert ist, können Sie die Festplattennutzung mit dem Befehl du
überprüfen.
Zum Beispiel unter Ubuntu sudo du -h /var/lib/mysql
.
Sie würden so etwas erhalten
980K /var/lib/mysql/db_one 1.1M /var/lib/mysql/mysql 8.0K /var/lib/mysql/someother_db 1.2M /var/lib/mysql/another_db 212K /var/lib/mysql/performance_schema 1.7G /var/lib/mysql
Quelle: Überprüfen Sie den von MySQL unter Linux verwendeten Speicher
Schreibe einen Kommentar