MySQL DB 당 디스크 공간 사용량 계산
On 2월 9, 2021 by admin현재 information_schema.TABLES를 사용하여 데이터베이스 이름별로 그룹화 된 총 디스크 공간 사용량을 계산하고 있지만 매우 실행 중입니다. 천천히. 수백 개의 데이터베이스가있는 서버에서는 계산하는 데 몇 분이 걸릴 수 있습니다.
데이터베이스별로 디스크 공간 사용량을 계산하는 가장 빠른 방법은 무엇입니까? 파일 시스템을보고 있어야합니까? information_schema 속도를 높이는 방법이 있습니까?
답변
3 가지 시나리오가 있습니다.
- MyISAM을 사용하는 경우 파일 시스템을보고
du -sh /var/lib/mysql/database
를 사용하는 것이 가장 쉽습니다. - innodb_file_per_table 이 설정된 InnoDB를 사용하면
du -sh
를 사용하여 대략적인 답변을 얻을 수 있습니다. ibdata1 파일에 여전히 일부 데이터가 저장되어 있기 때문에 대략적인 것이므로 약간 낮은 편이 될 것입니다. 이 기술은 혼합 된 MyISAM / InnoDB (innodb_file_per_table
) 데이터베이스에서도 작동합니다. -
innodb_file_per_table set
없이 InnoDB를 사용하는 경우 , 그런 다음 INFORMATION_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)
테이블 수가 너무 많으면 이미 발견했듯이 속도가 느려질 수 있습니다.
댓글 h3>
- 다른 곳에서 옵션 3이 ‘ VARCHAR 크기를 고려하지 않는 것을 보았습니다.
Answer
이 명령을 사용하여 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 데이터베이스의 실제 크기를 얻는 방법 을 참조하세요.
답변
디스크 공간이 어디에서 사용되고 있는지 (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 데이터를 담고있는 몇 개의 테이블이 모든 공간을 차지하고 있음을 알 수 있습니다. 도움이되기를 바랍니다.
Answer
테이블 이름과 테이블에있는 레코드 수에 대한 정보를 얻으려면 아래 쿼리를 사용할 수 있습니다.
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;
답변
데이터 사전에서 파일 크기를 찾아 보겠습니다. 즉각적이고 정확합니다.
경고 : 스토리지 엔진에 따르면 인덱스는 기본 파일 또는 다른 파일에 저장됩니다. 필요합니다.
댓글
- 예,하지만 그게 어디 있나요?
답변
이것이 오래되었지만 누군가 관련성이 있다고 생각할 수 있습니다.
나 n 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
이 정보가 도움이되기를 바랍니다.
답변
최고 (apt-get install ncdu
수행 후) :
cd "/var/lib/mysql" && ncdu
VPS에서 Mysql 데이터베이스의 전체 크기를 가져옵니다.
Answer
MySQL 호스트가 Linux에서 실행되고 있다고 가정합니다.
아래 쿼리를 실행하여 다음을 수행 할 수 있습니다. MySQL 데이터가 저장된 경로 찾기
select @@datadir;
데이터가있는 위치를 알고 나면 저장되면 du
명령으로 디스크 사용량을 확인할 수 있습니다.
예 : Ubuntu sudo du -h /var/lib/mysql
.
다음과 같은 결과를 얻을 수 있습니다.
980K /var/lib/mysql/db_one 1.1M /var/lib/mysql/mysql 8.0K /var/lib/mysql/someother_db 1.2M /var/lib/mysql/another_db 212K /var/lib/mysql/performance_schema 1.7G /var/lib/mysql
답글 남기기