Zabbix DB가 느릴 때: MySQL 파티션으로 해결하는 실무 구축법 (3편) — file-per-table 전환과 history·trends 파티션 구조 구성

개요

이 글은 앞서 분리한 Tablespace 구조를 기반으로,
Zabbix의 핵심 데이터(history, trends)를 일 단위 / 월 단위 파티션 테이블로 변환하는 과정을 다룬다.

MySQL 8.0부터는 일반 테이블스페이스(General Tablespace) 위에 파티션을 둘 수 없기 때문에,
먼저 file-per-table 구조로 전환한 뒤 파티션을 생성해야 한다.


1) 전제 조건

  • Ubuntu 22.04
  • Zabbix 7.4
  • MySQL 8.x
  • /data/history, /data/trends 디스크 분리 완료
  • 1~2편의 절차(스키마 import 및 Tablespace 이동)까지 완료되어 있을 것

⚠️ 주의:
운영 중인 환경에서는 파티션 적용 시 데이터 I/O가 급격히 발생하므로,
반드시 테스트 환경에서 검증 후 본 적용을 진행해야 한다.


2) 일반 테이블스페이스에서 file-per-table로 되돌리기

MySQL 8.0부터는 일반 테이블스페이스를 대상으로 파티션 테이블을 둘 수 없다.
따라서 반드시 각 테이블을 innodb_file_per_table 구조로 변경해야 한다.

mysql> 
ALTER TABLE zabbix.history       TABLESPACE = innodb_file_per_table;
ALTER TABLE zabbix.history_uint  TABLESPACE = innodb_file_per_table;
ALTER TABLE zabbix.trends        TABLESPACE = innodb_file_per_table;
ALTER TABLE zabbix.trends_uint   TABLESPACE = innodb_file_per_table;

3) 파티션 생성 전 참고

🔹 history vs trends 구조적 차이

테이블데이터량용도일반 파티션 단위
zabbix.history*초 단위로 수백만 건 이상실시간 단기 저장일 단위 (1~3일 주기)
zabbix.trends*집계(평균/최대/최소) 데이터중기~장기 저장월 단위 (30일 주기)

4) Epoch Time 계산 참고

파티션의 경계값은 UTC 기준 Epoch Time을 사용해야 한다.
이는 타임존 혼동을 방지하고, 크론 스크립트 자동화를 단순화하기 위함이다.

2025-10-25 00:00:00 UTC = 1761350400

리눅스에서 Epoch 값 확인:

date -d '2025-10-25 00:00:00 UTC' +%s

5) history / history_uint — 일 단위 파티션 생성

📌 오늘 기준으로 최초 파티션을 만들고,
각자 운영 환경의 날짜에 맞게 경계값(epoch)을 변경해야 한다.

mysql>  
ALTER TABLE zabbix.history
PARTITION BY RANGE (clock) (
  PARTITION p20251024 VALUES LESS THAN (1761350400) DATA DIRECTORY='/data/history',
  PARTITION pMAX      VALUES LESS THAN (MAXVALUE)   DATA DIRECTORY='/data/history'
);

mysql> ALTER TABLE zabbix.history_uint
PARTITION BY RANGE (clock) (
  PARTITION p20251024 VALUES LESS THAN (1761350400) DATA DIRECTORY='/data/history',
  PARTITION pMAX      VALUES LESS THAN (MAXVALUE)   DATA DIRECTORY='/data/history'
);

6) trends / trends_uint — 월 단위 파티션 생성

📌 기준일은 다음달 1일 00:00:00 UTC로 설정.

mysql> ALTER TABLE zabbix.trends
PARTITION BY RANGE (clock)(
  PARTITION p202510 VALUES LESS THAN (UNIX_TIMESTAMP('2025-11-01 00:00:00')) DATA DIRECTORY='/data/trends',
  PARTITION pMAX    VALUES LESS THAN (MAXVALUE)                               DATA DIRECTORY='/data/trends'
);

mysql> ALTER TABLE zabbix.trends_uint
PARTITION BY RANGE (clock)(
  PARTITION p202510 VALUES LESS THAN (UNIX_TIMESTAMP('2025-11-01 00:00:00')) DATA DIRECTORY='/data/trends',
  PARTITION pMAX    VALUES LESS THAN (MAXVALUE)                               DATA DIRECTORY='/data/trends'
);

7) 작업 후 점검

  • /data/history/data/trends 아래에 p20251024.ibd, p202510.ibd 형태의 파티션 파일 생성 확인
  • MySQL 로그(/var/log/mysql/error.log)에 파티션 오류 없는지 확인
  • 기존 데이터는 자동으로 새 파티션으로 옮겨지지 않으며, 이후 신규 수집 데이터부터 새 파티션에 저장된다.

8) 요약

구분작업결과
Tablespace → file-per-table 전환ALTER TABLE ... TABLESPACE = innodb_file_per_table파티션 생성 가능 상태
history 파티션 생성일 단위 (UTC epoch)/data/history에 일별 파티션 생성
trends 파티션 생성월 단위 (UNIX_TIMESTAMP)/data/trends에 월별 파티션 생성
데이터 경계 기준UTC크론 자동화 시 타임존 혼동 방지

9) 다음 편 예고

4편에서는 이 파티션 구조를 자동으로 관리하는 스크립트를 구성한다.
zbx-part-history.sh, zbx-part-trends.sh 두 개의 크론 스크립트를 통해
매일·매월 신규 파티션 자동 생성과 일정 기간 경과 데이터 자동 삭제를 완성한다.

ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. 본문 및 이미지를 무단 복제·배포할 수 없습니다. 공유 시 반드시 원문 링크를 명시해 주세요.
ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. All rights reserved. Unauthorized copying or redistribution of the text and images is prohibited. When sharing, please include the original source link.

🛠 마지막 수정일: 2025.10.27