안녕하세요
현재 사용하는 디비의 트랜잭션 ID가 20억이 가까워져서 postgres와 template1은
버큠을 돌려서 10억으로 되돌렸는데요
template0은 버큠 명령이 먹지를 않네요.
이대로 놔두어도 되는건지, 아니면 initdb부터 다시 해야하는지가 궁금합니다.
트랜잭션 id는 데이터베이스 클러스트 단위입니다.
template0 데이터베이스에 어떠한 트랜잭션 작업 - 여기서 트랜잭션 작업은 sql의 transaction을 이야기하는게 아니라, 하나의 db 자료가 바뀌는 작업을 말합니다 - 이 없었다면, vacuum 작업을 안해도 됩니다.
xid (트랜잭션 id) overwrap 문제는 이미 하드 디스크에 완벽 처리가 다 되었고 더 이상 redo 작업을 하지 않을 것이 확실하다는 것에 대한 자료에 대해서 더이상 xid 관리를 하지 않겠다는 것을 의미하거든요.
그러니, 특별히 서버가 비정상적으로 종료되는 문제를 위한 최근 트랜잭션 로그들만 잘 보관된다면,
주기적인 vacuum 작업으로 정리하면, xid overwrap 문제는 크게 심각한 것이 안 될 것 같습니다.
답변 감사합니다. 제가 이해력이 부족해서인지 완벽하게 이해가 안되네요. 현재 다음 쿼리를 날렸을 때 SELECT datname, age(datfrozenxid) FROM pg_database; datname age ----------------------- postgres 1204265912 template1 1075713743 template0 1722279687 이렇게 뜨는데요. 두번째의 수치는 위의 쿼리를 반복하면 셋 다 증가하고 있습니다. 그래서 postgres와 template1을 버큠을 해준거였던거구요. 문서를 보다가 15억이 넘으면 버큠을 돌릴 때 postgres에서 warning을 낸다고 봐서 실제로 확인해보니 warning을 날려서 버큠을 돌린거였구요. 그러다보니 template0은 버큠이 실패가 난 것이었습니다. 현재 template0 쪽의 수치도 계속 늘어가는데, 그게 트랜잭션 작업이 있는거 아닌가요? 그리고 저 세 개의 수치는 항상 똑같은 수치로 올라가는데, 항상 저 셋은 같이 움직이는 것인지도 궁금합니다.
pg_database.datfrozenxid 값은
해당 데이터베이스의 테이블에서 사용할 수 있는 최소 xid 입니다.
즉, 그 테이블이 트랜잭션 작업을 시작할 때, 그 xid 값을 이보다 작게는 시작할 수 없다는 것을 지정하는 것입니다.
앞에서 이야기 했듯이, xid 는 데이터베이스 클러스터 단위인지라, 같이 움직이는게 맞고요.
template0에 대한 vacuum 문제는 신경을 안써도 됩니다.
왜냐하면 template0놈은 initdb 때 만들어지는 최초의 데이터베이스 모습이거든요.
일반적으로 create database에서는 tempate1 을 사용하며,
template0 쪽으로는 접속조차 할 수 없게 만들어두고 있기 때문에, xid overwrap - 알고 봤더니, wraparound라고 하네요. 우리말로는 어떻게 옮기는게 좋을지 모르겠습니다. 한바퀴 휙~ 돌아서 같은 xid를 사용하게 되어 데이터가 이상하게 꼬이는 현상 정도 - 현상이 일어날 일이 없기 때문입니다.
꼼꼼히 질문하게 되니까, 꼼꼼히 살펴보게 되네요.
덕분에 하나 배웠습니다.