PostgreSQL 아카이브 모드
PostgreSQL 아카이브 모드 (Archive Mode)
– PostgreSQL에서 아카이브 모드를 이해하기전에 WAL을 자세히 알고 넘어가야 할 필요가 있습니다.
– WAL (Write-Ahead Logging)은 데이터 무결성을 보장하는 표준 방법입니다.
– WAL의 중심개념은 변경 내용을 설명하는 로그 레코드를 영구적 저장소에 먼저 기록한 후에 데이터 파일의 변경 내용을 작성한 다는 것입니다. (오라클의 redo-archive와 비슷한 역할)
– 충돌 발생시 로그를 사용하여 데이터베이스를 복구 할 수 있으므로 트랜잭션 커밋마다 데이터 페이지를 디스크에 쓸 필요가 없습니다. 데이터 페이지에 적용되지 않은 변경 내용은 로그 레코드에서 실행 취소가 가능합니다. (이것은 roll-forward 복구 이며, REDO라고도 합니다.)
– 로그 파일은 순차적으로 작성되며, 로그 파일 동기화 비용은 데이터 페이지 쓰기 비용보다 훨씩 적습니다.
– 서버가 소규모 도시 트랜잭션을 다수 처리하는 경우 로그 파일의 fsync 하나로 여러가지 트랜잭션을 충분히 커밋할 수 있습니다.
– 온라인 백업 및 PIT(point-in-time) 복구를 지원 가능하게 합니다.
※ $PGDATA 밑에 있는 postgresql.conf 파일안의 파라미터 값 수정하여 설정 가능합니다.
◆ wal_level (enum)
– wal_level은 WAL에 기록되는 정보의 양을 결정합니다. 기본값은 충돌 또는 즉시 셧다운으로부터 복구하기 위해 필요한 정보만 기록하는 minimal 입니다.
minimal : 기본값
archive : WAL 아카이브에 필요한 로깅만 추가.
hot_standby : 대기 서버에서 읽기전용 쿼리에 필요한 정보를 추가.
◆ archive_mode (boolean)
-archive_mode를 사용하는것으로 설정하면 완료된 WAL 세그먼트가 archive_command 설정에 의하 아카이브 저장소로 전달 됩니다. archive_mode 및 archive_command는 별개의 변수이므로 아카이빙 모드를 해지하지 않고도 archive_command를 변경할 수 있습니다. 이 매개변수는 서버 시작 시 설정됩니다. wal_level이 minimal로 설정된 경우 archive_mode를 사용 할 수 없습니다.
◆ archive_command (string)
– 완료된 WAL 파일 세그먼트를 아카이브하기 위해 실행하는 로컬 쉘 명령입니다.
– String :
%p 아카이브할 파일의 경로명으로 대체
%f 파일명으로만 대체
◆ archive_timeout (integer)
– archive_command는 완료된 WAL 세그먼트를 호출합니다. 그러므로 서버에는 WAL 트래픽이 발생되지 않아서 트랜잭션이 완료되는 시간과 아카이브 저장소에서 안전하게 기록 되는 사이에 긴 지연시간이 발생 할 수 있습니다. 데이터가 아카이브되지 않은 채로 방치되지 않게 하기 위해 서버가 새 WAL 세그먼트 파일로 주기적으로 전환되도록 archive_timeout을 설정할 수 있습니다.
– archive_timeout을 매우 짧게 설정하는 것은 저장소를 부풀게 함므로 현명하지 못하며, 1~2분정도로 설정하는 것이 좋습니다.
아카이브 적용
※ 실제로 설정 해보기
$ vi postgresql.conf wal_level = archive archive_mode = on archive_command = 'cp %p /data/pgsql/archive/arch_%f.arc' archvie_timeout = 120 :wq! postgres@psql-db01:/usr/local/pgsql/data]$ pg_ctl stop waiting for server to shut down.... done server stopped [1]+ Done postgres -D /usr/local/pgsql/data > /var/postgresql/log/postgresql.log 2>&1 (wd: /var/postgresql/log) (wd now: /usr/local/pgsql/data) postgres@psql-db01:/usr/local/pgsql/data]$ postgres -D /usr/local/pgsql/data >/var/postgresql/log/postgresql.log 2>&1 & [1] 52044 $
※ 아카이브 모드 확인하기
postgres=# select * from pg_settings where name in ('archive_mode', 'archive_command', 'archive_timeout', 'wal_level'); postgres=# show wal_level; postgres=# show archive_mode; postgres=# show archive_command;
로그 스위치
pg_switch_xlog() / pg_xlogfile_name / pg_xlogfile_name_offset
pg_switch_xlog() – 현재 사용중인 로그 파일을 아카이빙하고 새로운 파일로 스위칭 함.
(10이상 버전에서는 pg_switch_wal로 변경되었습니다. 참고 – https://wiki.postgresql.org/wiki/New_in_postgres_10)
postgres=# select pg_switch_xlog(); pg_switch_xlog ---------------- 0/70000B0 (1 row)
pg_xlogfile_name / pg_xlogfile_name_offset – 아카이빙 된 파일명 출력
postgres=# select pg_xlogfile_name('0/3000078'), pg_xlogfile_name_offset('0/3000078'); pg_xlogfile_name | pg_xlogfile_name_offset --------------------------+-------------------------------- 000000010000000000000003 | (000000010000000000000003,120) (1 row)
현재 사용중인 로그 확인
pg_current_xlog_locatioin() : 현재 사용중인 로그 출력
postgres=# select pg_current_xlog_location(); pg_current_xlog_location -------------------------- 0/41000060 (1 row)
최신 댓글