1. 2019.01.01 PostgreSQL 백업 및 복원
  2. 2018.10.15 RMAN 으로 Raw device 백업 복구하기

PostgreSQL 백업 및 복원



PostgreSQL 백업 및 복원


 - PostgreSQL 데이터를 백업하는 3가지 방법

 

 1. SQL 덤프

 2. 파일 시스템 레벨 백업

 3. 연속 아카이빙


 

1. SQL 덤프


pg_dump 사용


 덤프 백업


 $ pg_dump dbname > outfile


 - pg_dump 는 최신 버전에서 다시 로드 할 수 있습니다.

 - 32bit -> 64bit 서버로 이동할 수 있는 유일한 방법입니다.

 - 한번에 하나의 데이터베이스만 백업 가능합니다.


 덤프 복원


 $ psql dbname < infile


 - 새로운 환경에서 복원하게 되면 dbname 부분의 들어가는 데이터베이스가 자동으로 생성 되지 않기 때문에, 미리 사용자가 같은 이름의 데이터베이스를 생성 해줘야 합니다.

 - SQL 덤프를 복원하기 전에 덤프된 데이터베이스의 개체를 소유하고 있거나 개체에 대한 권한이 부여된 모든 사용자가 이미 존재해야 합니다.

 - 덤프 복원은 에러가 나도 계속 진행하기 때문에 --set ON_ERROR_STOP=on 옵션을 주면 에러 발생시 psql을 종료하게 할 수 있습니다.

 - pg_dump로 생성된 덤프는 template0에 상대적입니다. 이것은 template1을 통해 추가된 언어, 프로시저 등도 pg_dump에 의해 덤프된다는 것을 의미합니다. 결과적으로 복원시, 커스터마이즈된 template1을 사용하는 경우 template0으로부터 비어있는 데이터베이스를 생성해야 합니다. 

 - 파이프에 쓰거나, 파이프에서 읽어 오는 pg_dump 및 psql의 기능은 데이터베이스를 특정 서버에서 다른 서버로 직접 덤프를 가능하게 합니다.


 $ pg_dump -h host1 dbname | psql -h host2 dbname



pg_dumpall 사용


 - pg_dump는 한 번에 하나의 데이터베이스만 덤프하며, role 또는 테이블스페이스에 대한 정보는 덤프하지 않습니다. 


 백업

 

 $ pg_dumpall > outfile


 복원


 $ psql -f infile postgres


 - 실제로 시작한 기존 데이터베이스 이름을 지정할 수 있지만 비어있는 클러스터로 로딩한 경우 postgres를 일반적으로 사용해야 합니다.

 - 클러스터 차원의 데이터는 pg_dumpall --globals-only 옵션을 사용하여 단독 덤프가 가능합니다.



거대 데이터베이스 처리


 - 일부 운영체제는 거대 pg_dump 출력 파일을 생성할 때 최대 파일 크기 제한이 있습니다. pg_dump는 표준 출력으로 사용할 수 있어, 유닉스 툴로 이런 문제의 가능성을 피할 수 있습니다.


 ◆ 압축 덤프 사용

  

  gzip을 이용한 덤프

  $ pg_dump dbnam | gzip > filename.gz


  리로드

  $ gunzip -c filename.gz | psql dbname


 ◆ split 사용

  

  1GB 단위로 분할 백업

  $ pg_dump dbname | split -b 1024m - filename


  리로드

  $ cat filename* | psql dbname


 ◆ pg_dump의 커스텀 덤프 형식 사용

  

  - 설치된 zlib 압축 라이르러리를 사용하여 PostgreSQL을 시스템에서 빌드한 경우 출력 파일에 쓸 때 커스텀 덤프 형식이 데이터를 압축합니다.

 - 덤프파일 크기는 gzip과 비슷하지만 테이블을 선택적으로 복원할 수 있다는 장점이 있습니다.


  백업

  $ pg_dump -Fc dbname > filename


  복원 : psql이 아닌 pg_restore를 이용해 복원합니다.

  $ pg_restore -d dbname filename


 ◆ pg_dump의 병렬 덤프 기능 사용


  - 거대 데이터베이스의 덤프 속도를 높이기 위하여 병렬 모드를 사용할 수 있습니다.

  - 병렬 덤프는 "디렉토리" 아카이브 형식에 대해서만 지원합니다.

 

 백업

 $ pg_dump -j <number> -F d -f out.dir dbname


 복원

 pg_resote -j 를 이용하여 복원 할 수 있습니다.




2. 파일 시스템 레벨 백업


 - 시스템 레벨에서 백업을 하는 것인데, 정상적인 백업을 위해서는 반드시 DB를 shutdown 해야 합니다. 복원도 마찬가지.


 tar -cf backup.tar /usr/local/pgsql/data


 - 파일 시스템 백업은 전체 데이터베이스 클러스터의 완전한 백업 및 복원에 대해서만 동작합니다.



 

3. 연속 아카이빙 및 PITR


 - PostgreSQL은 클러스터의 데이터 디렉토리의 pg_xlog/ 서브 디렉토리에 WAL를 항상 유지관리합니다. 이 로그에는 데이터 파일에서 일어난 모든 변경 내용이 기록 됩니다.

 - 복구가 필요한 경우, 파일 시스템 백업을 복원한 이후, 백업된 WAL 파일로부터 리플레이로 시스템을 현재 상태로 불러옵니다. (오라클 Hot backup 복원 후 archive 적용하는 것과 비슷한 개념입니다.)

 - 일반 파일 시스템 백업과 마찬가지로, 전체 데이터베이스 클러스터 복원만 지원합니다.


 베이스 백업


 - pg_base 를 이용한 백업

 

 1) WAL 아카이빙이 활성화 되어 있는지 확인한다.

 2) 슈퍼유저로 데이터베이스에 연결하고 다음 명령을 실행한다.

   SELECT pg_start_backup('label');

   여기서 label은 백업 작업의 식별을 위한 string이다.

   기본적으로 pg_start_backup은 완료 되는데 체크포인트를 수행하기 때문에 시간이 오래걸린다.

   백업을 가능한 빨리 시작하고 싶다면, 다음을 사용하는 것이 좋다.

   SELECT pg_start_backup('label',ture);

   체크포인트를 강제한다.

 3) tar 또는 cpio 같은 편리한 파일 시스템 백업툴을 사용하여 백업을 수행한다.

 4) 슈퍼유저로 데이터베이스에 접속후에 명령을 실행한다.

   SELECT pg_stop_backup();

 5) 백업을 아카이브 하는 중에 WAL 세그먼트가 활성화 되면 백업이 끝이 난다.

 

 ※ 오라클 Hot backup과 동일한 개념으로 보면 됩니다.


 연속 아카이브 백업을 사용한 복구


 1) 서버가 실행중인 경우 서버를 중지한다.

 2) 공간에 여유가 잇는 경우 필요할 때를 대비하여 전체 클러스터 데이터 디렉토리와 테이블스페이스를 임시 위치에 복사한다. 시스템 다운 정에 아카이브되지 않은 로그가 포함되었을 수 있는 클러스터의 pg_xlog 서브디렉토리의 내용을 최소한이라도 따로 저장해두어야 한다.

 3) 사용 중인 클러스터 데이터 디렉토리 아래 및 데이블스페이스의 root 디렉토리 아래의 모든 기본 파일 및 서브 디렉토리를 삭제한다.

 4) 데이터베이스 파일을 파일 시스템 백업으로 부터 복원한다. 올바른 소유권 확인 및 pg_tblspc의 심볼릭 링크가 바른지 확인.

 5) pg_xlog/ 밑에 오래된 파일 시스템 백업에서 온 로그를 삭제한다.

 6) pg_xlog/ 2단계에서 저장된 아카이브되지 않은 WAL 세그먼트 파일이 있을 경우 pg_xlog/에 복사한다.

 7) 클러스터 데이터 디렉토리에서 복구 명령 파일 recovery.conf를 생성한다. pg_hba.conf를 수정하여 복구하는 동안 접속을 막는다.

 8) 서버를 시작한다. 서버가 복구모드로 들어가고 아카이브된 WAL 파일을 통해 읽기가 진행 된다. 복구가 완료 되면 recovery.conf의 이름을 recovey.done 으로 변경하고 다시 복구 모드로 들어가지 않게 바꿔준다.

 9) 데이터베이스의 내용을 확인하고 pg_hba.conf 를 복원하여 사용자 연결을 확인한다.


※ recovery.conf


 예제 파일. /usr/pgsql-9.6/share/recovery.conf.sample을 이용하여 만들수 있다.


 아카이브 복구 설정


 restore_command (string)

  - WAL 파일 시리즈의 아카이브된 세그먼트의 검색을 실행하는 로컬 쉘 명령.

  - 아카이브 복구에 필요하지만 스트리밍 복제의 경우는 옵션.

  - string의 %f 는 아카이브에서 검색할 파일 이름으로 교체되고, %p 는 서버의 복사 대상 경로로 교체된다.

 

    restore_command = 'cp /data/pgsql/archvie/%f "%p"'


 archive_cleanup_command (string)

  -모든 restartingpoint에서 실행되는 쉘 명령을 지정한다.

  - 스탠바이 서버에서 더 이상 필요로 하지 않는 오래된 아카이브 WAL 파일을 클린업하는 메카니즘을 제공하는 것.

  - %r 은 마지막 유효 재시작 지점이 있는 파일의 이름으로 교체된다.

  

   archive_cleanup_command = 'pg_archivecleanup /data/pgsql/archive %r'


 recovery_end_command (string)

  - 복구 종료 시에 한 번만 실행되는 쉘 명령을 지정한다. 이 매개변수는 옵션이다.


복구 타깃 설정


recovery_target = 'immediate'

  - 온라인 백업에서 복원하는 경우 이것은 백업이 종료된 지점을 의미한다.

  - 현재 다른 매개변수는 없다.


recovery_target_name (string)

  - 이 매개변수는 지명된 복원 지점(pg_create_restore_point()를 사용하여 생성)을 복구가 진행되는 지점으로 지정.


recovery_target_time (timestamp)

  - 이 매개변수는 타임스탬프를 복구가 진행되는 지점으로 지정한다.

  - 정밀한 정지 지점은 recovery_target_inclusive의 영향도 받는다


recovery_target_xid (string)

  - 트랜잭션 ID를 복구가 진행되는 지점으로 지정한다.

  - 복구되는 트랜잭션은 지정된 것 이전에 커밋된 트랜잭션이다.


다음 옵션은 복구 타깃을 추가로 지정하며, 타깃에 도달 했을때, 발생하는 것에 영향을 끼친다.


recovery_target_inclusive (boolean)

  - 지정된 복구 타깃 직후에 중지 할 것인지, 직전에 중지 할 것인지 지정한다.

  - 기본값은 ture.


recovery_target_timeline (string)

  - 특정한 타임라인으로의 복구를 지정한다.

  - 기본값은 베이스 백업을 가져왔을 때 현재였던 동일한 타임라인을 따라 복구하는 것이다.

  - 이것을 lastest로 설정하면 아카이브의 최신 타임라인으로 복구 되며, 스탠바이 서버에 유용하다.

 







RMAN 으로 Raw device 백업 복구하기

테스트 1 : Raw device 상태의 데이터파일을 RMAN 의 backupset 으로 백업 받은 후 정상적으로 복구 되는지 확인


Step 1. 현재상태 확인


[oracle@localhost ~]$ sqlplus / as sysdba


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:05:19 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> !vi dd.sql


set line 200

col tablespace_name for a10

col file_name for a45

select tablespace_name,bytes/1024/1024 MB,file_name from dba_data_files

/

:wq!


SQL> @dd <- Data file 상태 확인


TABLESPACE MB FILE_NAME

------------------- ---------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> !vi log.sql <- Redo log file 상태 확인


set line 200

col group# for 999

col member for a20

col mb for 999

col seq# for 999

col archived for a4

col status for a8

select a.group#,a.member,b.bytes/1024/1024 MB,b.sequence# "SEQ#" ,b.archived,b.status

from v$logfile a, v$log b

where a.group#=b.group#

order by 1,2

/

:wq!


SQL> @log


GROUP# MEMBER MB SEQ# ARCH STATUS

---------- -------------------- ------ ------- ---------- -----------

1 /dev/raw/raw10 50 4 NO CURRENT

1 /dev/raw/raw9 50 4 NO CURRENT

2 /dev/raw/raw11 50 2 YES INACTIVE

2 /dev/raw/raw12 50 2 YES INACTIVE

3 /dev/raw/raw13 50 3 YES INACTIVE

3 /dev/raw/raw14 50 3 YES INACTIVE

6 rows selected.


SQL> select name from v$controlfile;


NAME

---------------------------------

/dev/raw/raw6

/dev/raw/raw7

/dev/raw/raw8


SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /data/arc2

Oldest online log sequence 2

Next log sequence to archive 4

Current log sequence 4


Step 2. RMAN 을 사용하여 전체 백업(백업경로는 /data/backup/rman/ 으로 하겠습니다)


[oracle@localhost ~]$ rman target /


Recovery Manager: Release 10.2.0.5.0 - Production on Wed Feb 1 10:47:50 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: TESTDB (DBID=2557423915)


RMAN> backup as compressed backupset

2> format '/data/backup/rman/%U_%T'

3> database;

Starting backup at 01-FEB-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=144 devtype=DISK

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/dev/raw/raw1

input datafile fno=00003 name=/dev/raw/raw2

input datafile fno=00005 name=/dev/raw/raw5

input datafile fno=00002 name=/dev/raw/raw3

input datafile fno=00004 name=/dev/raw/raw4

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/01n27hl4_1_1_20120201 tag=TAG20120201T104907

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:36

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/02n27hm8_1_1_20120201 tag=TAG20120201T104907

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

Finished backup at 01-FEB-12


[oracle@localhost ~]$ ls -lSh /data/backup/rman/

합계 112M

-rw-r----- 1 oracle dba 111M 2월 1 10:49 01n27hl4_1_1_20120201 <- 전체 backupset

-rw-r----- 1 oracle dba 1.1M 2월 1 10:49 02n27hm8_1_1_20120201 <- controlfile backupset


Step 3. 테스트용 테이블 scott.gogak 테이블 생성 후 장애 발생시킴


[oracle@localhost ~]$ sqlplus scott/tiger


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:14:21 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> create table gogak (no number, name varchar2(10)) tablespace users;

Table created.


SQL> insert into gogak values (1,'AAA');

1 row created.


SQL> insert into gogak values (2,'BBB');

1 row created.


SQL> commit;

Commit complete.


SQL> select * from gogak;


NO NAME

---------- ----------

1 AAA

2 BBB


SQL> conn / as sysdba

Connected.


SQL> @dd


TABLESPACE MB FILE_NAME

---------------- ---------- ---------------------------------------------

USERS 5 /dev/raw/raw4 <- 이 파일에 장애 발생시킴

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> !dd if=/dev/zero of=/dev/raw/raw4 bs=8k

dd: writing `/dev/raw/raw4': 장치에 남은 공간이 없음

12801+0개의 레코드를 입력하였습니다

12800+0개의 레코드를 출력하였습니다


SQL> alter tablespace users offline immediate;

Tablespace altered.


SQL> alter tablespace users online;

alter tablespace users online

*

ERROR at line 1:

ORA-01122: database file 4 failed verification check

ORA-01110: data file 4: '/dev/raw/raw4'

ORA-01210: data file header is media corrupt


SQL> select * from scott.gogak;

select * from scott.gogak

*

ERROR at line 1:

ORA-00376: file 4 cannot be read at this time

ORA-01110: data file 4: '/dev/raw/raw4'


Step 4. RMAN 으로 해당 장애 복구하기


[oracle@localhost ~]$ rman target /


Recovery Manager: Release 10.2.0.5.0 - Production on Wed Feb 1 11:19:20 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: TESTDB (DBID=2557423915)

RMAN> run {

2> sql "alter tablespace users offline immediate";

3> restore tablespace users;

4> recover tablespace users;

5> sql "alter tablespace users online";

6> }

sql statement: alter tablespace users offline immediate

Starting restore at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00004 to /dev/raw/raw4

channel ORA_DISK_1: reading from backup piece /data/backup/rman/01n27hl4_1_1_20120201

channel ORA_DISK_1: restored backup piece 1

piece handle=/data/backup/rman/01n27hl4_1_1_20120201 tag=TAG20120201T104907

channel ORA_DISK_1: restore complete, elapsed time: 00:00:02

Finished restore at 01-FEB-12

Starting recover at 01-FEB-12

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:01

Finished recover at 01-FEB-12

sql statement: alter tablespace users online


RMAN> exit

Recovery Manager complete.


[oracle@localhost ~]$ sqlplus scott/tiger


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:21:53 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> select * from gogak;


NO NAME

---------- ----------

1 AAA

2 BBB


위에서 테스트 해 본 바와 같이 Raw device 도 RMAN 으로 백업 및 복구가 가능합니다.



테스트 2. Raw device 상태의 데이터 파일을 backupset 으로 증분 백업 가능한지와 복구 가능한지 테스트



Step 1. 현재 상태 확인


[oracle@localhost ~]$ sqlplus / as sysdba


SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 1 11:24:25 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> @dd


TABLESPACE MB FILE_NAME

----------------- ---------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> @log


GROUP# MEMBER MB SEQ# ARCH STATUS

----------- ---------------------- ------- --------- ---------- -------------

1 /dev/raw/raw10 50 4 NO CURRENT

1 /dev/raw/raw9 50 4 NO CURRENT

2 /dev/raw/raw11 50 2 YES INACTIVE

2 /dev/raw/raw12 50 2 YES INACTIVE

3 /dev/raw/raw13 50 3 YES INACTIVE

3 /dev/raw/raw14 50 3 YES INACTIVE


SQL> select name from v$controlfile;


NAME

----------------------------------------

/dev/raw/raw6

/dev/raw/raw7

/dev/raw/raw8

6 rows selected.



Step 2. RMAN 을 사용하여 증분 백업을 여러 차례 수행합니다.


[oracle@localhost ~]$ rman target /


Recovery Manager: Release 10.2.0.5.0 - Production on Wed Feb 1 11:28:05 2012

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: TESTDB (DBID=2557423915)


RMAN> backup as compressed backupset

2> incremental level 0

3> format '/data/backup/rman/%U_%T'

4> database;

Starting backup at 01-FEB-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=145 devtype=DISK

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/dev/raw/raw1

input datafile fno=00003 name=/dev/raw/raw2

input datafile fno=00005 name=/dev/raw/raw5

input datafile fno=00002 name=/dev/raw/raw3

input datafile fno=00004 name=/dev/raw/raw4

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/03n27jur_1_1_20120201 tag=TAG20120201T112827

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35

channel ORA_DISK_1: starting compressed full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/04n27jvu_1_1_20120201 tag=TAG20120201T112827

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

Finished backup at 01-FEB-12

-- 다른 터미널에서 데이터 변경을 위해 테이블 생성하고 데이터 입력합니다.


SQL> create table scott.gogak2 (no number,name varchar2(10)) tablespace users;

Table created.


SQL> insert into scott.gogak2 values (1,'CCC');

1 row created.


SQL> insert into scott.gogak2 values (2,'DDD');

1 row created.


SQL> commit;

Commit complete.


-- RMAN 터미널에서 증분 백업을 수행합니다.

RMAN> backup as compressed backupset

2> incremental level 2

3> format '/data/backup/rman/%U_%T'

4> tablespace users;

Starting backup at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting compressed incremental level 2 datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00004 name=/dev/raw/raw4

channel ORA_DISK_1: starting piece 1 at 01-FEB-12

channel ORA_DISK_1: finished piece 1 at 01-FEB-12

piece handle=/data/backup/rman/05n27knu_1_1_20120201 tag=TAG20120201T114150

comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 01-FEB-12



Step 3. 장애를 발생 시킵니다


SQL> @dd


TABLESPACE MB FILE_NAME

---------------- ------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5


SQL> !dd if=/dev/zero of=/dev/raw/raw4 bs=8k <- 장애를 발생시킵니다

dd: writing `/dev/raw/raw4': 장치에 남은 공간이 없음

12801+0개의 레코드를 입력하였습니다

12800+0개의 레코드를 출력하였습니다


SQL> alter tablespace users offline immediate;

Tablespace altered.


SQL> alter tablespace users online;

alter tablespace users online

*

ERROR at line 1:

ORA-01122: database file 4 failed verification check

ORA-01110: data file 4: '/dev/raw/raw4'

ORA-01210: data file header is media corrupt


SQL> select * from scott.gogak2;

select * from scott.gogak2

*

ERROR at line 1:

ORA-00376: file 4 cannot be read at this time

ORA-01110: data file 4: '/dev/raw/raw4'



Step 4. RMAN 으로 복구 후 확인합니다.


RMAN> run {

2> restore tablespace users;

3> recover tablespace users;

4> sql "alter tablespace users online" ;

5> }

Starting restore at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00004 to /dev/raw/raw4

channel ORA_DISK_1: reading from backup piece /data/backup/rman/05n27knu_1_1_20120201

channel ORA_DISK_1: restored backup piece 1

piece handle=/data/backup/rman/05n27knu_1_1_20120201 tag=TAG20120201T114150

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

Finished restore at 01-FEB-12

Starting recover at 01-FEB-12

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:01

Finished recover at 01-FEB-12

sql statement: alter tablespace users online


SQL> select * from scott.gogak2;


NO NAME

---------- ----------

1 CCC

2 DDD



테스트 3. RMAN 으로 Raw device 상태의 데이터 파일을 Raw device 형태로 백업 받은 후 복구 가능한지 테스트



Step 1. 현재 상태 확인


RMAN> report schema;

Report of database schema

List of Permanent Datafiles

===========================

File Size(MB) Tablespace RB segs Datafile Name

---- -------- -------------------- ------- ------------------------

1 440 SYSTEM *** /dev/raw/raw1

2 30 UNDOTBS1 *** /dev/raw/raw3

3 250 SYSAUX *** /dev/raw/raw2

4 5 USERS *** /dev/raw/raw4

5 100 EXAMPLE *** /dev/raw/raw5

List of Temporary Files

=======================

File Size(MB) Tablespace Maxsize(MB) Tempfile Name

---- -------- -------------------- ----------- --------------------

1 20 TEMP 100 /dev/raw/raw15


Step 2. RMAN 으로 Raw device 파일 백업 수행


RMAN> copy

2> datafile 1 to '/data/backup/rman/system' ,

3> datafile 2 to '/data/backup/rman/undotbs1' ,

4> datafile 3 to '/data/backup/rman/sysaux' ,

5> datafile 4 to '/data/backup/rman/users' ,

6> datafile 5 to '/data/backup/rman/example' ;

Starting backup at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile copy

input datafile fno=00001 name=/dev/raw/raw1

output filename=/data/backup/rman/system tag=TAG20120201T115814 recid=9

stamp=774100724

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35

channel ORA_DISK_1: starting datafile copy

input datafile fno=00003 name=/dev/raw/raw2

output filename=/data/backup/rman/sysaux tag=TAG20120201T115814 recid=10

stamp=774100744

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:16

channel ORA_DISK_1: starting datafile copy

input datafile fno=00005 name=/dev/raw/raw5

output filename=/data/backup/rman/example tag=TAG20120201T115814 recid=11

stamp=774100749

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07

channel ORA_DISK_1: starting datafile copy

input datafile fno=00002 name=/dev/raw/raw3

output filename=/data/backup/rman/undotbs1 tag=TAG20120201T115814 recid=12

stamp=774100754

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03

channel ORA_DISK_1: starting datafile copy

input datafile fno=00004 name=/dev/raw/raw4

output filename=/data/backup/rman/users tag=TAG20120201T115814 recid=13

stamp=774100756

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 01-FEB-12

-- 다른 창에서 백업 파일을 확인합니다


[oracle@localhost rman]$ pwd

/data/backup/rman


[oracle@localhost rman]$ ls –lSh

-rw-r----- 1 oracle dba 441M 2?? 1 11:58 system

-rw-r----- 1 oracle dba 251M 2?? 1 11:59 sysaux

-rw-r----- 1 oracle dba 101M 2?? 1 11:59 example

-rw-r----- 1 oracle dba 31M 2?? 1 11:59 undotbs1

-rw-r----- 1 oracle dba 5.1M 2?? 1 11:59 users


Step 3. 테스트용 테이블 scott.gogak3 을 생성 후 장애를 발생시킵니다.


SQL> create table scott.gogak3 (no number, name varchar2(10))

2 tablespace users;

Table created.


SQL> insert into scott.gogak3 values (1,'EEE');

1 row created.


SQL> insert into scott.gogak3 values (2,'FFF');

1 row created.


SQL> commit;

Commit complete.


SQL> select * from scott.gogak3;


NO NAME

---------- ----------

1 EEE

2 FFF


SQL> @dd


TABLESPACE MB FILE_NAME

---------------- -------- ---------------------------------------------

USERS 5 /dev/raw/raw4

SYSAUX 250 /dev/raw/raw2

UNDOTBS1 30 /dev/raw/raw3

SYSTEM 440 /dev/raw/raw1

EXAMPLE 100 /dev/raw/raw5

SQL> !dd if=/dev/zero of=/dev/raw/raw4 bs=8k

dd: writing `/dev/raw/raw4': 장치에 남은 공간이 없음

12801+0개의 레코드를 입력하였습니다

12800+0개의 레코드를 출력하였습니다


SQL> alter tablespace users offline immediate;

Tablespace altered.


SQL> alter tablespace users online;

alter tablespace users online

*

ERROR at line 1:

ORA-01122: database file 4 failed verification check

ORA-01110: data file 4: '/dev/raw/raw4'

ORA-01210: data file header is media corrupt


SQL> select * from scott.gogak3;

select * from scott.gogak3

*

ERROR at line 1:

ORA-00376: file 4 cannot be read at this time

ORA-01110: data file 4: '/dev/raw/raw4'


Step 4. RMAN 으로 파일을 복원 한 후 복구합니다.


RMAN> restore tablespace users;

Starting restore at 01-FEB-12

using channel ORA_DISK_1

channel ORA_DISK_1: restoring datafile 00004

input datafile copy recid=13 stamp=774100756 filename=/data/backup/rman/users

destination for restore of datafile 00004: /dev/raw/raw4

channel ORA_DISK_1: copied datafile copy of datafile 00004

output filename=/dev/raw/raw4 recid=14 stamp=774101682

Finished restore at 01-FEB-12

위에서 진하게 표시된 부분을 보면 RMAN 에서 자동으로 copy 된 raw device 를 찾아서

복원하는 것을 알 수 있습니다.


RMAN> recover tablespace users;

Starting recover at 01-FEB-12

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:00

Finished recover at 01-FEB-12


-- sqlplus 창에서 데이터가 복구되었는지 확인합니다.


SQL> alter tablespace users online;

Tablespace altered.


SQL> select * from scott.gogak3;

NO NAME

---------- ----------

1 EEE

2 FFF


정상적으로 복구가 된 것을 알 수 있습니다.

위에서 살펴본 바와 같이 Raw Device 로 구성된 database 도 RMAN 으로 동일하게 관리할 수 있습니다.