Levytilan käytön laskeminen MySQL-tietokannan mukaan
On helmikuu 9, 2021 by adminKäytän tällä hetkellä information_schema.TABLES-levyä tietokannan nimen mukaan ryhmitetyn levytilan kokonaiskäytön laskemiseen, mutta se toimii kauheasti hitaasti. Palvelimilla, joilla on satoja tietokantoja, laskeminen voi viedä minuutteja.
Mikä on nopein tapa laskea levytilan käyttö tietokannittain? Pitäisikö minun vain tarkastella tiedostojärjestelmää? Onko olemassa menetelmä tietojen_skeeman nopeuttamiseksi?
Vastaa
On olemassa 3 skenaariota.
- Jos käytät MyISAM-ohjelmaa, on helpoin vain tarkastella tiedostojärjestelmää ja käyttää
du -sh /var/lib/mysql/database
. - Jos olet käyttämällä InnoDB: tä innodb_file_per_table -sarjan kanssa, saat likimääräisen vastauksen käyttämällä
du -sh
. Se on likimääräinen, koska ibdata1-tiedostoon on vielä tallennettu joitain tietoja, joten olet hieman matalalla puolella. Tämä tekniikka toimii myös sekoitettujen MyISAM / InnoDB (innodb_file_per_table
) -tietokantojen kanssa. - Jos käytät InnoDB: tä ilman
innodb_file_per_table set
, sinun on sitten tarkasteltava INFORMATION_SCHEMA.
Kaikissa yllä mainituissa tapauksissa voit suorittaa seuraavan kyselyn saadaksesi etsimäsi tiedot.
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)
Jos sinulla on hyvin suuri määrä taulukoita, se voi olla hidasta, kuten olet jo huomannut.
Kommentit
- Näin jossain muualla, että vaihtoehto 3 ei ’ ota huomioon VARCHAR-kokoja.
vastaus
Tämän komennon avulla saat tietoja GB-muodossa:
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)
Mukautti vastauksen lähettäjältä Aaron Brown koon ilmoittamiseksi gigatavuina. Katso lisätietoja Aaron Brownin vastauksesta saadaksesi lisätietoja.
TAI lisätäksesi vapaata / palautettavaa tilaa, käytä:
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 | +--------------------+---------------+------------------------------+
Avaruus voidaan palauttaa InnoDB-, MyISAM- ja ARCHIVE-taulukoiden OPTIMIZE TABLE -komennolla .
Katso myös Kuinka saada oikea koko MySQL-tietokannasta? saadaksesi lisätietoja.
Vastaa
Jotta voin nähdä, missä levytilaa käytetään loppuun (riippumatta siitä, onko se mysql-taulukossa vai ei), käytän luotettavaa ”du” -komentoni. Tässä on esimerkki siitä, kuinka löydän, mistä kaikki tila syötää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
Voit nähdä, että suurimman osan tilasta käyttää tämä kansio. / mysql
Tässä kansiossa on tietotaulukoita. Jos haluat nähdä, mitkä taulukot vievät kaiken tilaa, voit jatkaa näin käyttämällä ”ihminen” – tai ”-h” -vaihtoehtoa. Haluan tehdä levytilan hallinta tällä tavalla, koska joskus et voi edes kirjautua mysql: ään, koska et tiedä salasanaa tai käyttäjää.
$ 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
Voit nähdä, että muutama taulukko, jossa on paljon GiG: n tietoja, on tylsistynyt koko tilaan. Toivottavasti tämä auttaa.
vastaus
Saat lisätietoja taulukon nimestä ja sen sisältämien tietueiden määrästä käyttämällä alla olevaa kyselyä.
SELECT * FROM information_schema.TABLES ;
Saadaksesi tietoa palvelinten tietokannoista niiden koon mukaan, voit käyttää alla olevaa kyselyä,
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;
vastaus
Etsin tiedostokokoa tietokirjastostasi. Sen välitön ja tarkka.
Varoitus : Tallennuskoneen mukaan indeksit tallennetaan päätiedostoon tai toiseen tiedostoon. Älä unohda niitä summata, jos tarvitaan.
Kommentit
- Joo, mutta missä se on?
Vastaa
Tiedän, että tämä on vanha, mutta joku saattaa pitää tätä merkityksellisenä.
I n Käytettävä MySQL:
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;
Koska minun tietokantani on InnoDB, tämä on vain arvio.
Vertailen tätä lähtöä:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Toivottavasti tämä auttaa sinua
Vastaa
Paras (tekemällä apt-get install ncdu
):
cd "/var/lib/mysql" && ncdu
saadaksesi koko Mysql-tietokantojen koko VPS: ään.
Vastaa
Olettaen, että MySQL-isäntänne toimii Linuxissa.
Voit suorittaa alla olevan kyselyn etsi polku, johon MySQL-tiedot on tallennettu
select @@datadir;
Kun tiedät, mihin tiedot on tallennettu, voit tarkistaa levyn käytön komennolla du
.
Esimerkiksi Ubuntussa sudo du -h /var/lib/mysql
.
Saat jotain tällaista
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
Vastaa