snp-connection-monitoring/docs/schema/partition_migration.sql
HYOJIN 1aec67cee1 feat(phase6): 안정화 - 파티셔닝 배치, 데이터 정리, 에러 핸들링 보완
파티셔닝:
- PartitionService (JdbcTemplate DDL, 파티션 생성/삭제/목록)
- PartitionManageScheduler (매월 1일 00:00, 미래 파티션 생성 + 만료 파티션 DROP)
- partition_migration.sql (운영 DB 수동 실행용 마이그레이션 문서)
- snp_api_request_log 월별 Range 파티션 전환 완료

데이터 정리:
- DataCleanupScheduler (매일 02:00, health_log 90일 이전 DELETE)
- application.yml retention/partition 설정 추가

에러 핸들링:
- GlobalExceptionHandler: DataAccessException, IllegalArgumentException, HttpMessageNotReadableException 핸들러 추가

Closes #11

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:25:43 +09:00

70 lines
2.8 KiB
PL/PgSQL

-- =============================================================
-- SNP Connection Monitoring - 파티션 마이그레이션
-- snp_api_request_log 테이블을 월별 Range 파티션으로 전환
-- 스키마: common
--
-- 주의: 운영 DB에서 수동 실행. 서비스 중지 후 진행 권장.
-- =============================================================
BEGIN;
-- 1. 기존 데이터 백업
CREATE TABLE common.snp_api_request_log_backup AS
SELECT * FROM common.snp_api_request_log;
-- 2. 기존 테이블 삭제
DROP TABLE IF EXISTS common.snp_api_request_log CASCADE;
-- 3. 파티션 테이블 생성
CREATE TABLE common.snp_api_request_log (
log_id BIGSERIAL,
request_url VARCHAR(2000),
request_params TEXT,
request_method VARCHAR(10),
request_status VARCHAR(20),
request_headers TEXT,
request_ip VARCHAR(45),
service_id BIGINT,
user_id BIGINT,
api_key_id BIGINT,
response_size BIGINT,
response_time INTEGER,
response_status INTEGER,
error_message TEXT,
requested_at TIMESTAMP NOT NULL DEFAULT NOW(),
tenant_id BIGINT,
PRIMARY KEY (log_id, requested_at)
) PARTITION BY RANGE (requested_at);
-- 4. 현재 월 + 미래 2개월 파티션 생성 (실행 시점에 맞게 날짜 수정)
-- 예시: 2026년 4월 실행 기준
CREATE TABLE common.snp_api_request_log_202604
PARTITION OF common.snp_api_request_log
FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');
CREATE TABLE common.snp_api_request_log_202605
PARTITION OF common.snp_api_request_log
FOR VALUES FROM ('2026-05-01') TO ('2026-06-01');
CREATE TABLE common.snp_api_request_log_202606
PARTITION OF common.snp_api_request_log
FOR VALUES FROM ('2026-06-01') TO ('2026-07-01');
-- 5. 인덱스 재생성 (파티션 테이블에 자동 상속됨)
CREATE INDEX idx_snp_request_log_service ON common.snp_api_request_log (service_id);
CREATE INDEX idx_snp_request_log_user ON common.snp_api_request_log (user_id);
CREATE INDEX idx_snp_request_log_requested ON common.snp_api_request_log (requested_at);
CREATE INDEX idx_snp_request_log_tenant ON common.snp_api_request_log (tenant_id);
CREATE INDEX idx_snp_request_log_daily_stats ON common.snp_api_request_log (requested_at, request_status);
CREATE INDEX idx_snp_request_log_daily_user ON common.snp_api_request_log (requested_at, user_id);
CREATE INDEX idx_snp_request_log_svc_stats ON common.snp_api_request_log (requested_at, service_id, request_status);
CREATE INDEX idx_snp_request_log_top_api ON common.snp_api_request_log (requested_at, request_url, request_method);
-- 6. 데이터 복원
INSERT INTO common.snp_api_request_log SELECT * FROM common.snp_api_request_log_backup;
-- 7. 백업 테이블 삭제 (데이터 복원 확인 후)
-- DROP TABLE common.snp_api_request_log_backup;
COMMIT;