Describe 백업의기본 here {{{ 백업.... 백업은 데이타베이스 관리자가 하는 일중에 비중이 큰 작업입니다.. 왜냐하면 어떤 조직에서 데이타베이스 시스템을 도입하였다면 이는 그 조직이 정보의 중요함을 인식했기 때문입니다... 정보는 곧 힘이 될 수 있습니다... 이렇게 조직에서 중요하게 인식한 정보는 바로 데이타베이스에서 어떤 처리 과정을 거쳐서 나오는 결과물이기 때문입니다... 만약 데이타베이스에 문제가 생긴다면 그 조직의 정보체계에 큰 문제가 일어나고... 또한 경제적인 손실이 만만치 않을 것이기 때문에 만약의 사태에 대비한 백업이 데이타베이스 관리자의 비중있는 일이 된 것입니다.. 이미 위 단원에서 아카이브로그 모드로 전환하는 방법과 부분백업(온라인백업)을 해보았습니다.. 이 부분은 이미 해본것이기 때문에 직접해보는 것은 생략하고... 개념과 기초에 대한 야그를 더 해보겠습니다... 물론 다른 종류의 백업도 해볼작정입니다... ================== 아카이브 로그 모드 ================== 먼저 아카이브로그 모드에 대해서 살펴보겠습니다.. 보통 오라클을 셋업하면 노아카이브 로그모드에서 동작을 시킵니다..(별다른 옵션에 체크를 하지 않으셨다면..) 전에도 언급했듯이 아카이브로그의 의미는 로그파일을 또한번 다시 다른 저장장소에 저장한다는 것입니다... 아카이브 모드를 사용하는지 사용하지 않는지는 백업의 방법과 복구의 방법을 결정지을 수 있는 백업 솔루션이지여.. 트랜잭션의 복구가 될 수 있는가 될 수 없는가는 아카이브로그 모드에 따라서 달라지게되는 것입니다.. 모든 트랜잭션은 아카이브 로그모드일때 가능합니다... 물론 '안정성'의 측면에서 봤을때는 아주 좋습니다..그러나 '성능'에서 본다면...추가적인 오라클의 작업과 추가적인 저장장치를 필요로 합니다... 그러므로 전체적인 성능은 약간 저하될 수 있습니다.. 전에도 한번 해봤듯이 부분백업 같은 경우에는 반드시 아카이브로그 모드에서만 할 수 있습니다.. 이유는 백업도중 어떤 트랜잭션이 발생 할 수 있으므로 백업하는 동안에는 해당 테이블스페이스에 사용자가 접근하지 못하기 때문에... 데이타의 기록을 할 수 없습니다... 이런 경우는 아카이브 로그를 사용해서 백업도중 발생한 데이타베이스에 대한 변경을 적용해 줄 수 있는 것입니다.. 상호 보완적이라도고 볼 수 있겠네여...헐헐~ SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG SQL> select group#, archived from v$log; GROUP# ARC ---------- --- 1 YES 2 NO 3 YES SQL> connect system/manager 연결되었습니다. SQL> archive log list; ORA-01031: 권한이 불충분합니다 SQL> connect sys/change_on_install as sysdba 연결되었습니다. SQL> archive log list; 데이터베이스 로그 모드 아카이브 모드 자동 아카이브 사용 아카이브 대상 /export/home/oracle/8i/oradata/archive 가장 오래된 온라인 로그 순서 4110 아카이브할 다음 로그 4112 현재 로그 순서 4112 SQL> 아카이브 모드의 설정해제는 ALTER DATABASE NOARCHIVELOG; 문장으로 합니다... ALTER DATABASE문장은 데이타베이스를 셧다운후 마운트까지만 하고 실행야 합니다... 아카이브에 대한 파라미터 파일에서 LOG_ARCHIVE_FORMET라는 것이 있었습니다.. 여기서 설정해주는 값은 다음과 같은 의미를 가지고 있습니다.. %T : 쓰레드 번호 --> arch0000000001 %t : 쓰레드 번호 --> arch1 %S : 로그 일련번호 --> arch0000000004 %s : 로그 일련번호 --> arch4 %t와 %T는 OPS(오라클 병령 서버)에서 사용하는 쓰레드를 나타냅니다.. SQL> !vi $ORACLE_HOME/dbs/initORCL.ora . . . log_archive_start = true log_archive_dest = /export/home/oracle/8i/oradata/archive log_archive_format = arch%s.arc . . . . 아카이브 로그모드를 사용하면 아카이브된 로그는 지정된 저장장치에 계속 쌓이게 됩니다... 이렇게 하면 저장공간이 부족한 상태에 이르게 되는데...이렇게 저장공간이 부족하게 되면 오라클은 에러를 발생하게 됩니다.. 그러므로 어느정도의 아카이브로그가 쌓이게 되면 다른 저장장치로 아카이브된 로그들을 옮겨줘야 합니다.. 유닉스에서는 보통 dd명령을 통해서 아카이브 로그 파일을 다른 저장장치로 옮깁니다.. 다음은 그 예입니다.. #dd if = /export/home/oracle/8i/oradata/archive of = /dev/rmt/ctape1 이렇게 운영체제의 명령을 통해서 아카이브 로그를 관리할때는 복구시 빠른 작업을 하기 위해서 아카이브 로그 파일들을 순서에 맞게 잘 정리하는 것도 중요합니다.. 백업과 복구에서 중요한 것은 어떤 문제로 인하여 서비스를 가능한 빨리 정상화하는 것이 중요하기 때문에...문제 발생시 아카이브 로그 파일들을 정리하고...또 필요한 파일들을 찾는데 시간을 허비해서는 안돼기 때문입니다.. ======================= 전체 백업(whole backup) ======================= 저는 처음에 홀백업이라고 해서 홀을 '구멍'이라는 뜻을 받아들였었슴니다.. 그래서 전체 데이타베이스에서 일 부분만 백업하는 방법인 줄 알았는데...역쉬 아니더군여... 헐헐~ 전체 백업은 데이타베이스가 작고, 사용자가 많치 않을때 효율적이고 경제적입니다.. 기냥 전체 백업에 들어가도 데이타 파일을 복사하는데 시간이 참 무료하게 느껴질 정도로 오래 걸립니다.. 담배한대 태우고..커피 마시고..텔레비젼 조금 보다가 오면 됩니다.. 대용량 데이타베이스를 전체 백업하는 것은 좀 무리가 있을 수 도 있습니다... 대용량 데이타베이스는 권하기를 전문회사의 백업관련 제품을 이용하는 것이 좋다구 합니다.. 전체데이타베이스 백업은 아주 쉽기도 하고 어렵기도 한 백업 방법입니다... 주의할 점은 백업할때 데이타베이스 셧다운과 스타트 사이에 모든 관련 파일을 복사해야 한다는 것입니다.. 띄엄띄엄 받는 백업은 무의미합니다....또한 정상적인 구동중에 운영체제 상에서 관련 파일을 복사하는 것도 의미가 없습니다...그 이유는 정상적인 가동중에는 트랜잭션이 진행중일 수 있기때문입니다... 사용은 간단합니다.. 1. 데이타베이스 셧다운 2. 운영체제 명령을 통해서 모든 오라클 데이타베이스(파일들...)을 백업 3. 데이타베이스 스타트업 오라클에게 반드시 필요한 파일은 Datafile, Redo log file, control file, parameterfile입니다. 전체 백업은 반복적이 작업입니다...그러므로 실수도 할 수 있겠지여...이런 실수를 방지하고...업무 효율을 높이기 위해서 쉘스크립트를 작성해서 하는 것이 좋습니다...정기적인 전체 백업이 필요하다면 스케줄러를 써야 겠지여... 잘 작성된 쉘스크립트는 데이타베이스 백업 관리에 아주 큰 도움이 될 것입니다.. 다음은 오라클의 파일에 관련된 데이타 사전뷰입니다.. SQL> select file_name from dba_data_files; FILE_NAME ------------------------------------------------------------------ /export/home/oracle/8i/oradata/ORCL/tools01.dbf /export/home/oracle/8i/oradata/ORCL/drsys01.dbf /export/home/oracle/8i/oradata/ORCL/users01.dbf /export/home/oracle/8i/oradata/ORCL/indx01.dbf /export/home/oracle/8i/oradata/ORCL/rbs01.dbf /export/home/oracle/8i/oradata/ORCL/temp01.dbf /export/home/oracle/8i/oradata/ORCL/system01.dbf /export/home/oracle/8i/oradata/data1.dbf /export/home/oracle/8i/oradata/data2_a.dbf /export/home/oracle/8i/oradata/temp_data.dbf /export/home/oracle/8i/oradata/data1_1.dbf /export/home/oracle/8i/oradata/local_manage_data.dbf 12 개의 행이 선택되었습니다. SQL> select value from v$parameter 2 where name = 'control_files'; VALUE ------------------------------------------------------------------------------------------------------------------------------------------------------------- /export/home/oracle/8i/oradata/ORCL/control01.ctl, /export/home/oracle/8i/oradata/ORCL/control02.ctl, /export/home/oracle/8i/oradata/ORCL/control03.ctl SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------------- /export/home/oracle/8i/oradata/ORCL/redo03.log /export/home/oracle/8i/oradata/ORCL/redo02.log /export/home/oracle/8i/oradata/ORCL/redo01.log SQL> SQL> shutdown 데이터베이스가 닫혔습니다. 데이터베이스가 마운트 해제되었습니다. ORACLE 인스턴스가 종료되었습니다. SQL> ! yasicom% pwd /export/home/oracle/8i yasicom% mkdir backup ######### 운영체제 상에서 관련된 파일들 복사######### yasicom% cp $ORACLE_HOME/dbs/*.ora $ORACLE_HOME/backup yasicom% cp $ORACLE_HOME/oradata/ORCL/*.dbf $ORACLE_HOME/backup <------------ 시간이 좀 걸릴수 있음....... yasicom% cp $ORACLE_HOME/oradata/ORCL/*.ctl $ORACLE_HOME/backup yasicom% cp $ORACLE_HOME/oradata/ORCL/*.log $ORACLE_HOME/backup yasicom% exit yasicom% SQL> startup ORACLE 인스턴스가 시작되었습니다. Total System Global Area 72704160 bytes Fixed Size 73888 bytes Variable Size 55681024 bytes Database Buffers 16777216 bytes Redo Buffers 172032 bytes 데이터베이스가 마운트되었습니다. 데이터베이스가 열렸습니다. 다음은 전체백업의 쉘스크립트를 작성한 것입니다... 이 스크립트를 일정기간동안 주기적으로 실행하려면 운영체제의 스케줄러를 이용합니다.. SQL> !vi $ORACLE_HOME/dbs/whole_backup.sql #전체백업 스크립트 #데이타베이스 종료 $ORACLE_HOME/bin/sqlplus /nolog << EOF connect sys/change_on_install as sysdba shutdown immediate exit # #데이타베이스와 관련된 파일 복사 cp $ORACLE_HOME/dbs/*.ora $ORACLE_HOME/backup cp $ORACLE_HOME/oradata/ORCL/*.dbf $ORACLE_HOME/backup cp $ORACLE_HOME/oradata/ORCL/*.ctl $ORACLE_HOME/backup cp $ORACLE_HOME/oradata/ORCL/*.log $ORACLE_HOME/backup # #데이타베이스 시작 $ORACLE_HOME/bin/sqlplus /nolog << EOF connect sys/change_on_install as sysdba startup exit EOF ~ ~ ~ ~ ~ ~ ~ ~ ~ :wq ========================== 온라인 백업/ 오프라인 백업 ========================== 이것도 윗 단윈에서 했었지여...아카이브 로그를 수행할때 말입니다... 여기서 말하는 온라인 백업/ 오프라인 백업은 테이블스페이스를 단위로 백업을 하는 것을 의미합니다.. 저는 안했지만 오픈 백업에서 중요한 것은 테이블 스페이스단위로 백업 작업을 끝냈으면 컨트롤 파일과 로그 파일도 함께 복사를 해두라는 것입니다.. 이것 역시 쉘스크립트를 작성하면 편하겠지여... 다음은 컨트롤 파일에 대한 백업 명령 예입니다.. SQL> ALTER DATABASE BACKUP CONTROLFILE TO '경로.......'; SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE; <---------- *.trc 형태로 파일을 복사합니다.. =============== 엑스포트/임포트 =============== 엑스포트와 임포트는 exp, imp 명령으로 수행합니다.. 엑스포트와 임포트를 이용한 백업 방법을 보통 논리적인 백업이라고 합니다.. 논리적이라는 것은 DBMS가 데이타 모델의 분류에서 실행 데이타 모델이라는 것입니다.. 즉, 논리적인 관점에서의 백업입니다..논리적인 관점이라는 것은 오라클의 객체들 바라볼때의 관점입니다.. 그러니까 엑스포트/임포트는 객체를 백업하고 복구하는 방법이라고 볼수 있습니다... 백업부분인데...보통 임포트와 엑스포트는 같이 붙어다니까...기냥 백업 단원에서 언급하겠습니다.. 특이한 점은 엑스포트와 임포트가 백업/복구 말고도 다른 기능을 수행한다는 것입니다... 다른 기능은 데이타베이스의 객체와 데이타를 서로 이동시키고, 또한 테이블, 인덱등을 재정장 하기 때문에 단편화(Freagmentaion)을 감소시킨다는 것입니다... 아주 유용하죠? 익스포트 옵션을 살펴보게습니다...옵션은 외울필요 없이 그때그때 참고하면서 하면 되겠습니다.. 자연스레 외워져 있다면 더 좋겠지여.. USERID/PASSWORD : 사용자명과 패스워드 BUFFER : 데이타를 읽어오는데 필요한 버퍼크기 0으로 설정되면 한번에 한행만 읽어온다. 데이타형이 LONG인 것은 한번에 하나의 행만 읽어와야 한다. FILE : 백업 파일명 GRANTS : 백업할 객체의 권한 백업 INDEXS : 인덱스를 생성할 수 있는 sql문을 파일로 만들어준다. ROWS : 테이블의 데이타를 백업해준다. CONSTRAINTS : 테이블이 가지고 잇는 제약조건 백업 COMPRESS : 익스텐트 영역을 하나의 영역으로 압축하여 백업 FULL : 데이타베이스 전체 백업 OWNER : 백업할 객체를 가지고 잇는 사용자명 정의 TABLES : 특정 테이블을 선택하여 백업 INCTYPE : FULL = Y일때... COMPLETE : 모든 테이블의 데이타를 백업 INCREMENTAL : 최근에 백업(COMPLETE, CUMULATIVE, INCREMENTAL)한 이후의 변경된 테이블만 백업 CUMULATIVE : 최근에 백업(COMPLETE, CUMULATIVE)한 이후의 변경된 RECORD : SYS.INCVID, SYS.INCEXP테이블에 INCREMENTAL 익스포트 백업내용을 기록해준다. HELP : 도움말 LOG : 지정한 파일에 로그 내용을 기록해준다. CONSISTENT : 백업 진행중인 테이블의 데이타가 변경중이라면 변경전의 데이타를 백업한다. STATISTICS : 백업하는 동안 테이블과 인덱스에 있는 통계정보를 수집해 준다. ESTIMATE : 전체 데이타중 일부 데이타로 통계정보를 수집 COMPUTE : 전체 데이타로 통계 정보를 수집한다 NONE : 통계정보를 수집하지 않는다. DIRECT : 데이타버퍼 캐쉬 영역을 사용하지 않고 백업하기 때문에 매우 빠르게 백업할 수 있다. 객체타입, 중첩테이블, LOB, REF, VARRAY 타입에는 사용할 수 없다. FEEDBACK : 백업하는 도중에 행의 수마다 점(.)을 찍는다. 엑스포트에서의 백업모드는 아래의 3가지와 같으며 다음과 같은 내용이 백업됩니다.. 테이블 모드 - 테이블 생성 스크립트 - 테이블 데이타 - 테이블 권한 - 인덱스 - 제약조건 - 트리거 (예: exp USERID = system/manager FULL = y) 사용자 모드 - 테이블 생성 스크립트 - 테이블 데이타 - 테이블 권한 - 인덱스 - 제약조건 - 트리거 - 클러스트 - 스냅샷 - 저장 프로시저 - 시노님 - 뷰 (예: exp USERID = scott/tiger OWNER = scott) 전체 모드 - 테이블 생성 스크립트 - 테이블 데이타 - 테이블 권한 - 인덱스 - 제약조건 - 트리거 - 클러스트 - 스냅샷 - 저장 프로시저 - 시노님 - 뷰 - 프로파일 - 롤 - 롤백 세그먼트 - 감사 - 테이블스페이스 데이타 (예: exp USERID = scott/tiger TABLES = (scott.emp, yasi.test) ) 임포트 그럼 논리적인 백업의 복구 방법인 임포트에 대해서 살펴보겠습니다... 바로 임포트 파라미터로 들어가지여.. USERID : 접속할 오라클의 사용자명/패스워드 BUFFER : 엑스포트와 같다 FILE : 엑스포트와 같다 SHOW : Y값으로 설정되면 실제 복구 작업은 실행되지 않고 복구해야할 내역만 화면에 출력 IGONRE : 이미 존재하는 테이블에 대해 복구작업을 실행하면 'Object already exists'라는 에러가 발생하는데 이 에러를 무시하고 계속 복구작업 수행 INDEXES : 인덱스를 별도로 생성할 것인지 표시 ROWS : 테이블의 데이타를 복구할 것인지 표시 FULL : 백업된 모든 데이타를 복구 FROMUSER : 여기에 정의된 사용자가 가지고 있는 모든 객체를 복구 TOUSER : 여기에 정의된 사용자가 FROMUSER 리스트에 정의되어 있는 사용자의 모든 객체를 복구 TABLES : 복구할 테이블을 지정하여 복구 TABLES = (emp, dept) RECORDLENGTH : 한번에 임포트할 수 있는 파일의 레코드 길이를 정의 INCTYPE : 복구할 파일의 COMPLETE, CUMULATIVE, INCREMENTAL 유형을 정의 COMMIT : Y를 설정하면 각 배열을 입력한후 commit문을 실행 HELP : 도움말 PARFILE : 임포트 파라미터를 외부 파일에 정의하여 사용하는 경우 파일명 표시 imp USERID = scott/tiger PARFILE = test.par LOG : 모든 에러 메세지를 기록하는 파일명을 표시 DESTORY : 데이타베이스에 이미 존재하는 객체를 삭제후 재생성해주며 FROMUSER, TOUSER 옵션과 같이 사용한다. INDEXFILE : 엑스포트 파일에 있는 모든 객체를 재생성 할 수 있는 CREATE문과 ALTER문을 외부 파일로 생성해 줍니다.. 간단하게 엑스포트/임포트 해보겠습니다.. SQL> !exp userid = scott/tiger file = $ORACLE_HOME/oradata/scott.dmp owner = scott Export: Release 8.1.7.0.0 - Production on 수 Dec 12 15:29:36 2001 (c) Copyright 2000 Oracle Corporation. All rights reserved. 접속 대상: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production KO16KSC5601 문자 설정과 KO16KSC5601 NCHAR 문자 설정에서 엑스포트가 종료되었습니다\ . 스키마 이전 단계의 객체와 작업을 엑스포트합니다\r . SCOTT 사용자를 위해 외래 함수 라이브러리 이름을 엑스포트합니다 \ . SCOTT 사용자의 객체 유형 정의를 엑스포트 합니다 \r SCOTT의 객체를 엑스포트하려고 합니다 ... . 데이터베이스 링크 엑스포트 중 . 순차 번호 엑스포트 중 . 클러스터 정의 엑스포트 중 . SCOTT의 테이블을 엑스포트하려고 합니다 via 규정 경로... . . 테이블 BONUS(를)을 엑스포트 중 0 행이 엑스포트됨 . . 테이블 DEPT(를)을 엑스포트 중 4 행이 엑스포트됨 . . 테이블 EMP(를)을 엑스포트 중 15 행이 엑스포트됨 . . 테이블 SALGRADE(를)을 엑스포트 중 5 행이 엑스포트됨 . . 테이블 SEQ_TEST(를)을 엑스포트 중 1 행이 엑스포트됨 . . 테이블 TEST(를)을 엑스포트 중 0 행이 엑스포트됨 . 동의어 엑스포트 중 . 뷰 엑스포트 중 . 저장 프로시저 엑스포트 중 . 작업을 엑스포트합니다 . 참조 무결성 제약조건 엑스포트 중 . 트리거 엑스포트 중 . 인덱스유형을 엑스포팅합니다 . 비트맵, 함수, 기능과 확장 가능한 인덱스들을 엑스포트합니다 . 이후 테이블 처리를 엑스포트 중 . 스냅샷 엑스포트 중 . 스냅샷 로그 엑스포트 중 . 작업 대기열을 엑스포트 중 . 리프레쉬 그룹과 자식 엑스포트 중 . 차원을 엑스포트합니다\ . 스키마 이후 단계의 객체와 작업을 엑스포트합니다\r . 통계를 엑스포트합니다 엑스포트가 경고 없이 정상적으로 종료되었습니다. SQL> connect system/manager 연결되었습니다. SQL> drop user scott 2 cascade; 사용자가 삭제되었습니다. SQL> create user scott identified by tiger 2 default tablespace users; 사용자가 생성되었습니다. SQL> grant connect, resource to scott; 권한이 부여되었습니다. SQL> !imp userid=scott/tiger file=$ORACLE_HOME/oradata/scott.dmp full=y Import: Release 8.1.7.0.0 - Production on 수 Dec 12 15:49:48 2001 (c) Copyright 2000 Oracle Corporation. All rights reserved. 접속 대상: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production 엑스포트 파일은 규정 경로를 거쳐 EXPORT:V08.01.07 에 의해 생성되었습니다 KO16KSC5601 문자집합과 KO16KSC5601 NCHAR 문자 집합에 임포트가 완성되었습니다 . SCOTT 객체를 SCOTT(으)로 임포트하는 중입니다 . . 테이블 "BONUS"(를)을 임포트 중 0 행이 임포트되었습니다 . . 테이블 "DEPT"(를)을 임포트 중 4 행이 임포트되었습니다 . . 테이블 "EMP"(를)을 임포트 중 15 행이 임포트되었습니다 . . 테이블 "SALGRADE"(를)을 임포트 중 5 행이 임포트되었습니다 . . 테이블 "SEQ_TEST"(를)을 임포트 중 1 행이 임포트되었습니다 . . 테이블 "TEST"(를)을 임포트 중 0 행이 임포트되었습니다 사용 가능한 제약 조건에 관해서... 임포트가 경고 없이 정상적으로 종료되었습니다. SQL> connect scott/tiger 연결되었습니다. SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 여기까지 백업에 대한 내용이였습니다... }}}