[오라클 DB백업과 복구]23.10.05_데이터복구

망구씨·2023년 10월 5일
0
post-thumbnail
post-custom-banner

컨트롤 파일이 깨졌을 때의 복구 방법 (p.16-8)

#1
alter tablespace ts01
  add datafile '/home/oracle/ts01/dbf' size 10m ;

#2
alter tablespace ts01
  add datafile ('/home/oracle/ts01/dbf', 
                '/home/oracle/ts01b/dbf')

💡 현업예서 컨트롤 파일이 깨졌던 사례 !
: 테이블 스페이스에 여러개의 data file을 한번에 add할 때 컨트롤 파일이 깨지는 일이 발생합니다. 위 #2번처럼..!

컨트롤 파일 백업

1. 사용자 관리 백업 : 컨트롤 파일 생성 스크립트 생성

SQL> alter database backup controlfile to trace
       as '/home/oracle/create_controlfile_20231005.sql';

2. RMAN 백업

RMAN> configure controlfile autobackup on; #아래꺼 하면 컨트롤파일 자동으로 백업할게
RMAN> backup datafile 1;
RMAN> backup current controlfile; #컨트롤파일만 따로 백업받는거

컨트롤 파일 복구

과정
1. 컨트롤 파일의 위치를 확인합니다.

SQL> select * from v$controlfile;
SQL> save c_file.sql
SQL> show parameter control_files;

+DATA/orcl/controlfile/current.260.796857737
+FRA/orcl/controlfile/current.256.1148659713
/home/oracle/control03.ctl
  1. db를 shutdown abort로 내린다.
  2. 컨트롤 파일 3개중, 한개를 깨트립니다.
[orcl:~]$ ls -l control*
-rw-r----- 1 oracle dba 9846784 10월  5 10:09 control03.ctl
-rw-r--r-- 1 oracle dba    6375  9월  7 09:59 controlfile_text.txt
[orcl:~]$ rm control03.ctl
  1. db를 startup으로 올린다.
ORACLE instance started.

Total System Global Area 1071333376 bytes
Fixed Size                  1341312 bytes
Variable Size             847251584 bytes
Database Buffers          218103808 bytes
Redo Buffers                4636672 bytes
ORA-00205: error in identifying control file, check alert log for more info

SYS @ orcl > @i

STATUS
------------
STARTED #nomount단계

  1. 컨트롤 파일을 복구 (1.사용자관리 복구 / 2.RMAN 복구)
    5-1. 사용자 관리 복구
1. 아까 만든 create_controlfile_20231005.sql을 열고 
2. NORESETLOGS case를 따로 콜론누르고 51,128 w c8.sql 해서 저장한다.
3. SYS에서 @c8.sql 돌린다.

5-2. RMAN 복구

RMAN> restore controlfile from
       '+DATA/orcl/controlfile/current.260.796857737';
SYS> alter database mount
SYS> alter database open #한단계씩 올라가기
  1. db를 올립니다.

✔️ 실습 하면서 참고할 것들

  • 스크립트에 주석이랑 줄 띄어져있는게 있는데 dd로 다 지우고 다 딱 붙였다.
  • MAXDATAFILES 가 100개로 되어있는데 2000개로늘리는것이 좋다.
  • Set #1. NORESETLOGS case: 앞으로 변경사항을 적을 리두로그 파일을 그다음 숫자로 이어서 적는다. (완전복구)
  • Set #2. RESETLOGS case : 앞으로 변경사항을 적을 리두로그파일을 다시 깨끗하게 비우고 1번부터 새롭게 쓰겠다. (불완전복구)
  • : set nu : 앞에 숫자 붙이기 !

리두 로그 파일 손실시 복구 방법(p.16-9)

💡 복구 방법 정리
1. 리두 로그 그룹의 멤버가 여러개이고, 여러개중에 1개만 깨졌을때?
(초급반)

정상적으로 db가 운영된다. 그리고 alert log에는 계속 메세지가 나온다. 
내용은 멤버 하나가 없으니 복구해야한다는 메세지 이고 다른 정상적인 멤버로 복구를 하면 된다. 

2. 리두 로그 그룹의 멤버가 모두 깨졌을 때?

  • 깨진 그룹의 상태가 inactive 면? 그 그룹을 drop 시키면 된다. (얘도 쉽다.. 초급반)
  • 깨진 그룹의 상태가 active나 current면? 불완전 복구 (어렵다. 고급!!)

리두로그 파일 복구 실습

1. 리두 로그 그룹의 멤버가 여러개이고, 여러개중에 1개만 깨졌을때?

1. 현재 리두 로그 그룹의 상태를 확인

SQL> select group#, members, status from v$log;
    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          2 INACTIVE #다 썼고 버퍼 캐쉬의 변경사항이 datafile에 다 반영된 상태
         2          2 INACTIVE
         3          2 INACTIVE
         4          2 INACTIVE
         5          2 INACTIVE
         6          2 CURRENT #현재 lgwr가 쓰고 있는 상태
                      ACTIVE #다 썼고 버퍼캐쉬의 변경사항이 datafile에 다 반영된 상태
SQL> save log.sql
SQL> @log.sql
SQL> alter system checkpoint; #dbwr 작동시켜서 ACTIVE를 INACTIVE로 바꾸는것
SQL> select group#, member from v$logfile;
SQL> save logf.sql
SQL> ed logf.sql

    GROUP# MEMBER
---------- ---------------------------------------------
         1 +FRA/orcl/onlinelog/group_1.257.796857749
         1 +DATA/orcl/onlinelog/group_1.261.796857743
         2 +DATA/orcl/onlinelog/group_2.262.796857753
         2 +FRA/orcl/onlinelog/group_2.258.796857757
         3 +DATA/orcl/onlinelog/group_3.263.796857759
         3 +FRA/orcl/onlinelog/group_3.259.796857763
         4 +DATA/orcl/onlinelog/group_4.271.1146924991
         4 +FRA/orcl/onlinelog/group_4.264.1146924997
         5 +DATA/orcl/onlinelog/group_5.272.1146925419
         5 +FRA/orcl/onlinelog/group_5.265.1146925423
         6 +DATA/orcl/onlinelog/group_6.275.1148660837

    GROUP# MEMBER
---------- ---------------------------------------------
         6 +FRA/orcl/onlinelog/group_6.330.1148660945

2. ASM에서 1번 깨트릴것임 멤버 누군지 확인하기

1 +FRA/orcl/onlinelog/group_1.257.796857749
1 +DATA/orcl/onlinelog/group_1.261.796857743

SQL> shutdown abort
ASMCMD> 리두 로그 그룹 1번의 멤버 1개를 삭제하기
ASMCMD> pwd
+data/orcl/onlinelog
ASMCMD> rm group_1.261.796857743
ASMCMD> ls
group_2.262.796857753
group_3.263.796857759
group_4.271.1146924991
group_5.272.1146925419
group_6.275.1148660837

3. 디비 올려보기(정상적으로 올라온다)


4. 아직 1번 그룹이 있다고 나오는데 alter system switch logfile; 로 로그스위치를 일으키다 보면 alert log file에 없다고 메세지 나올것이다.
로그 스위치는 원래 자동인데 우리는 빨리 메세지 보려고 수동으로 일으킴
ORA-15012: ASM file '+DATA/orcl/onlinelog/group_1.261.796857743' does not exist

5. 위 메세지를 봤다면, 복구하자!
깨진 멤버를 같은 그룹의 다른 리두 로그 멤버로 복구 합니다.
db내릴 필요 없이 그냥 새로운 멤버를 그룹1에 추가하고, 기존꺼 삭제!

1 +FRA/orcl/onlinelog/group_1.257.796857749
1 +DATA/orcl/onlinelog/group_1.261.796857743 #지금 얘가없음
SQL> alter system switch logfile;
SQL> alter system checkpoint; #이 두개로 지금 내가 지운게 active라면 inactive로 변경

#새로운 멤버를 그룹1에 추가합니다.
SQL> alter database add logfile member '+data' to group 1;
#기존에 없어진 멤버를 삭제합니다.(컨트롤 파일에서 지움)
SQL> alter database drop logfile member '+DATA/orcl/onlinelog/group_1.261.796857743';
SYS> alter system switch logfile;

✅ ACTIVE 는 dbwr가 아직 작동 전이라서 메모리에 반영되었지만 디스크에 반영 안된상태 에서
lgwr가 디스크에 다 내린건 active인데(현재 쓰고있는건 current) 체크포인트가 일어나서 dbwr가 디스크에 3000->0 으로 반영하면 active가 inactive로 바뀐다.

2. inactive 리두 로그 그룹의 멤버를 모두 삭제하고 복구하기!

  1. inactive가 누군지 확인
SQL> @log
SQL> @logf

    GROUP# MEMBER
---------- ---------------------------------------------
         1 +FRA/orcl/onlinelog/group_1.257.796857749
         1 +DATA/orcl/onlinelog/group_1.261.1149421679

SQL> shutdown abort
  1. 모두 삭제
rm group_1.261.1149421679
cd +fra/orcl/onlinelog
rm group_1.257.796857749

ASMCMD> pwd
+data/orcl/onlinelog
ASMCMD> rm group_1.261.1149421679
ASMCMD> ls
group_2.262.796857753
group_3.263.796857759
group_4.271.1146924991
group_5.272.1146925419
group_6.275.1148660837
ASMCMD> cd +fra/orcl/onlinelog
ASMCMD> ls
group_1.257.796857749
group_2.258.796857757
group_3.259.796857763
group_4.264.1146924997
group_5.265.1146925423
group_6.330.1148660945
ASMCMD> rm group_1.257.796857749

SQL> startup 
#올라오다가 mount에서 멈추면서 다시 db가 shutdown 되어버린다.
SQL> startup mount
SQL>@i

STATUS
------------
MOUNTED
SYS @ orcl > @log

    GROUP#    MEMBERS STATUS            SEQUENCE#
---------- ---------- ---------------- ----------
         1          2 INACTIVE                146 -- 문제가 된 로그그룹이 INACTIVE 확인
         2          2 INACTIVE                147
         6          2 INACTIVE                148
         4          2 INACTIVE                144
         5          2 INACTIVE                145
         3          2 CURRENT                 149
        
SQL> alter database drop logfile group 1;        
SQL> alter database open;
SQL> alter database add logfile group 1;
SYS @ orcl > @log

    GROUP#    MEMBERS STATUS            SEQUENCE#
---------- ---------- ---------------- ----------
         1          2 UNUSED                    0
         2          2 INACTIVE                147
         3          2 INACTIVE                149
         4          2 CURRENT                 150
         5          2 INACTIVE                145
         6          2 INACTIVE                148
SQL> alter system switch logfile;
SQL> alter system checkpoint;        

점심시간 문제 리두로그 그룹의 마지막 그룹인 6번을 삭제하시오!
상태가 current나 active가 아니어야 삭제된다! 로그스위치를 수동으로 일으키고 inactive로 만들고 삭제하기!

SQL> alter system switch logfile;
SQL> alter system checkpoint;   
SQL> alter database drop logfile group 6;
    GROUP# MEMBER
---------- ---------------------------------------------
         1 /home/oracle/arch/ORCL/onlinelog/o1_mf_1_lkw9
           tgov_.log

         1 +DATA/orcl/onlinelog/group_1.261.1149422555
         2 +DATA/orcl/onlinelog/group_2.262.796857753
         2 +FRA/orcl/onlinelog/group_2.258.796857757
         3 +DATA/orcl/onlinelog/group_3.263.796857759
         3 +FRA/orcl/onlinelog/group_3.259.796857763
         4 +DATA/orcl/onlinelog/group_4.271.1146924991
         4 +FRA/orcl/onlinelog/group_4.264.1146924997
         5 +DATA/orcl/onlinelog/group_5.272.1146925419

    GROUP# MEMBER
---------- ---------------------------------------------
         5 +FRA/orcl/onlinelog/group_5.265.1146925423
         6 +DATA/orcl/onlinelog/group_6.275.1148660837
         6 +FRA/orcl/onlinelog/group_6.330.1148660945

NOARCHIVELOG 모드에서의 데이터 파일 손실

✔️ 완전 복구(archivelog 모드)

□ data file , ■ control file, ▩ redo log file

□                  □                                □
□                  □                                □
□                  □    ------------------------->  □ -- 얘 깨졌다고 가정 
■                  ■                                ■
■                  ■                                ■
■                  ■                                ■
▩                 ▩                               ▩ 
▩                 ▩                               ▩ 
▩                 ▩    △△△△△△△△△△△△△△△  ▩ 

whole backup       월     화     수     목     금     토

✅ 월요일에 whole backup 해놓은 상태, 토요일에 데이터 파일 하나가 깨졌다고 가정하면 월요일에서 그 파일을 가져온다. 그럼 다른 데이터들과 데이터 내용이 다르므로 (△는 아카이브 로그 파일) 아카이브 로그 파일을 적용해서 토요일 내용으로 다 똑같이 맞추어준다.

❗❗❗ 그런데 NOARCHIVELOG 라면, 아카이브 로그 파일이 없으므로, 깨진거는 월요일 데이터, 다른거는 토요일 데이터이다. 다른(월)데이터를 포기하면 되지만 포기할 수 없다면 월요일 데이터를 다시 다 가져와야한다. 그리고 그 사이 백업 이후에 발생한 변경 사항들은 사람이 직접 손으로 모두 입력해야한다.
노아카이브 모드에서의 복구는 whole 백업 받았던 시점으로 db 전체를 복원하는 방법이 복구이다.
그래서 아카이브 모드로 db를 운영해야한다!!

Noncritical 데이터 파일 손실시 복구방법 (p.16-12)

💡 Critical한 데이터 파일이란? system tablespaceundo tablespace의 파일들을 말하고, 나머지는 모두 Noncrit
ical한 데이터 파일이다. Noncritical한 파일들은 db를 내리지 않고 복구할 수 있다.
(어제는 Noncritical한 파일들을 복구하는 것을 배웠는데 ASM때문에 디비를 내렸었다.)

실습
1. ts700 테이블 스페이스를 사이즈 20m로 생성하기

drop tablespace ts700 including contents and datafiles;
SQL> create tablespace ts700
       datafile '/home/oracle/ts700.dbf' size 20m;
  1. ts700 테이블 스페이스에 emp700 테이블을 생성하기
SCOTT> create table emp700
        (empno number(10),
         ename varchar2(10) )
         tablespace ts700;
SCOTT> insert into emp700 values(1111,'aaaa');         
SCOTT> insert into emp700 values(2222,'bbbb'); 
SCOTT> commit;

3. 알맨으로 ts700 테이블 스페이스를 백업받는다.

RMAN> backup tablespace ts700;

4. os에서 ts700.dbf를 삭제한다.

[orcl:~]$ rm ts700.dbf
[orcl:~]$ ls -l ts700.dbf
ls: ts700.dbf: 그런 파일이나 디렉토리가 없음 

5. emp700 table이 조회가 되는지 확인해보기(처음에는 조회 되는데, 버퍼캐시에 메모리 올라가있어서 그렇다. 이걸 없애주면 조회 안됨!)

SCOTT> alter system flush buffer_cache;
SCOTT @ orcl > select * from emp700;
select * from emp700
*
ERROR at line 1:
ORA-01116: error in opening database file 10
ORA-01110: data file 10: '/home/oracle/ts700.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

✅ 위 상태에서 다른 테이블들은 조회가 된다. 근데 디비를 내리면 조회되는 테이블들도 안
6. 알맨으로 ts700 테이블 스페이스를 복구한다. (offline으로 변경한 후 진행해야 한다.)

SQL> alter tablespace ts700 offline immediate;
# 만약 immediate를 붙히지 않고 offline시키면 ts700 tablespace에 대해 체크포인트를 
# 일으키고 offline시킨다. 그런데 지금 ts700.dbf가 깨졌기 때문에 체크포인트를 일으켜도 
# 내려쓸 수 없는 상태이므로 immediate를 안붙이면 에러나면서 offline이 안됩니다. 

RMAN> restore tablespace ts700;
RMAN> recover tablespace ts700;
SYS @ orcl > alter tablespace ts700 online;

7. emp700 table이 조회되는지 확인한다. (scott접속)

SCOTT @ orcl > select * from emp700;

     EMPNO ENAME
---------- ----------
      1111 aaaa
      2222 bbbb

관련문제1. ts800 테이블 스페이스를 사이즈 30m로 생성하고, ts800 테이블 스페이스에 dept테이블과 똑같은 테이블과 데이터로 dept800을 생성하고, ts800 테이블을 백업하기

  1. tablespace ts800 만들기
SQL> create tablespace ts800
       datafile '/home/oracle/ts800.dbf' size 30m;
  1. dept800 생성하기
SCOTT> create table dept800 
       tablespace ts800
       as
        select * from dept;
  1. 알맨으로 백업받기
RMAN> backup tablespace ts800;

관련문제2. os에서 ts800.dbf를 삭제하고 복구하기!

1. ts800삭제

[orcl:~]$ ls -l ts800*
-rw-r----- 1 oracle dba 31465472 10월  5 14:25 ts800.dbf
[orcl:~]$ rm ts800.dbf
[orcl:~]$ ls -l ts800*
ls: ts800*: 그런 파일이나 디렉토리가 없음

2. 조회 되는지 확인

SCOTT @ orcl> alter system flush buffer_cache;
SCOTT @ orcl > select * from dept800;
select * from dept800
*
ERROR at line 1:
ORA-01116: error in opening database file 11
ORA-01110: data file 11: '/home/oracle/ts800.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

3. 복구하기

SYS @ orcl > alter tablespace ts800 offline immediate;
RMAN> restore tablespace ts800;
RMAN> recover tablespace ts800;
SYS @ orcl > alter tablespace ts800 online;

SCOTT @ orcl > select * from dept800;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
profile
Slow and steady wins the race.
post-custom-banner

0개의 댓글