Calculul utilizării spațiului pe disc pentru MySQL DB
On februarie 9, 2021 by adminÎn prezent folosesc information_schema.TABLES pentru a calcula utilizarea spațiului pe disc total grupat după numele bazei de date, dar rulează teribil încet. Pe serverele cu sute de baze de date, poate dura câteva minute pentru a calcula.
Care este cea mai rapidă metodă de calcul al utilizării spațiului pe disc în baza de date? Ar trebui să mă uit doar la sistemul de fișiere? Există o metodă pentru a accelera information_schema?
Răspuns
Există 3 scenarii.
- Dacă utilizați MyISAM, este mai ușor să vă uitați la sistemul de fișiere și să utilizați
du -sh /var/lib/mysql/database
. - Dacă sunteți folosind InnoDB cu set innodb_file_per_table , atunci puteți obține un răspuns aproximativ folosind
du -sh
. Este aproximativ, deoarece există încă unele date stocate în fișierul ibdata1, deci veți fi puțin în partea de jos. Această tehnică funcționează și cu baze de date mixte MyISAM / InnoDB (innodb_file_per_table
). - Dacă utilizați InnoDB fără
innodb_file_per_table set
, atunci va trebui să vă uitați la INFORMATION_SCHEMA.
În oricare dintre cazurile de mai sus, puteți rula următoarea interogare pentru a obține informațiile pe care le căutați.
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)
Dacă aveți un număr foarte mare de tabele, poate fi lent, așa cum ați descoperit deja.
Comentarii
- Am văzut în altă parte că opțiunea 3 nu ‘ nu ia în considerare dimensiunile VARCHAR.
Răspuns
Puteți utiliza această comandă pentru a obține informații în 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)
A adaptat răspunsul de la Aaron Brown pentru a furniza dimensiunea în GB. Consultați răspunsul lui Aaron Brown pentru mai multe detalii.
SAU pentru a include spațiu liber / recuperabil, utilizați:
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 | +--------------------+---------------+------------------------------+
Spațiul poate fi recuperat folosind comanda OPTIMIZE TABLE pentru tabelele InnoDB, MyISAM și ARCHIVE.
Consultați și Cum se obține dimensiunea adevărată a bazei de date MySQL? pentru mai multe detalii.
Răspuns
Pentru a vedea unde se folosește spațiul pe disc (indiferent dacă este sau nu într-un tabel mysql), folosesc comanda mea „du” de încredere. Iată un exemplu în care am găsit de unde se consumă tot spațiul.
$ 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
Puteți vedea că majoritatea spațiului este folosit de acest folder. / mysql
Acest folder conține tabele de date. Pentru a vedea ce tabele ocupă tot spațiul, puteți continua astfel folosind opțiunea „uman” sau „-h”. Îmi place să fac gestionarea spațiului pe disc în acest fel, deoarece uneori nici măcar nu vă puteți conecta la MySQL deoarece nu știți parola sau utilizatorul.
$ 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
Puteți vedea că tot spațiul este acoperit de câteva tabele care conțin multe date GiG. Sper că acest lucru vă va ajuta.
Răspuns
Pentru a obține informații despre numele tabelului și numărul de înregistrări pe care le are, se poate utiliza interogarea de mai jos,
SELECT * FROM information_schema.TABLES ;
Pentru a obține informații despre bazele de date de pe servere cu dimensiunea lor respectivă, poate fi utilizată interogarea de mai jos,
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;
Răspuns
Aș căuta dimensiunea fișierului pe dicționarul dvs. de date. Este instantaneu și precis.
Avertisment : Conform motorului de stocare, indexurile sunt stocate în fișierul principal sau într-un alt fișier, nu uitați să le rezumați dacă nevoie.
Comentarii
- Da, dar unde este asta?
Răspuns
Știu că este vechi, dar cineva poate găsi acest lucru relevant.
I n MySQL îl folosesc:
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;
Deoarece DB-ul meu este InnoDB, aceasta este doar o estimare.
Compar această ieșire cu:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Sper că acest lucru vă ajută
Răspundeți
Cel mai bun (după ce ați făcut apt-get install ncdu
):
cd "/var/lib/mysql" && ncdu
pentru a obține dimensiunea totală a bazelor de date Mysql din VPS.
Răspuns
Presupunând că gazda MySQL rulează pe Linux.
Puteți executa interogarea de mai jos pentru găsiți calea în care sunt stocate datele MySQL
select @@datadir;
Odată ce știți unde sunt datele este stocat, puteți verifica utilizarea discului cu comanda du
.
De exemplu pe Ubuntu sudo du -h /var/lib/mysql
.
Ați primi ceva de genul acesta
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
Sursă: Verificați spațiul de stocare utilizat de MySQL pe Linux
Lasă un răspuns