pg_resetwal — PostgreSQL 데이터베이스 클러스터의 미리-쓰기 로그와 기타 제어 정보를 재설정함.
pg_resetwal
[-f
] [-n
] [옵션
...] {[-D
] 데이터디렉터리
}
pg_resetwal
명령은 미리-쓰기 로그를 깨끗하게 정리하고,
더불어 pg_control
파일에 저장된 여러 제어 정보를
재설정한다. 이 작업은 앞에서 설명한 파일들이 깨졌을 때, 복구하기
위해서 필요하다. 이 명령은 서버를 실행 할 수 없을 때,
마지막 조치로 사용되어야 한다.
이 명령을 사용하고 난 뒤, 서버가 잘 실행 된다고 해도,
트랜잭션 처리의 불완전한 복구로 자료 정합성이 맞지 않을 가능성이 높다.
그래서, 서버가 실행 되면, 모든 자료를 덤프하고,
initdb
명령으로 새 클러스터를 만들어, 그곳에
다시 복원해서, 필요하다면, 자료 정합성을 맞추는 작업을 해야 한다.
(공식 설명서에서는 이렇게 권고한다. - 옮긴이)
이 명령은 서버가 다루는 파일을 다루기 때문에, 서버를 실행한
OS 사용자 계정으로 실행해야 한다. 안전상 pg_resetwal
명령은 PGDATA
환경 변수를 사용하지 않는다. 반드시 데이터 디렉터리를
지정해야 한다.
pg_resetwal
명령을 실행할 때,
pg_control
파일에 저장된 정보가 바르지 않다고,
오류 메시지를 보게 된다면, 이런 오류를 무시하고, 강제로
작업을 진행할 수 있다. 이때는 -f
(force) 옵션을
사용한다. 이렇게 하면, 그 잘못된 정보를 고치는데,
그럴싸한 값을 사용한다. 이렇게 사용하는 그럴싸한 값은 대부분의 경우
정확한 값이겠지만, 다음 OID, 다음 트랜잭션 ID, 다음 시간,
다음 다중 트랜잭션 ID, 위치 값은 사용자가 직접 그 값을 지정해야
하는 경우도 있다. 이런 값들은 아래에서 설명하는 옵션으로 지정한다.
이런 값들을 모두 정확하게 알지 못한다면, 결국
-f
옵션을 사용할 수 밖에 없다. 이렇게 되면,
복구된 데이터베이스 서버가 완벽하게 정상 상태일 가능성이 적다. 그렇기
때문에, 이 상태의 데이터베이스 서버에 자료 조작 명령을 내리는 것은
아주 위험하다. 서버가 실행되면, 즉시 자료 덤프를 하고,
그 덤프한 것을 복원해서 사용하는 것이 안전하다. -f
옵션을 사용해서 복구 하고 그냥 그 서버를 사용하는 것은 자료를 더
손상시키는 결과를 만들 수 있다.
-f
pg_control
파일에 저장된 정보가 바르지 않은 경우에도
강제로 작업을 진행한다. 위에서 자세히 설명했다.
-n
pg_control
파일의 정보를 어떻게 바꿀 것인지,
작업 계획만 보여주고, 실제 작업은 하지 않는다. (no operation)
이 옵션은 문제점 추적용으로 사용되지만, pg_resetwal
명령을 실행해서 어떤 일이 생길지 확인하는 용도로도 유용하게 사용된다.
-V
--version
버전을 보여주고 마친다.
-?
--help
도움말을 보여주고 마친다.
다음 옵션들은 pg_resetwal
명령을 사용할 때
pg_control
파일의 정보가 올바르지 않을 때
사용하는 옵션이다. 안전한 값은 아래에서 설명하는 것처럼
결정될 수 있다. 옵션 값으로 숫자를 지정하는 경우,
0x
문자로 시작하면, 16진수로 간주한다.
-c
xid
,xid
직접 제일 오래된 트랜잭션 ID, 가장 최신의 트랜잭션 ID를 지정한다.
안전한 값은 데이터 디렉터리 안 pg_commit_ts
디렉터리 안에
있는 그 파일 이름 기준으로 가장 오래된 파일의 트랜잭션 ID를
제일 오래된 트랜잭션 ID로 사용하며, 가장 최신의 트랜잭션 ID는
반대로 그 디렉터리에 있는 가장 최근의 파일에 있는 트랜잭션 ID를
사용한다. 파일 이름은 16진수로 되어있다.
-e
xid_epoch
다음 트랜잭션ID epoch(유닉스 타임스탬프값)를 지정한다.
트랜잭션 ID epoch 값은 데이터베이스 어디에도 저장되지 않는다. 즉 사용자가 지정하는 그 값을 그대로 사용한다. 이 옵션은 Slony-I 또는 Skytools 응용 프로그램이 바르게 작동하도록 하기 위해 사용하는 옵션이다.
-l
WAL파일
WAL 시작 주소를 지정.
여기서 지정하는 값은 pg_wal
디렉터리 내 있는
WAL 조각 파일의 이름보다 큰 값이어야 한다.
이 조각 파일 이름은 세 부분으로 구성 되는데,
가장 앞부분은 “타임라인ID”이며, 이 부분은 그대로
사용한다. 예를 들어, 00000001000000320000004A
파일이 그 디렉터리에 있다면, 이 옵션 사용법은
-l 00000001000000320000004B
또는 이 보다 큰
값을 지정해야 한다.
pg_resetwal
명령은
특별한 경우가 아니면, -l
옵션을 기본적으로
사용하며, 그 값은 해당 디렉터리 안에 있는 파일을 찾아서
그 보다 큰 값을 사용한다. 따라서, 이 옵션을
의도적으로 쓰는 경우는 pg_wal
디렉터리
안에 있는 파일을 무시하고, 의도적으로 어떤 파일로
지정하려고 할 때 사용한다. 대표적인 경우가,
아카이브 파일을 다시 만들어야 하거나, pg_wal
디렉토리 내 특정 파일이 반드시 있어야 하는 경우다.
-m
mxid
,mxid
다음 멀티트랜잭션ID와 제일 오래된 멀티트랜잭션ID 지정.
-m
옵션값으로 쉼표로 구분한 두 16진수를 지정하는데,
앞부분은 다음 멀티트랜잭션ID, 뒷부분은 제일 오래된 멀티트랜잭션ID다.
각 값들은 pg_multixact/offsets
디렉터리 내 있는
파일을 참조해서, 가장 큰 값에 하나를 더해, 65536 (0x10000) 곱해서
앞부분에 사용하고, 가장 작은 값에 65536 곱해서 뒷부분에
사용한다. 이 값은 16진수를 사용하며,
ffff 이하라면, 네자리로, 0을 앞에 채운다.
-o
oid
다음 OID 지정.
다음 작업에 사용할 OID가 뭔지를 구하는 작업은 쉽지는 않지만, 특별한 경우가 아니고서는 이 값은 특별한 문제 없이 자동으로 잘 구하기 때문에, 굳이 이 옵션을 사용할 필요는 없다.
-O
mxoff
다음 멀티트랜잭션 위치 지정.
안전한 값은 pg_multixact/members
디렉터리 안에 있는
파일들 가운데, 그 이름이 가장 큰 것을 찾고, 그 값에 1을 더하고,
52352 (0xCC80)를 곱한 값이다.
이 값은 16진수를 사용한다. There is no simple recipe such as
the ones for other options of appending zeroes.
-x
xid
다음 트랜잭션 ID 지정.
안전한 값은 pg_xact
디렉터리 안에 있는 파일들 가운데,
그 이름이 가장 큰것을 찾아 그 값에 1을 더하고, 1048576 (0x100000)을
곱해서 사용한다. 파일 이름은 16진수를 사용한다.
예를 들어, 가장 큰 파일이 0011
이면,
-x 0x1200000
옵션을 사용한다.
이 명령은 서버가 실행 중에 사용하면 안된다.
서버가 실행 중임을 알리는 잠금 파일을 데이터 디렉터리 안에서
찾으면, pg_resetwal
명령은 더 이상 작업을
진행하지 않는다. 이 잠금 파일을 남겨둔채 서버가 갑자기
중지되었다면, 이 잠금 파일을 지워야 계속 작업을 할 수 있다.
물론 정말 서버가 중지 되었는지, 서버 프로세스 확인을 하는 것을
잊지 말아야 한다.
pg_resetwal
명령은 같은 메이저 버전에서만
사용할 수 있다.