Výpočet využití místa na disku za MySQL DB
On 9 února, 2021 by adminMomentálně používám information_schema.TABLES k výpočtu celkového využití místa na disku seskupeném 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 podle databáze? Měl bych se jen dívat na souborový systém? Existuje metoda pro zrychlení informačního schématu?
Odpověď
Existují 3 scénáře.
- Pokud používáte MyISAM, je nejjednodušší podívat se na souborový systém a použít
du -sh /var/lib/mysql/database
. - Pokud používáte pomocí InnoDB se sadou innodb_file_per_table 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 dně. Tato technika funguje také se smíšenými databázemi MyISAM / InnoDB (innodb_file_per_table
). - Pokud používáte InnoDB bez
innodb_file_per_table set
, pak se budete muset podívat na INFORMATION_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ý počet tabulek, může to být pomalé, jak jste již zjistili.
Komentáře
- Viděl jsem někde jinde, že možnost 3 nezohledňuje ‚ velikosti VARCHAR.
Odpověď
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)
Přizpůsobil odpověď od Aarona Browna tak, aby poskytoval velikost v GB. Další podrobnosti najdete v odpovědi Aarona Browna .
NEBO k zahrnutí volného / uvolnitelné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 uvolnit pomocí příkazu OPTIMIZE TABLE pro tabulky InnoDB, MyISAM a ARCHIVE.
Další podrobnosti naleznete také v části Jak získat skutečnou velikost databáze MySQL? .
Odpovědět
Abych zjistil, kde je místo na disku vyčerpáno (bez ohledu na to, zda je v tabulce mysql nebo ne), používám svůj důvěryhodný příkaz „du“. Zde je příklad toho, jak zjišťuji, odkud je celý prostor pohlcován.
$ 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
Vidíte, že většinu prostoru využívají tato složka. / mysql
Tato složka obsahuje datové tabulky. Chcete-li zjistit, které tabulky zabírají veškerý prostor, můžete takto postupovat pomocí možnosti „člověk“ nebo „-h“. správa místa na disku tímto způsobem, protože někdy se nemůžete ani přihlásit do mysql, protože neznáte heslo ani 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 veškerý prostor zabíjí několik tabulek s mnoha daty GiG. Doufám, že to pomůže.
Odpověď
Chcete-li získat informace o názvu tabulky a počtu záznamů, které obsahuje, lze použít následující dotaz,
SELECT * FROM information_schema.TABLES ;
Chcete-li získat informace o databázích na serverech s jejich příslušnou velikostí, můžete použít následující 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;
Odpověď
Hledám velikost souboru ve vašem datovém slovníku. Je okamžitý a přesný.
Varování : Podle úložiště jsou indexy uloženy v hlavním souboru nebo v jiném souboru, nezapomeňte je sečíst, pokud potřeba.
Komentáře
- Ano, ale kde to je?
Odpověď
Vím, že je to staré, ale někdo to může považovat za relevantní.
I n MySQL, které 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 databáze je InnoDB, jedná se pouze o odhad.
Porovnávám tento výstup s:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Doufám, že vám to pomůže
Odpovědět
Nejlepší (poté, co provedete apt-get install ncdu
):
cd "/var/lib/mysql" && ncdu
a získáte celkovou velikost databází MySQL ve vašem VPS.
Odpověď
Za předpokladu, že váš hostitel MySQL běží na Linuxu.
Níže uvedený dotaz můžete provést najděte cestu, kde jsou uložena data MySQL
select @@datadir;
Jakmile víte, kde jsou data je uloženo, můžete zkontrolovat využití disku pomocí příkazu du
.
Například na Ubuntu sudo du -h /var/lib/mysql
.
Dostali byste něco takového
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
Napsat komentář