Menghitung penggunaan ruang disk per MySQL DB

28

Saat ini saya menggunakan information_schema.TABLES untuk menghitung total penggunaan ruang disk yang dikelompokkan berdasarkan nama database, tetapi sedang berjalan sangat lambat. Pada server dengan ratusan basis data, dibutuhkan beberapa menit untuk menghitungnya.

Apa metode tercepat untuk menghitung penggunaan ruang disk oleh database? Haruskah saya melihat filesystem saja? Apakah ada metode untuk mempercepat information_schema?

GoldenNewby
sumber

Jawaban:

46

Ada 3 skenario.

  1. Jika Anda menggunakan MyISAM, lebih mudah untuk hanya melihat sistem file dan menggunakannya du -sh /var/lib/mysql/database.
  2. Jika Anda menggunakan InnoDB dengan set innodb_file_per_table , maka Anda bisa mendapatkan jawaban perkiraan menggunakan du -sh. Perkiraan karena masih ada beberapa data yang disimpan dalam file ibdata1, sehingga Anda akan sedikit di sisi rendah. Teknik ini juga berfungsi dengan innodb_file_per_tabledatabase MyISAM / InnoDB ( ) campuran .
  3. Jika Anda menggunakan InnoDB tanpa innodb_file_per_table set, maka Anda harus melihat INFORMATION_SCHEMA.

Dalam salah satu kasus di atas, Anda dapat menjalankan kueri berikut untuk mendapatkan informasi yang Anda cari.

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)

Jika Anda memiliki jumlah tabel yang sangat besar, ini bisa lambat, seperti yang sudah Anda temukan.

Aaron Brown
sumber
Saya melihat di tempat lain bahwa opsi 3 tidak memperhitungkan ukuran VARCHAR.
Joe
3

Anda dapat menggunakan perintah ini untuk mendapatkan informasi dalam 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)

Diadaptasi jawaban dari Aaron Brown untuk memberikan ukuran dalam GB. Lihat jawaban Aaron Brown untuk lebih jelasnya.

ATAU untuk memasukkan ruang bebas / reklamasi, gunakan:

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

Spasi dapat direklamasi menggunakan perintah OPTIMIZE TABLE untuk InnoDB, MyISAM, dan tabel ARCHIVE.

Lihat juga Bagaimana Mendapatkan Ukuran Sebenarnya dari Database MySQL? untuk lebih jelasnya.

pengguna9269906
sumber
1

Untuk mendapatkan info tentang nama tabel dan jumlah catatan yang dimilikinya, kueri di bawah ini dapat digunakan,

SELECT * 
FROM information_schema.TABLES ;

Untuk mendapatkan info tentang basis data di server dengan ukurannya masing-masing, kueri di bawah ini dapat digunakan,

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;
Mathew
sumber
1

Agar saya dapat melihat di mana ruang disk digunakan (terlepas apakah itu dalam tabel mysql atau tidak), saya menggunakan perintah "du" saya yang dapat dipercaya. Ini contoh saya menemukan dari mana semua ruang dimakan.

$ 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

Anda dapat melihat bahwa sebagian besar ruang sedang digunakan oleh folder ini. / mysql

Folder itu menampung tabel data. Untuk melihat tabel mana yang mengambil semua ruang, Anda dapat melanjutkan seperti ini menggunakan opsi "manusia" atau "-h". Saya suka melakukan manajemen ruang disk dengan cara ini karena kadang-kadang Anda bahkan tidak bisa masuk ke mysql karena Anda tidak tahu kata sandi atau pengguna.

$ 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

Anda dapat melihat bahwa semua ruang dihambat oleh beberapa tabel yang menyimpan banyak data GiG. Semoga ini membantu.

Russell Lego
sumber
0

Saya akan mencari ukuran file pada kamus data Anda. Ini instan dan akurat.

Peringatan : Menurut mesin penyimpanan, indeks disimpan dalam file utama atau file lain jangan lupa untuk menjumlahkannya jika diperlukan.

Spredzy
sumber
2
Ya, tapi dimana itu?
Magne
0

Saya tahu ini sudah tua tetapi seseorang mungkin menemukan ini relevan.

Di MySQL saya menggunakan:

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;

Karena DB saya adalah InnoDB, ini hanya perkiraan.

Saya membandingkan hasil ini dengan:

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

Semoga ini bisa membantu Anda

AJinSD
sumber
0

Terbaik (setelah melakukan apt-get install ncdu):

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

untuk mendapatkan semua ukuran total dari database Mysql di VPS Anda.

T.Todua
sumber