MySQL DB'ye göre disk alanı kullanımını hesaplama


28

Şu anda database_ tarafından gruplanan toplam disk alanı kullanımını hesaplamak için information_schema.TABLES kullanıyorum, ancak çok yavaş çalışıyor. Yüzlerce veritabanına sahip sunucularda hesaplanması birkaç dakika sürebilir.

Disk alanı kullanımını veritabanına göre hesaplamanın en hızlı yöntemi nedir? Sadece dosya sistemine mi bakmalıyım? İnformation_schema'yı hızlandırmanın bir yöntemi var mı?

Yanıtlar:


46

3 senaryo var.

  1. MyISAM kullanıyorsanız, sadece dosya sistemine bakmak ve kullanmak en kolaydır du -sh /var/lib/mysql/database.
  2. InnoDB'yi innodb_file_per_table setiyle kullanıyorsanız, kullanarak yaklaşık bir cevap alabilirsiniz du -sh. Bu yaklaşık bir değer çünkü ibdata1 dosyasında saklanan bazı veriler hala var, bu yüzden biraz düşük olursunuz. Bu teknik aynı zamanda karışık MyISAM / InnoDB ( innodb_file_per_table) veritabanlarıyla çalışır.
  3. InnoDB kullanmadan kullanıyorsanız innodb_file_per_table set, INFORMATION_SCHEMA dosyasına bakmanız gerekir.

Yukarıdaki durumların herhangi birinde, aradığınız bilgiyi almak için aşağıdaki sorguyu çalıştırabilirsiniz.

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)

Çok sayıda tablonuz varsa, zaten keşfetmiş olduğunuz gibi yavaş olabilir.


Seçenek 3'ün VARCHAR boyutlarını dikkate almadığını başka bir yerde gördüm.
Joe

3

GB’de bilgi almak için bu komutu kullanabilirsiniz:

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)

Aaron Brown'un cevabını GB cinsinden boyut sağlayacak şekilde uyarladı . Daha fazla bilgi için Aaron Brown'ın cevabına bakınız.

VEYA boş / yeniden doldurulabilir alanı dahil etmek için şunu kullanın:

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 |
+--------------------+---------------+------------------------------+

InnoDB, MyISAM ve ARCHIVE tabloları için OPTIMIZE TABLE komutu kullanılarak alan geri kazanılabilir .

Ayrıca bakınız MySQL Veritabanının Gerçek Boyutu Nasıl Elde Edilir? daha fazla ayrıntı için.


1

Tablonun adı ve sahip olduğu kayıt sayısı hakkında bilgi almak için aşağıdaki sorgu kullanılabilir.

SELECT * 
FROM information_schema.TABLES ;

Sunucuların veritabanları hakkında kendi büyüklüklerine sahip bilgi almak için aşağıdaki sorgu kullanılabilir.

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;

1

Disk alanının nerede kullanıldığını görmem için (mysql tablosunda olsun olmasın), güvenilir "du" komutumu kullanıyorum. İşte tüm alanın nereden yenileceğini bulmama bir örnek.

$ 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

Alanın çoğunluğunun bu klasör tarafından kullanıldığını görebilirsiniz. / mySQL

Bu klasör veri tablolarını tutar. Hangi tabloların tüm alanı kapladığını görmek için "insan" veya "-h" seçeneğini kullanarak bu şekilde devam edebilirsiniz. Disk alanı yönetimini bu şekilde yapmak hoşuma gidiyor, çünkü bazen şifreyi veya kullanıcıyı bilmediğiniz için mysql'ye bile giriş yapamıyorsunuz.

$ 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

Tüm alanın birçok GiG verilerini tutan birkaç tablo tarafından asıldığını görebilirsiniz. Bu yardımcı olur umarım.


0

Veri sözlükteki dosyanın boyutunu arardım. Anlık ve doğru.

Uyarı : Depolama motoruna göre, indeksler ana dosyada saklanır veya başka bir dosyada gerekirse bunları toplamayı unutma.


2
Evet, ama o nerede?
Magne

0

Bunun eski olduğunu biliyorum ama birileri bunu alakalı bulabilir.

MySQL'de kullanıyorum:

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;

Benim DB'm InnoDB olduğundan, bu sadece bir tahmin.

Bu çıktıyı şöyle karşılaştırırım:

du -sch /location/of_Mysql/* | sort -hr | head -n20

Umarım bu size yardımcı olur


0

En iyisi (yaptıktan sonra apt-get install ncdu):

cd "/var/lib/mysql" && ncdu

VPS'nizdeki tüm Mysql veritabanlarının boyutlarını almak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.