본문 바로가기

Server/Linux

서버 용량 확인 및 관리 (MYSQL)

1. 서버 용량 확인 방법

서버 용량이 부족하면 서비스 장애를 초래할 수 있다. 주기적으로 서버의 용량을 점검하고 관리하는 것이 필수!

 

용량 확인 명령어

1) df -h

# df -h: 파일 시스템의 사용량과 남은 공간 확인
df -h

 

출력 예시

 

2) du -h

# du -h [경로]: 특정 경로의 디스크 사용량 확인

du -h /var/

 

출력 예시

 

# du -h --max-depth=1 /var: 경로의 하위 디렉터리별 용량 확인

 

# du -ah /var | sort -rh | head -10: 용량이 큰 파일/디렉터리 순위 확인

du -ah /var | sort -rh | head -10

/var/lib/mysql: MySQL 데이터베이스 파일 저장 경로

zabbix 폴더는 Zabbix 모니터링 시스템의 데이터베이스 데이터가 저장됨

 

/var 디렉터리의 용량 관리

/var 경로는 주로 로그, 캐시, 데이터베이스 파일이 쌓이기 때문에 용량이 부족해지기 쉽다.

 

2. 관리 방법

오래된 데이터 삭제

-Zabbix GUI에서 데이터 보존 기간을 조정해 오래된 데이터를 삭제해준다.

-MySQL에서 직접 오래된 데이터를 삭제한다.

 

현재  /var/lib/mysql/zabbix 디렉터리 아래에 큰 용량을 차지하는 history_text.ibd 파일이 보인다. 이 파일은 Zabbix의 히스토리 데이터를 저장하는 테이블 파일로, 불필요한 오래된 데이터를 삭제하면 용량을 확보할 수 있을듯..?

아래는 안전하게 데이터를 정리하는 구체적인 방법이다.

 

1) Zabbix 데이터베이스 테이블 이해

 

 

history 테이블 계열

history, history_text, history_uint 등은 Zabbix의 모니터링 데이터를 저장합니다.

일반적으로 가장 많은 데이터를 차지하는 테이블은 history_text.ibd로, 텍스트 기반의 로그 데이터가 저장됩니다.

 

2) 데이터 삭제 전 데이터베이스 백업하기

mysqldump -u root -p zabbix > /backup/zabbix_backup.sql

 

3) 바이너리 로그 삭제

https://h98h.tistory.com/13

삭제 후 용량이 줄어들었음.

 

4) DB 확인

# MySQL 접속 및 Zabbix 데이터베이스 선택
mysql -u root -p
USE zabbix;
SHOW TABLES;

# 각 테이블의 크기를 확인
SELECT table_name AS "Table", 
       ROUND((data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" 
FROM information_schema.TABLES 
WHERE table_schema = "zabbix" 
ORDER BY (data_length + index_length) DESC;

history_text는 텍스트 기반의 모니터링 데이터를 저장하며, 가장 많은 용량을 차지하고 있음

 

데이터 정리 전 준비 작업

# 서비스 일시 중단 
# 데이터 삭제 작업 중 Zabbix 서버의 MySQL 데이터베이스 사용량이 높아질 수 있다. 
# 안정적인 작업을 위해 Zabbix 서버를 일시 중지하는 것이 좋다.

sudo systemctl stop zabbix-server

 

데이터 백업

mysqldump -u root -p zabbix history_text > /backup/history_text_backup.sql

 

(1) 특정 호스트 데이터 삭제

# 만약 특정 호스트의 데이터가 너무 많이 쌓였다면 해당 호스트의 데이터를 삭제한다.

DELETE FROM history_text 
WHERE itemid IN (SELECT itemid FROM items WHERE hostid = '호스트_ID');

 

호스트 ID는 아래 명령어로 찾을 수 있다.

SELECT hostid, host FROM hosts;

 

(2) 특정 아이템 데이터 삭제

# 특정 모니터링 항목에 해당하는 데이터를 삭제할 수 있다.

DELETE FROM history_text WHERE itemid = '아이템_ID';

 

아이템 ID는 다음과 같이 확인

SELECT itemid, name FROM items WHERE hostid = '호스트_ID';

 

(3) 텍스트 데이터의 크기 기준 분석

# 특정 itemid가 얼마나 많은 데이터를 쌓았고, 총 용량이 얼마나 되는지 보여준다.
# 이 쿼리로 가장 많은 데이터를 차지하는 아이템을 식별할 수 있다.

SELECT 
    itemid, 
    COUNT(*) AS entry_count, 
    ROUND(SUM(LENGTH(value)) / 1024 / 1024, 2) AS total_size_mb 
FROM 
    history_text 
GROUP BY 
    itemid 
ORDER BY 
    total_size_mb DESC 
LIMIT 10;

 

(4) 수집된 시간 기준으로 분석

# 특정 날짜에 많은 용량이 쌓였는지 확인할 수 있다
# 필요에 따라 특정 날짜의 데이터만 삭제할 수 있다

SELECT 
    FROM_UNIXTIME(clock, '%Y-%m-%d') AS date, 
    COUNT(*) AS entry_count, 
    ROUND(SUM(LENGTH(value)) / 1024 / 1024, 2) AS total_size_mb 
FROM 
    history_text 
GROUP BY 
    date 
ORDER BY 
    total_size_mb DESC 
LIMIT 10;

 

오래된 데이터 삭제

DELETE FROM history_text 
WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));

 

특정 텍스트 길이 이상의 데이터 삭제

DELETE FROM history_text 
WHERE LENGTH(value) > 1000;

Truncate 테이블 (데이터 전체 삭제)

# 데이터가 복구가 불필요하다면, 
# 아래 방법으로 history_text 테이블을 비우는(Truncate) 방법을 사용할 수 있다.

# Truncate 테이블 (데이터 전체 삭제)
TRUNCATE TABLE history_text;

# 장점: 빠르게 테이블을 비워준다.
# 주의: 테이블의 모든 데이터가 삭제되므로 복원이 필요하다면 백업 후 실행한다.

 

용량 확인

 

테이블 최적화

OPTIMIZE TABLE history_text;