MySQL DB 당 디스크 공간 사용량 계산


28

현재 information_schema.TABLES를 사용하여 데이터베이스 이름별로 그룹화 된 총 디스크 공간 사용량을 계산하고 있지만 매우 느리게 실행 중입니다. 수백 개의 데이터베이스가있는 서버에서는 계산하는 데 몇 분이 걸릴 수 있습니다.

데이터베이스별로 디스크 공간 사용량을 계산하는 가장 빠른 방법은 무엇입니까? 파일 시스템 만 살펴 봐야합니까? information_schema 속도를 높이는 방법이 있습니까?

답변:


46

3 가지 시나리오가 있습니다.

  1. MyISAM을 사용하는 경우 파일 시스템을보고 사용하는 것이 가장 쉽습니다 du -sh /var/lib/mysql/database.
  2. innodb_file_per_table이 설정된 InnoDB를 사용하는 경우을 사용하여 대략적인 답변을 얻을 수 있습니다 du -sh. 여전히 ibdata1 파일에 일부 데이터가 저장되어 있기 때문에 근사치이므로 약간 낮은 편입니다. 이 기술은 혼합 MyISAM / InnoDB ( innodb_file_per_table) 데이터베이스 에서도 작동 합니다.
  3. 없이 InnoDB를 사용하는 경우 innodb_file_per_table setINFORMATION_SCHEMA를 확인해야합니다.

위의 경우에서 다음 쿼리를 실행하여 원하는 정보를 얻을 수 있습니다.

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)

매우 많은 수의 테이블이있는 경우 이미 발견 한 것처럼 느릴 수 있습니다.


다른 곳에서 옵션 3이 VARCHAR 크기를 고려하지 않는 것을 보았습니다.
Joe

3

이 명령을 사용하여 정보를 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)

Aaron Brown 의 답변을 GB 단위로 제공했습니다. 자세한 내용은 Aaron Brown의 답변 을 참조하십시오.

또는 여유 공간 / 재생 공간을 포함 시키려면 다음을 사용하십시오.

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 및 ARCHIVE 테이블에 OPTIMIZE TABLE 명령 을 사용하여 공간을 회수 할 수 있습니다 .

실제 크기의 MySQL 데이터베이스를 얻는 방법 도 참조하십시오 . 상세 사항은.


1

테이블 이름과 레코드 수에 대한 정보를 얻으려면 아래 쿼리를 사용할 수 있습니다.

SELECT * 
FROM information_schema.TABLES ;

각각의 크기로 서버의 데이터베이스에 대한 정보를 얻기 위해 아래 쿼리를 사용할 수 있습니다.

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

디스크 공간이 어디에서 사용되는지 확인하려면 (mysql 테이블에 있는지 여부에 관계없이) 신뢰할 수있는 "du"명령을 사용합니다. 다음은 모든 공간이 어디서 소비되는지 찾는 예입니다.

$ 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

이 폴더가 공간의 대부분을 사용하고 있음을 알 수 있습니다. / mysql

해당 폴더에는 데이터 테이블이 있습니다. 어떤 테이블이 모든 공간을 차지하는지 확인하기 위해 "human"또는 "-h"옵션을 사용하여 이와 같이 진행할 수 있습니다. 암호 또는 사용자를 모르기 때문에 때로는 mysql에 로그인 할 수 없기 때문에 디스크 공간 관리를하고 싶습니다.

$ 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

많은 GiG 데이터를 보유한 몇 개의 테이블이 모든 공간을 차지하고 있음을 알 수 있습니다. 이것이 도움이되기를 바랍니다.


0

데이터 사전에서 파일 크기를 찾습니다. 즉각적이고 정확합니다.

경고 : 스토리지 엔진에 따르면 인덱스는 기본 파일 내에 저장되거나 다른 파일에 저장되며 필요한 경우 합계하는 것을 잊지 마십시오.


2
예,하지만 어디입니까?
Magne

0

나는 이것이 오래되었다는 것을 알고 있지만 누군가는이 관련성을 찾을 수 있습니다.

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;

내 DB는 InnoDB이므로 추정치입니다.

이 출력을 다음과 비교합니다.

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

희망이 당신을 도울


0

최고 (수행 후 apt-get install ncdu) :

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

VPS에서 Mysql 데이터베이스의 전체 크기를 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.