pg_resetwal

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 명령은 같은 메이저 버전에서만 사용할 수 있다.

관련 항목

pg_controldata