본문 바로가기

빅데이터과정/WORKSHOP 1

#23_140715_WSHOP_백업/복구

728x90

# 백업/복구






장애의 6가지 유형
1.     문장에러
코드의 오류권한 부족 : 코드수정권한부여로 해결

2.     유저프로세서 에러
클라이언트 PC 또는 응용프로그램이 비정상적으로 종료 다시 시작시켜 해결한다
pmon 이 알아서 commit 안한 data는 rollback 해준다

3.     네트웍 에러
클라이언트에서 서버로 오라클 접속이 안된다
원인
1)     서버의 리스너가 내려간 경우 – lsnrctl start(리스너를 올린다)
2)     물리적 네트웍 구성이 잘못된 경우(랜카드에 이상이 있거나 랜선이 빠지거나) – 백업네트웍을 구성해야 한다

4.     유저의 실수 : flashback 기술로 복구한다
실수로 테이블 drop
실수로 data를 다 지우고 commit
주의할 사항 : truncate table emp; 는 flashback 으로 못살린다
SQL> alter table emp enable row movement;  - emp 테이블을 flashback이 가능한 상태로 만든다

5.     instance failure

오라클 DB의 인스턴스가 비정상적으로 종료된 경우
instance recovery를 통한 해결을 위해서는 startup 해주면 된다
instance recovery
rollforward
: commit 했는데 data file에 반영 안된 data를 반영(by SMON)
rollback
: commit 안했는데 data file에 반영된 것 원래 상태로 되돌림(by PMON)
: log file commit 안됐다는 정보도 함께 포함됨
: rollforward, rollback 둘다 startup 할 때 반영됨
instance recovery 를 위해 DBA가 해야할 일은
: instance revocery 시에 걸리는 시간을 미리 설정해야 한다
: fast_start_mttr_target(= 20) – instance recovery에 걸리는 시간을 20분으로 제한하겠다


장점
단점
짧으면
인스턴스 리커버리 시간이 빨라진다
평상시 체크포인트가 자주 발생해서disk I/O 가 빈번해진다
길면
DISK I/O 가 빈번하지 않다
instance recovery시간이 많이 걸린다



6.     media failure
: file 이 손상되었거나 disk가 깨진 경우에 발생한다
해결방법은 백업받은 파일로 복구해야한다










평상시 백업해야 하는 4가지 사항

1. 정기적으로 백업을 해야한다
2. control file 을 다중화 해야한다
3. redo logfile 을 다중화 해야한다
4. 아카이브 모드로 운영해야 한다
SQL> archive log list
– 아카이브 모드인지 노 아카이브 모드 인지 확인
SQL> shutdown immediate
– 반드시 정상종료
SQL> startup mount
- DB구조를 변경하려면 mount 해야한다
SQL> alter database archivelog;
아카이브 모드로 변경
SQL> alter database open;
SQL> archive log list
– 아카이브 모드인지 노 아카이브 모드 인지 확인

백업
무슨 file을 백업해야 하는가?
1)     data file
2)     control file
3)     redo log file
움직이지 않게 하고 백업해야 한다(동기화 정보가 갱신되지 않도록)
동기화정보 : DB에 있는 파일들이 같은 시점의 파일들임을 증명하는 정보
백업의 종류 2가지
1)     cold backup : DB 내리고 백업
1 shutdown immediate
2 /home/oracle 밑에 mkdir 명령어로 backup 이란 폴더생성
3 data file, control file, redo log file 들을 모두 /hoem/oracle/backup 밑에 copy
4 startup
2)     hot backup : DB 운영중에 백업




SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !pwd
/home/oracle

SQL> !mkdir backup

SQL> !ls
Adobe                       afiedt.buf       labs            report03.html
C:\nppdf32Log\debuglog.txt  afiedt.buf~      oradiag_oracle  report04.html
DBDB                        backup           report01.html   report06.txt
Desktop                     datamodeler.log  report02.html   status.sql

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[dbdb:~]$ cd /u01/app/oracle/oradata/dbdb/
[dbdb:dbdb]$ ls
control01.ctl  redo02.log    system01.dbf   user06.dbf
example01.dbf  redo03.log    temp01.dbf     users01.dbf
redo01.log     sysaux01.dbf  undotbs01.dbf
[dbdb:dbdb]$ cp * /home/oracle/backup/
[dbdb:backup]$ cd /u01/app/oracle/flash_recovery_area/dbdb
[dbdb:dbdb]$ cp control02.ctl /home/oracle/backup/
[dbdb:dbdb]$ cd /home/oracle/backup/
[dbdb:backup]$ ls
control01.ctl  redo01.log  sysaux01.dbf  undotbs01.dbf
control02.ctl  redo02.log  system01.dbf  user06.dbf
example01.dbf  redo03.log  temp01.dbf    users01.dbf








  • control file 다중화




백업본 원본의 카페본인데 변하지 않는 data가 들어있는 파일
다중화 똑 같은 원본을 여러 개 만들겠다
control file 을 다중화 해야한다


 control file 의 내용은?
     1.     DB의 구조정보
2.     동기화 정보 : DB의 모든 파일들이 같은 시점의 파일들임을 증명하는 정보


control file 다중화(기존에 2개이지만 3개로 만듦)
1.     select name from v$controlfile; - controlfile 위치확인
2.     alter system set control_files=
'/u01/app/oracle/oradata/dbdb/control01.ctl',
'/u01/app/oracle/flash_recovery_area/dbdb/control02.ctl',
'/u01/app/oracle/oradata/dbdb/control03.ctl' scope=spfile;
3.     shutdown immediate
4.     OS에서 /u01/app/oracle/oradata/dbdb/ 이 위치로 이동해서 control01.ctl 을 복사해서control03.ctl로 붙여넣는다
$ cd /u01/app/oracle/oradata/dbdb/
$ cp control01.ctl control03.ctl
5.     startup
6.     select name from v$controlfile;



control file 다중화
SQL> show parameter control_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /u01/app/oracle/oradata/dbdb/c
                                                 ontrol01.ctl, /u01/app/oracle/
                                                 flash_recovery_area/dbdb/contr
                                                 ol02.ctl
SQL> alter system set control_files=
'/u01/app/oracle/oradata/dbdb/control01.ctl',
'/u01/app/oracle/flash_recovery_area/dbdb/control02.ctl',
'/u01/app/oracle/oradata/dbdb/control03.ctl' scope=spfile;

SQL> shutdown immediate;
SQL> exit

[dbdb:backup]$ cd /u01/app/oracle/oradata/dbdb/

[dbdb:dbdb]$ ls
control01.ctl  redo02.log    system01.dbf   user06.dbf
example01.dbf  redo03.log    temp01.dbf     users01.dbf
redo01.log     sysaux01.dbf  undotbs01.dbf

[dbdb:dbdb]$ cp control01.ctl control03.ctl

[dbdb:dbdb]$ sqlplus /as sysdba

SQL> startup
Total System Global Area  422670336 bytes
…………………………………………………………
Database mounted.
Database opened.

SQL> select name from v$controlfile;
NAME
------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/dbdb/control01.ctl
/u01/app/oracle/flash_recovery_area/dbdb/control02.ctl
/u01/app/oracle/oradata/dbdb/control03.ctl








  • redo log file 다중화


SQL> select group#, status from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 CURRENT
         3 INACTIVE
SQL> alter system switch logfile;
다른 redo log group으로 옮김
SQL> select group#, status from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 ACTIVE
         3 CURRENT
CURRENT 는 현재 내려쓰고 있는 redo log group
SQL> ALTER DATABASE ADD LOGFILE member
'/u01/app/oracle/flash_recovery_area/dbdb/redo01b.log' TO GROUP 1;
ALTER DATABASE ADD LOGFILE member
'/u01/app/oracle/flash_recovery_area/dbdb/redo02b.log' TO GROUP 2;
ALTER DATABASE ADD LOGFILE member
'/u01/app/oracle/flash_recovery_area/dbdb/redo03b.log' TO GROUP 3;
SQL> select group#, status, members from v$log;
    GROUP# STATUS              MEMBERS
---------- ---------------- ----------
         1 INACTIVE                  2
         2 INACTIVE                  2
         3 CURRENT                   2
member가 2로 변한 것을 확인 할 수 있다. member는 redo log file 한 개를 의미한다





  •   backup solution



1. 사용자 관리 백업 – shutdown immediate 한후 CP 명령어로 일일이 백업
2. Rman(Recovery manager) 을 사용한 백업
hot backup
cold backup

[dbdb:dbdb]$ rman target sys/oracle nocatalog
Recovery Manager: Release 11.2.0.1.0 - Production on Tue Jul 15 15:23:54 2014
……………………………………………………..
RMAN> backup database;
Starting backup at 15-JUL-14
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=37 device type=DISK
………………………………………………………………..
RMAN> list backup;
List of Backup Sets
===================
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1       Full    1017.11M   DISK        00:01:08     15-JUL-14     
        BP Key: 1   Status: AVAILABLE  Compressed: NO  Tag: TAG20140715T152432
        Piece Name: /u01/app/oracle/flash_recovery_area/DBDB/backupset/2014_07_15/o1_mf_nnndf_TAG20140715T152432_9w9l91go_.bkp
  List of Datafiles in backup set 1
  File LV Type Ckp SCN    Ckp Time  Name
  ---- -- ---- ---------- --------- ----
  1       Full 822133     15-JUL-14 /u01/app/oracle/oradata/dbdb/system01.dbf
  2       Full 822133     15-JUL-14 /u01/app/oracle/oradata/dbdb/sysaux01.dbf
  3       Full 822133     15-JUL-14 /u01/app/oracle/oradata/dbdb/undotbs01.dbf
  4       Full 822133     15-JUL-14 /u01/app/oracle/oradata/dbdb/users01.dbf
  5       Full 822133     15-JUL-14 /u01/app/oracle/oradata/dbdb/example01.dbf
6       Full 822133     15-JUL-14 /u01/app/oracle/oradata/dbdb/user06.dbf
1번 backup set 안에 1,2,3,4,5,6이 들어있다
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
2       Full    9.36M      DISK        00:00:01     15-JUL-14     
        BP Key: 2   Status: AVAILABLE  Compressed: NO  Tag: TAG20140715T152432
        Piece Name: /u01/app/oracle/flash_recovery_area/DBDB/backupset/2014_07_15/o1_mf_ncsnf_TAG20140715T152432_9w9lcgb1_.bkp
  SPFILE Included: Modification time: 15-JUL-14
  SPFILE db_unique_name: DBDB
  Control File Included: Ckp SCN: 822165       Ckp time: 15-JUL-14

3. Oracle secure backup(tape backup)
hot backup
cold backup

백업 : copy
복원 : 백업받은 파일을 원본 디스크에 복사
복구 : 복원한 파일에 아카이브 로그파일을 적용해서 최신파일로 만드는 것





  •   data file 복구


1.     SQL> select file_name from dba_data_files;
/u01/app/oracle/oradata/dbdb/users01.dbf
/u01/app/oracle/oradata/dbdb/undotbs01.dbf
/u01/app/oracle/oradata/dbdb/sysaux01.dbf
/u01/app/oracle/oradata/dbdb/system01.dbf
/u01/app/oracle/oradata/dbdb/example01.dbf
/u01/app/oracle/oradata/dbdb/user06.dbf
2.     SQL> shutdown abort
3.     SQL> exit
4.     $ cd /u01/app/oracle/oradata/dbdb/
5.     $ rm user01.dbf
6.     SLQ> startup
7.     SQL> select * from v$recover_file;
복구해야할 파일번호가 무엇인지 확인하는 명령어(file not found 출력하는 파일번호 확인)
8.     SQL> exit
9.     $ rman target sys/oracle nocatalog
10.   rman> restore datafile 4;
복원
11.   rman> recover datafile 4;
복구 : archive 파일 이용
12.   rman> alter database open;
13.   exit
14.   SLQ> select file_name from dba_data_files;



SQL> shutdown abort
ORACLE instance shut down.
SQL> exit
[dbdb:dbdb]$ cd /u01/app/oracle/oradata/dbdb/
[dbdb:dbdb]$ ls
[dbdb:dbdb]$ rm users01.dbf
[dbdb:dbdb]$ ls
[dbdb:dbdb]$ sqlplus "/as sysdba"
SQL> startup
ORACLE instance started.
Total System Global Area  422670336 bytes
Fixed Size                  1336960 bytes
Variable Size             272632192 bytes
Database Buffers          142606336 bytes
Redo Buffers                6094848 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/u01/app/oracle/oradata/dbdb/users01.dbf'
users01.dbf 파일이 없다는 메시지가 출력된다
SQL> select * from v$recover_file;
     FILE# ONLINE  ONLINE_ ERROR                                                   CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- ---------- ---------
1 ONLINE  ONLINE  UNKNOWN ERROR                                            822133 15-JUL-14
    2 ONLINE  ONLINE  UNKNOWN ERROR                                            822133 15-JUL-14
    3 ONLINE  ONLINE  UNKNOWN ERROR                                            822133 15-JUL-14
    4 ONLINE  ONLINE  FILE NOT FOUND                                                0

SQL> exit
[dbdb:dbdb]$ rman target sys/oracle nocatalog
RMAN> restore datafile 4;
Starting restore at 15-JUL-14
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=18 device type=DISK
…………………………………………………………………………….
RMAN> recover datafile 4;
Starting recover at 15-JUL-14
using channel ORA_DISK_1
…………………………………………………………………………….
RMAN> alter database open;
RMAN> exit
[dbdb:dbdb]$ sqlplus "/as sysdba"
SQL> select file_name from dba_data_files;
FILE_NAME
------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/dbdb/users01.dbf
/u01/app/oracle/oradata/dbdb/undotbs01.dbf
/u01/app/oracle/oradata/dbdb/sysaux01.dbf
/u01/app/oracle/oradata/dbdb/system01.dbf
/u01/app/oracle/oradata/dbdb/example01.dbf
/u01/app/oracle/oradata/dbdb/user06.dbf
users01.dbf 가 복원된 것을 확인할 수 있다



백업하는 공간 늘리는 명령어

SQL> alter system set db_recovery_file_dest_size='10G';




  • controlfile 복구





control file 을 백업하는 방법 2가지
1. rman 으로 백업
2. 사용자 관리 백업
binary file
: SQL> alter database backup controlfile to '/home/oracle/control01.bak';
text file
: SLQ> alter database backup controlfile to trace as '/home/oracle/cre_script.sql';
위 명령어는 control file을 생성하는 스크립트 생성

control file 삭제 후 복구방법
1.     SQL> select name from v$controlfile;
2.     SQL> shutdown abort
3.     SQL> exit
4.     $ cd /u01/app/oracle/oradata/dbdb/
5.     $ rm control01.ctl
6.     $ rm control03.ctl
7.     $ cd /u01/app/oracle/flash_recovery_area/dbdb/
8.     $ rm control02.ctl
9.     SQL> startup
10.   SQL> @/home/oracle/cre.sql
11.   select name from v$controlfile;




controlfile 복구 코드(cre.sql)
CREATE CONTROLFILE REUSE DATABASE "DBDB" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/u01/app/oracle/oradata/dbdb/redo01.log',
    '/u01/app/oracle/flash_recovery_area/dbdb/redo01b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/u01/app/oracle/oradata/dbdb/redo02.log',
    '/u01/app/oracle/flash_recovery_area/dbdb/redo02b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/u01/app/oracle/oradata/dbdb/redo03.log',
    '/u01/app/oracle/flash_recovery_area/dbdb/redo03b.log'
  ) SIZE 50M BLOCKSIZE 512
DATAFILE
  '/u01/app/oracle/oradata/dbdb/system01.dbf',
  '/u01/app/oracle/oradata/dbdb/sysaux01.dbf',
  '/u01/app/oracle/oradata/dbdb/undotbs01.dbf',
  '/u01/app/oracle/oradata/dbdb/users01.dbf',
  '/u01/app/oracle/oradata/dbdb/example01.dbf',
  '/u01/app/oracle/oradata/dbdb/user06.dbf'
CHARACTER SET WE8MSWIN1252
;

-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/DBDB/archivelog/2014_07_15/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/DBDB/archivelog/2014_07_15/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE

-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;

-- Database can now be opened normally.
ALTER DATABASE OPEN;

-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/dbdb/temp01.dbf'
     SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
-- End of tempfile additions.





controlfile 복구
SQL> shutdown abort
SQL> exit
[dbdb:~]$ cd /u01/app/oracle/oradata/dbdb/
[dbdb:dbdb]$ rm control01.ctl
[dbdb:dbdb]$ rm control03.ctl
[dbdb:dbdb]$ cd /u01/app/oracle/flash_recovery_area/dbdb/
[dbdb:dbdb]$ rm control02.ctl
[dbdb:dbdb]$ sqlplus "/as sysdba"
SQL> startup
……………………………………………………………………………
Redo Buffers                6094848 bytes
ORA-00205: error in identifying control file, check alert log for more info
SQL> @/home/oracle/cre.sql
안에 모든 open 까지 모든 복구 코드가 포함되어있기 때문에 자동으로 수행한다
Control file created.
Media recovery complete.
System altered.
Database altered.
Tablespace altered.
SQL> select name from v$controlfile;
NAME
------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/dbdb/control01.ctl
/u01/app/oracle/flash_recovery_area/dbdb/control02.ctl
/u01/app/oracle/oradata/dbdb/control03.ctl