generated from gc/template-java-maven
파티셔닝: - 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>
70 lines
2.8 KiB
PL/PgSQL
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;
|