Beregning av diskplassbruk per MySQL DB
On februar 9, 2021 by adminJeg bruker for øyeblikket information_schema.TABLES for å beregne den totale diskplassforbruket gruppert etter databasenavnet, men det kjører veldig sakte. På servere med hundrevis av databaser kan det ta minutter å beregne.
Hva er den raskeste metoden for å beregne diskplassbruk etter database? Skal jeg bare se på filsystemet? Finnes det en metode for å øke hastigheten på informasjon_skjema?
Svar
Det er 3 scenarier.
- Hvis du bruker MyISAM, er det enklest å bare se på filsystemet og bruke
du -sh /var/lib/mysql/database
. - Hvis du er ved å bruke InnoDB med innodb_file_per_table satt, så kan du få et omtrentlig svar ved hjelp av
du -sh
. Det er omtrentlig fordi det fortsatt er noen data lagret i ibdata1-filen, så du vil være litt på den lave siden. Denne teknikken fungerer også med blandede MyISAM / InnoDB (innodb_file_per_table
) databaser. - Hvis du bruker InnoDB uten
innodb_file_per_table set
, så må du se på INFORMATION_SCHEMA.
I noen av tilfellene ovenfor kan du kjøre følgende spørsmål for å få informasjonen du leter etter.
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)
Hvis du har et veldig stort antall tabeller, kan det gå sakte, som du allerede har oppdaget.
Kommentarer
- Jeg så et annet sted at alternativ 3 ikke tar ‘ t hensyn til VARCHAR-størrelser.
Svar
Du kan bruke denne kommandoen for å få informasjon i 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)
Tilpasset svaret fra Aaron Brown for å gi størrelse i GB. Se Aaron Browns svar for mer informasjon.
ELLER for å inkludere ledig / gjenvinnbar plass, bruk:
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 | +--------------------+---------------+------------------------------+
Plass kan gjenvinnes ved hjelp av OPTIMIZE TABLE command for InnoDB, MyISAM, and ARCHIVE tables.
Se også Hvordan få ekte størrelse på MySQL-databasen? for mer informasjon.
Svar
For at jeg skal se hvor diskplass som blir brukt opp (uansett om det er i en mysql-tabell eller ikke), bruker jeg min pålitelige «du» -kommando. Her er et eksempel på at jeg har funnet hvor all plassen blir spist opp fra.
$ 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
Du kan se at størstedelen av plassen blir brukt av denne mappen. / mysql
Den mappen inneholder datatabeller. For å se hvilke tabeller som tar all plass, kan du fortsette slik ved å bruke alternativet «human» eller «-h». Jeg liker å gjøre diskplassadministrasjon på denne måten fordi du noen ganger ikke en gang kan logge på mysql fordi du ikke vet passordet eller brukeren.
$ 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
Du kan se at all plass blir hogged av noen få tabeller med mange GiG-data. Håper dette hjelper.
Svar
For å få informasjon om navnet på tabellen og antall poster den har, kan spørringen nedenfor brukes,
SELECT * FROM information_schema.TABLES ;
For å få informasjon om databaser på serverne med deres respektive størrelse, kan spørringen nedenfor brukes,
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;
Svar
Jeg vil se etter størrelsen på filen på dataordboken. Den er øyeblikkelig og nøyaktig.
Advarsel : I henhold til lagringsmotoren lagres indekser i hovedfilen eller i en annen fil, ikke glem å oppsummere dem hvis nødvendig.
Kommentarer
- Ja, men hvor er det?
Svar
Jeg vet at dette er gammelt, men noen kan finne dette relevant.
I n MySQL bruker jeg:
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;
Siden DB-en min er InnoDB, er dette bare et estimat.
Jeg sammenligner denne utgangen med:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Håper dette hjelper deg
Svar
Best (etter å ha gjort apt-get install ncdu
):
cd "/var/lib/mysql" && ncdu
for å få den totale størrelsen på Mysql-databaser i VPS.
Svar
Forutsatt at MySQL-verten kjører på Linux.
Du kan utføre spørringen nedenfor for å finn stien der MySQL-data lagres
select @@datadir;
Når du vet hvor dataene er er lagret, kan du sjekke diskbruk med du
kommando.
For eksempel på Ubuntu sudo du -h /var/lib/mysql
.
Du vil få noe slikt
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
Legg igjen en kommentar