Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

우주코딩

파티셔닝을 생성하는 PostgreSQL 함수 만들기 본문

월급루팡

파티셔닝을 생성하는 PostgreSQL 함수 만들기

우주코딩 2023. 12. 18. 11:21

파티셔닝 적용과 자동생성을 도입해야하는 상황

열심히 구글링한 결과 pgsql 의 10언더 버전에선 파티셔닝이 아닌 상속만 있어서 상속으로 파티셔닝을 처리했다.

10 이상 버전에서 파티셔닝의 기능을 사용할 수 있다.

문제는 파티셔닝을 도입하면 해당 조건에 맞지 않는 데이터의 경우 바로 에러를 던지기 때문에 미리 생성해 두지 않으면 안된다.

10년치를 미리 만들어 놓는다고 해도 10년 뒤의 누군가는 유지보수를 해야하는 것... 그래서 자동생성을 하려고 한다.

첫번째로 pg_cron 이라는 포스트그레스큐엘 extension을 사용하는 것이다.

이건 타 블로그에 잘 기술되어 있으니 그것을 참조.. 문제는 pg_cron을 설치하는 방법이

소스를 컴파일, yum install이 있는데 현재 패키징 구조상 소스를 컴파일 하여 설치하지 않고있어 이 방법은 패스

yum install을 해보려고 이것 저것 시도를 해보았지만 rpm 설치는 postgresql의 특정 버전에서만 설치가 가능했다... (방법이 있다면 알려주세요)

결국 향후 3개월 파티셔닝을 체크하고 자동생성하는 함수를 만들어서 Spring Quartz 잡으로 등록하기로 했다.

create or replace
function check_and_create() returns void as
$function$
declare
v_ptt_nm text;

v_ptt_nm2 text;

v_ptt_nm3 text;

v_sql text;

begin
v_ptt_nm := 'tmp_tbl' || to_char(now(),'YYYY_MM');

v_ptt_nm2 := 'tmp_tbl' || to_char(now()+ interval '1 month','YYYY_MM');

v_ptt_nm3 := 'tmp_tbl' || to_char(now()+ interval '2 month','YYYY_MM');

if not exists (
select
	relname
from
	pg_class
where
	relname = v_ptt_nm) then
    
v_sql = (
select
	'CREATE TABLE public.' || v_ptt_nm || ' PARTITION OF public.tmp_tbl FOR VALUES 
    FROM (''' || to_char(now(),'YYYY-MM-01') || ''') 
	TO (''' || to_char(now() + interval '1 month','YYYY-MM-01') || ''')' as SCRIPT);

execute v_sql;

raise notice 'table % created','public.' || v_ptt_nm ;
end if;

if not exists(
select
	relname
from
	pg_class
where
	relname = v_ptt_nm2) then
    
v_sql = (
select
	'CREATE TABLE public.' || v_ptt_nm2 || ' PARTITION OF public.tmp_tbl FOR VALUES 
    FROM (''' || to_char(now() + interval '1 month','YYYY-MM-01') || ''') 
	TO (''' || to_char(now() + interval '2 month','YYYY-MM-01') || ''')' as SCRIPT);

execute v_sql;

raise notice 'table % created','public.' || v_ptt_nm2;
end if;

if not exists(
select
	relname
from
	pg_class
where
	relname = v_ptt_nm3) then
    
v_sql = (
select
	'CREATE TABLE public.' || v_ptt_nm3 || ' PARTITION OF public.tmp_tbl FOR VALUES 
    FROM (''' || to_char(now() + interval '2 month','YYYY-MM-01') || ''') 
	TO (''' || to_char(now() + interval '3 month','YYYY-MM-01') || ''')' as SCRIPT);

execute v_sql;

raise notice 'table % created','public.' || v_ptt_nm3;
end if;

raise notice 'end function check_and_create()';

end;

$function$
language plpgsql volatile;

-- 더 좋은 스크립트가 있다면 알려주세요

 

해당 함수를 생성하고 배치로 돌도록 설정했다.

 

'월급루팡' 카테고리의 다른 글

오류 코드: ORA-01898  (0) 2022.06.07
padStart  (0) 2022.05.12
svn 프로젝트 소스 임포트 할 때 순서, 에러 잡기  (0) 2022.03.16
오라클 contains  (0) 2022.03.12
ORDER BY 2,4,6 의 의미는 무엇일까  (0) 2022.02.28
Comments