Oracle 44일차

[DB 장애별 복구 방법 정리 – archive log mode]

1. parameter file 유실

parameter file이 없어서 nomount부터가 안된다.

* 해결 방법
initdb2.ora를 백업이 있다면 가져오든가, 없으면 직접 쳐서 만들어서 DB 기동하면 됨.

2. controlfile 장애

parameter file에 기록된 controlfile이 실제로 존재해야 mount 단계로 갈 수 있음.

case 1) 하나만 정상, 나머지 파일이 존재하지 않을 경우 :
정상인 파일을 cp하여 생성

case 2) 둘 다 존재, 버전이 다른 경우 :
최신 파일을 cp하여 두 파일의 버전이 일치하도록 만듦

case 3) 둘 다 없는 경우 :
controlfile 재생성 script 사용
– 1) noresetlogs : current redo 정상인 경우
– 2) resetlogs : current redo 비정상인 경우

3. redo log file 장애 (drop -> clear -> recover)

controlfile에 있는 정보대로 redo log file이 실제로 존재해야(+datafile도 정상이어야) open 단계로 갈 수 있음. -> v$log, v$logfile 뷰를 통해 확인 가능 (mount 단계 이상에서 조회 가능)

case 1) 멤버 하나만 손상, 다른 멤버는 정상, DB open :
문제있는 redo log 멤버를 삭제 후 재생성 (필요 시 log switch 수행 – current redo group의 member는 삭제가 안 돼서)

case 2) 특정 그룹 하나 손상, DB open :
log clear 수행 (필요 시 log switch 수행 – current, active group은 clear 불가해서)

case 3) 전체 redo log 손상, DB open :
log clear 수행

case 4) 전체 redo log 손상, DB shutdown abort :
redo가 없으니 mount 단계까지 밖에 못 올라오는데 mount에서는 log switch 불가, current redo group은 drop, clear가 불가. -> recover (불완전 복구) 수행 -> resetlogs로 DB open.

4. datafile 장애

controlfile에 있는 정보대로 datafile이 실제로 존재해야(+redo log file도 정상이어야) open 단계로 갈 수 있음.

case 1) 불필요한 datafile의 경우 offline 후 DB open

case 2) 중요 데이터가 저장된 datafile의 손상의 경우 recover 진행 (완전 복구 가능)
최근 datafile 백업본 restore -> mount -> recover database -> DB open

[copy DB]

copy DB 구축을 위해 필요한 파일

1. parameter file 전달
2. datafile restore
3. archive file restore
4. controlfile 재생성 script 전달

copy DB 구축 절차

1. parameter file 변경
– controlfile 위치 변경.

2. startup nomount

3. controlfile 재생성 – resetlogs mode 부분
– datafile, redo log file 위치 변경.

4. recovery until time
– archive 적용을 통해 원하는 시점(장애 발생 이전)으로 복구.

5. DB open

6. 운영 중인 DB에 장애 발생한 데이터 전송

[논리 장애를 copy DB 통해 복구하기]

운영 중인 DB에서 논리 장애가 발생하여 DB 전체를 장애 발생 이전 시점으로 돌리기 위해서는 반드시 shutdown이 필요. 하지만 운영 중인 DB를 내릴 수 없는 상황이라면 운영 중인 DB와 동일한 copy DB를 구축 후 copy DB에서 데이터 복구 후 운영 중인 DB에 데이터를 전송하여 복구를 진행한다.

[사전 준비 – 운영 중인 DB에서 할 일]

1. 최신의 initSID.ora 생성

> create pfile from spfile;

2. controlfile 재생성 스크립트 생성

> alter database backup controlfile to trace as '/oracle12/backup/control.sql';

3. log switch 여러 번 (선택)

[실습 – 사전 준비]

1. DB shutdown immediate
2. archive file 모두 삭제
3. offline full backup
4. DB open
5. log switch 5번 이상

[장애 발생]

1. 시점 확인

select sysdate from dual;  -- 2024/12/12 11:17:12

2. 장애 발생 (truncate)

select * from scott.delivery;
truncate table scott.delivery;

-- 변경된 내용이 archive로 가도록 만들기 위해 log switch 5번 진행
alter system switch logfile;

3. DB shutdown immediates

원래는 DB 운영 중인 상태에서 해야되는데 VMWare랑 PC상황 때문에 DB 2개 돌리는 게 안됨. 따라서 여기서는 내리고 copy DB 올리지만 안 내렸다고 생각해야됨.

[복구]

1. 복구 영역 설정 (data 위치)

mkdir -p /oracle12/recover

2. datafile만 복구 영역에 restore

cp /oracle12/backup/cold_backup/*.dbf /oracle12/recover

3. init parameter 수정

export ORACLE_SID=copydb

cd $ORACLE_HOME/dbs
cp initdb1.ora initcopydb.ora

vi initcopydb.ora
---- 수정 ----
*.audit_file_dest='/oracle12/recover/adump'  # modified
*.audit_trail='db'
*.compatible='12.2.0'
*.control_files='/oracle12/recover/control01.ctl'  # modified
*.db_block_size=8192
*.db_name='db1'
*.db_recovery_file_dest='/arch'  # not now
*.db_recovery_file_dest_size=5368709120
*.diagnostic_dest='/oracle12/app/oracle'  # not now
*.dispatchers='(PROTOCOL=TCP) (SERVICE=db1XDB)'
*.local_listener='LISTENER_DB1'
*.log_archive_dest_1='location=/arch'  # not now
*.memory_target=1192m
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_retention=1800
*.undo_tablespace='UNDOTBS1'

mkdir -p /oracle12/recover/adump

4. instance 기동

echo $ORACLE_SID
cat $ORACLE_HOME/dbs/initcopydb.ora
sqlplus / as sysdba
> startup nomount

5. controlfile 재생성

cp /oracle12/backup/control.sql /oracle12/recover
cd /oracle12/recover

vi control.sql
-- resetlogs 부분만 남기고 나머지 지우기.
-- 그리고 DB file들 경로 수정.
CREATE CONTROLFILE REUSE DATABASE "DB1" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/oracle12/recover/redo01.log'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 2 (
    '/oracle12/recover/redo02.log'
  ) SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/oracle12/recover/system01.dbf',
  '/oracle12/recover/test01.dbf',
  '/oracle12/recover/sysaux01.dbf',
  '/oracle12/recover/undotbs01.dbf',
  '/oracle12/recover/users01.dbf'
CHARACTER SET KO16MSWIN949
;

> @control.sql

6. recover

> recover database until time '2024/12/12 11:17:12' using backup controlfile
-- enter or auto

7. db open

> alter database open resetlogs;

8. 데이터 조회

select * from scott.delivery;
-- 잘 복구된 듯?

[archive 조회]

불완전 복구 시 복구 시점과 마지막 백업본 시점 사이에 있는 archive가 필요.

1. 아카이브 현황 조회

동적뷰, 실시간 조회 가능, 오래된 내용 삭제

-- recover에 필요한 아카이브 파일만 조회하는 쿼리
select name,
       sequence#,
       resetlogs_id,
       first_change#,
       round(BLOCKS*BLOCK_SIZE/1024/1024,2) as "SIZE(MB)",
       first_time,
       COMPLETION_TIME
from v$archived_log
where COMPLETION_TIME between to_date('2024/12/12 11:13:00','YYYY/MM/DD HH24:MI:SS')
                      and to_date('2024/12/12 11:17:12', 'YYYY/MM/DD HH24:MI:SS')
   or first_time between to_date('2024/12/12 11:13:00','YYYY/MM/DD HH24:MI:SS')
                 and to_date('2024/12/12 11:17:12', 'YYYY/MM/DD HH24:MI:SS');
-- 최근 백업 시점 ~ 복구되기를 원하는 시점 사이의 archive file만 조회

[copy server 구축]

vmware player를 사용하여 여러 서버를 동시에 구동 가능.
oel7 서버를 사용하여 동일한 내용을 갖는 다른 이름의 서버를 구축 및 기동.

1. server shutdown

2. oel7를 복사 후 copy라는 이름으로 변경
cd C:\Users\itwill\Documents\Virtual Machines

3. 파일 이름 변경
copy디렉터리 안에 있는 이름들을 copy로 변경.
lck 디렉터리가 있다면 삭제

4. copy.vmf 파일 수정
ctrl+H 후 기존 이름을 copy로 모두 바꾸기 후 저장

5. ip 변경 (고정)
우측 상단에 소리왼쪽 네모3개있는거 클릭->톱니바퀴 클릭->IPv4->아이피 고정해주고(172.16.124.130) / 255.255.255.0 / 172.16.124.2 -> VMWare shutdown 후 재시작하면 ip고정됨.

6. hostname 변경
$ su – root
$ vi /etc/hosts
# ip, hostname 변경
$ vi /etc/hostname
# hostname 변경
$ reboot

7. oracle .bash_profile 수정
$ cd
$ vi .bash_profile
export ORACLE_HOSTNAME=copy
export ORACLE_SID=copydb
alias data=’cd /oracle12/recover’
$ . .bash_profile

8. network 설정 파일 수정
$ tns
$ vi tnsnames.ora
$ vi listener.ora

9. DB 기동

10. windows 쪽의 tnsnames.ora 수정

COPYDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.124.130)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db1)
    )
  )

11. 연결 확인

Leave a Comment