PostgreSQL의 pageinspect extension을 이용한 블록 덤프 방법

PostgreSQL은 pageinspect 익스텐션을 이용한 블록 덤프 기능을 제공합니다. 오라클과 같이 다양하고 세세한 기능을 제공하지는 않지만, 간단한 테스트 시에는 좋은 도구로 활용할 수 있습니다. 사용 방법 및 예제는 다음과 같습니다.

1. PAGEINSPECT 익스텐션 설치

create extension pageinspect;

2. 테스트 시나리오 수행

-- 테이블 생성
test=# create table t3 (c1 integer);

-- 3건 입력
test=# insert into t3 values(1);
test=# insert into t3 values(2);
test=# insert into t3 values(3);

-- 각각의 XID가 74,75,76 인것을 확인
test=# select xmin, xmax, * from t3;
   xmin    | xmax | c1
-----------+------+----
        74 |    0 |  1
        75 |    0 |  2
        76 |    0 |  3

-- 2번 레코드 삭제
test=#  delete from t3 where c1=2;

test=# select xmin, xmax, * from t3;
   xmin    | xmax | c1
-----------+------+----
        74 |    0 |  1
        76 |    0 |  3

-- 3번 레코드 변경
test=# update t3 set c1=4 where c1=3;

test=# select xmin, xmax, * from t3;
   xmin    | xmax | c1
-----------+------+----
        74 |    0 |  1
        78 |    0 |  4

이때, 실제 블록 내부에는 어떠한 변경 사항이 발생했는지 확인해보겠습니다.

3. GET_RAW_PAGE 함수를 이용한 블록 덤프

-- get_raw_page의 (1번쨰 아규먼트: 오브젝트 명) (2번쨰 아규먼트: 블록 번호)
-- delete와 update로 인해 삭제된 레코드 2건은 아직 블록 내에 존재하는 것을 알 수 있습니다.
-- delete의 XID는 77
-- update의 XID는 78 

test=# select t_ctid,
       case lp_flags
           when 0 then 'Unused'
           when 1 then 'Normal'
           when 2 then 'Redirect to ' || lp_off
           when 3 then 'Dead'
        end,
        t_xmin,
        t_xmax
from    heap_page_items(get_raw_page('t3',0));      

 t_ctid |  case  |  t_xmin   |  t_xmax
--------+--------+-----------+-----------
 (0,1)  | Normal | 74        |         0
 (0,2)  | Normal | 75        |        77   --- delete 명령어로 delete된 레코드
 (0,4)  | Normal | 76        |        78   --- update 명령어로 delete된 레코드
 (0,4)  | Normal | 78        |         0

4. VACUUM 수행 후의 변경 사항 확인

test=# vacuum t3;

-- VACUUM 수행 후, 삭제된 2건은 재활용 가능한 상태로 변경된 것을 알 수 있습니다. 

test=# select t_ctid,
       case lp_flags
           when 0 then 'Unused'
           when 1 then 'Normal'
           when 2 then 'Redirect to ' || lp_off
           when 3 then 'Dead'
        end,
        t_xmin,
        t_xmax
from    heap_page_items(get_raw_page('t3',0));

 t_ctid |     case      |  t_xmin   | t_xmax
--------+---------------+-----------+--------
 (0,1)  | Normal        |        74 |      0
        | Unused        |           |
        | Redirect to 4 |           |
 (0,4)  | Normal        |        78 |      0
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s