DB 복구(Recovery)

DB 복구(Recovery)

  1. controlfile 손실 시 복구
  2. redologfile 손실 시 복구
  3. datafile 손실 시 복구




controlfile 손실 시 복구

  • Controlfile다중화 목적 : 최신 시점으로 복구하기
  • 다중화되어있는 컨트롤파일의 Member 중 하나라도 이상이 있으면 DB작동이 멈춘다.
  • 반드시 DB를 종료한 상태에서 남아 있는 Member를 사용해서 복원해야한다.
  • 절대 백업파일을 사용하지않는다.
    • 백업파일을 사용해서 백업하는 경우는 오로지 다중화된 controlfile의 Member 모두가 손실된 경우.

상황 : Controlfile이 다중화되어 있는데 특정 member가 손실된 경우 1. DB켜는 중 오류를 발견
1
2
3
s> startup 

//출력 => nomount는 되지만 mount시 오류발생
  1. DB종료
1
s> shut immediate
  1. 남아있는 member를 사용해서 손실된 member복구
    • 어떤 member가 손상되었는지 log정보 확인하거나 파일위치를 호가인하여 어떤 member가 손실되었는지 확인한다.
    • 파일이 있는데 손상되어있는 경우는 드물다.
    • 보통은 손실되는 경우가 많다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 손상되거나 손실된 컨트롤파일 찾기 => fast_recovery_area에 있는 컨트롤파일이 사라졌다.
SQL> show parameter control_files
SQL> !
[oracle@localhost ~]$ cd
[oracle@localhost ~]$ cd /u01/app/oracle/oradata/ORCL/controlfile/
[oracle@localhost controlfile]$ ls
o1_mf_fwvn95xm_.ctl
[oracle@localhost controlfile]$ cd
[oracle@localhost ~]$ cd /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile/
[oracle@localhost controlfile]$ ls
[oracle@localhost controlfile]$ cd /home/oracle/
[oracle@localhost ~]$ ls
200820quizMySol.sql checkTablespaceNname.sql consNcol.sql hr1.sql ingMe.sql new_dept.sql 공개 바탕화면 서식
afiedt.buf cons1.sql control103.ctl hr2.sql labs_12c ora12c 다운로드 비디오 음악
backup cons2.sql hr.sql hr3.sql load_emp.sql search_cons.sql 문서 사진
[oracle@localhost ~]$ ^C

// 컨트롤파일 복구
[oracle@localhost controlfile]$ cp o1_mf_fwvn95xm_.ctl /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile/o1_mf_fwvn96cd_.ctl

// 컨트롤파일 잘 복사되었는지 확인
[oracle@localhost controlfile]$ cd /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile/
[oracle@localhost controlfile]$ ls
o1_mf_fwvn96cd_.ctl
  1. DB 재시작
    • 아까는 mount되지않았던 DB가 정상적으로 start되는 것을 확인할 수 있다.
1
s> startup




redologfile 손실 시 복구

  • redolog file은 group내 member가 하나라도 정상이면 DB는 정상적으로 작동한다.
  • 남아있는 member를 사용해서 복구하지않는다 => redologfile은 reuse안됨
    • 기존에 사용했던 redologfile명 재사용 할 수 없다.
  • 손실된 member 삭제하고 새로 다중화해야한다.
  • redologfile 다중화 목적 : DB가 멈추지않고 계속 운영할수있도록 위함

1. redolog file확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
SQL> select group#, members from v$log;

GROUP# MEMBERS
---------- ----------
1 3
2 3
3 3
4 3

SQL> select group#, member from v$logfile;

GROUP# MEMBER
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_3_fwv
n9t6z_.log

3 /u01/app/oracle/fast_recovery_area/orcl/ORCL/onlin
elog/o1_mf_3_fwvn9xf6_.log

2 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_fwv
n9ddv_.log

2 /u01/app/oracle/fast_recovery_area/orcl/ORCL/onlin
elog/o1_mf_2_fwvn9l85_.log

GROUP# MEMBER
---------- --------------------------------------------------

1 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_fwv
n9ddb_.log

1 /u01/app/oracle/fast_recovery_area/orcl/ORCL/onlin
elog/o1_mf_1_fwvn9o6v_.log

4 /u01/app/oracle/oradata/ORCL/onlinelog/redo4a.log
4 /u01/app/oracle/fast_recovery_area/orcl/ORCL/onlin
elog/redo4b.log


GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/ORCL/datafile/redo1c.log
2 /u01/app/oracle/oradata/ORCL/datafile/redo2c.log
3 /u01/app/oracle/oradata/ORCL/datafile/redo3c.log
4 /u01/app/oracle/oradata/ORCL/datafile/redo4c.log

12 rows selected.
  1. redolog file복구 명령어
1
2
3
4
5
6
7
// redologfile 일부러 삭제
alter database
drop logfile member '/u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_fwvn9ddb_.log'

// rodologfile 복구
alter database
add logfile member '/u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_fwvn9ddb_1.log'




datafile 손실 시 복구

  • Recovery = Restore + Recover
    • Restore(복원) : 백업 파일로부터 손실된 파일을 디살리는 작업
      • 명령어 : $> cp
    • Recover(복구) : datafile만 해당되는 작업
      • 명령어 : $> cp
  • 케이스 2가지
    1. Non-critical datafile(일반 Datafile) 손실 시
    2. critical datafile(필수 Datafile-system, undo) 손실 시




Non-critical datafile(일반 Datafile) 손실 시 - DB켜는 중에 손실

상황) DB켜는 중에 데이터파일4의 손실 발생했을 때

  1. DB mount됨(open안됨)
  2. 손실된 datafile을 offline시킴
1
s> alter database datafile 4 offline;
  1. DB오픈 시킴
1
s> alter database open;
  1. restore : 백업으로부터 손실된 datafile만 복원
1
$>cp /home/oracle/backup/user01.dbf /u01/.../datafile/user01.dbf
  1. recover : 복원된 datafile만 복구(부분 DB복구)
1
s> recover datafile4;
  1. 복구가 완료된 datafile online 시킴
1
4> alter database datafile 4 online;




Non-critical datafile(일반 Datafile) 손실 시 - DB켜져있는 중에 손실발생

상황) DB켜져있는 중에 데이터파일4의 손실 발생했을 때

  1. 손실된 datafile만 offline시킴
1
s> alter database datafile 4 offline immediate;
  1. DB오픈 유지함

  2. restore : 백업으로부터 손실된 datafile만 복원

1
$> cp /home/oracle/backup/user01.dbf /u01/.../datafile/user01.dbf
  1. recover : 복원된 datafile만 복구(부분 DB복구)
1
s> recover datafile4;
  1. 복구가 완료된 datafile online 시킴
1
s> alter database datafile 4 online;




Non-critical datafile 손실 시 복구 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// datafiles 조회
SQL> select file#, name from v$datafile;

FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_system
_fwvn49fw_.dbf

2 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_users_
hp871s7n_.dbf

3 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux
_fwvn5f1l_.dbf

4 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotb
s1_fwvn66mp_.dbf

FILE# NAME
---------- --------------------------------------------------

5 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_exampl
e_hp86s7s0_.dbf

7 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_users_
fwvn681o_.dbf

8 /u01/app/oracle/oradata/ORCL/datafile/appuser01.dbf

9 /u01/app/oracle/oradata/ORCL/datafile/appuser02.dbf
---------- --------------------------------------------------

8 rows selected.

// DB종류 후 데이터파일 일부러 손실시키기 (rm 명령어 = 삭제)
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
[oracle@localhost ~]$ cd /u01/app/oracle//oradata/ORCL/datafile/
[oracle@localhost datafile]$ ls
appuser01.dbf o1_mf_sysaux_fwvn5f1l_.dbf o1_mf_undotbs1_fwvn66mp_.dbf redo1c.log redo4c.log
appuser02.dbf o1_mf_system_fwvn49fw_.dbf o1_mf_users_fwvn681o_.dbf redo2c.log
o1_mf_example_hp86s7s0_.dbf o1_mf_temp_fwvnbgvk_.tmp o1_mf_users_hp871s7n_.dbf redo3c.log
[oracle@localhost datafile]$ rm o1_mf_users_hp871s7n_.dbf
[oracle@localhost datafile]$ exit
exit

// DB켜기
SQL> startup
ORACLE instance started.

Total System Global Area 838860800 bytes
Fixed Size 8626240 bytes
Variable Size 620761024 bytes
Database Buffers 201326592 bytes
Redo Buffers 8146944 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2:
'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_users_hp871s7n_.dbf'

// 손실된 datafile만 offline시키기
SQL> alter database datafile 2 offline;
Database altered.

// DB 오픈시키기
SQL> alter database open;
Database altered.

// 백업폴더로부터 손실된 datafile만 restore시키기
SQL> !
[oracle@localhost ~]$ cd /home/oracle/backup/
[oracle@localhost backup]$ ls
appuser01.dbf conbk.ctl o1_mf_sysaux_fwvn5f1l_.dbf o1_mf_undotbs1_fwvn66mp_.dbf o1_mf_users_hp871s7n_.dbf
appuser02.dbf o1_mf_example_hp86s7s0_.dbf o1_mf_system_fwvn49fw_.dbf o1_mf_users_fwvn681o_.dbf
[oracle@localhost backup]$ cp /home/oracle/backup/o1_mf_users_hp871s7n_.dbf /u01/app/oracle/oradata/ORCL/datafile/o1_mf_users_hp871s7n_.dbf
[oracle@localhost backup]$ exit
exit

// 복원된 datafile만 recover하기(부분 복구)
SQL> recover datafile 2;
Media recovery complete.

// 복구가 완료된 datafile online 시키기
SQL> alter database datafile 2 online;

Database altered.

// 잘 복구되었는지 확인
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 838860800 bytes
Fixed Size 8626240 bytes
Variable Size 620761024 bytes
Database Buffers 201326592 bytes
Redo Buffers 8146944 bytes
Database mounted.
Database opened.

datafile online까지 잘 진행되었다면 DB를 껐다가 재접속시 원할하게 접속 가능하다!




critical datafile 손실 시 복구

상황 : system01.dbf(file# : 1) 손실한 경우

  1. DB 종료
1
SQL> shut abort
  1. DB mount시킨다
    • mount상태에서 restore와 recover를 진행해야한다.
1
SQL> startup mount
  1. restore : 백업 파일로부터 손실된 Datafile만 복원
1
$> cp /home/oracle/backup/system01.dbf /u01/.../datafile/system01.dbf
  1. recover : 모든 datafile복구(전체 DB 복구)
    • 부분 복구가 아니라 전체 datafile을 복구해야한다.
1
SQL> recover database;
  1. DB open시킨다.
1
SQL> alter database open;




critical datafile 손실 시 복구 예시

  • rm *system* 파일중에 system이 들어간 파일을 삭제하겠다는 쿼리.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//DB를 끄고 dafatile 중 system파일을 일부러 손실시킨다
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> !
[oracle@localhost ~]$ cd /u01/app/oracle/oradata/ORCL/datafile/
[oracle@localhost datafile]$ ls
appuser01.dbf o1_mf_sysaux_fwvn5f1l_.dbf o1_mf_undotbs1_fwvn66mp_.dbf redo1c.log redo4c.log
appuser02.dbf o1_mf_system_fwvn49fw_.dbf o1_mf_users_fwvn681o_.dbf redo2c.log
o1_mf_example_hp86s7s0_.dbf o1_mf_temp_fwvnbgvk_.tmp o1_mf_users_hp871s7n_.dbf redo3c.log
[oracle@localhost datafile]$ rm *system*
[oracle@localhost datafile]$ ls
appuser01.dbf o1_mf_example_hp86s7s0_.dbf o1_mf_temp_fwvnbgvk_.tmp o1_mf_users_fwvn681o_.dbf redo1c.log redo3c.log
appuser02.dbf o1_mf_sysaux_fwvn5f1l_.dbf o1_mf_undotbs1_fwvn66mp_.dbf o1_mf_users_hp871s7n_.dbf redo2c.log redo4c.log
[oracle@localhost datafile]$ exit
exit

SQL> show user
USER is "SYS"
SQL> startup
ORACLE instance started.
Total System Global Area 838860800 bytes
Fixed Size 8626240 bytes
Variable Size 620761024 bytes
Database Buffers 201326592 bytes
Redo Buffers 8146944 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1:
'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_fwvn49fw_.dbf'


// DB 종료 후 mount 시킨다.
SQL> shut abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 838860800 bytes
Fixed Size 8626240 bytes
Variable Size 620761024 bytes
Database Buffers 201326592 bytes
Redo Buffers 8146944 bytes
Database mounted.


// restore한다
SQL> !
[oracle@localhost ~]$ ls
200820quizMySol.sql checkTablespaceNname.sql consNcol.sql hr1.sql ingMe.sql new_dept.sql 공개 바탕화면 서식
afiedt.buf cons1.sql control103.ctl hr2.sql labs_12c ora12c 다운로드 비디오 음악
backup cons2.sql hr.sql hr3.sql load_emp.sql search_cons.sql 문서 사진
[oracle@localhost ~]$ cd backup/
[oracle@localhost backup]$ ls
appuser01.dbf conbk.ctl o1_mf_sysaux_fwvn5f1l_.dbf o1_mf_undotbs1_fwvn66mp_.dbf o1_mf_users_hp871s7n_.dbf
appuser02.dbf o1_mf_example_hp86s7s0_.dbf o1_mf_system_fwvn49fw_.dbf o1_mf_users_fwvn681o_.dbf
[oracle@localhost backup]$ cp o1_mf_system_fwvn49fw_.dbf /u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_fwvn49fw_.dbf
[oracle@localhost backup]$ exit
exit


// recover한다
SQL> recover database;
Media recovery complete.


// DB open시킴
SQL> alter database open;
Database altered.


// DB 어디까이 켜져있는지 확인
SQL> select status from v$instance;

STATUS
------------------------
OPEN