PostgreSQL을 위한 일반 DBA 작업 - Amazon Relational Database Service

PostgreSQL을 위한 일반 DBA 작업

이번 단원에서는 PostgreSQL 데이터베이스 엔진을 실행하는 DB 인스턴스의 몇 가지 공통 DBA 작업에 대한 Amazon RDS 구현에 대해 설명합니다. 관리형 서비스 환경을 제공하기 위해 Amazon RDS는 DB 인스턴스에 대해 shell 액세스를 제공하지 않으며, 고급 권한을 필요로 하는 특정 시스템 절차와 테이블에 대한 액세스를 제한합니다.

Amazon RDS의 PostgreSQL 로그 파일 작업 방법에 대한 자세한 내용은 PostgreSQL 데이터베이스 로그 파일 단원을 참조하십시오.

역할 생성

DB 인스턴스를 생성할 때 마스터 사용자 시스템 계정은 rds_superuser 역할에 할당됩니다. rds_superuser 역할은 PostgreSQL 수퍼유저 역할(로컬 인스턴스에 사용자 정의로 명명된 postgres)과 마찬가지로 사전에 정의된 Amazon RDS 역할이지만 일부 제한 사항이 있습니다. PostgreSQL 수퍼유저 역할과 마찬가지로 rds_superuser 역할에는 DB 인스턴스에 대한 최대의 권한이 있습니다. 사용자에게 DB 인스턴스에 대한 최대의 액세스 권한이 필요하지 않다면 사용자에게 이 역할을 할당하면 안 됩니다.

rds_superuser 역할은 다음을 수행할 수 있습니다.

  • Amazon RDS와 함께 사용할 수 있는 확장 기능을 추가합니다. 자세한 내용은 지원되는 PostgreSQL 기능PostgreSQL 문서를 참조하십시오.

  • 테이블스페이스 생성 및 삭제를 포함한 테이블스페이스 관리. 자세한 내용은 PostgreSQL 설명서에서 Amazon RDS의 PostgreSQL에 대한 테이블 공간테이블스페이스 섹션을 참조하세요.

  • pg_stat_activity 명령을 사용하여 rds_superuser 역할이 할당되지 않은 모든 사용자를 보고, pg_terminate_backendpg_cancel_backend 명령을 사용하여 연결 중단

  • rds_superuser 역할이 아닌 모든 역할에 대해 rds_replication 역할을 부여하고 취소합니다. 자세한 내용은 PostgreSQL 문서에서 GRANT 단원을 참조하십시오.

다음은 사용자를 생성한 후 사용자에게 rds_superuser 역할을 부여하는 방법을 나타낸 예제입니다. 여기서는 rds_superuser 같은 사용자 정의 역할을 부여해야 합니다.

create role testuser with password 'testuser' login; grant rds_superuser to testuser;

PostgreSQL 데이터베이스 액세스 관리

PostgreSQL용 Amazon RDS에서 어느 사용자가 어느 데이터베이스에 연결할 권한이 있는지 관리할 수 있습니다. 다른 PostgreSQL 환경에서 pg_hba.conf 파일을 수정하여 이러한 관리를 수행하는 경우도 있습니다. Amazon RDS에서 데이터베이스 권한을 대신 사용할 수 있습니다.

PostgreSQL의 새 데이터베이스는 항상 기본 권한 세트를 사용하여 생성됩니다. 기본 권한을 사용하면 PUBLIC(모든 사용자)이 데이터베이스에 연결하고 연결된 동안 임시 테이블을 생성할 수 있습니다.

Amazon RDS의 주어진 데이터베이스에 연결할 수 있는 사용자를 제어하려면 먼저 기본 PUBLIC 권한을 취소합니다. 그런 다음 권한을 다시 세부적으로 허용합니다. 다음 예제 코드에서는 작업 방법을 보여줍니다.

psql> revoke all on database <database-name> from public; psql> grant connect, temporary on database <database-name> to <user/role name>;

PostgreSQL 데이터베이스의 권한에 대한 자세한 내용은 PostgreSQL 설명서에서 GRANT 명령을 참조하십시오.

PostgreSQL 파라미터 작업

postgresql.conf 파일에서 로컬 PostgreSQL 인스턴스의 PostgreSQL 파라미터를 설정하면 DB 인스턴스의 DB 파라미터 그룹에 유지됩니다. 기본 파라미터 그룹을 사용해 DB 인스턴스를 생성하면 파라미터 설정은 default.postgres9.6이라는 이름의 파라미터 그룹에 저장됩니다.

DB 인스턴스를 생성하면 연동되어 있는 DB 파라미터 그룹의 파라미터가 로드됩니다. 여기서 파라미터 값을 변경할 수 있습니다. 또한 변경할 수 있는 보안 권한이 있는 경우에는 ALTER DATABASE, ALTER ROLE 및 SET 명령을 사용해서도 파라미터 값 변경이 가능합니다. 호스트에 대한 액세스 권한이 없기 때문에 명령줄 postgres 명령 또는 env PGOPTIONS 명령은 사용할 수 없습니다.

PostgreSQL 파라미터 설정은 경우에 따라 추적이 어렵기도 합니다. 다음은 현재 파라미터 설정과 기본 값을 표시하는 명령입니다.

select name, setting, boot_val, reset_val, unit from pg_settings order by name;

출력 값에 대한 자세한 설명은 PostgreSQL 문서의 pg_settings 항목을 참조하십시오.

max_connections 또는 shared_buffers의 메모리를 너무 크게 설정하면 PostgreSQL 인스턴스가 시작되지 않습니다. 익숙하지 않은 단위를 사용하는 파라미터도 있습니다. 예를 들어 shared_buffers는 서버에서 사용하는 8KB 공유 메모리 버퍼의 수치를 설정합니다.

다음은 인스턴스를 시작하려고 하지만 잘못된 파라미터 설정으로 인해 시작되지 않을 때 postgres.log 파일로 출력되는 오류입니다.

2013-09-18 21:13:15 UTC::@:[8097]:FATAL: could not map anonymous shared memory: Cannot allocate memory 2013-09-18 21:13:15 UTC::@:[8097]:HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory or swap space. To reduce the request size (currently 3514134274048 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

PostgreSQL 파라미터는 정적과 동적, 두 가지 유형이 있습니다. 정적 파라미터를 적용하려면 DB 인스턴스를 재부팅해야 합니다. 동적 파라미터는 바로 적용됩니다. 다음 표는 PostgreSQL DB 인스턴스에서 변경할 수 있는 파라미터와 각 파라미터 유형을 나타냅니다.

파라미터 이름

적용 유형

설명

application_name

동적 애플리케이션 이름이 통계 및 로그에 표시되도록 설정합니다.

array_nulls

동적 어레이의 NULL 요소 입력을 활성화합니다.

authentication_timeout

동적 클라이언트 인증 완료를 위한 최대 허용 시간을 설정합니다.

autovacuum

동적 autovacuum 서브프로세스를 시작합니다.

autovacuum_analyze_scale_factor

동적 분석 전 삽입, 업데이트 또는 삭제되는 튜플 수를 reltuples 분수 값으로 지정합니다.

autovacuum_analyze_threshold

동적 분석 전 삽입, 업데이트 또는 삭제되는 튜플의 최소 수를 지정합니다.

autovacuum_naptime

동적 autovacuum 실행 간 절전 시간을 지정합니다.

autovacuum_vacuum_cost_delay

동적 autovacuum에서 vacuum 코스트 지연 시간(밀리초)을 지정합니다.

autovacuum_vacuum_cost_limit

동적 autovacuum에서 지연 시간 이전에 이용 가능한 vacuum 코스트 값을 지정합니다.

autovacuum_vacuum_scale_factor

동적 vacuum 전 업데이트 또는 삭제되는 튜플 수를 reltuples 분수 값으로 지정합니다.

autovacuum_vacuum_threshold

동적 vacuum 전 업데이트 또는 삭제되는 튜플의 최소 수를 지정합니다.

backslash_quote

동적 문자열 리터럴에서 백슬래시(\)의 허용 여부를 설정합니다.

bgwriter_delay

동적 라운드 사이에 백그라운드 라이터의 절전 시간을 지정합니다.

bgwriter_lru_maxpages

동적 백그라운드 라이터가 라운드마다 LRU 페이지를 작성할 최대 수를 지정합니다.

bgwriter_lru_multiplier

동적 라운드마다 해제할 평균 버퍼 사용량의 배수를 지정합니다.

bytea_output

동적 바이트의 출력 형식을 설정합니다.

check_function_bodies

동적 CREATE FUNCTION 도중 함수 본문을 검사합니다.

checkpoint_completion_target

동적 체크포인트 도중 변경된 버퍼 플러시에 사용된 시간으로 체크포인트 간격의 분수 값입니다.

checkpoint_segments

동적 로그 세그먼트에서 자동 write-ahead log(WAL) 체크포인트의 최대 간격을 설정합니다.

checkpoint_timeout

동적 자동 WAL 체크포인트 사이의 최대 시간을 설정합니다.

checkpoint_warning

동적 체크포인트 세그먼트가 이 파라미터 값보다 더 빨리 채워지는 경우 경고를 활성화합니다.

client_encoding

동적 클라이언트 문자 세트 인코딩을 설정합니다.

client_min_messages

동적 클라이언트에게 보여지는 메시지 수준을 설정합니다.

commit_delay

동적 트랜잭션 커밋부터 디스크에 대한 WAL 플러시까지 지연 시간(밀리초)을 설정합니다.

commit_siblings

동적 commit_delay 실행 전에 동시에 열려 있는 트랜잭션 최소 개수를 설정합니다.

constraint_exclusion

동적 planner가 제약 조건을 사용하여 쿼리를 최적화하도록 활성화합니다.

cpu_index_tuple_cost

동적 인덱스 스캔 중 각 인덱스 항목을 처리하는 데 따른 planner의 예상 코스트를 설정합니다.

cpu_operator_cost

동적 각 연산자 또는 함수 호출을 처리하는 데 따른 planner의 예상 코스트를 설정합니다.

cpu_tuple_cost

동적 각 튜플(행)을 처리하는 데 따른 planner의 예상 코스트를 설정합니다.

cursor_tuple_fraction

동적 planner가 예상하는 검색할 커서 행의 분수 값을 설정합니다.

datestyle

동적 날짜와 시간 값에 대한 표시 형식을 설정합니다.

deadlock_timeout

동적 교착 상태 여부를 확인하기 이전 잠금 대기 시간을 설정합니다.

debug_pretty_print

동적 구문과 실행 계획 트리를 들여쓰기 하여 표시합니다.

debug_print_parse

동적 각 쿼리의 구문 분석 트리를 기록합니다.

debug_print_plan

동적 각 쿼리의 실행 계획을 기록합니다.

debug_print_rewritten

동적 각 쿼리에서 재작성된 구문 분석 트리를 기록합니다.

default_statistics_target

동적 기본 통계 대상을 설정합니다.

default_tablespace

동적 테이블과 인덱스를 생성할 기본 테이블스페이스를 설정합니다.

default_transaction_deferrable

동적 새로운 트랜잭션의 기본 deferrable 상태를 설정합니다.

default_transaction_isolation

동적 새로운 트랜잭션마다 트랜잭션 격리 수준을 설정합니다.

default_transaction_read_only

동적 새로운 트랜잭션의 기본 읽기 전용 상태를 설정합니다.

default_with_oids

동적 새로운 테이블을 생성할 때 OID가 기본적으로 포함됩니다.

effective_cache_size

동적 디스크 캐시 크기에 대한 planner의 가정을 설정합니다.

effective_io_concurrency

동적 디스크 하위 시스템에서 효율적으로 동시에 처리할 수 있는 요청 수를 지정합니다.

enable_bitmapscan

동적 planner가 비트맵 스캔 계획을 사용할 수 있도록 활성화합니다.

enable_hashagg

동적 planner가 해시된 집계 계획을 사용할 수 있도록 활성화합니다.

enable_hashjoin

동적 planner가 해시 조인 계획을 사용할 수 있도록 활성화합니다.

enable_indexscan

동적 planner가 인덱스 스캔 계획을 사용할 수 있도록 활성화합니다.

enable_material

동적 planner가 구체화를 사용할 수 있도록 활성화합니다.

enable_mergejoin

동적 planner가 병합 조인 계획을 사용할 수 있도록 활성화합니다.

enable_nestloop

동적 planner가 중첩 루프 조인 계획을 사용할 수 있도록 활성화합니다.

enable_seqscan

동적 planner가 순차적 스캔 계획을 사용할 수 있도록 활성화합니다.

enable_sort

동적 planner가 명시적 정렬 단계를 사용할 수 있도록 활성화합니다.

enable_tidscan

동적 planner가 TID 스캔 계획을 사용할 수 있도록 활성화합니다.

escape_string_warning

동적 일반 문자열 리터럴의 백슬래시(\) 이스케이프에 대해 경고합니다.

extra_float_digits

동적 부동 소수점으로 표시할 자릿수를 설정합니다.

from_collapse_limit

동적 서브 쿼리가 축소되지 않는 FROM 목록 크기를 설정합니다.

fsync

동적 업데이트를 디스크와 강제로 동기화합니다.

full_page_writes

동적 체크포인트 후 최초 변경 시 전체 페이지를 WAL에 기입합니다.

geqo

동적 유전적 쿼리 최적화를 활성화합니다.

geqo_effort

동적 GEQO: 다른 GEQO 파라미터의 기본값을 설정하는 데 사용됩니다.

geqo_generations

동적 GEQO: 알고리즘의 반복 횟수입니다.

geqo_pool_size

동적 GEQO: 모집단의 개체 수입니다.

geqo_seed

동적 GEQO: 무작위 경로 선택을 위한 시드(seed)를 지정합니다.

geqo_selection_bias

동적 GEQO: 모집단 내 선택적 압력을 지정합니다.

geqo_threshold

동적 GEQO가 사용되는 FROM 항목의 임계값을 설정합니다.

gin_fuzzy_search_limit

동적 정확한 GIN 기준 검색에 허용되는 최대 결과 수를 설정합니다.

hot_standby_feedback

동적 핫 스탠바이가 피드백 메시지를 기본 또는 업스트림 스탠바이로 전송하는지 여부를 결정합니다.

intervalstyle

동적 간격 값에 대한 표시 형식을 설정합니다.

join_collapse_limit

동적 JOIN 구문이 결합되지 않는 FROM 목록 크기를 설정합니다.

lc_messages

동적 메시지 표시 언어를 설정합니다.

lc_monetary

동적 통화 금액의 형식으로 사용할 로캘을 설정합니다.

lc_numeric

동적 숫자의 형식으로 사용할 로캘을 설정합니다.

lc_time

동적 날짜와 시간 값의 형식으로 사용할 로캘을 설정합니다.

log_autovacuum_min_duration

동적 autovacuum 작업이 기록되는 최소 실행 시간을 설정합니다.

log_checkpoints

동적 각 체크포인트를 기록합니다.

log_connections

동적 성공한 연결을 모두 기록합니다.

log_disconnections

동적 지속 시간을 포함해 세션 종료를 기록합니다.

log_duration

동적 완료된 개별 SQL 문의 지속 시간을 기록합니다.

log_error_verbosity

동적 기록된 메시지의 세부 사항을 설정합니다.

log_executor_stats

동적 실행기 성능 통계를 서버 로그에 기록합니다.

log_filename

동적 로그 파일의 이름 패턴을 설정합니다.

log_hostname

동적 연결 로그에 호스트 이름을 기록합니다.

log_lock_waits

동적 오랜 잠금 대기 시간을 기록합니다.

log_min_duration_statement

동적 문이 기록되는 최소 실행 시간을 설정합니다.

log_min_error_statement

동적 이 수준 이상으로 오류 원인이 되는 모든 문을 기록합니다.

log_min_messages

동적 기록되는 메시지 수준을 설정합니다.

log_parser_stats

동적 구문 분석기 성능 통계를 서버 로그에 기록합니다.

log_planner_stats

동적 planner 성능 통계를 서버 로그에 기록합니다.

log_rotation_age

동적 N분 후에 자동 로그 파일 로테이션이 일어납니다.

log_rotation_size

동적 N킬로바이트 후에 자동 로그 파일 로테이션이 일어납니다.

log_statement

동적 기록할 문 유형을 설정합니다.

log_statement_stats

동적 누적 성능 통계를 서버 로그에 기록합니다.

log_temp_files

동적 이 킬로바이트 수치보다 큰 임시 파일의 사용을 기록합니다.

maintenance_work_mem

동적 유지 관리 작업에 사용할 최대 메모리를 설정합니다.

max_stack_depth

동적 최대 스택 깊이(KB)를 설정합니다.

max_standby_archive_delay

동적 핫 스탠바이 서버가 아카이브 WAL 데이터를 처리할 때 쿼리 취소까지 걸리는 최대 지연 시간을 설정합니다.

max_standby_streaming_delay

동적 핫 스탠바이 서버가 스트리밍 WAL 데이터를 처리할 때 쿼리 취소까지 걸리는 최대 지연 시간을 설정합니다.
max_wal_size 정적 검사 점을 트리거하는 WAL 크기를 설정합니다. PostgreSQL 버전 9.6 이하의 경우 max_wal_size는 16MB 단위입니다. PostgreSQL 버전 10 이상의 경우 max_wal_size는 1MB 단위입니다.
min_wal_size 정적 WAL을 축소할 최소 크기를 설정합니다. PostgreSQL 버전 9.6 이하의 경우 min_wal_size는 16MB 단위입니다. PostgreSQL 버전 10 이상의 경우 min_wal_size는 1MB 단위입니다.

quote_all_identifiers

동적 SQL 조각 생성 시 모든 식별자에 인용 부호(")를 추가합니다.

random_page_cost

동적 비순차적으로 가져온 디스크 페이지에 대한 planner의 예상 코스트를 설정합니다.
rds.adaptive_autovacuum 동적 트랜잭션 ID 임계값이 초과될 때마다 autovacuum 파라미터를 자동으로 조정합니다.

rds.log_retention_period

동적 Amazon RDS가 N분보다 오래된 PostgreSQL 로그를 삭제하도록 로그 보존을 설정합니다.
rds.restrict_password_commands 정적 암호를 관리할 수 있는 사람을 rds_password 역할이 있는 사용자로 제한합니다. 암호 제한을 활성화하려면 이 파라미터를 1로 설정합니다. 기본값은 0입니다.

search_path

동적 스키마로 한정되지 않은 이름의 스키마 검색 순서를 설정합니다.

seq_page_cost

동적 순차적으로 가져온 디스크 페이지에 대한 planner의 예상 코스트를 설정합니다.

session_replication_role

동적 트리거 및 다시 쓰기 규칙에 대한 세션 동작을 설정합니다.

sql_inheritance

동적 다양한 명령에서 서브테이블이 기본적으로 상속됩니다.

ssl_renegotiation_limit

동적 암호화 키를 재협상하기 전에 전송 및 수신할 트래픽 양을 설정합니다.

standard_conforming_strings

동적 ... 문자열에서 백슬래시가 리터럴로 처리됩니다.

statement_timeout

동적 모든 문에 허용되는 최대 지속 시간을 설정합니다.

synchronize_seqscans

동적 동기 방식의 순차적 스캔을 활성화합니다.

synchronous_commit

동적 현재 트랜잭션 동기화 수준을 설정합니다.

tcp_keepalives_count

동적 TCP keepalive의 최대 재전송 횟수를 지정합니다.

tcp_keepalives_idle

동적 TCP keepalive의 실행 주기를 지정합니다.

tcp_keepalives_interval

동적 TCP keepalive의 재전송 주기를 지정합니다.

temp_buffers

동적 각 세션에서 사용하는 임시 버퍼의 최대 수를 설정합니다.

temp_tablespaces

동적 임시 테이블 및 정렬 파일에 사용할 테이블스페이스를 설정합니다.

timezone

동적 타임스탬프를 표시 및 해석할 시간대를 설정합니다.

track_activities

동적 명령 실행에 대한 정보를 수집합니다.

track_counts

동적 데이터베이스 작업에 관한 통계를 수집합니다.

track_functions

동적 데이터베이스 작업에 관한 함수 수준 통계를 수집합니다.

track_io_timing

동적 데이터베이스 I/O 작업에 관한 시간 통계를 수집합니다.

transaction_deferrable

동적 잠재적 직렬화 오류 없이 시작될 때까지 직렬화가 가능한 읽기 전용 트랜잭션의 지연 여부를 결정합니다.

transaction_isolation

동적 현재 트랜잭션 격리 수준을 설정합니다.

transaction_read_only

동적 현재 트랜잭션의 읽기 전용 상태를 설정합니다.

transform_null_equals

동적 expr=NULL을 expr IS NULL로 처리합니다.

update_process_title

동적 프로세스 제목을 업데이트하여 활성 SQL 명령을 표시합니다.

vacuum_cost_delay

동적 vacuum 코스트 지연 시간(밀리초)을 지정합니다.

vacuum_cost_limit

동적 지연 시간 이전에 이용 가능한 vacuum 코스트 값을 지정합니다.

vacuum_cost_page_dirty

동적 vacuum으로 페이지 변경 시 부과되는 vacuum 코스트를 지정합니다.

vacuum_cost_page_hit

동적 버퍼 캐시에서 발견되는 페이지에 대한 vacuum 코스트를 지정합니다.

vacuum_cost_page_miss

동적 버퍼 캐시에서 발견되지 않는 페이지에 대한 vacuum 코스트를 지정합니다.

vacuum_defer_cleanup_age

동적 vacuum 및 hot cleanup을 연기해야 하는 트랜잭션 수를 지정합니다(있는 경우).

vacuum_freeze_min_age

동적 vacuum에서 테이블 행을 동결해야 하는 최소 기간을 지정합니다.

vacuum_freeze_table_age

동적 vacuum에서 전체 테이블을 스캔하여 튜플을 동결해야 하는 기간을 지정합니다.

wal_writer_delay

동적 WAL 플러시 사이에 WAL 작성기의 절전 시간을 지정합니다.

work_mem

동적 쿼리 작업 공간에 사용할 최대 메모리를 설정합니다.

xmlbinary

동적 XML에서 바이너리 값의 인코딩 방식을 설정합니다.

xmloption

동적 암시적 구문 분석 및 직렬화 작업에서 XML 데이터를 문서 또는 내용 조각으로 간주할지 여부를 설정합니다.

autovacuum_freeze_max_age

정적 트랜잭션 ID 랩어라운드를 방지하기 위한 테이블의 autovacuum 기간을 지정합니다.

autovacuum_max_workers

정적 autovacuum 작업자 프로세스를 동시에 실행할 수 있는 최대 수를 설정합니다.

max_connections

정적 동시에 접속할 수 있는 최대 수를 설정합니다.

max_files_per_process

정적 서버 프로세스마다 파일을 동시에 열 수 있는 최대 수를 설정합니다.

max_locks_per_transaction

정적 하나의 트랜잭션에서 사용할 수 있는 최대 잠금 횟수를 설정합니다.

max_pred_locks_per_transaction

정적 하나의 트랜잭션에서 사용할 수 있는 최대 술어(predicate) 잠금 횟수를 설정합니다.

max_prepared_transactions

정적 트랜잭션을 동시에 준비할 수 있는 최대 수를 설정합니다.

shared_buffers

정적 서버에서 사용할 공유 메모리 버퍼의 수를 설정합니다.

ssl

정적 SSL 연결을 활성화합니다.
temp_file_limit 정적 임시 파일이 증가할 수 있는 최대 크기(KB)를 설정합니다.

track_activity_query_size

정적 pg_stat_activity.current_query에 예약되는 크기(바이트)를 설정합니다.

wal_buffers

정적 WAL 기능을 위해 공유 메모리에서 사용할 디스크 페이지 버퍼 수를 설정합니다.

Amazon RDS는 모든 파라미터에서 기본 PostgreSQL 단위를 사용합니다. 다음 표는 PostgreSQL 기본 단위 및 각 파라미터에 대한 값을 나타냅니다.

파라미터 이름

Unit

effective_cache_size

8KB

segment_size

8KB

shared_buffers

8KB

temp_buffers

8KB

wal_buffers

8KB

wal_segment_size

8KB

log_rotation_size

KB

log_temp_files

KB

maintenance_work_mem

KB

max_stack_depth

KB

ssl_renegotiation_limit

KB
temp_file_limit KB

work_mem

KB

log_rotation_age

minutes

autovacuum_vacuum_cost_delay

ms

bgwriter_delay

ms

deadlock_timeout

ms

lock_timeout

ms

log_autovacuum_min_duration

ms

log_min_duration_statement

ms

max_standby_archive_delay

ms

max_standby_streaming_delay

ms

statement_timeout

ms

vacuum_cost_delay

ms

wal_receiver_timeout

ms

wal_sender_timeout

ms

wal_writer_delay

ms

archive_timeout

s

authentication_timeout

s

autovacuum_naptime

s

checkpoint_timeout

s

checkpoint_warning

s

post_auth_delay

s

pre_auth_delay

s

tcp_keepalives_idle

s

tcp_keepalives_interval

s

wal_receiver_status_interval

s

PostgreSQL DB 인스턴스에 대한 감사 로깅

PostgreSQL DB 인스턴스에 발생하는 로그 활동을 설정하는 파라미터가 몇 가지 있습니다. 이러한 파라미터에는 다음이 포함됩니다.

  • log_statement 파라미터는 PostgreSQL 데이터베이스에서 사용자 활동 로그에 사용할 수 있습니다. 자세한 내용은 PostgreSQL 데이터베이스 로그 파일 섹션을 참조하세요.

  • rds.force_admin_logging_level 파라미터는 RDS 내부 사용자(rdsadmin)가 DB 인스턴스의 데이터베이스에서 수행한 작업을 기록하고 PostgreSQL 오류 로그에 출력을 씁니다. 허용되는 값은 disabled, debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal 및 panic입니다. 기본값은 disabled입니다.

  • rds.force_autovacuum_logging_level 파라미터는 DB 인스턴스의 모든 데이터베이스에서 autovacuum 작업자 작업을 기록하고 PostgreSQL 오류 로그에 출력을 씁니다. 허용되는 값은 disabled, debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal 및 panic입니다. 기본값은 disabled입니다. rds.force_autovacuum_logging_level에 대한 Amazon RDS 권장 설정은 LOG입니다. 1000 또는 5000에서 log_autovacuum_min_duration 값을 설정합니다. 이 값을 5000으로 설정하면 5초 이상 걸리는 작업을 로그에 쓰고 "vacuum skipped" 메시지를 표시합니다. 이 파라미터에 대한 자세한 내용은 PostgreSQL로 작업하기 위한 모범 사례 단원을 참조하십시오.

pgaudit 확장 작업

pgaudit 확장은 PostgreSQL 버전 9.6.3 이상 및 버전 9.5.7 버전 이상의 Amazon RDS에 대한 세부적인 세션 및 객체 감사 로깅을 제공합니다. 이 확장을 사용하여 세션 감사 또는 객체 감사를 활성화할 수 있습니다.

세션 감사를 사용하면 다양한 소스의 감사 이벤트를 기록할 수 있으며 사용 가능한 경우 정규화된 명령 텍스트를 포함할 수 있습니다. 예를 들어 세션 감사를 사용하여 pgaudit.log를 READ로 설정하면 데이터베이스에 연결된 모든 READ 문을 기록할 수 있습니다.

객체 감사를 사용하면 특정 명령을 사용하도록 감사 로깅을 구체화할 수 있습니다. 예를 들어 특정 테이블 수에서 READ 작업에 대한 로깅을 지정할 수 있습니다.

pgaudit 확장을 사용하여 객체 기반 로깅을 사용하려면

  1. 다음 명령을 사용하여 rds_pgaudit라는 데이터베이스 역할을 생성합니다.

    CREATE ROLE rds_pgaudit;
  2. 다음을 수행하도록 DB 인스턴스와 연결된 파라미터 그룹을 수정합니다.

    • pgaudit를 포함하는 공유 사전 로드 라이브러리를 사용합니다.

    • pgaudit.rolerds_pgaudit 역할로 설정합니다.

    다음 명령은 사용자 파라미터 그룹을 수정합니다.

    aws rds modify-db-parameter-group \ --db-parameter-group-name rds-parameter-group-96 \ --parameters "ParameterName=pgaudit.role,ParameterValue=rds_pgaudit,ApplyMethod=pending-reboot" \ --region us-west-2 aws rds modify-db-parameter-group \ --db-parameter-group-name rds-parameter-group-96 \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pgaudit,ApplyMethod=pending-reboot" \ --region us-west-2
  3. DB 인스턴스가 파라미터 그룹에 대한 변경 사항을 가져오도록 인스턴스를 재부팅합니다.

    aws rds reboot-db-instance \ --db-instance-identifier rds-test-instance \ --region us-west-2
  4. 다음 명령을 실행하여 pgaudit가 초기화되었는지 확인합니다.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pgaudit (1 row)
  5. 다음 명령을 실행하여 pgaudit 확장을 생성합니다.

    CREATE EXTENSION pgaudit;
  6. 다음 명령을 실행하여 pgaudit.rolerds_pgaudit로 설정되었는지 확인합니다.

    SHOW pgaudit.role; pgaudit.role ------------------ rds_pgaudit

감사 로깅을 테스트하려면 감사하기로 선택한 여러 명령을 실행합니다. 예를 들어 다음과 같은 명령을 실행할 수 있습니다.

CREATE TABLE t1 (id int); GRANT SELECT ON t1 TO rds_pgaudit; SELECT * FROM t1; id ---- (0 rows)

데이터베이스 로그에는 다음과 유사한 항목이 포함됩니다.

... 2017-06-12 19:09:49 UTC:...:rds_test@postgres:[11701]:LOG: AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1; ...

로그 확인에 대한 자세한 내용은 Amazon RDS 데이터베이스 로그 파일 액세스 단원을 참조하십시오.

pg_repack 확장 작업

pg_repack 확장을 사용하여 테이블과 인덱스에서 부풀림을 제거할 수 있습니다. 이 확장은 Amazon Amazon RDS의 PostgreSQL 버전 9.6.3 이상을 지원합니다. pg_repack 확장에 대한 자세한 내용은 GitHub 프로젝트 설명서를 참조하십시오.

pg_repack 확장을 사용하려면

  1. 다음 명령을 실행하여 PostgreSQL DB 인스턴스용 Amazon RDS에 pg_repack 확장을 설치합니다.

    CREATE EXTENSION pg_repack;
  2. pg_repack 클라이언트 유틸리티를 사용하여 데이터베이스에 연결합니다. rds_superuser 권한이 있는 데이터베이스 역할을 사용하여 데이터베이스에 연결합니다. 다음 연결 예제에서 rds_test 역할은 rds_superuser 권한을 가지며, 사용되는 데이터베이스 엔드포인트는 rds-test-instance.cw7jjfgdr4on8.us-west-2.rds.amazonaws.com입니다.

    pg_repack -h rds-test-instance.cw7jjfgdr4on8.us-west-2.rds.amazonaws.com -U rds_test -k postgres

    -k 옵션을 사용하여 연결합니다. -a 옵션은 지원되지 않습니다.

  3. pg_repack 클라이언트의 응답은 다시 구성된 DB 인스턴스 상의 테이블에 대한 정보를 제공합니다.

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"

pgBadger를 사용한 PostgreSQL의 로그 분석

pgbadger 등의 로그 분석기를 사용하여 PostgreSQL 로그를 분석할 수 있습니다. pgbadger 문서에는 %l 패턴(세션/프로세스의 로그 라인)은 접두사에 포함되어야 한다고 나와 있습니다. 그러나 현재 rds log_line_prefix를 pgbadger에 파라미터로 사용하더라도 여전히 보고서를 생성해야 합니다.

예를 들어 다음 명령은 pgbadger를 사용하여 2014-02-04 일자의 Amazon RDS for PostgreSQL 로그 파일을 정확한 형식으로 나타내고 있습니다.

./pgbadger -p '%t:%r:%u@%d:[%p]:' postgresql.log.2014-02-04-00

pg_config의 내용 보기

PostgreSQL 버전 9.6.1에서는 새로 보기 pg_config를 이용해 현재 설치된 PostgreSQL 버전의 컴파일 시간 구성 파라미터를 볼 수 있습니다. 다음 예제와 같이 pg_config 함수를 호출하여 볼 수 있습니다.

select * from pg_config(); name | setting -------------------+--------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- BINDIR | /rdsdbbin/postgres-9.6.1.R1/bin DOCDIR | /rdsdbbin/postgres-9.6.1.R1/share/doc HTMLDIR | /rdsdbbin/postgres-9.6.1.R1/share/doc INCLUDEDIR | /rdsdbbin/postgres-9.6.1.R1/include PKGINCLUDEDIR | /rdsdbbin/postgres-9.6.1.R1/include INCLUDEDIR-SERVER | /rdsdbbin/postgres-9.6.1.R1/include/server LIBDIR | /rdsdbbin/postgres-9.6.1.R1/lib PKGLIBDIR | /rdsdbbin/postgres-9.6.1.R1/lib LOCALEDIR | /rdsdbbin/postgres-9.6.1.R1/share/locale MANDIR | /rdsdbbin/postgres-9.6.1.R1/share/man SHAREDIR | /rdsdbbin/postgres-9.6.1.R1/share SYSCONFDIR | /rdsdbbin/postgres-9.6.1.R1/etc PGXS | /rdsdbbin/postgres-9.6.1.R1/lib/pgxs/src/makefiles/pgxs.mk CONFIGURE | '--prefix=/rdsdbbin/postgres-9.6.1.R1' '--with-openssl' '--with-perl' '--with-tcl' '--with-ossp-uuid' '--with-libxml' '--with-libraries=/rdsdbbin /postgres-9.6.1.R1/lib' '--with-includes=/rdsdbbin/postgres-9.6.1.R1/include' '--enable-debug' CC | gcc CPPFLAGS | -D_GNU_SOURCE -I/usr/include/libxml2 -I/rdsdbbin/postgres-9.6.1.R1/include CFLAGS | -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict- aliasing -fwrapv -fexcess-precision=standard -g -O2 CFLAGS_SL | -fpic LDFLAGS | -L../../src/common -L/rdsdbbin/postgres-9.6.1.R1/lib -Wl,--as-needed -Wl, -rpath,'/rdsdbbin/postgres-9.6.1.R1/lib',--enable-new-dtags LDFLAGS_EX | LDFLAGS_SL | LIBS | -lpgcommon -lpgport -lxml2 -lssl -lcrypto -lz -lreadline -lrt -lcrypt -ldl -lm VERSION | PostgreSQL 9.6.1 (23 rows)

바로 보기에 액세스하려고 하면 요청이 실패합니다.

select * from pg_config; ERROR: permission denied for relation pg_config

orafce 확장 작업

orafce 확장은 상용 데이터베이스에서 흔히 사용되는 함수를 제공하며, 상용 데이터베이스를 PostgreSQL로 더 쉽게 포팅할 수 있게 합니다. Amazon RDS PostgreSQL 버전 9.6.6 이상에서 이 확장을 지원합니다. orafce에 대한 자세한 내용은 GitHub에서 orafce 프로젝트를 참조하십시오.

참고

PostgreSQL용 Amazon RDS는 orafce 확장의 일부분인 utl_file 패키지를 지원하지 않습니다. 이는 utl_file 스키마 함수가 기본 호스트에 대한 수퍼유저 권한을 필요로 하는 운영 체제 텍스트 파일의 읽기 및 쓰기 작업을 제공하기 때문입니다.

orafce 확장을 사용하려면

  1. DB 인스턴스를 생성할 때 사용한 마스터 사용자 이름으로 DB 인스턴스에 연결합니다.

    참고

    동일한 인스턴스의 다른 데이터베이스에서 orafce를 활성화하려는 경우 연결을 시작한 후 /c dbname psql 명령을 사용하여 기본 데이터베이스에서 변경합니다.

  2. CREATE EXTENSION 문을 사용하여 orafce 확장을 활성화합니다.

    CREATE EXTENSION orafce;
  3. ALTER SCHEMA 문을 사용하여 oracle 스키마 소유권을 rds_superuser 역할로 이전합니다.

    ALTER SCHEMA oracle OWNER TO rds_superuser;
    참고

    oracle 스키마의 소유자 목록을 보려면 \dn psql 명령을 사용합니다.

postgres_fdw 확장으로 외부 데이터 액세스

postgres_fdw 확장으로 원격 데이터베이스에 있는 테이블의 데이터에 액세스할 수 있습니다. PostgreSQL DB 인스턴스에서 원격 연결을 설정하는 경우 읽기 전용 복제본에도 액세스할 수 있습니다.

postgres_fdw로 원격 데이터베이스 서버에 액세스하려면

  1. postgres_fdw 확장을 설치합니다.

    CREATE EXTENSION postgres_fdw;
  2. CREATE SERVER로 외부 데이터 서버를 생성합니다.

    CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'xxx.xx.xxx.xx', port '5432', dbname 'foreign_db');
  3. 원격 서버에 사용할 역할 식별을 위하여 사용자 매핑을 생성합니다.

    CREATE USER MAPPING FOR local_user SERVER foreign_server OPTIONS (user 'foreign_user', password 'password');
  4. 원격 서버에서 테이블을 매핑할 테이블을 생성합니다.

    CREATE FOREIGN TABLE foreign_table ( id integer NOT NULL, data text) SERVER foreign_server OPTIONS (schema_name 'some_schema', table_name 'some_table');

암호 관리 제한

데이터베이스 사용자 암호를 관리할 수 있는 사람을 특정 역할로 제한할 수 있습니다. 이렇게 하면 클라이언트 측의 암호 관리를 더 잘 제어할 수 있습니다.

정적 파라미터 rds.restrict_password_commands로 제한된 암호 관리를 활성화하고 rds_password라는 역할을 사용합니다. rds.restrict_password_commands 파라미터를 1로 설정하면, rds_password 역할의 멤버인 사용자만 특정 SQL 명령을 실행할 수 있습니다. 제한된 SQL 명령은 데이터베이스 사용자 암호와 암호 만료 시간을 수정하는 명령입니다.

제한된 암호 관리를 사용하려면 DB 인스턴스가 PostgreSQL 10.6 이상용 Amazon RDS를 실행해야 합니다. rds.restrict_password_commands 파라미터는 정적이므로 이 파라미터를 변경하려면 데이터베이스를 다시 시작해야 합니다.

데이터베이스에 제한된 암호 관리가 활성화되어 있을 때 제한된 SQL 명령을 실행하려고 하면 ERROR: must be a member of rds_password to alter passwords 오류가 표시됩니다.

다음은 제한된 암호 관리가 활성화되어 있을 때 제한되는 몇 가지 SQL 명령 예입니다.

postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword'; postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword'; postgres=> ALTER ROLE myrole VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole RENAME TO myrole2;

RENAME TO가 포함된 일부 ALTER ROLE 명령도 제한될 수 있습니다. 이러한 명령이 제한될 수 있는 이유는 MD5 암호가 있는 PostgreSQL 역할 이름을 바꾸면 암호가 지워지기 때문입니다.

rds_superuser 역할에는 기본적으로 rds_password 역할의 멤버십이 있으므로 변경할 수 없습니다. GRANT SQL 명령을 사용하여 다른 역할에 rds_password 역할의 멤버십을 제공할 수 있습니다. 암호 관리에만 사용하는 몇 가지 역할에만 rds_password 멤버십을 제공하는 것이 좋습니다. 이러한 역할에는 다른 역할을 수정할 CREATEROLE 속성이 필요합니다.

만료 및 클라이언트 측에 필요한 복잡성 등의 암호 요구 사항을 확인해야 합니다. 자체 클라이언트 측 유틸리티를 사용하여 암호 관련 변경을 제한하는 것이 좋습니다. 이 유틸리티에는 rds_password의 멤버이며 CREATEROLE 역할 속성이 있는 역할이 있어야 합니다.