DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

백업과 복구

DBMS 2
DB2 가이드
DB2 사용자 가이드
백업과 복구
작성자
admin
작성일
2021-02-19 14:48
조회
2310

백업과 복구

데이터베이스 로깅

데이터베이스가 활성화되면 고정된 개수의 로그 파일들이 로그 디렉토리에 새롭게 생성됩니다. SQL문의 처리에 필요한 데이터는 테이블스페이스 컨테이너에서 버퍼풀로 로드됩니다. 버퍼풀 의 데이터를 변경하면 변경 내용은 로그 버퍼에 기록되어 로그 버퍼가 가득 차거나, 트랜잭션이 COMMIT 되면 로그 파일로 반영됩니다. 버퍼풀의 변경된 페이지가 지정한 비율을 초과하면 변경 내용은 로그 파일에 먼저 반영되고, 디스크의 컨테이너에 반영됩니다. 기본적으로 로그 파 일 한 개 분량의 로깅이 완료되면 버퍼풀의 변경 내용이 컨테이너로 반영됩니다.

db2

SQL문의 종류에 따라 로그 파일에 기록되는 내용이 다릅니다.

db2

로그 파일은 용도와 상태에 따라 4가지로 구분됩니다.

db2

로그 파일을 운영하는 방법에 따라 2가지의 로깅 방법으로 구분됩니다.

db2


데이터베이스 로그를 위한 구성 변수

데이터베이스 로그와 관련된 주요 데이터베이스 구성 변수는 다음과 같습니다.

db2

UPDATA DB CFG 명령어로 변경하며, 데이터베이스가 재활성화가 필요할 수 있습니다.

db2


순환 로깅

데이터베이스가 활성화되면 LOGPRIMARY 데이터베이스 구성 변수에 설정된 개수의 로그 파 일들이 로그 디렉토리에 새롭게 생성됩니다. 생성된 로그 파일의 번호는 0 번부터 시작합니다.


$ db2 get db cfg for DB명> | grep LOGPRIMARY
$ db2 get db cfg for DB명> | grep LOGSECOND

db2

update db cfg 명령어로 LOGARCHMETH1 구성 변수의 값을 OFF로 설정합니다.


$ db2 update db cfg for?<db명>using LOGARCHMETH1 OFF</db명>

UOW가 시작되면 0번 로그는 활성 로그가 되어 기록을 시작하고, 0번을 모두 채우면 1번이 활 성 로그가 되어 0번 로그에 이어서 기록을 시작합니다.

0번 로그에 포함된 트랜잭션들이 모두 종료되었다면, 0번 로그는 비활성 로그가 되어서 다음 번 에 재사용됩니다. 0번 로그에 아직 종료되지 않은 트랜잭션이 포함되어 있다면, 0번 로그와 1번 로그는 모두 활성 로그가 됩니다.

유사한 방법으로 현재 N번 로그가 활성 로그이고, 더 이상 기록할 공간이 없으면 다음 번호의 로 그 파일을 요청합니다. 이 시점에서 0번 로그가 비활성 로그였다면, N번 로그에 뒤를 이어 재사 용됩니다. 0번 로그가 활성 로그였다면, LOGSECOND에서 지정한 로그가 사용되어 전체 활 성 로그의 수는 N+1 이 됩니다.

유사한 방법으로 LOGSECOND 가 지정한 M개의 로그가 모두 활성 로그가 된 상태에서 더 이상 기록할 공간이 없으면, 로그 공간 부족 현상이 발생하면서, 진행 중이던 트랜잭션은 모두 롤 백됩니다. 즉, 활성 로그의 최대 개수는 LOGPRIMARY 구성 변수와 LOGSECOMD 구 성 변수의 합을 초과할 수 없습니다.

LOGSECOND로 생성된 M개의 로그들이 비활성 로그가 되면, 비동기식으로 엔진에 의해 제 거되고, 다시 LOGPRIMARY 의 값인 N개의 로그가 남게 됩니다.


아카이브 로깅

데이터베이스가 활성화되면 LOGPRIMARY 데이터베이스 구성 변수에 설정된 개수의 로그 파 일들이 로그 디렉토리에 새롭게 생성됩니다. 생성된 로그 파일의 번호는 최근에 사용했던 로그 파일의 다음 번호입니다.


$ db2 get db cfg for DB명> | grep "처음에 사용되는 로그 파일"

db2

update db cfg 명령어로 LOGARCHMETH1 구성 변수의 값을 LOGRETAIN 으로 설 정합니다.


$ db2 update db cfg for DB명> using LOGARCHMETH1 LOGRETAIN

UOW가 시작되면 0번 로그는 활성 로그가 되어 기록을 시작하고, 0번을 모두 채우면 1번이 활 성 로그가 되어 0번 로그에 이어서 기록을 시작합니다.

0번 로그에 포함된 트랜잭션들이 모두 종료되었다면, 0번 로그는 비활성 로그가 되어 더 이상 사 용되지 않고 보관됩니다. 새로운 N+1 번의 로그 파일을 생성하여 전체 로그 파일의 개수는 N개 를 유지하도록 합니다. 0번 로그에 아직 종료되지 않은 트랜잭션이 포함되어 있다면, 0번 로그와 1번 로그는 모두 활성 로그가 됩고, N+1 번 로그는 생성되지 않습니다.

현재 N개의 로그가 활성 로그이고, 더 이상 기록할 공간이 없으면 LOGSECOND에서 지정한 로그가 사용되어 전체 활성 로그의 수는 N+1 이 됩니다.

유사한 방법으로 LOGSECOND 가 지정한 M개의 로그가 모두 활성 로그가 된 상태에서 더 이상 기록할 공간이 없으면, 로그 공간 부족 현상이 발생하면서, 진행 중이던 트랜잭션은 모두 롤 백됩니다. 즉, 활성 로그의 최대 개수는 LOGPRIMARY 구성 변수와 LOGSECOMD 구 성 변수의 합을 초과할 수 없습니다 비활성 로그가 되면, 제거되지 않고 그대로 보관됩 니다. 다시 LOGPRIMARY 의 값인 N개의 로그가 남게 됩니다.


USER EXIT

update db cfg 명령어로 LOGARCHMETH1 구성 변수의 값을 DISK:<경로명> 으로 설정합니다. 경로명>은 절대 경로명으로 표현합니다.


$ db2 update db cfg for DB명> using LOGARCHMETH1 DISK:경로명>

get db cfg 명령어의 show detail 옵션으로 변경값이 반영되었는지 확인합니다.


$ db2 connect to DB명>
$ db2 get db cfg for DB명> SHOW DETAIL | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = OFF

update db cfg 명령어를 실행한 후에 SQL1363W 경고를 받았다면, 변경값이 동적으로 반영되지 않았으므로 데이터베이스를 재활성화합니다.


$ db2 terminate
$ db2 deactivate db DB명>

activate db 명령어로 데이터베이스를 재활성화하면 SQL1116N 오류가 반환됩니다.


$ db2 get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = DISK:경로명>
$ db2 activate db DB명>
SQL1116N BACKUP PENDING 때문에 데이터베이스 "DB명>"에 연결하거나 활
성화할 수 없습니다. SQLSTATE=57019

LOGARCHMETH1 의 값이 OFF 가 아닌 경우는 아카이브로깅 모드로 설정되므로 최초의 오프라인 모드의 데이터베이스 FULL 백업이 필요합니다. backup db 명령어를 실행하여 데 이터베이스의 '백업 보류' 상태를 해제하고, 다시 데이터베이스를 재활성화합니다.


$ db2 backup db DB명>
$ db2 activate db DB명>

다양한 트랜잭션을 실행시키면 로그 파일에 변경 내용이 기록되고, 비활성 로그가 되면 자동적으 로 LOGARCHMETH1 변수가 지정한 경로명>로 이동됩니다.


$ ls ?R 경로명> S0000000.LOG S0000001.LOG S0000002.LOG

활성 로그 파일의 시작 번호를 확인하면 마지막 아카이브 로그의 번호를 알 수 있습니다.


$ db2 get db cfg for DB명> | grep "처음에 사용되는 로그 파일"
처음에 사용되는 로그 파일 = S0000002.LOG
복구 기록 파일

create db 명령어로 데이터베이스를 생성하면 복구 기록 파일이 생성됩니다.

db2

복구 기록 파일은 다음과 같은 명령어가 실행될 때 갱신됩니다.

db2


LIST HISTORY 명령어

list history 명령어를 이용하여 복구 기록 파일의 내용을 조회할 수 있습니다.

db2

list history 명령어를 이용하여 복구 기록 파일의 내용을 조회할 수 있습니다.


$ db2 list history ALL for DB명> $ db2 list history BACKUP all for DB명> 
$ db2 list history ROLLFORWARD all for DB명> $ db2 list history backup SINCE 시간소인> for DB명> $ db2 list history rollforward CONTAINING 스키마명>.테이블명> for DB 명> $ db2 list history REORG all for sample

복구 기록 파일이 저장하는 정보는 다음과 같습니다.

db2


PRUNE HISTORY 명령어

prune history 명령을 이용하여 복구 기록 파일의 내용 중에서 지정한 시점 이전의 기록을 삭 제할 수 있습니다.

db2

prune history 명령을 이용하여 복구 기록 파일의 내용 중에서 지정한 시점 이전의 기록을 삭 제할 수 있습니다. 시간소인>은 yyyymmddhhmmss> 형식으로 표시합니다.?이상을 명시할 수 있습니다.


$ db2 prune history yyyy>
$ db2 prune history yyyymmdd>
$ db2 prune history yyyymmddhhmmss>

WITH FORCE 옵션을 이용하면 복구 기록 파일의 모든 항목을 완전히 제거합니다. 옵션을 지 정하지 않으면, 최근의 FULL 백업 정보와 연관되는 복구 작업의 기록은 유지됩니다.


$ db2 prune history yyyymmddhhmmss> WITH FORCE OPTION

AND DELETE 옵션을 이용하면 복구 기록 파일에서 항목이 삭제되고, 해당 항목과 관련된 아 카이브 로그 파일도 물리적으로 제거됩니다. USEREXIT 프로그램을 사용하여 아카이브 로그 파 일을 관리하는 경우에는 지원되지 않습니다.


$ db2 prune history yyyymmddhhmmss> AND DELETE

prune logfile prior to 명령어로 지정한 번호보다 작은 번호의 로그 파일을 모드 제거합니다. LOGRETAIN 변수가 ON으로 설정되어야 합니다. 로그 파일명은 S0000100.LOG 와 같은 형식으로 표시합니다.


$ get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = LOGRETAIN
$ db2 prune logfile prior to 로그파일명>

update dbm cfg 명령어를 이용하여 REC_HIS_RETENTN 데이터베이스 구성 변수를 변 경합니다. 기간>은 1일 단위로 지정합니다. 기본값은 366일입니다.


$ db2 get db cfg for DB명> | grep REC_HIS_RETENTN
복구 실행기록 보유(일) (REC_HIS_RETENTN) = 366
$ db2 update db cfg for DB명> using REC_HIS_RETENTN 기간>
백업의 종류

SYSADM, SYSCTRL, SYSMAINT 권한의 사용자가 원격 또는 지역 데이터베이스에 대해 백 업을 실행하면 백업 이미지 파일이 생성됩니다.

db2

백업의 모드는 2가지로 분류됩니다.

db2

백업의 수준은 2가지로 분류됩니다.

db2

백업의 범위는 3가지로 분류됩니다.

db2


BACKUP DB 명령어

BACKUP DB 명령어의 형식은 다음과 같습니다.

db2

자주 사용되는 옵션은 다음과 같습니다.

db2

UNIX에서 백업 이미지 파일명이 백업에 관한 정보를 반영하고 있습니다..

db2

Windows 에서는 서브경로명과 백업 이미지 파일명이 함께 백업 정보를 반영합니다.

db2

백업 이미지 파일명의 각 항목은 다음과 같습니다.

db2


FULL 백업

주기적으로 FULL 백업을 실행합니다. 마지막으로 생성한 FULL 백업의 이미지는 복구시에 사용 되므로 안전하게 보관합니다. 온라인 백업이라면 백업 작업 동안 사용된 로그 파일을 함께 보관 해야 합니다.

db2

순환 로깅 모드인 경우에는 오프라인 모드의 FULL 백업만 가능합니다.


$ get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = OFF
$ db2 backup db DB명>

아카이브 로깅 모드인 경우에만 오프라인 백업과 온라인 백업이 모두 가능합니다.


$ get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = LOGRETAIN
$ db2 backup db DB명>
$ db2 backup db DB명> ONLINE

원격 데이터베이스의 백업을 실행할 때는 반드시 <사용자명>과 <암호명>를 입력해야 합니다.


$ db2 backup db DB명> user 사용자명> using 암호명>

TO 옵션을 이용하여 백업 이미지를 독립적인 디렉토리에 따로 생성하는 것이 좋습니다.


$ db2 backup db DB명> TO 경로명>
$ db2 backup db DB명> TO 경로명1>, 경로명2>

list history 명령어로 해당 INCREMENTAL 백업과 연관된 로그 파일의 번호를 확인합니다.


$ db2 list history backup for DB명>
INCREMENTAL 백업

주기적으로 FULL 백업을 실행하고, 다음 FULL 백업이 되기 전까지는 INCREMENTAL 백업 을 여러 번 실행합니다. 기준이 되는 FULL 백업 이미지와 마지막으로 생성한 INCREMENTAL 백업의 이미지, 백업 작업 동안 사용된 로그 파일은 복구를 대비하여 안전하게 보관해야 합니다.

db2

아카이브 로깅 모드에서만 지원되므로 LOGARCHMETH1 데이터베이스 구성 변수의 값이 OFF 가 아닌 것을 확인합니다.


$ get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = LOGRETAIN

TRACKMOD 데이터베이스 구성 변수의 db2 get db cfg for DB명> | grep TRACKMOD
트랙 수정 페이지 (TRACKMOD) = ON

backup database 명령에서 INCREMENTAL 옵션을 이용하여 최근의 FULL 백업 이후 에 변경된 부분에 대해서만 백업 이미지를 생성합니다.


$ db2 backup db DB명> INCREMENTAL
$ db2 backup db DB명> ONLINE incremental
$ db2 backup db DB명> online incremental TO 디렉토리명>
$ db2 backup db DB명> online incremental to 디렉토리명> INCLUDE
LOGS

list history 명령어로 해당 INCREMENTAL 백업과 연관된 로그 파일의 번호를 확인합니다.


$ db2 list history backup for DB명>
DELTA 백업

주기적으로 FULL 백업을 실행하고, 다음 FULL 백업이 되기 전까지는 INCREMENTAL 백업 또는 DELTA 백업을 여러 번 실행합니다. 기준이 되는 FULL 백업 이미지와 마지막으로 생성한 INCREMENTAL 백업 이미지, 최근까지의 DELTA 백업 이미지, 백업 작업 동안 사용된 로그 파일은 복구시에 사용되므로 안전하게 보관해야 합니다.

db2

아카이브 로깅 모드에서만 지원되므로 LOGARCHMETH1 데이터베이스 구성 변수의 값이 OFF 가 아닌 것을 확인합니다.


$ get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = LOGRETAIN

TRACKMOD 데이터베이스 구성 변수의 값이 ON 인 것을 확인합니다.


$ db2 get db cfg for DB명> | grep TRACKMOD
트랙 수정 페이지 (TRACKMOD) = ON

backup database 명령에서 INCREMENTAL DELTA 옵션을 이용하여 최근의 FULL 또는 INCREMENTAL 백업 이후에 변경된 부분에 대해서만 백업 이미지를 생성합니다.


$ db2 backup db DB명> INCREMENTAL DELTA
$ db2 backup db DB명> ONLINE incremental delta
$ db2 backup db DB명> online incremental delta TO 디렉토리명>
$ db2 backup db DB명> online incremental delta to 디렉토리명>
INCLUDE LOGS

list history 명령어로 해당 INCREMENTAL 백업과 연관된 로그 파일의 번호를 확인합니다.


$ db2 list history backup for DB명>
카탈로그 테이블스페이스 또는 중요한 테이블스페이스만 별도로 백업합니다. 테이블스페이스에 대한 백업 이미지 파일과 백업 작업 동안 사용된 로그 파일을 안전하게 보관해야 합니다.

db2

아카이브 로깅 모드에서만 지원되므로 LOGARCHMETH1 데이터베이스 구성 변수의 값이 OFF 가 아닌 것을 확인합니다.


$ get db cfg for DB명> | grep LOGARCHMETH1
첫 번째 로그 아카이브 메소드 (LOGARCHMETH1) = LOGRETAIN

backup database 명령에서 TABLESPACE 옵션을 이용하여 한 개 이상의 테이블스페 이스에 대한 백업 이미지를 생성합니다. 연관된 테이블스페이스는 함께 백업합니다.


$ db2 "backup db DB명> TABLESPACE (TS명>)"
$ db2 "backup db DB명> TABLESPACE (TS명 1>, TS명 2>)"

ONLINE, TO, INCREMENTAL, DELTA 등의 옵션과 함께 사용될 수 있습니다.


$ db2 "backup db DB명> tablespace (TS명>) ONLINE "
$ db2 "backup db DB명> tablespace (TS명>) online TO 디렉토리명>"
$ db2 "backup db DB명> tablespace (TS명>) online INCREMENTAL"
$ db2 "backup db DB명> tablespace (TS명>) online INCREMENTAL
DELTA"

list history 명령어로 해당 INCREMENTAL 백업과 연관된 로그 파일의 번호를 확인합니다.


$ db2 list history backup for DB명>
복구의 종류

데이터베이스를 사용할 수 없는 상태가 되면 SYSADM, SYSCTRL, SYSMAINT 권한의 사용 자가 원격 또는 지역 데이터베이스의 백업 이미지 파일, 아카이브 로그 파일, 활성 로그 파일 등 을 이용하여 데이터베이스를 복구합니다

db2

복구의 유형은 세 가지로 분류됩니다.

db2

복구의 수준은 2가지로 분류됩니다.

db2

복구의 범위는 3가지로 분류됩니다.

db2


RESTART DB 명령어

RESTART DB 명령어의 형식은 다음과 같습니다.

db2

사용되는 옵션은 다음과 같습니다.

db2


RESTORE DB 명령어

RESTORE DB 명령어의 형식은 다음과 같습니다.

db2

자주 사용되는 옵션은 다음과 같습니다.

db2


ROLLFORWARD DB 명령어

ROLLFORWARD DB 명령어의 형식은 다음과 같습니다.

db2

자주 사용되는 옵션은 다음과 같습니다.

db2


크래쉬 복구

응용프로그램이 연결되어 있을 때 데이터베이스가 비정상 종료하는 경우에는 크래쉬 복구가 필 요합니다. 데이터베이스의 비정상 종료는 전원 공급 중단이나 시스템 소프트웨어 장애로 인해 발 생할 수 있습니다. 이러한 종료는 실패시 데이터베이스 버퍼 풀에 있으나 디스크에 기록되지 않 은 커미트 트랜잭션에 적용됩니다. 또한 디스크에 기록된 미확약 트랜잭션을 롤백시킵니다.

get dbm cfg 명령어로 데이터베이스 구성 변수인 AUTORESTART의 기본값이 ON 인 것 을 확인합니다. ON 은 필요시에 크래쉬 복구가 자동적으로 실행되는 것을 의미합니다.


$ login 인스턴스 사용자>
$ db2 get db cfg for DB명> | grep AUTORESTART
자동 재시작 사용 (AUTORESTART) = ON

AUTORESTART 값을 OFF로 설정하면, 필요시에 크래쉬 복구가 자동적으로 실행되지 않습 니다. activate db 명령어로 데이터베이스를 활성화시키거나, connect 명령어로 최초의 데이터베이스 접속을 요청하면, SQL1015N 오류가 반환됩니다. restart db 명령어를 사용하 여 크래쉬 복구를 실행합니다. 크래쉬 복구가 완료되면 데이터베이스를 사용할 수 있습니다.


$ db2 RESTART DATABASE DB명>
$ db2 ACTIVATE DATABASE DB명>
$ db2 CONNECT TO DB명>

크래쉬 복구에 대한 정보는 오류 진단 파일인 db2diag.log 파일에서 확인할 수 있습니다.


$ vi $HOME/sqllib/db2diag.log

db2


버전 복구

데이터베이스가 손상된 경우에는 최근에 생성했던 FULL 백업 이미지 파일만 있으면, restore db 명령으로 데이터베이스를 이전 버전으로 복구할 수 있습니다. 복구에 사용된 백업 이미지가 생성되었던 시점 이후부터 현재까지의 데이터베이스에 대한 모든 변경 내용은 유실됩니다.

db2

restore database 명령을 이용하여 데이터베이스의 백업 이미지로부터 기존 데이터베이스 로 복구합니다. 접속된 모든 응용프로그램은 종료되어야 합니다.


$ db2 force applications all
$ db2 restore db DB명>

INTO 옵션을 사용하면 신규 데이터베이스로 복구할 수 있습니다.


$ db2 restore db DB명> INTO 신규 DB명>

백업 이미지가 다른 디렉토리에 있는 경우에는 restore 명령어의 FROM 옵션을 이용합니다.


$ db2 restore db DB명> FROM 디렉토리명>

백업 이미지가 여러 개 있으면 restore 명령어의 TAKEN AT 옵션을 이용합니다.


$ db2 restore db DB명> taken at 백업시간소인>

list history 명령어로 해당 버전 복구와 연관된 기록을 확인합니다.


$ db2 list history backup for DB명>
경로 재지정 복구

백업 이미지 파일에는 테이블스페이스의 컨테이너에 대한 정보가 함께 저장되어 있으므로 복구 가 시작되면, 백업 이미지 파일에 설정된 정보에 의해 테이블스페이스가 생성됩니다. 지정한 테 이블스페이스 컨테이너를 액세스할 수 없는 상태가 되면 복구 작업은 진행될 수 없습니다. RESTORE DB 명령어의 REDIRECT 옵션과 SET TABLESPACE CONTAINERS 문을 이 용하여 액세스 불가능한 컨테이너에 대한 경로를 재지정하면 새로운 컨테이너로 복구됩니다.

백업 이미지는 기본적으로 기존의 데이터베이스를 복구할 때 사용됩니다. 백업 이미지에는 데이 터베이스에 대한 모든 정보가 저장되어 있으므로 새로운 데이터베이스로 복구하는 것도 가능합 니다. 동일한 데이터베이스 서버에서 새로운 데이터베이스로 복구하게 되면, 테이블스페이스의 컨테이너가 중복되므로 경로 재지정 복구 방법이 사용됩니다.

RESTORE DB 명령어에서 REDIRECT 옵션을 사용하면 경로 재지정 복구를 지정됩니다.


$ RESTORE DB 백업이미지의 DB명> INTO 새로운 DB명> REDIRECT

SET TABLESPACE CONTAINERS 명령어에서 컨테이너에 대한 경로를 재지정합니다. FOR 옵션에서 사용되는 번호는 테이블테이너 를 제거 또는 변경할 수 있으며, 새로운 컨테이너를 추가할 수도 있습니다.

db2


$ SET TABLESPACE CONTAINERS FOR 0 USING (FILE "파일명>" 크기>)
$ SET TABLESPACE CONTAINERS FOR 1 USING (PATH "경로명>")

RESTORE DB 명령어에서 ABORT 옵션을 사용하면 경로 재지정 복구가 취소됩니다


$ RESTORE DB 백업이미지의 DB명> INTO 새로운 DB명> ABORT

RESTORE DB 명령어에서 CONTINUE 옵션을 사용하면 경로 재지정 복구가 시작됩니다


$ RESTORE DB 백업이미지의 DB명> INTO 새로운 DB명> CONTINUE

ROLLFORWARD DB 명령어로 아카이브 로그를 적용합니다.


$ ROLLFORWARD DB 새로운 DB명> TO END OF LOGS AND STOP
롤포워드 복구

데이터베이스가 손상된 경우에는 최근에 생성했던 FULL 백업 이미지 파일과 아카이브 로그가 있으면, restore db 명령어와 rollforward db 명령어로 데이터베이스를 원하는 시점으로 복구할 수 있습니다. 복구에 사용된 마지막 아카이브 로그에 저장된 트랜잭션 이후부터 현재까지 의 데이터베이스에 대한 변경 내용은 유실됩니다.

db2

최초의 rollforward db 명령어는 버전 복구를 완료된 이후에 시작할 수 있습니다.


$ db2 restore db DB명>
$ db2 rollforward db DB명> to end of logs

적용할 로그 파일의 크기가 크고, 개수가 많은 경우에는 로그 디렉토리에 로그 파일의 일부만 옮 겨 두고, 여러 번에 걸쳐 rollforward db 명령어를 실행합니다.


$ db2 rollforward db DB명> to end of logs

마지막 rollforward db 명령을 입력할 때, TO 옵션을 이용하여 원하는 시점까지의 복구가 가 능합니다. 시간소인>은 USING LOCAL TIME 옵션으로 지정합니다.


$ db2 rollforward db DB명> to 시간소인> using local time

STOP 옵션을 이용하면, 로그 재적용 작업은 중지되고, 마지막으로 적용된 로그 파일의 다음 번 호부터 데이터베이스 로깅이 다시 시작됩니다.


$ db2 rollforward db DB명> stop

list history 명령어로 해당 롤포워드 복구와 연관된 기록을 확인합니다


$ db2 list history rollforward for DB명>
INCREMENTAL 복구

restore db 명령어로 최근의 FULL 백업 이미지를 이용하여 버전 복구를 합니다. restore db 명령어로 FULL 백업 시점 이후의 INCREMENTAL 백업 이미지 중에서 최근 것으로 FULL 백업과 INCREMENTAL 백업 시점 구간에 있는 변경 내용을 복구합니다. 마지막으로 INCREMENTAL 백업 이후 시점부터 현재까지의 아카이브 로그를 차례로 적용하면 데이터베 이슨 손상 직전의 상태로 복구됩니다.

db2

최근의 FULL 백업 이미지 파일을 이용하여 restore database 명령으로 데이터베이스를 이 전 시점으로 버전 복구합니다.


$ db2 restore db DB명>

restore database 명령의 INCREMENTAL 옵션으로 최근의 INCREMENTAL 백업 이 미지 파일을 이용하여 FULL 백업 이후의 변경분을 복구합니다.


$ db2 restore db DB명> INCREMENTAL

rollforward db 명령으로 아카이브 로그 파일을 이용하여 최근의 INCREMENTAL 백업 이 미지 생성 시점 이후부터 원하는 시점까지의 변경분을 복구합니다.


$ db2 rollforward db DB명> to 시간소인> using local time and stop

list history 명령어로 해당 롤포워드 복구와 연관된 기록을 확인합니다.


$ db2 list history rollforward for DB명>
DELTA 복구

최근의 FULL 백업 이미지 파일, 최근의 INCREMENTAL 백업 이미지, 현 시점까지의 DELTA 백업 이미지 파일, 아카이브 로그 파일을 준비하고, restore db 명령어와 rollforward db 명령어를 실행합니다.

db2

최근의 FULL 백업 이미지 파일을 이용하여 Restore database 명령으로 데이터베이스를 과거의 시점으로 복구합니다.


$ db2 restore db DB명>

최근의 INCREMENTAL 백업 이미지 파일이 있다면 restore db 명령으로 FULL 백업 이후 의 변경분을 복구합니다. restore db 명령을 반복적으로 사용하여 최근까지의 DELTA 백업 이미지 파일들로부터 변경분을 복구합니다.


$ db2 restore db DB명> INCREMENTAL

데이터베이스 로그 파일을 이용하여 rollforward database 명령으로 최근의 DELTA 백업 이미지 생성 시점 이후의 변경분을 복구합니다.


$ db2 rollforward db DB명> to end of logs
$ db2 rollforward db DB명> to 시간소인> using local time and stop

list history 명령어로 해당 롤포워드 복구와 연관된 기록rollforward for DB명>


테이블스페이스의 상태

컨테이너에 문제가 발생한 테이블스페이스는 OFFLINE 상태가 되고, 사용할 수 없습니다.

db2

테이블 스페이스의 현재 상태를 확인합니다.


$ db2 "SELECT * FROM 테이블명>"
SQL0290N 테이블 스페이스 액세스가 허용되지 않습니다. SQLSTATE=55039
$ db2 list tablespaces | grep ?p ?i 테이블스페이스명>
테이블 스페이스 ID = 3
이름 = 테이블스페이스명>
유형 = 데이터베이스 관리 스페이스
내용 = 임의의 데이터
상태 = 0x4000
세부사항 설명:
오프라인
$ db2tbst 0x4000
State = Offline and not accessible

테이블스페이스 컨테이너의 문제점을 해결하고, alter tablespace 문을 이용하여 테이블스 페이스의 상태를 ON 으로 변환하고, 데이터를 정상적으로 액세스할 수 있습니다. 컨테이너의 문제점이 해결되지 않으면, SQL0293N 오류 코드와 함께 명령은 실패합니다.


$ db2 ALTER TABLESPACE 테이블스페이스명> SWITCH ONLINE

특정한 테이블스페이스 컨테이너에 문제점이 발생하여 데이터베이스가 활성화될 수 없다면, restart db 명령어를 이용하여 해당 테이블스페이스만 DROP PENDING 상태로 전환하고, 데이터베이스를 활성화할 수 있습니다.


$ db2 "RESTART DATABASE DB명> DROP PENDING (TS명>)"
$ db2 drop tablespace TS명>
테이블스페이스 복구

원하는 시점의 TABLESPACE 백업 이미지 파일과 아카이브 로그 파일을 준비하고, restore db 명령어와 rollforward db 명령어를 실행하면, 테이블스페이스를 복구할 수 있습니다.

db2

원하는 TABLESPACE 백업 이미지 파일을 이용하여 restore db 명령으로 데이터베이스의 특정 테이블스페이스를 과거 시점으로 복구합니다. restore db 명령어가 완료되면, 해당 테이 블스페이스가 '롤포워드 보류' 상태에 놓이게 됩니다.


$ db2 "restore db DB명> TABLESPACE (TS명>) ONLINE"
$ db2 connect to 데이터베이스명>
$ db2 "SELECT * FROM 테이블명>"
SQL0290N 테이블 스페이스 액세스가 허용되지 않습니다. SQLSTATE=55039
$ db2 list tablespaces | grep -p ?i 테이블스페이스명> | grep "상태"
상태 = 0x0080

rollforward db 명령어의 TO 옵션으로 해당 테이블스페이스와 다른 테이블스페이스의 일관 성을 보장할 수 있는 시점 이상의 로그 파일을 복구합니다.


$ db2 ROLLFORWARD DB DB명> TO END OF LOGS AND STOP
TABLESPACE (TS명>) ONLINE"

SQL4907W 데이터베이스 "데이터베이스명>"이(가) 복구되었으나, 롤 포워드 조작을
위해 포함된 테이블 스페이스 목록에서 하나 이상의 테이블이 점검 보류 상태에 있습니다.

복구된 테이블스페이스에 포함된 테이블의 데이터를 정상적으로 액세스할 수 있습니다


$ db2 "SELECT * FROM 테이블명>"