Beregning af diskpladsforbrug pr. MySQL DB
On februar 9, 2021 by adminJeg bruger i øjeblikket information_schema.TABLES til at beregne den samlede diskpladsforbrug grupperet efter databasenavnet, men det kører forfærdeligt langsomt. På servere med hundredvis af databaser kan det tage minutter at beregne.
Hvad er den hurtigste metode til beregning af diskpladsforbrug efter database? Skal jeg bare se på filsystemet? Er der en metode til at fremskynde informationsskema?
Svar
Der er 3 scenarier.
- Hvis du bruger MyISAM, er det nemmest at bare se på filsystemet og bruge
du -sh /var/lib/mysql/database
. - Hvis du er ved hjælp af InnoDB med innodb_file_per_table indstillet, så kan du få et omtrentligt svar ved hjælp af
du -sh
. Det er omtrentligt, fordi der stadig er nogle data gemt i ibdata1-filen, så du vil være lidt på den lave side. Denne teknik fungerer også med blandede MyISAM / InnoDB (innodb_file_per_table
) databaser. - Hvis du bruger InnoDB uden
innodb_file_per_table set
, så bliver du nødt til at se på INFORMATION_SCHEMA.
I et af ovenstående tilfælde kan du køre følgende forespørgsel for at få de oplysninger, du leder efter.
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 meget stort antal tabeller, kan det være langsomt, som du allerede har opdaget.
Kommentarer
- Jeg så et andet sted, at mulighed 3 ikke ‘ ikke tager højde for VARCHAR-størrelser.
Svar
Du kan bruge denne kommando til at få oplysninger 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 at give størrelse i GB. Se Aaron Browns svar for flere detaljer.
ELLER for at inkludere ledig / genindvindelig plads skal du bruge:
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 | +--------------------+---------------+------------------------------+
Plads kan genvindes ved hjælp af OPTIMER TABEL-kommando til InnoDB-, MyISAM- og ARCHIVE-tabeller.
Se også Sådan får du ægte størrelse af MySQL-database? for flere detaljer.
Svar
For at jeg kan se, hvor diskplads bliver brugt op (uanset om det er i en mysql-tabel eller ej), bruger jeg min troværdige “du” -kommando. Her er et eksempel på, at jeg finder ud af, hvor al plads spises op 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 af rummet bliver brugt af denne mappe. / mysql
Denne mappe indeholder datatabeller. For at se hvilke tabeller der tager al plads, kan du fortsætte sådan ved at bruge “human” eller “-h”. Jeg kan godt lide at gøre styring af diskplads på denne måde, fordi du undertiden ikke engang kan logge ind på mysql, fordi du ikke kender adgangskoden eller brugeren.
$ 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 al plads bliver slået med nogle få tabeller, der indeholder mange GiG-data. Håber det hjælper.
Svar
For at få information om navnet på tabellen og antallet af poster, den har, kan nedenstående forespørgsel bruges,
SELECT * FROM information_schema.TABLES ;
For at få information om databaser på serverne med deres respektive størrelse kan nedenstående forespørgsel bruges,
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 ville se efter filstørrelsen på din databogbog. Den er øjeblikkelig og nøjagtig.
Advarsel : I henhold til lagringsmotoren lagres indekser i hovedfilen eller i en anden fil, glem ikke at opsummere dem, hvis nødvendigt.
Kommentarer
- Ja, men hvor er det?
Svar
Jeg ved, det er gammelt, men nogen finder det måske relevant.
I n MySQL bruger 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;
Da min DB er InnoDB, er dette kun et skøn.
Jeg sammenligner dette output med:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Håber dette hjælper dig
Svar
Bedst (efter at have udført apt-get install ncdu
):
cd "/var/lib/mysql" && ncdu
for at få al den samlede størrelse af Mysql-databaser i din VPS.
Svar
Forudsat at din MySQL-vært kører på Linux.
Du kan udføre forespørgslen nedenfor for at find stien, hvor MySQL-data er gemt
select @@datadir;
Når du ved, hvor dataene er er gemt, kan du kontrollere diskbrug med du
kommando.
For eksempel på Ubuntu sudo du -h /var/lib/mysql
.
Du får noget som dette
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
Skriv et svar