Tính toán dung lượng ổ đĩa trên mỗi DB DB


28

Tôi hiện đang sử dụng information_schema.TABLES để tính tổng dung lượng sử dụng không gian đĩa được nhóm theo tên cơ sở dữ liệu, nhưng nó đang chạy rất chậm. Trên các máy chủ có hàng trăm cơ sở dữ liệu, có thể mất vài phút để tính toán.

Phương pháp nhanh nhất để tính toán sử dụng không gian đĩa theo cơ sở dữ liệu là gì? Tôi có nên nhìn vào hệ thống tập tin không? Có một phương pháp để tăng tốc information_schema không?

Câu trả lời:


45

Có 3 kịch bản.

  1. Nếu bạn đang sử dụng MyISAM, cách dễ nhất là chỉ cần nhìn vào hệ thống tệp và sử dụng du -sh /var/lib/mysql/database .
  2. Nếu bạn đang sử dụng InnoDB với bộ innodb_file_per_table , thì bạn có thể nhận được câu trả lời gần đúng bằng cách sử dụng du -sh. Nó là gần đúng vì vẫn còn một số dữ liệu được lưu trữ trong tệp ibdata1, vì vậy bạn sẽ có một chút ở phía thấp. Kỹ thuật này cũng hoạt động với innodb_file_per_tablecơ sở dữ liệu hỗn hợp MyISAM / InnoDB ( ).
  3. Nếu bạn đang sử dụng InnoDB mà không có innodb_file_per_table set, thì bạn sẽ cần xem THÔNG TIN_SCHema.

Trong bất kỳ trường hợp nào ở trên, bạn có thể chạy truy vấn sau để có được thông tin mà bạn đang tìm kiếm.

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)

Nếu bạn có số lượng bảng rất lớn, nó có thể chậm, như bạn đã phát hiện ra.


Tôi thấy ở đâu đó tùy chọn 3 không tính đến kích thước VARCHAR.
Joe

3

Bạn có thể sử dụng lệnh này để nhận thông tin bằng 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)

Điều chỉnh câu trả lời từ Aaron Brown để cung cấp kích thước tính bằng GB. Xem câu trả lời của Aaron Brown để biết thêm chi tiết.

HOẶC để bao gồm không gian miễn phí / có thể thu hồi, sử dụng:

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

Không gian có thể được lấy lại bằng cách sử dụng lệnh OPTIMIZE TABLE cho các bảng InnoDB, MyISAM và ARCHIVE.

Xem thêm Làm thế nào để có được kích thước thật của cơ sở dữ liệu MySQL? để biết thêm chi tiết.


1

Để nhận thông tin về tên của bảng và số lượng bản ghi có, có thể sử dụng truy vấn bên dưới,

SELECT * 
FROM information_schema.TABLES ;

Để nhận thông tin về cơ sở dữ liệu trên các máy chủ có kích thước tương ứng, có thể sử dụng truy vấn bên dưới,

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

Để cho tôi biết không gian đĩa đang được sử dụng hết (bất kể nó có trong bảng mysql hay không), tôi sử dụng lệnh "du" đáng tin cậy của mình. Đây là một ví dụ về việc tôi tìm thấy tất cả không gian đang bị ăn mò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

Bạn có thể thấy rằng phần lớn không gian đang được sử dụng bởi thư mục này. / mys

Thư mục đó chứa các bảng dữ liệu. Để xem các bảng nào đang chiếm toàn bộ không gian, bạn có thể tiến hành như thế này bằng cách sử dụng tùy chọn "con người" hoặc "-h". Tôi thích quản lý không gian đĩa theo cách này vì đôi khi bạn thậm chí không thể đăng nhập vào mysql vì bạn không biết mật khẩu hoặc người dùng.

$ 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

Bạn có thể thấy rằng tất cả không gian đang bị tắc nghẽn bởi một vài bảng chứa nhiều dữ liệu của GiG. Hi vọng điêu nay co ich.


0

Tôi sẽ tìm kích thước của tệp trên từ điển dữ liệu của bạn. Nó ngay lập tức và chính xác.

Cảnh báo : Theo công cụ lưu trữ, các chỉ mục được lưu trữ trong tệp chính hoặc trong một tệp khác đừng quên tổng hợp chúng nếu cần.


2
Vâng, nhưng đó là ở đâu?
Magne

0

Tôi biết điều này là cũ nhưng ai đó có thể tìm thấy điều này có liên quan.

Trong MySQL tôi sử dụng:

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;

Vì DB của tôi là InnoDB, đây chỉ là ước tính.

Tôi so sánh đầu ra này với:

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

Hy vọng điều này sẽ giúp bạn


0

Tốt nhất (sau khi làm apt-get install ncdu):

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

để có được tất cả kích thước của cơ sở dữ liệu Mysql trong VPS của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.