개요
이 글은 앞서 분리한 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]. 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
답글 남기기
댓글을 달기 위해서는 로그인해야합니다.