본문으로 건너뛰기

확장 기능

카카오클라우드 PostgreSQL에서 제공하는 확장 기능과 주요 사용 방법을 설명합니다.

확장 기능 조회 및 설치

카카오클라우드 PostgreSQL은 주요 확장 기능을 기본 제공합니다. 신규 데이터베이스를 기본 템플릿으로 생성하면, template1에 등록된 확장 기능을 별도 설치 없이 사용할 수 있습니다.

확장 기능 기본 제공 방식
  • pg_cron을 제외한 기본 제공 확장 기능은 template1 데이터베이스에 등록되어 있습니다.
  • pg_cron은 기본 데이터베이스인 postgres에 등록되어 있습니다. 사용 방법과 제한 사항은 pg_cron을 참고해 주세요.
  • template1이 아닌 다른 템플릿으로 데이터베이스를 생성한 경우에는 필요한 확장 기능을 직접 설치해야 합니다.

직접 설치가 필요한 경우, 다음과 같이 설치 가능한 확장 기능을 조회하고 설치할 수 있습니다.

설치 가능한 확장 기능 조회

설치 가능한 확장 기능은 다음과 같이 조회할 수 있습니다.

설치 가능 확장 기능 조회 예시
select * from pg_available_extensions ;

확장 기능 설치

확장 기능을 설치하려면 최초 생성한 사용자 계정에서 create_extension을 사용합니다.
create_extensionpostgres.public에 있으므로 반드시 postgres 데이터베이스에 접속한 후 호출해야 합니다.
postgres 데이터베이스에서 수행하지 않을 경우 타입 오류가 발생할 수 있습니다.

확장 기능 설치, create_extension 예시
# template0 기반의 데이터베이스를 생성하여 orafce 확장 기능을 설치하는 예시입니다.
# 예시에 사용될 사용자 계정은 admin으로 가정합니다.

# 1. template0 기반의 'test' 데이터베이스를 생성합니다.
postgres=> create database test TEMPLATE template0 ;
CREATE DATABASE

# 2. postgres 데이터베이스에서 create_extension 프로시저를 호출합니다. 호출 시 각 필드의 타입을 예시와 같이 지정하는 것을 권장합니다.
postgres=> \c postgres admin
postgres=> CALL create_extension('test'::text, 'orafce'::text);
NOTICE: Extension "orafce" added to database "test"
CALL

# 3. 'test' 데이터베이스에 설치된 확장 기능을 확인합니다.
postgres=> \c test admin
You are now connected to database "test" as user "admin".

test=> \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+-----------------------------------------------------------------------------------------------
orafce | 4.15 | public | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)

지원하는 확장 기능

확장 기능에 대한 자세한 설명은 PostgreSQL 공식 추가 확장 문서를 참고하시기 바랍니다.

이름설명
adminpack서버 설정, 로그 디렉터리, 파일 상태 등 관리 정보를 조회하는 함수 모음입니다.
데이터베이스 관리와 문제 진단에 활용할 수 있습니다.
amcheckB-Tree 인덱스 등 데이터베이스 구조의 손상 여부와 일관성을 검사합니다. 데이터 무결성 점검과 장애 원인 분석에 유용합니다.
autoinc트리거 기반 자동 증가 열을 구현할 때 사용합니다.
bloom여러 열 조건을 빠르게 필터링하기 위한 블룸 필터 인덱스를 제공합니다. 대용량 테이블의 다중 컬럼 검색에 활용할 수 있습니다.
intarray정수 배열을 검색하고 조작하는 함수와 연산자를 제공합니다.
btree_gin일반 B-Tree 비교 연산을 GIN 인덱스에서 사용할 수 있습니다. 배열, JSONB 등 복합 데이터 타입 인덱싱에 활용할 수 있습니다.
btree_gist일반 B-Tree 비교 연산을 GiST 인덱스와 함께 사용할 수 있게 합니다. 범위 타입이나 복합 조건 인덱싱에 활용합니다.
citext대소문자를 구분하지 않는 텍스트 타입을 제공합니다. 이메일 주소나 사용자 이름처럼 대소문자 구분이 불필요한 값에 유용합니다.
cube다차원 점과 큐브 데이터를 저장하고 검색하는 타입과 연산자를 제공합니다. 다차원 좌표나 간단한 공간 계산에 활용할 수 있습니다.
dblink다른 PostgreSQL 데이터베이스에 연결해 쿼리를 실행합니다. 분산 환경에서 외부 데이터베이스의 데이터를 조회할 때 사용합니다.
dict_xsyn텍스트 검색에서 동의어 사전을 사용할 수 있게 합니다. 같은 의미의 다른 표현을 동일하게 검색해야 할 때 활용합니다.
dict_int텍스트 검색에서 정수 토큰을 처리하기 위한 사전을 제공합니다. 숫자 기반 검색어를 정규화할 때 사용합니다.
earthdistance위도와 경도 등 지리 좌표 간 거리를 계산합니다. 위치 기반 검색이나 거리 계산에 활용할 수 있습니다.
file_fdw서버의 파일을 외부 테이블로 조회할 수 있게 합니다. CSV 같은 파일 데이터를 테이블처럼 조회할 때 사용합니다.
fuzzystrmatch유사 문자열 검색과 철자 오류 보정에 사용할 수 있는 문자열 매칭 함수를 제공합니다. 이름, 주소 등 유사 텍스트 비교에 유용합니다.
hstore키-값 쌍 데이터를 저장하고 검색하기 위한 데이터 타입을 제공합니다. JSONB가 필요하지 않은 단순 속성 저장에 활용할 수 있습니다.
hstore_plperlPerl 함수에서 hstore 데이터를 처리할 수 있게 합니다.
hstore_plperlu신뢰할 수 없는 Perl 함수에서 hstore 데이터를 처리할 수 있게 합니다.
hypopg실제 인덱스를 생성하지 않고 가상 인덱스로 실행 계획을 검토합니다. 인덱스 추가 전 쿼리 성능 영향을 예측할 때 유용합니다.
insert_username행 삽입 또는 업데이트 시 현재 사용자 이름을 자동으로 기록합니다.
intagg정수 값을 배열 형태로 집계하는 함수를 제공합니다. 여러 정수 값을 하나의 배열 결과로 반환해야 할 때 사용합니다.
isnISBN, ISMN, ISSN 등 국제 표준 번호 타입과 검증 기능을 제공합니다. 표준 번호를 저장하고 형식을 검증할 때 사용합니다.
jsonb_plperlPerl 함수에서 jsonb 데이터를 처리할 수 있게 합니다.
jsonb_plperlu신뢰할 수 없는 Perl 함수에서 jsonb 데이터를 처리할 수 있게 합니다.
jsonb_plpython3uPython 3 함수에서 jsonb 데이터를 처리할 수 있게 합니다.
lo대용량 객체(Large Object)를 관리하는 기능을 제공합니다. 바이너리 파일처럼 큰 데이터를 데이터베이스에서 다룰 때 사용합니다.
ltree계층형 라벨 데이터를 저장하고 검색하기 위한 데이터 타입과 연산자를 제공합니다. 트리 구조 데이터 처리에 활용할 수 있습니다.
ltree_plpython3uPython 3 함수에서 ltree 데이터를 처리할 수 있게 합니다.
moddatetime행이 변경될 때 수정 시간을 자동으로 기록합니다.
old_snapshot오래된 스냅샷 사용과 관련된 상태 정보를 제공합니다. 장기 실행 쿼리 관련 문제를 진단할 때 사용할 수 있습니다.
orafceOracle 호환 함수와 패키지를 제공하며, Oracle 기반 애플리케이션을 PostgreSQL로 마이그레이션할 때 사용할 수 있습니다.
pageinspect테이블과 인덱스 페이지의 내부 구조를 검사합니다. 인덱스나 페이지 단위 문제를 상세 분석할 때 사용합니다.
pg_buffercache공유 버퍼 캐시의 현재 상태를 조회합니다. 데이터베이스 캐시 사용 현황을 분석할 때 사용합니다.
pg_freespacemap테이블과 인덱스 페이지의 여유 공간 정보를 조회합니다. 공간 사용 효율을 분석할 때 활용합니다.
pgcrypto암호화, 복호화, 해시 생성 함수를 제공합니다. 데이터 암호화와 무결성 검증에 사용할 수 있습니다.
pgrowlocks특정 테이블의 행 잠금 정보를 조회합니다. 잠금 경합이나 트랜잭션 문제를 분석할 때 사용합니다.
pgstattuple테이블과 인덱스의 공간 사용량과 dead tuple 정보를 분석합니다. 테이블 팽창과 정리 필요성을 판단할 때 유용합니다.
pg_stat_kcache쿼리별 CPU와 커널 레벨 I/O 사용 통계를 수집합니다. 쿼리 성능 병목을 시스템 리소스 관점에서 분석할 때 사용합니다.
pg_visibility테이블 페이지와 행의 가시성 정보를 조회합니다. VACUUM 상태나 dead tuple 관련 문제를 분석할 때 참고할 수 있습니다.
plperlPerl로 사용자 정의 함수를 작성할 수 있게 합니다.
plpgsqlPostgreSQL의 기본 절차적 언어로 함수와 트리거를 작성할 때 사용합니다.
plprofilerPL/pgSQL 함수의 실행 시간과 성능 병목을 분석합니다. 저장 함수나 프로시저 최적화에 활용할 수 있습니다.
plpython3uPython 3으로 사용자 정의 함수를 작성할 수 있게 합니다.
plpythonuPython 2 기반 사용자 정의 함수를 지원합니다. Python 2는 지원 종료되었으므로 plpython3u 사용을 권장합니다.
postgis공간 데이터 타입과 공간 인덱스, 거리 계산 등 GIS 기능을 제공합니다. 위치 기반 서비스나 공간 데이터 분석에 사용합니다.
postgis_topologyPostGIS에서 위상 기반 공간 모델을 사용할 수 있게 합니다. 공간 객체 간 연결, 경계, 인접 관계를 관리할 때 사용합니다.
postgres_fdw외부 PostgreSQL 데이터베이스의 테이블을 로컬에서 조회합니다.
데이터 통합이나 마이그레이션에 활용할 수 있으며, 사용 방법은 postgres_fdw를 참고해 주세요.
refint트리거 기반 참조 무결성 검사 기능을 제공합니다.
seg선분 데이터를 저장하고 비교하는 타입과 연산자를 제공합니다.
sslinfo현재 SSL 연결과 클라이언트 인증서 정보를 조회합니다.
tablefunc크로스탭 등 테이블 변환 함수를 제공합니다. 집계 결과를 피벗 형태로 표현할 때 유용합니다.
tcn테이블 변경 사항을 알림으로 전달하는 트리거 기반 기능을 제공합니다.
tsm_system_rows지정한 행 수만큼 테이블 샘플링을 수행합니다.
tsm_system_time지정한 시간 동안 테이블 샘플링을 수행합니다.
unaccent문자열에서 악센트 기호를 제거하여 검색과 비교에 활용합니다.
uuid-osspUUID 생성 함수를 제공합니다.
pgvector벡터 데이터를 저장하고 유사도 검색을 수행합니다. 검색, 추천, AI 애플리케이션의 임베딩 데이터 처리에 활용합니다.
pg_cron데이터베이스 작업을 cron 형식으로 예약 실행합니다.
정기적인 VACUUM, 집계, 유지 관리 작업에 활용할 수 있으며, 사용 방법은 pg_cron을 참고해 주세요.
pg_hint_planSQL 힌트로 쿼리 실행 계획을 제어할 수 있게 합니다.
pg_partman시간 또는 순번 기반 파티션 테이블 관리를 지원합니다.
pg_proctab운영 체제 프로세스 정보를 PostgreSQL에서 조회합니다.
pg_repack테이블과 인덱스의 bloat을 줄이고 공간을 회수합니다. 서비스 중단을 최소화하면서 테이블을 정리할 때 사용합니다.
pg_trgm트라이그램 기반 유사 문자열 검색과 인덱싱을 지원합니다. LIKE '%검색어%' 형태의 검색 성능 개선에 유용합니다.
pg_stat_statements쿼리별 실행 횟수, 실행 시간, I/O 등 SQL 실행 통계를 수집합니다. 자주 실행되거나 부하가 큰 쿼리를 식별할 때 사용합니다.

확장 기능 상세

사용 방법에 대한 추가 설명이 필요한 확장 기능을 소개합니다.

postgres_fdw

postgres_fdw는 PostgreSQL에서 제공하는 외부 데이터 래퍼(FDW, Foreign Data Wrapper)입니다. 원격 PostgreSQL 데이터베이스의 테이블을 로컬 데이터베이스에서 조회하거나, 원격 테이블을 참조하는 외부 테이블을 로컬에 생성할 수 있습니다.
카카오클라우드에서 제공하는 postgres_fdw를 사용하려면 create_fdw_server 프로시저를 사용해야 합니다. create_fdw_server 프로시저는 template1에 생성되어 있으므로, 신규 데이터베이스 생성 시 기본으로 제공됩니다.

postgres_fdw는 다음과 같이 프로시저를 호출하여 원격 서버를 생성할 수 있습니다. 프로시저를 실행하면 사용자 계정이 자동으로 매핑되며, 서버 생성 후 외부 테이블을 만들어 사용할 수 있습니다.

사용 절차는 다음과 같습니다.

  1. 데이터베이스 생성이 가능한 관리자 또는 사용자 계정을 이용해서 데이터베이스를 생성합니다.
  2. 접근하려는 데이터베이스에 대한 보안 그룹의 아웃바운드 규칙(포트 허용)이 설정되어 있는지 확인합니다.
  3. 생성한 데이터베이스에서 create_fdw_server 프로시저를 사용해 FDW 수행을 위한 서버를 생성합니다.
  4. 외부 데이터베이스를 조회합니다.
postgres_fdw 사용 예시
[create_fdw_server 생성 및 사용자 정보 연결]
SELECT * FROM create_fdw_server(
'fdw_server', -- 서버 이름
'pg_endpoint', -- 외부 데이터베이스 엔드포인트
'foreign_database', -- 외부 데이터베이스 이름
5432, -- 외부 데이터베이스 접속 포트(숫자 형식)
'test_database', -- 외부 데이터베이스를 조회할 사용자 데이터베이스
'admin', -- 사용자 계정 ID
'foreign_admin', -- 외부 데이터베이스 계정 ID
'foreign_pass' -- 외부 데이터베이스 계정 비밀번호
);

예시)
SELECT * FROM create_fdw_server(
'db_nameserver',
'db_name-pg-001.csnzphcqgi72.ap-northeast-2.rds.amazonaws.com',
'postgres',
5432,
'grey',
'admin',
'remote_user',
'remote_password'
);

[외부 데이터베이스 조회]
create_fdw_server를 통해 생성한 서버 이름 조회 예시
SELECT srvname, srvtype, srvversion, srvoptions FROM pg_foreign_server;

원격 테이블 매핑 예시)
CREATE FOREIGN TABLE remote_table (
id SERIAL,
name TEXT,
value NUMERIC
)
SERVER fdw_server_example -- FDW 서버 이름
OPTIONS (schema_name 'public', table_name 'remote_table_name');

pg_cron

pg_cron은 데이터베이스의 유지 보수와 운영 효율성을 위해 cron 기반 작업 스케줄링을 실행할 수 있게 하는 확장 기능입니다. 카카오클라우드에서는 기본 데이터베이스인 postgrespg_cron이 생성되어 있으며, pg_cron의 시간대는 UTC±00:00을 기준으로 합니다.

지원하지 않는 pg_cron 작업

서비스의 안정적인 운영을 위해 cron.schedule, cron.alter_job, UPDATE cron.jobcron.job을 직접 생성하거나 변경하는 작업은 지원하지 않습니다.

사용 절차는 다음과 같습니다.

  1. pg_cron이 설정된 postgres 데이터베이스에 접근합니다.
  2. cron 형태의 스케줄을 등록합니다.
  3. 등록된 시간에 cron이 수행되었는지 조회합니다.
  4. 스케줄을 삭제합니다.
pg_cron 사용 예시
postgres=# \c postgres {관리자/사용자 ID}
You are now connected to database "postgres" as user "{관리자/사용자 ID}".

[스케줄 등록]
# 매일 새벽 4시(UTC)에 특정 데이터베이스에서 VACUUM이 수행되는 'weekly-vacuum'이라는 이름의 스케줄 등록
# postgres=> CALL create_cronjob('{job name}', '{schedule}', '{command}', '{DB name}', {active});

postgres=> CALL create_cronjob('weekly-vacuum', '* 4 * * *', 'VACUUM', 'test', true);

[스케줄 조회]
postgres=> select * from cron.job ;
jobid | schedule | command | nodename | nodeport | database | username | active | jobname
-------+-------------+---------+-----------+----------+----------+----------+--------+------------------
1 | * 4 * * * | VACUUM | | 5432 | test | admin | t | weekly-vacuum


[스케줄 수행 조회]
postgres=> select * from cron.job_run_details ;
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time

-------+-------+---------+----------+----------+---------+-----------+----------------+-------------------------------+---------------------
----------
8 | 1 | 379928 | db_name | postgres | VACUUM | succeeded | VACUUM | 2024-11-11 11:01:00.066025+00 | 2024-11-11 11:01:05.
821539+00
(1 rows)


[스케줄 삭제]
# 기존에 등록한 스케줄 삭제
# postgres=> select cron.unschedule('{Job name or Job ID}') ;

postgres=> select cron.unschedule('weekly-vacuum') ;
unschedule
------------
t
(1 row)
작업 수정

작업(Job)을 수정하려면 기존 작업을 삭제한 후 새로운 설정으로 작업을 등록해 주세요.