Lemezterület-felhasználás kiszámítása MySQL DB-nként
On február 9, 2021 by adminJelenleg az information_schema.TABLES fájlt használom az összes lemezterület-felhasználás kiszámításához az adatbázis neve szerint, de rettenetesen fut lassan. Több száz adatbázissal rendelkező kiszolgálókon perceket vehet igénybe a számítás.
Mi a leggyorsabb módszer a lemezterület-felhasználás kiszámítására adatbázis szerint? Csak a fájlrendszert kellene néznem? Van-e módszer az információséma felgyorsítására?
Válasz
Három forgatókönyv létezik.
- Ha MyISAM-ot használ, akkor a legegyszerűbb megnézni a fájlrendszert, és használni a
du -sh /var/lib/mysql/database
parancsot. - Ha Ön az InnoDB használatával a innodb_file_per_table készlettel, akkor hozzávetőleges választ kaphat a
du -sh
használatával. Ez hozzávetőleges, mert még mindig van néhány adat az ibdata1 fájlban, így egy kicsit az alacsony oldalon lesz. Ez a technika a vegyes MyISAM / InnoDB (innodb_file_per_table
) adatbázisokkal is működik. - Ha az InnoDB-t
innodb_file_per_table set
nélkül használja. , akkor meg kell vizsgálnia az INFORMATION_SCHEMA címet.
A fenti esetek bármelyikében futtathatja a következő lekérdezést a kívánt információk megszerzéséhez.
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)
Ha nagyon sok táblája van, az lassú lehet, amint azt már felfedezte.
Megjegyzések
- Valahol máshol láttam, hogy a 3. lehetőség nem ‘ nem veszi figyelembe a VARCHAR méreteket.
Válasz
Ezzel a paranccsal GB-ba szerezhet információkat:
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)
Az Aaron Brown válaszát úgy alakította át, hogy GB-ban megadja a méretet. További részletekért lásd: Aaron Brown válaszát .
VAGY ha szabad / visszaigényelhető helyet szeretne beírni, használja:
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 | +--------------------+---------------+------------------------------+
A szóköz visszaszerezhető az TABLE OPTIMIZE paranccsal az InnoDB, MyISAM és ARCHIVE táblákhoz.
További részletekért lásd még: Hogyan lehet elérni a MySQL adatbázis valódi méretét? .
Válasz
Annak érdekében, hogy lássam, merre merül fel a lemezterület (függetlenül attól, hogy egy mysql táblában van-e vagy sem), a megbízható “du” parancsomat használom. Itt egy példa arra, hogy megtaláltam, ahonnan az összes helyet elfogyasztják.
$ 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
Láthatja, hogy a hely nagy részét a ez a mappa. / mysql
Ez a mappa adattáblákat tartalmaz. Annak érdekében, hogy lássuk, mely táblák foglalnak helyet, az “emberi” vagy a “-h” opcióval folytathatja így. Szeretem lemezterület-kezelés ilyen módon, mert néha nem is tud bejelentkezni a mysql-be, mert nem tudja a jelszót vagy a felhasználót.
$ 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
Láthatja, hogy az összes helyet néhány tábla feltorlja, amelyek sok GiG adatot tartalmaznak. Remélem, ez segít.
Válasz
Ha információt szeretne kapni a táblázat nevéről és a benne lévő rekordok számáról, az alábbi lekérdezés használható,
SELECT * FROM information_schema.TABLES ;
Ha információt szeretne kapni a kiszolgálókon a megfelelő méretű adatbázisokról, az alábbi lekérdezés használható,
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;
Válasz
A fájl méretét az adatszótárában keresném. Azonnali és pontos.
Figyelmeztetés : A tároló motor szerint az indexek a fő fájlban vagy egy másik fájlban vannak tárolva, ne felejtsük el összegezni őket, ha szükséges.
Megjegyzések
- Igen, de hol van ez?
Válasz
Tudom, hogy ez régi, de valaki ezt relevánsnak találhatja.
I n Az általam használt 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;
Mivel a DB-m InnoDB, ez csak egy becslés.
Összehasonlítom ezt a kimenetet:
du -sch /location/of_Mysql/* | sort -hr | head -n20
Remélem, ez segít
Válasz
Legjobb (apt-get install ncdu
elvégzése után):
cd "/var/lib/mysql" && ncdu
a Mysql adatbázisok teljes méretének megszerzéséhez a VPS-ben.
Válasz
Feltéve, hogy a MySQL gazdagép Linuxon fut.
Az alábbi lekérdezést az alábbiak szerint hajthatja végre: keresse meg a MySQL adatok tárolási útvonalát
select @@datadir;
Ha már tudja, hol vannak az adatok tárolva van, ellenőrizheti a lemezhasználatot a du
paranccsal.
Például az Ubuntu sudo du -h /var/lib/mysql
.
Valami ilyesmit kapna
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
Vélemény, hozzászólás?