티스토리 뷰
반응형
운영 중 이력테이블의 사이즈가 커져서 RDS용량 증가 문제 발생.
문제해결방안으로 파티션테이블로 만들고 오래된 하위테이블은 S3로 백업 후 삭제.
1. 파티션 테이블 생성
CREATE TABLE IF NOT EXISTS change_history_p
(
history_sn bigint NOT NULL DEFAULT nextval('change_history_p_history_sn_seq'::regclass),
...
change_dt timestamp with time zone NOT NULL
) PARTITION BY RANGE (change_dt);
2. 하위테이블 생성
CREATE TABLE change_history_p_y202305 PARTITION OF change_history_p FOR VALUES FROM ('2023-05-01') TO ('2023-06-01') ;
...
CREATE TABLE change_history_p_y202308 PARTITION OF change_history_p FOR VALUES FROM ('2024-04-01') TO ('2024-05-01') ;
3. 데이터 이관
INSERT INTO change_history_p
SELECT ...
FROM change_history
4. 시퀀스값(pk) 수정
SELECT setval('change_history_p_history_sn_seq', (SELECT MAX(history_sn)+1 FROM change_history_p));
5. 하위테이블 생성 스크립트. 실행 달의 다음 달 하위 테이블 생성
SELECT to_char(now()+ INTERVAL '1 month','yyyy-mm')||'-01',to_char(now()+ INTERVAL '2 month','yyyy-mm')||'-01',concat('change_history_p_y',to_char(now()+ INTERVAL '1 month','yyyymm'))
6. 프로시저로 생성 후 배치 등록.(예제)
DO
$$
begin
EXECUTE format('CREATE TABLE IF NOT EXISTS %I PARTITION OF change_history_p FOR VALUES FROM(%L) TO(%L);'
,concat('change_history_p_y',to_char(now()+ INTERVAL '1 month','yyyymm'))
,concat(to_char(now()+ INTERVAL '1 month','yyyy-mm'),'-01')
,concat(to_char(now()+ INTERVAL '2 month','yyyy-mm'),'-01'));
END;
$$ LANGUAGE plpgsql;
반응형
'DataBase > Postgresql' 카테고리의 다른 글
전화번호, 계좌 정보 등 개인정보 불용화 (0) | 2024.05.13 |
---|---|
postgresql 요일 구하기 (0) | 2024.05.13 |
테이블 사이즈 확인 (0) | 2019.08.13 |
role에 속한 계정 조회 (0) | 2019.08.13 |
테이블단위 autovacuum 끄기 (0) | 2019.08.13 |