it-swarm-eu.dev

Výpočet využití místa na disku podle databáze MySQL

Momentálně používám information_schema.TABLES pro výpočet celkového využití místa na disku seskupeného podle názvu databáze, ale běží strašně pomalu. Na serverech se stovkami databází může výpočet trvat několik minut.

Jaká je nejrychlejší metoda výpočtu využití místa na disku databází? Měl bych se jen dívat na souborový systém? Existuje metoda pro urychlení information_schema?

29
GoldenNewby

Existují 3 scénáře.

  1. Pokud používáte MyISAM, je nejjednodušší se jen podívat na souborový systém a použít du -sh /var/lib/mysql/database.
  2. Pokud používáte InnoDB s innodb_file_per_table set, můžete získat přibližnou odpověď pomocí du -sh. Je to přibližné, protože v souboru ibdata1 jsou stále uložena některá data, takže budete trochu na spodní straně. Tato technika také pracuje se smíšeným MyISAM/InnoDB (innodb_file_per_table) databáze.
  3. Pokud používáte InnoDB bez innodb_file_per_table set, pak se budete muset podívat na INFORM_SCHEMA.

V kterémkoli z výše uvedených případů můžete spustit následující dotaz a získat informace, které hledáte.

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)

Pokud máte velmi velké množství tabulek, může to být pomalé, jak jste již objevili.

50
Aaron Brown

Tento příkaz můžete použít k získání informací v 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)

Odpověď byla upravena z Aaron Brown tak, aby poskytovala velikost v GB. Další podrobnosti viz odpověď Aarona Browna .

NEBO k zahrnutí volného/regenerovatelného prostoru použijte:

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

Prostor lze získat zpět pomocí příkaz OPTIMALIZACE TABULKY pro tabulky InnoDB, MyISAM a ARCHIVE.

Viz také Jak získat skutečnou velikost MySQL databáze? pro více informací.

4
user9269906

Abych viděl, kde se místo na disku využívá (bez ohledu na to, zda je to v tabulce mysql nebo ne), používám svůj důvěryhodný příkaz „du“. Tady je příklad, jak jsem zjistil, odkud je celý prostor pohlcen.

$ 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

Uvidíte, že většina místa je v této složce využívána./mysql

Tato složka obsahuje datové tabulky. Chcete-li zjistit, které tabulky zabírají veškerý prostor, můžete takto postupovat pomocí volby „člověk“ nebo „-h“. Líbí se mi správa místa na disku tímto způsobem, protože někdy se ani nemůžete přihlásit do mysql, protože neznáte heslo nebo uživatele.

$ 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

Vidíte, že celý prostor je zabírán několika tabulkami s mnoha daty GiG. Snad to pomůže.

1
Russell Lego

Pro získání informací o názvu tabulky a počtu záznamů, které má, lze použít dotaz uvedený níže,

SELECT * 
FROM information_schema.TABLES ;

Pro získání informací o databázích na serverech s jejich příslušnou velikostí lze použít níže uvedený dotaz,

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

Hledal bych velikost souboru ve vašem datovém slovníku. Je to okamžité a přesné.

Varování: Podle úložiště jsou indexy ukládány v hlavním souboru nebo v jiném souboru, nezapomeňte je v případě potřeby sečíst.

0
Spredzy

Vím, že je to staré, ale někdo to může považovat za relevantní.

V MySQL používám:

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;

Protože moje DB je InnoDB, jedná se pouze o odhad.

Porovnám tento výstup s:

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

Doufám, že vám to pomůže

0
AJinSD

Nejlepší (po provedení apt-get install ncdu):

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

abyste získali celkovou velikost databází Mysql ve vašem VPS.

0
T.Todua