728x90
# 백업/복구
l 장애의 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가 깨진 경우에 발생한다
: 해결방법은 백업받은 파일로 복구해야한다
l 평상시 백업해야 하는 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
– 아카이브 모드인지 노 아카이브 모드 인지 확인
l 백업
- 무슨 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 다중화
l 백업본 : 원본의 카페본인데 변하지 않는 data가 들어있는 파일
l 다중화 : 똑 같은 원본을 여러 개 만들겠다
control file 을 다중화 해야한다
control file 의 내용은?
1. DB의 구조정보
2. 동기화 정보 : DB의 모든 파일들이 같은 시점의 파일들임을 증명하는 정보
l 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;
n 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 가 복원된 것을 확인할 수 있다 |
n 백업하는 공간 늘리는 명령어
- SQL> alter system set db_recovery_file_dest_size='10G';
- controlfile 복구
l 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을 생성하는 스크립트 생성
l 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;
n 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. |
n 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 |
'빅데이터과정 > WORKSHOP 1 ' 카테고리의 다른 글
#24_140716_WSHOP_백업(RMAN) (0) | 2014.07.16 |
---|---|
#24_140716_WSHOP_백업(사용자관리) (0) | 2014.07.16 |
#22_140714_WSHOP_자동화된 유지관리 (0) | 2014.07.15 |
#22_140714_WSHOP_테이블 통계정보 (0) | 2014.07.15 |
#22_140714_WSHOP_SNAPSHOT (0) | 2014.07.15 |