it-swarm.asia

Menghitung penggunaan ruang disk per MySQL DB

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

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

29
GoldenNewby

Ada 3 skenario.

  1. Jika Anda menggunakan MyISAM, paling mudah untuk hanya melihat sistem file dan menggunakan du -sh /var/lib/mysql/database.
  2. Jika Anda menggunakan InnoDB dengan innodb_file_per_table set, maka Anda bisa mendapatkan perkiraan jawaban menggunakan du -sh. Perkiraan karena masih ada beberapa data yang disimpan dalam file ibdata1, sehingga Anda akan sedikit di sisi rendah. Teknik ini juga bekerja dengan MyISAM/InnoDB campuran (innodb_file_per_table) basis data.
  3. Jika Anda menggunakan InnoDB tanpa innodb_file_per_table set, maka Anda perlu 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, bisa lambat, seperti yang sudah Anda temukan.

50
Aaron Brown

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 tabel OPTIMIZE TABLE untuk tabel InnoDB, MyISAM, dan ARCHIVE.

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

4
user9269906

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.

1
Russell Lego

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

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.

0
Spredzy

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

0
AJinSD

Terbaik (setelah melakukan apt-get install ncdu):

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

untuk mendapatkan semua ukuran total database Mysql di VPS Anda.

0
T.Todua