완전한 데이터 복구는 DBA 생명입니다.
No. 12077
PURPOSE
-------
사용자의 실수로 중요한 데이타를 delete 하였거나, 테이블을 drop하였을
경우 복구하는 절차를 정리한 자료이다.
Explanation
-----------
사용 중인 database 의 archive log mode 여부를 다음과 같이 확인 후
archive log mode인지 아닌지에 따라 복구 방법이 달라진다.
os>svrmgrl
SVRMGR> connect internal;
SVRMGR> archive log list
Database log mode ARCHIVELOG
Automatic archival ENABLED
Archive destination ?/dbs/arch
Oldest online log sequence 2525
Current log sequence 2527
1. Archive mode인 경우 복구 방법
archive log mode로 운영중이면서 full backup및 archive file들이 모두
존재하는 경우 복구가 항상 가능하다.
이때 다시 다음과 같이 두가지의 경우를 구분하여 복구 작업을 수행할 필요가
있으며 아래에 각각의 경우에 대한 절차를 자세히 설명한다.
(1) drop이나 delete한 시점이 얼마 지나지 않았거나, 혹은 필요에 의해
database 전체를 data 손실 이전 시점으로 돌리고자 하는 경우
(2) 손실된 data만을 drop이나 delete이전 상태를 받아내고, 나머지 data는
모두 drop/delete이후 발생한 transaction의 반영분을 유지시키기 위해
현재 시점으로 맞추어햐 하는 경우
1-1 database 전체를 drop이나 delete 이전시점으로 돌리고자 할 때
이러한 경우는 데이타 손실이 발생하기 이전의 datafile들에 대한 backup을
restore한 후 손실 발생 시점 직전까지 time based로 imcomplete recovery를
수행하면 된다.
(1) db를 shutdown시킨 후 현재 상태를 만약의 경우를 대비하여 cold
backup을 받아둔다.
shutdown immediate로 db를 내리고, datafiles, redo log files, control
files 모두 tar등의 명령어를 이용하여 backup을 받아둔다.
이것은 만약의 경우 이전 backup이나 archive file에 문제가 있는 경우,
삭제된 data의 복구가 불가능할 경우 현재 상태로라도 돌리기 위한
것이다.
(2) 데이타를 삭제하기 이전 상태에서 받아둔 datafile full backup을
restore한다.
redo log files과 controlfiles은 현재 것을 그대로 이용하고, 현재
상태의 모든 datafiles을 지우고 데이타가 삭제되기 전에 받아둔
backup datafile을 restore시킨다.
(temp datafile의 경우는 restore시간을 줄이기 위해 restore하지
않아도된다.)
(3) restore한 backup시점 이후의 archive file들을 archive log
destination에 위치시킨다.
full backup 이후의 archive file들을 일부 tape 장비등에 backup을
받아두고 지운 상태라면 그러한 file을을 다시 원래 위치에 restore
하여, full backup받은 시점부터 복구하고자 하는 시점까지의
archive log file들이 모두 log archive destination에 존재하는지
확인한다.
(4) 데이타 삭제 이전 시점까지 time based로 recover를 수행한다.
이때 날짜와 시간 지정은 항상 아래 예와 같은 형식으로 지정한다.
만약 데이타를 삭제한 시간이후로 지정하게 되면 recovery후에도
여전히 data는 지워진 상태로 보여진다.
os>svrmgrl
SVRMGR> connect internal
SVRMGR> startup mount;
SVRMGR> set autorecovery on
SVRMGR> recover database until time '2001-01-30:21:00:00';
SVRMGR> alter database open resetlogs;
(a) 만약 이때, controlfile이 현재것이 존재하지 않아 datafile뿐
아니라, controlfile도 과거것을 사용했다면, recovery command를
다음과 같이 지정하면 된다.
recover database using backup controlfile (아래줄과 이어짐)
until time '2001-01-30:21:00:00';
(b) temp datafile을 restore하지 않은 경우라면 startup mount수행
직후 다음과 같은 문장을 추가하면 된다.
alter databse datafile '/oracle/oradata/temp01.dbf'
offline drop;
/oracle/oradata/temp01.dbf는 temp datafile의 이름을 예로 든
것이다.
(5) 원하는 data가 제대로 조회되는지 확인한다.
1-2. 삭제된 data만을 복구하고 나머지는 현재 상태를 유지하고자 하는 경우
이러한 경우는 데이타가 삭제되기 이전 상태의 backup datafile 중에
SYSTEM, RBS와 삭제된 data가 들어있는 datafile만을 restore시켜 time
based로 recovery하여 db를 open시킨 후 원하는 table만 export를 받아낸다.
그리고 다시 현재 상태의 db에 export받은 내용을 import시키는 것이다.
이때 삭제된 data를 export받기까지의 절차에 대해서 다음과 같이 세가지
경우의 방법을 생각할 수 있다.
(a) 다른 시스템에 backup이나 test용으로 oracle이 설치되어 있는 경우
그 시스템에 backup을 restore하여 해당 table을 export 받는 방법
(b) 같은 시스템에 backup을 restore 하되, db name과 oracle_sid를 다른
이름으로 변경하여 다른 db를 만들어 recovery후 open하여 export받는
방법 <Bulletin:11616 참조>
(c) 현재 db는 cold backup받아 두고, backup을 restore하여 export을
받아내는 방법
여기에서 (a)의 경우는 다른 시스템에 이용하고자 하는 datafile의 oracle
version 이상의 oracle software가 이미 설치되어 있어야 한다.
(b)의 경우는 현재 상태의 cold backup을 받았다가 export받은 후 다시
현재 상태를 restore할 필요는 없애주지만, 대신 SYSTEM, RBS, user
datafile 만큼의 disk space가 추가로 필요하며, 새로운 db를 추가로
구성하는 것이므로 init.ora file 구성 등의 작업이 필요하다.
이것에 관한 자세한 절차는 <Bulletin:11616>을 참조하도록 한다.
이 자료에서는 이중 (c)에 대한 것만을 자세히 설명한다.
(1) 현재의 모든 datafiles과 redo log files, control files을 다음과 같이
신중히 cold backup을 받아두도록 한다.
이것은 이후에 삭제한 data를 복구하여 export를 받은 후에 다시 현재
상태의 db로 되돌아오기 위한 것이다.
단 이 때 tar 등을 이용하여 cold backup하는 대신에 disk 상에 cold
backup을 받아 시간을 절약할 수 있다. disk로의 backup이 가능한
이유는 export를 위한 time based recovery를 수행하기 위해 필요한
datafile이 SYSTEM, RBS, 삭제된 data를 포함한 user datafile
정도이기 때문이다.
os>svrmgrl
SVRMGR> connect internal
SVRMGR> shutdown immediate;
SVRMGR> exit
os>cp /oracle/oradata/*.ctl /oracle/backup/*.ctl
os>cp /oracle/oradata/redo*.log /oracle/backup/redo*.log
os>mv /oracle/oradata/system01.dbf /oracle/backup/system01.bak
os>mv /oracle/oradata/rbs01.dbf /oracle/backup/rbs01.bak
os>mv /oracle/oradata/tools01.dbf /oracle/backup/tools01.bak
...
redo log file이나 controlfile의 경우는 time based recovery시에도
필요하므로 cp를 받아두고, datafile의 경우는 mv를 이용하도록 한다.
위의 예에 제시된 file이름들은 해당 환경에 맞게 변경되어야 하며,
tar를 이용하여 tape에 옮겨도 관계는 없으나, 단 cold backup에
해당하는 모든 datafiles, redo log files, control files를 받아두어야
한다.
(2) 삭제한 data가 존재할 당시에 받아둔 backup에서 SYSTEM datafile, RBS
datafile, 그리고 삭제한 table이 들어있는 datafile만을 restore한다.
redo log files과 controlfiles은 현재 것을 그대로 이용한다.
(3) restore한 backup시점 이후의 archive file들을 archive log
destination에 위치시킨다.
full backup 이후의 archive file들을 일부 tape 장비 등에 backup을
받아두고 지운 상태라면 그러한 file을을 다시 원래 위치에 restore
하여, full backup받은 시점부터 복구하고자 하는 시점까지의
archive log file들이 모두 log archive destination에 존재하는지
확인한다.
(4) restore하지 않을 datafile, 즉 SYSTEM, RBS, 삭제된 data를 포함하
는 user datafile을 제외한 모든 datafile은 모두 offline drop시키
고, 데이타 삭제 이전 시점까지 time based로 recover를 수행한다.
이때 날짜와 시간 지정은 항상 아래 예와 같은 형식으로 지정한다.
만약 데이타를 삭제한 시간이후로 지정하게 되면 recovery후에도
여전히 data는 지워진 상태로 보여진다.
os>svrmgrl
SVRMGR> connect internal
SVRMGR> startup mount;
SVRMGR> alter database datafile '/oracle/oradata/temp01.dbf'
offline drop; (윗줄과 이어짐)
SVRMGR> alter database datafile '/oracle/oradata/userdata05.dbf'
offline drop; (윗줄과 이어짐)
... 이와 같이 resotre하지 않은 datafile을 모두 offline drop시킨다.
SVRMGR> set autorecovery on
SVRMGR> recover database until time '2001-01-30:21:00:00';
SVRMGR> alter database open resetlogs;
만약 이때, controlfile이 현재것이 존재하지 않아 datafile뿐 아니라,
controlfile도 과거것을 사용했다면, recovery command를 다음과 같이
지정하면 된다.
SVRMGR>recover database using backup controlfile until time
'2001-01-30:21:00:00'; (윗줄과 이어짐)
(5) 원하는 data가 제대로 조회되는지 확인한 후 필요한 table을 export한다.
예를 들어 scott user의 dept table을 복구하고자 한것이었다면 다음과
같이 export를 받는다.
os>exp scott/tiger file=dept.dmp tables=dept log=deptlog1
(6) time based로 recovery후 open한 db는 shutdown하여 없애고 (1)번에서
받아둔 현재 상태의 backup을 restore한다.
shutdown은 immediate나 abort 모두 가능하며, shutdown후 restore한
SYSTEM, RBS, user datafile모두 삭제하고, 사용하던 controlfiles,
redo log files도 모두 삭제한다.
그리고 (1)에서 mv나 cp로 (혹은 tar로) 옮겨놓은 모든 datafiles,
controlfiles, redo log files를 원래의 directory와 이름으로
위치시킨다. SYSTEM, RBS, user datafile도 반드시 (1)번 상태의
현재 상태 backup을 restore하여야 한다.
(7) db를 startup시킨 후 (5)에서 받은 export내용을 import시킨다.
os>imp scott/tiger file=dept.dmp tables=dept ignore=y commit=y
log=deptlog2 (윗줄과 이어짐)
(8) 원하는 data가 제대로 조회되는지 확인한다.
2. No archive mode 로 운영할 경우 복구 방법
archive mode 로 운영하지 않았을 경우에는, 삭제한 data를 export 받아
두었거나, 혹은 data가 삭제 전 받아둔 cold backup이 존재하는 경우
복구가 가능하다.
(1) export가 존재하는 경우
다음과 같이 import한다. scott user의 dept가 삭제된 경우를 예로 들었다.
os>imp scott/tiger file=dept.dmp tables=dept ignore=y commit=y log=log1
(2) cold backup이 존재하는 경우
다른 시스템에 사용가능한 oracle engine이 설치되어 있다면, 그곳을
이용하거나, 혹은 현재 database를 backup받아둔후 현재 시스템에
restore하여 export를 받아낼 수 있다.
(1) 현재의 모든 datafiles과 redo log files, datafiles을 다음과 같이
신중히 cold backup을 받아두도록 한다.
이것은 이후에 삭제한 data를 복구하여 export를 받은 후에 다시 현재
상태의 db로 되돌아오기 위한 것이다.
단 이 때 tar 등을 이용하여 cold backup하는 대신에 disk 상에 cold
backup을 받아 시간을 절약할 수 있다. disk로의 backup이 가능한
이유는 export를 위한 time based recovery를 수행하기 위해 필요한
datafile이 SYSTEM, RBS, 삭제된 data를 포함한 user datafile
정도이기 때문이다.
os>svrmgrl
SVRMGR> connect internal
SVRMGR> shutdown immediate;
SVRMGR> exit
os>mv /oracle/oradata/*.ctl /oracle/backup/*.ctl
os>mv /oracle/oradata/redo*.log /oracle/backup/redo*.log
os>mv /oracle/oradata/system01.dbf /oracle/backup/system01.bak
os>mv /oracle/oradata/rbs01.dbf /oracle/backup/rbs01.bak
os>mv /oracle/oradata/tools01.dbf /oracle/backup/tools01.bak
...
위의 예에 제시된 file이름들은 해당 환경에 맞게 변경되어야 하며,
tar를 이용하여 tape에 옮겨도 관계는 없으나, 단 cold backup에
해당하는 모든 datafiles, redo log files, control files를 받아두어야
한다.
(2) 삭제한 data가 존재할 당시에 받아둔 backup에서 SYSTEM datafile,
RBS datafile, 그리고 삭제한 table이 들어있는 datafile만을
restore한다.
backup당시의 redo log files과 controlfiles도 restore하여야 한다.
(3) restore하지 datafile, 즉 SYSTEM, RBS, 삭제된 data를 포함하는 user
datafile을 제외한 모든 datafile은 모두 offline drop시키고,
database를 open시킨다.
os>svrmgrl
SVRMGR> connect internal
SVRMGR> startup mount;
SVRMGR> alter database datafile '/oracle/oradata/temp01.dbf'
offline drop; (윗줄과 이어짐)
SVRMGR> alter database datafile '/oracle/oradata/userdata05.dbf'
offline drop; (윗줄과 이어짐)
... 이와 같이 resotre하지 않은 datafile을 모두 offline drop시킨다.
SVRMGR> alter database open;
(4) 원하는 data가 제대로 조회되는지 확인한 후 필요한 table을 export
한다.
예를 들어 scott user의 dept table을 복구하고자 한 것이었다면
다음과 같이 export를 받는다.
os>exp scott/tiger file=dept.dmp tables=dept log=deptlog1
(5) exprot받아낸 database는 shutdown하여 없애고 (1)번에서 받아둔
현재 상태의 backup을 restore한다.
shutdown은 immediate나 abort 모두 가능하며, shutdown후 restore한
SYSTEM, RBS, user datafile모두 삭제하고, 사용하던 controlfiles,
redo log files도 모두 삭제한다.
그리고 (1)에서 mv나 tar로 옮겨놓은 모든 datafiles, controlfiles,
redo log files를 원래의 directory와 이름으로 위치시킨다.
(6) db를 startup시킨 후 (4)에서 받은 export내용을 import시킨다.
os>imp scott/tiger file=dept.dmp tables=dept ignore=y commit=y
log=deptlog2 (윗줄과 이어짐)
(7) 원하는 data가 제대로 조회되는지 확인한다.
|