PostgreSQL 의 XID
PostgreSQL 에서 하나의 튜플은 xmin, xmax 의 2개의 트랜잭션 ID 를 가집니다.
Tuple 이 생성된 시점은 xmin / Tuple 이 삭제되는 (이전의 값) 인 경우는 xmax 로 TID 를 저장합니다.
이 때 다른 세션에서 해당 데이터를 조회 시 사용되는 트랜잭션ID 가 xmin 과 xmax 사이라면 보여지고,
그렇지 않다면 보여지지 않도록 합니다.
PostgreSQL 의 XID 제약조건
TID 는 40억개를 사용할 수 있으며 20억개는 older , 20억개는 newer 로 사용됩니다.
40억개가 다 사용되면 다시 1부터 시작됩니다.
여기서 중요한 문제가 발생합니다.
트랜잭션 ID 가 40억에서 새로운 데이터가 적재되어 xmin 이 40억인 최신의 데이터가 있다고 합니다.
그다음 세션에서 1의 트랜잭션 ID 를 가지고 1보다 작은 xmin 을 조회하려고 합니다.
40억은 1보다 크기 때문에 당연히 조회할 수 없습니다.
이런 경우를 방지하기 위해 해당 tuple 에 freeze 표기를 해둡니다.
이렇게 표기된 tuple 은 항상 어떤 트랜잭션에서도 표기되도록 설정해 줍니다.
Vacuum 으로 해결하기
주기적인 Vacuum 이 이 문제를 해결할 수 있는데, 이러한 이유는 FrozneXID 라는 특별 XID 가 있기 때문입니다.
이 XID 는 일반적인 XID 비교 대상에서 제외되어 항상 보여지는 XID 입니다.
위에서 말했다 시피 40억개의 XID 는 20억개의 older 와 20억개의 newer 로 나뉩니다.
그리고 이 XID 값은 계속 순환하며 사용됩니다.
그래서 특정한 XID 로 저장이 되어버린다면, 앞으로 20억개의 트랜잭션이 생기기 전까지는
older 로 취급받아 조회가 가능하도록 할 수 있습니다.
따라서 20억개의 트랜잭션이 생기기전에 vacuum 을 진행하여 XID 값을 FrozenXID 로 바꿔버립니다.
이렇게 되면 XID 비교작업에서 제외되어 XID 겹침 오류를 회피할 수 있습니다.
이 작업을 Vacuum Freezing, data freezing 이라고 합니다.
'Database > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] Connection to refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. 오류 해결하기 (0) | 2021.04.26 |
---|---|
[PostgreSQL] PostgreSQL 의 프로세스와 폴더 구조 (0) | 2021.04.14 |
[PostgreSQL] PostgreSQL Vacuum 이란 ( FSM, VM, TID ) (0) | 2021.04.05 |
[PostgreSQL] PostgreSQL 아카이브 백업과 특정시점 복구방법 (0) | 2021.04.05 |
[PostgreSQL] PostgreSQL 파일 시스템 방식의 백업과 복원 (0) | 2021.04.02 |