[ Oracle - SQL TRACE ]

 

☞ SQL TRACE

 

1. 정의 : SQL TRACE의 기능을 사용하면 개개의 SQL 문 실행시 실행과정의 및 결과등의 통계 정보를
          트레이스.파일에 출력한다. 이 결과를 모니터링하여 SQL튜닝을 실시해야 할 곳을 발견할
          수 있다.

2. 단점 : SQL TRACE를 하게 되면 속도가 느려 지므로 필요시에만  상태를 True로 하고 사용하지 않을
          경에는 False로 한다.   

☞ SQL TRACE 시작 /종료 OPTION
 

■ 현재Session 만을 변경 
  SQL> alter session set timed_statistics=true;  --(CPU 시간을 알고 싶을 경우에 실행)
  SQL> alter session set sql_trace = true;
  SQL> select ... (SQL문 처리의 실행)
  SQL> alter session set sql_trace = false;
  SQL> exit

■ 임의Session을 변경
    SQL> alter session set timed_statistics=true; 
    SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, TRUE);
 
    SQL> select ... (처리의 실행)
    SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, FALSE);

■ 인스턴스 전체를 변경
  init.ora ->
  timed_statistics=true
  sql_trace_true
  user_dump_dest ...

  RESTART INSTANCE

  여기서 초기화 파라미터 USER_DUMP_DEST(udump)에 트레이스·파일이 작성 된다.
  해당 트레이스·파일은 작성된 타임 스탬프로 확인한다.

  이 SQL 트레이스·파일은 SQL문 실행시에 순서대로 정보가 써지므로 이 파일을 보고 SQL문을
  분석하는 것은 곤란하다. 다음의 2.에서 소개하는 TKPROF라고 하는 유틸리티를 사용해 
  SQL 트레이스·파일을 정형하는 것으로 튜닝을 위한 분석을 실시하기 쉽게 한다.

2. TKPROF의 실행 방법
     - TKPROF로 SQL 트레이스를 포맷 해 보기 쉽게 한다

상기로 취득한 SQL 트레이스에 대해 TKPROF 커멘드를 실행하면 SQL 트레이스가  알기 쉽게 포맷 됩니다.

% tkprof <상기로 작성된 트레이스·파일> <임의의 파일명>
  (예: % tkprof oracle_ora_8138.trc tkprof.txt)

※ TKPROF 커멘드에는 많은 옵션이 있습니다.자세한 것은 Oracle8 or Oracle8i 「퍼포먼스를 위한 설계 및 튜닝」또는 Oracle9i  「데이타베이스·퍼포먼스·가이드 및 레퍼런스」의 "SQL 트레이스 기능과 TKPROF의 사용 방법" - 순서 3:TKPROF에 의한 트레이스·파일의 포맷을 참조.

3. 통계 정보를 해석한다
   - TKPROF 실행 후의 트레이스·파일의 대략적인 견해(처리에 걸린 시간) 

☞ SQL TRACE시 취득 정보

 

◆ Parse
   - SQL문이 파싱되는 단계에 대한 통계
   - 새로 파싱을 했거나, 공유 풀에서 찾아 온 것도 포함됨.
   - 단, PL/SQL 내에서 반복 수행(Loop)된 SQL이나 PL*SQL에서 보존 커서(Hold cursor)를 지정한
     경우에는 한 번만 파싱됨.

◆ Execute
   - SQL문의 실행단계에 대한 통계임.
   - UPDATE, INSERT, DELETE 문들은 여기에 수행한 결과가 나타나게 됨.
   - 전체범위 방식으로 처리된 결과가 여러 건인 경우는 주로 여기에 많은 값이 나타나며
     Fetch에는 아주 적은 값이 나타남.

◆ Fetch
   - SQL문이 실행되면서 Fetch된 통계임. 
   - 부분범위 방식으로 처리된 SELECT 문들이나 전체범위 처리를 한 후 한 건을 추출하는 경우        (AGGREGATE, 전체집계, COUNT 등)는 주로 여리게 많은 값들이 나타나고 EXECUTE에는 아주
     적은 값이 나타남.

◆ COUNT
   - SQL문이 파싱된 횟수, 실행된 횟수, FETCH가 수행된 횟수

◆ CPU
   - PARSE, EXECUTE, FETCH가 실제로 사용한 CPU 시간(1/100초 단위)

◆ ELAPSED
   - 작업의 시작에서 종료시까지 실제 소요된 총 시간

DISK
   - 디스크에서 읽혀진 데이타 블록의 수

QUERY
   - 메모리 내에서 변경되지 않은 블록을 읽거나 다른 세션에 의해 변경되었으나 아직 Commit되지
     않아 복사해 둔 스냅샷 블록을 읽은 블록의 수
   - SELECT 문에서는 거의가 여기에 해당하며 UPDATE, DELETE, INSERT시에는 소량만 발생됨.

CURRENT
   - 현 세션에서 작업한 내용을 Commit하지 않아 오로지 자신에게만 유효한 블록(Dirty Block)을
     액세스한 블록 수
   - 주로 UPDATE, INSERT, DELETE 작업시 많이 발생
   - SELECT문에서는 거의 없으나 아주 적은 양인 경우가 대부분임.

Logical I/O : QUERY + CURRENT

ROWS
   - SQL문을 수행한 결과에 의해 최종적으로 액세스된 ROW의 수
    - 서브쿼리
에 의해서 추출된 ROW는 제외됨.
   - 만약 SUM, AVG, MIN, COUNT 등의 그룹함수를 사용한 경우라면 큰 의미가 없음.

▣ 재귀적 콜(RECURSIVE CALL)이란:
   유저가 발행한 SQL문을 실행하기 위해서 Oracle는 추가의 문장을 발행해야만 하는 경우가 있다.
   이러한 문장을 재귀적 콜 또는 재귀적 SQL문 이라고 한다. 예를 들어 충분한 공간이 없는 테이블에
   행을 삽입하려고 하면, Oracle는 재귀적 콜을 실행해 동적으로 공간을 할당한다. SQL 트레이스
   기능이 사용 가능으로 되어 있을 때 재귀적 콜이 발생하면 TKPROF는 재귀적 콜의 원인이 된
   문장에 대해 재귀적 SQL문의 통계를 표시한다.

▣ 재귀적 콜의 분별법:
   TKPROF로 출력되고 있는 SQL문이 재귀적 SQL문인가 그렇지 않은가는 각 SQL문의 최후의 「
   recursive depth」정보로 판단한다. 이 값이 1이상의 경우, 그 SQL문은 재귀적 SQL문으로서의
   통계 정보가 된다.

「recursive depth」(이하, DEPTH)은, SQL 문이 발행된 재귀 레벨을 나타낸다. 예를 들어 값 0 은
    유저가 그 문장을 발행한 것을 나타내 보인다. 값 1은 Oracle이 값0의 문장(유저 발행의 문장)을
    처리하는 재귀적 콜로서 그 문장을 생성했다란 것을 나타낸다.값n 는 Oracle 가 그 문장을 값 n-1
    의 문장을 처리하는 재귀적 콜로서 생성한 것을 나타낸다.
    주의:내부표에 대한 처리만이 재귀적 SQL문이 되는 것은 아니다.

    PL/SQL 블록으로
      스토어드·프로그램(패키지, 프로시저, 팬쿠션등)을 부르는 처리를 실시했을 경우
      스토어드·프로그램 안에서 실행되는 SQL문은 SELECT나 UPDATE여도 재귀적 SQL문
                 으로 간주해져 재귀적 SQL문의 통계 정보로서 출력됩니다.

전체의 통계 정보에 대해:
전체의 처리에 걸린 통계 정보는 트레이스·파일의 마지막에 출력되고 있다

      OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
      OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

란 통계 정보로 확인한다.
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS = 비재귀적 SQL문의 통계 정보의 합계
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS = 재귀적 SQL문의 통계 정보의 합계

    처리 전체에 걸린 시간은 이 양자를 합계한 시간이 된다.
    (※ SQL 트레이스를 취득할 때에 초기화 파라미터 timed_statistics를 TRUE로 하고 있지 않은
        경우 에는 처리 시간은 항상 0.00이 된다.



☞ ORANGE TOOL에서 SQL TRACE하기

  [단, Oracle이  windows에 설치 되었을 경우의 설명]
1. ORANGE 로 Oracle접속
2. 메뉴 : Tools -> Plan Tool 선택
3. 메뉴 : Tools -> Trace Method -> Local File
            (참고, Plan Tool창을 띄워야  Trace 메뉴가 추가 됨)
4. POP_UP창에서 : Trace  file 위치를 [ \oracle\admin\sid\udump ] 로하고
                            Trace Name Format은 [ sid_ora_%d.trc ] 로 한다.   
5. 다시 Plan Tool 창으로 온다.
6. Trace를 하고 싶은 SQL 문을 KEY IN 한다.
7. ORANGE의 왼쪽에 상단에 TRACE  Icon       을 클릭 한다.
8. Plan Tool 창  하단 TRACE Tab page에서 Trace 내용이 출력 된다.

☞  ORANGE TOOL에서 SQL TRACE 결과 보기
 

1. SQL문을 KEY IN 후 처음 TRACE를 할 경우
    (아래 결과는  
       - Oracle이  Local PC인  windows XP에 설치 되었다.
       - TABLE FULLSCAN 이다
       - Record 갯수가  334개 결과가 나오는 SQL문장의 TRACE결과이다
     

 

 

2. SQL문을 KEY IN 후 두 번째 부터의 TRACE결과
     

 

 

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Data Pump Export / Import 1편  (0) 2017.01.22
Oracle - 데이터 펌프 (Data Pump) expdp, impdp  (0) 2017.01.22
Oracle - Listener_EM Console  (0) 2017.01.21
Oracle - Pro*C  (0) 2017.01.21
Oracle - Recovery - Point in Time  (0) 2017.01.21
Posted by 농부지기
,

Dangtong 의 오라클 <Data Pump Export / Import 1편>

 

dangtong76님의 블로그 | 당통
http://blog.naver.com/dangtong76/140042693346

 

우리가 데이터 베이스 내에 있는 정보들을 운영체제 파일 시스템으로 옮기거나 혹은 그 반대

의 경우를 위해 사용해 오던 것이  export/import 였다면 ,오라클 Data Pump 는 우리가 사용

 오던 export/import 의 기능에 다양하고 강력한 기능들을 추가 한 것입니다.  

오라클 10g 에서는 export/import와 Data Pump export/import 두 가지 기능을 모두를 지원

하고 있지만, Data Pump import/export 를 알고난 후 에는 더 이상 기존에

사용해오던 export/import 를 사용하실 필요성을 느끼지 못하게 되실 겁니다.  왜냐구요?

그만큼 강력한 기능을 제공한답니다.  자 그럼 Data Pump 의 세계로 들어가 볼까요?

※잠깐만~~!!

Export/Import와 Data pump는 서로 호환되지 않습니다. 즉 Export유틸리티를 이용하여 백업 받은 파일을 Data pump 를 이용하여 Import할 수 없으며, 마찬가지로 Data Pump 를 통해 Export 된 데이터는 Export/Import 유틸리티를 통해 Import할 수 없습니다.

 

 

 

1. Data Pump export/import 의 잇점

   Data Pump export/import 를 사용함으로서 얻을 수 있는 잇점은 다음과 같습니다.  

    1) JOB 콘트롤 가능

    Interactive mode 를 통하여 Data Pump 작업을 통제 할 수 있습니다. 작업을 중단시키고

    재시작 할 수 있으며 동적으로 dump file 을 할당 할 수 있습니다. 에러가 나더라도 작업

    이 중지 될 뿐 언제든지 원인을 수정하고 재수행 할 수 있습니다.

    2) 병렬수행지원

    PARALLEL 파라메타 를 이용하여 프로세스의 Data Pump 작업의 프로세스를 병렬화 할수

    있습니다. 병렬화 된 프로세스는 여러게의 데이타 파일에 각각 데이터를 쓰거나 여러

    개의 데이터 파일로 부터 데이터를 읽어 데이터베이스에 저장합니다. 병렬 수행이 가능

    함으로써 이전 보다 훨씬 강력한 수행 속도를 보장합니다.

    3) 작업에 필요한 디스크공간을 미리 예상

    ESTIMATE 파라메타를 이용하여 작업 시작 전에 필요한 물리적인 디스크 공간을 예상 할

    수 있습니다.

    4) 원격지 수행

    DB LINK를 통하여 원격지 데이터에 대한 Data Pump Import/Export 를 수행 할 수 있습

    니다.

    5) Remapping 지원

    유저 스키마, 테이블 스페이스, 데이터파일 등과 같은 정보들의 Data Pump Import/

    Export 시에 변경 할 수 있습니다. 이러한 기능은 데이터 마이그레이션 시에 보다 많

    은 유연성을 제공하는데 큰 역할을 합니다.

2. Data Access Methods

    1) Direct-path

    메모리를 거의 사용하지 않고 파일에 direct 로 쓰게 되는 방법입니다. 메모리

    사용이 적고 속도가 빠르며, 데이터 컨버전에 시간이 걸리지 않습니다.

    2) External tables

    메타 데이터를 데이터베이스에 저장하고 데이터 는 파일시스템에 존재하게 함으로써

    대용량 데이터를 Export/Import 할 때 사용합니다.

    이두가지 모드는 오라클이 자동으로 판단하여 수행하게 됩니다.

※잠깐만~~!!!

Direct-path 가 되지 않는 경우

. 클러스터 테이블인 경우

. 테이블에 활성화된 트리거가 존재 할 경우

. 글로벌 인덱스를 가진 테이블이 하나의 파티션에 존재 할 경우

. LOB 칼럼 에 있는 도메인 인덱스

. insert 모드에서 fine-grained access control 이 enable 인 경우

. BFILE 을 가진 테이블 인 경우

 

 

 

 

 

 

 

 

 

 

 

 

External Table이란?

. Create TABLE ~~ ORGANIZATION EXTERNAL 문을 통해 만들어진 테이블입니다.

. 실질적인 데이터는 데이터 베이스 내에 존재하는 것이 아니라 물리적 디스크에 논리

  적 공간을 할당 받아 데이터를 저장하며, 파일형태로 존재합니다.

. 저장되는 데이터는 READ ONLY 데이터 이며 인덱스를 생성할 수 없습니다.

. DML 작업을 수행할 수 없습니다.

. MEAT-DATA in DATABASE, DATA in OS 라고 압축 설명 할 수 있습니다.

 

 

 

 

 

 

 

 

3. Data Pump의 권한 설정

    좀더 다양한 옵션과 Data Pump 의 모든 기능을 자유자재로 사용하고

    자 한다면, 시스템에 설정된 EXP_FULL_DATABASE, IMP_FULL_DATABASE 롤을 부여 함으로써

    가능합니다. 일단 다음과 같이 유저를 생성하고 두 권한 모두를 생성된 사용자에 게 주는

    실습을 해 보도록 합시다.

    1) 사용자 생성

       create user dangtong identified by imsi00

       default tablespace USERS

       temporary tablespace temp;

    2) 권한부여

       grant connect, resource to dangtong;

    3) 모든 테이블에 대한 select 권한 부여

       grant select any table to dangtong;

    4) EXP_FULL_DATABASE,IMP_FULL_DATABASE 권한 부여

       grant EXP_FULL_DATABASE, IMP_FULL_DATABASE to ecampus;

       

    이렇게 함으로써 모든 데이터 베이스 오브젝트에 대한 Data Pump 권한을 획득

    하였습니다. 그럼 이제 실제적으로 Data Pump 를 이용하여 Export/Import 를 실습해 보실

    모든 준비가 되었습니다.   

 

    4. Data Pump 파일 오브젝트

    1) Data Pump 가 사용하는 파일의 종류

       ⓛ Dump File : 테이블로부터 데이터 또는 메타 데이터를 로드하여 저장된 파일

       ② Log File  : Data Pump 작업 중에 발생 하는 메세지나 결과를 기록하는 파일

       ③ SQL File  : Data Pump 는SQLFILE 이라는 옵션을 사용합니다. 이옵션을 사용할 경

                       우 Data Pump Import 작업이 수행되는 동안 DDL 문을 수행할 수 있게

     해주는 옵션입니다.(자세한 사항은 이후에 다룸)

 

    2) Data Pump 디렉토리 오브젝트

      

 

       Data Pump 는 디렉토리 오브젝트를 참조하여 Dump 파일을 쓰게 됩니다.

       그림과 같이 사용자 A는 DO1,DO2 에 허가(GRANT)되어 실재 존재하는 Dir1 과

       Dir2를 사용할 수 있게 됩니다. Data Pump 가 Export 받은 데이터를 Dir1, Dir2 모두

       에 저장할 수 있다. 반면, 사용자 B는 DO1에 만 (Grant) 되어 Dir1 에만 접근할 수 있

       습니다. 이처럼 Data Pump를 이용하게 되면 디렉토리에 대한 권한까지 설정할 수 있

  습니다.

  

       ⓛ 사용 중인 디렉토리 오브젝트의 조회

          SELECT * FROM dba_directories;   

       ② 디렉토리 오브젝트 추가

          CREATE DIRECTORY datapump_dir1 as '/temporary/ora_tmp';  

          '/temporary/ora_tmp' 에 대한 디렉토리 오브젝트 datapump_dir1 을 생성하는

          명령문 입니다.

       ③ 디렉토리 오브젝트에 대한 권한 설정

          GRANT READ,WRITE ON DIRECTORY datapump_dir1 to dangtong;

          ecampus 유저에 대해 datapump_dir1 에 대한 쓰기 및 읽기 권한을 할당하는 명령문 입니다.

          이제 Data pump 를 통해 Export 받을 때 ecampus 유저는 다음과 같이 지정함으로서 '/temporary/ora_tmp'

          에 Export된 덤프 파일을 저장할 수 있습니다.

 expdp dangtong/imsi00 DIRECTORY=datapump_dir1 Tables=EMP dumpfile=dangtong_dump1.dmp

         

       ④ 디펄트 디렉토리 설정하기

          Data Pump 를 사용할 때마다 디렉토리지정을 하지 않고 묵시적으로 사용하고 싶다

          면 운영체제 환경변수에 DATA_DUMP_DIR 을 만들고 그 값으로 디렉토리 오브젝트명

          을 입력 하면 됩니다.

          $ export DATA_DUMP_DIR datapump_dir1

          위와 같이 선언하게 되면 이제 다음과 같이 디렉토리를 지정하지 않아도 됩니다.

          $ expdp ecampus/password  dumpfile=ecam_dump01.dmp Tables= test_00

 

Dangtong 의 오라클 <Data Pump Export / Import 2편>  

 5. Data Pump Export 사용하기

   이제 본격적으로 Data Pump Export 를 사용하는 방법과, 여러 가지 옵션들에 대해 살펴

   보고, 실 상황에서 옵션들이 어덯게 동작하는지 테스트 해보는 시간을 가져 보도록 하겠습

   니다.

     1) 컴맨드 라인을 이용한 Data Pump 사용

     $ expdp system/manager DIRECTORY=datapump_dir1 DUMPFILE=dangntong_dump01.dmp

     컴맨드 라인을 이용하여 보기와 같이 expdp 를 사용하실 수 있습니다. 커맨들 라인을

     이용 할 때는 비교적 적은 수의 옵션들이 사용되거나 간단한 구문일 때 이용하시는 것이

     좋습니다. 복잡하고, 옵션이 많게 되면 수정 하거나, 잘못 타이핑할 때 시간이 많이

     걸리게 됩니다.

     2) 파라메타 파일을 이용한 Data Pump 사용

     파라메타 파일에 다음과 같이 기록합니다. 파일명은 dangtong.par입니다.

     ⓛ dangtong.par 파일을 다음과 같이 작성하세요

     SCHEMAS=SCOTT

     DIRECTORY=datapump_dir1

     DUMPFILE=dangtong_dump01.dmp

 LOGFILE=dangtong_dump.log  

     $ expdp dangtong/imsi00 PARFILE=dangtong.par

 

   6. Data Pump Export 모드

    1) Full export 모드

    FULL 파라메타를 사용합니다.

    데이터 베이스 전체를 export 받을수 있습니다. 한가지 주의 할점은

    EXPORT_FULL_DATABASE 롤이 Full export 받고자 하는 사용자 에게 부여되어 있

    어야 합니다.

    2) 스키마 모드

    SCHEMAS 파라메타를 사용합니다.

    하나의 유저가 소유하고 있는 데이타및 오브젝트 전체를 export 받고자 할때  사용할 수

    있는 모드입니다.

    3) 테이블스페이스 모드

    TABLESPACE 파라메타를 사용합니다.

    하나 이상의 테이블스페이스에 대해 해당 테이블스페이스에 속한 모든 테이블을 받을수

    있습니다. 만약 TRANSPORT_TABLESPACES 파라메타를 이용한다면, 테이블 뿐 아니라 테이

    블스페이스의 메타데이타 까지 export 받게 되어 다른 서버에 dump 파일을 카피 한 후

    import 하게 되면 테이블 스페이스 및 테이블이 자동으로 생성됩니다.

    4) 테이블 모드

    TABLES 파라메타를 사용합니다.

    하나 이상의 테이블을 export 받을 때 사용합니다.

 

   7. Data Pump Export 파라메타

    1) 파일 및 디렉토리 관련 파라메타

       파라메타 :DIRECTORY,DUMPFILE,FILESIZE,PARFILE,LOGFILE,NOLOGFILE,COMPRESSION

       ① DIRECTORY : 디렉토리 오브젝트를 참조 하는 DIRECTORY 파라메타를 이용하여

          덤프 파일의 위치 및 로그 파일의 위치를 지정할 수 있습니다.

          DIRECTORY=directory_object_name  형식으로 사용할 수 있습니다.

       ② DUMPFILE  : Export 받아 파일시스템에 저장될 덤프파일의 이름을 지정하는 파

          라메터 입니다. 파라메타를 사용할 때 다음을 기억하시고 사용하시면 됩니다.

          - %U 를 사용하여 여러 개의 덤프 파일을 구분할 수 있습니다.

            DUMPFILE=DANGTONG_DUMO_%U.dmp 로 파라메타를 정의 합니다. 만약 덤프 파일

            이 10개가 생성 된다고 가정하면 DANGTONG_DUMO_01.dmp 부터 DANGTONG_DUMO_10.dmp

            까지 %U 부분이 자동 증가하여 파일을 구분하여 줍니다. %U의 범위는 01~99 까

            지입니다.

          - ',' 를 이용하여 여러게의 파일명을 구분할 수 있습니다. 예를 들어 다음과 같이

            DUMPFILE=DANGTONG_DUMO_01.dmp,DANGTONG_DUMO_02.dmp,DANGTONG_DUMO_03.dmp 라고

            정의 할 수 있습니다.

          - 만약 DUMPFILE 파라메타를 지정하지 않는다면 expdat.dmp 라는 파일명으로 오

            라클이 자동 선언하게 됩니다.

       ③ FILESIZE  : Export 받는 1개 파일의 최대 크기를 지정하는 파라메타 입니다.

          만약 총데이터 량이 10Gigabyte 이고 FILESIZE 를 1Gigabyte 로 지정하였다면

          1Gigabyte 크기의 dump file 이 10개 만들어 지게 됩니다.

          FILESIZE=N [ BYTES | KILOBYTES | MEGABYTES | GIGABYTES ] 형식으로 쓸 수 있습

    니다.

 ④ PARFILE   : 파일에 파라메타 들을 저장해두고 Data Pump 를 이용할 때 마다 참조

    하여 작업을 수행하고 싶을 때 PARFILE 파라메타 를  사용할 수 있습니다.

    PARFILE=filename.par 형식으로 사용할 수 있으며, 파일 확장자는 아무런 영향을

    미치지 않습니다.

 ⑤ LOGFILE and NOLOGFILE : 로그파일명을 지정하는 파라메타 입니다.

    LOGFILE=logfile_name 형식으로 사용 하시면 됩니다. 파라메타 를 설정하지 않

    는다면 export.log 라는 파일명으로 로그가 남게 됩니다. 로그파일을 남기고 싶

    지 않을 때는 NOLOGFILE 파라메타 를 사용하시면 됩니다.

 ⑥ COMPRESSION : 오라클에서 EXPORT 시에 메타데이터는 압축을 하여 파일에 저장

    하게 됩니다. COMPRESSION 파라메타를 사용 하지 않을 경우에는 덤프파일 내에

    메타데이타가 압축되어 보관됩니다. COMPRESSION 파라메타 에는 METADATA_ONLY,    

 NONE 두개의 옵션이 있으며,METADATA_ONLY 는 파라메타를 사용하지 않으면 디펄

 트로 인식되는 옵션입니다. COMPRESSION=OPTION_NAME 형식으로 사용하시면 됩니다.

 

$expdp dangtong/imsi00 DIRECTORY=datapump_dir1 DUMPFILE=dump.dmp COMPRESSION=NONE

 

    2) Export 모드 관련 파라메타

      파라메타 :FULL,SCHEMAS,TABLES,TABLESPACES,TRANSPORT_TABLESPACES

     TRANSPORT_FULL_CHECK 가 있으며, TRANSPORT_FULL_CHECK 파라메타를 제외한 파라메타

     들은 여러분들 께서 이미 "6. Data Pump Export 모드" 에서 학습 하셨습니다. 그럼

     TRANSPORT_FULL_CHECK 파라메타에 대해서만 학습 하도록 하겠습니다.

     TRANSPORT_FULL_CHECK 파라메타는 Export 작업시에 테이블스페이스 내에 존재하는 테

     이블과 인덱스의 의존성을 검사 할 것인지 하지 않을 것인지를 설정하는 파라메타 이

     며 'Y' 또는 'N' 두개의 값만을 허용 하는 파라메타 입니다. TRANSPORT_FULL_CHECK

     파라메타는 TRANSPORT_TABLESPACES 와 같이 사용 되어 집니다.

     ① 'Y' 일경우 TABLESPACE 내에 테이블만 있고 인덱스가 없다면 작업은 실패합니다.

        반드시 INDEX도 같은테이블 스페이스에 존재 해야합니다.

     ② 'Y' 일경우 TABLESPACE 내에 인덱스만 존재하고 테이블이 없다면 작업은 실패합니다.

        반드시 TABLE 또한 존재 해야합니다.

     ③ 'N' 일경우 TABLESPACE 내에 테이블만 있고 인덱스가 없다면 작업은 성공합니다.

     ④ 'N' 일경우 TABLESPACE 내에 인덱스만 있고 테이블이 없다면 작업은 실패합니다.

   

    3) Export 필터링 관련 파라메타

     파라메타 :CONTENT,EXCLUDE,EXCLUDE,QUERY 파라메타가 있으며, 이러한 파라메타들은

     어떤 데이터를 Export 된 파일에 포함시킬지 결정 하는 파라메타 입니다.

     ① CONTENT :3개의 옵션을 가질 수 있으면 옵션 들은 다음과 같습니다.

        - ALL : 테이블과 메터데이터를 포함한 모든것을 포함시키겠다는 옵션

       

 

$ expdp dangtong/edu2006 DUMPFILE=datadump.dmp CONTENT=ALL

        - DATA_ONLY : 테이블 데이터만 포함 시키겠다는 옵션

       

 

$ expdp dangtong/edu2006 DUMPFILE=datadump.dmp CONTENT=DATA_ONLY

        - METADATA_ONLY : 메타데이터 만을 포함하겠다는 옵션이며, 이경우 Export된

          파일을 이용해 다른 데이터베이스에 Import할 경우 테이블 구조만 생성되게

          됩니다.

        $ expdp dangtong/edu2006 DUMPFILE=datadump.dmp CONTENT=METADATA_ONLY

     ② EXCLUDE and INCLUDE  : 원하는 오브젝트를 선택하여 받을 수 있습니다.

        그렇다면 EXCLUDE 와 INCLUDE 파라메타가 가질 수 있는 오브젝트의 종류에는 어떤

        것들이 있을까요? 오라클에서 오브젝트란 유저스키마, 테이블, 인덱스, 프로시져

        등을 통칭해서 오브젝트라고 합니다. 파라메타의 사용방법은 아래와 같습니다.

        - SCOTT 유저와 관련된 모든것을 Export 받고 싶은데 단, BONUS 테이블을 제외하고

        받고 싶다면 아래와 같이 하시면 됩니다.

       

 

$ expdp dangtong/edu2006 dumpfile=ex_dump.dmp schemas=scott

  exclude=TABLES:"='BONUS'"  

        - SCOTT 유저와 관련된 모든 것을 Export 받고 싶은데 단, EMP 테이블의 인덱스는 받

          지 않고 싶다면  다음과 같이 하시면 됩니다.

       

 

$ expdp dangtong/edu2006 dumpfile=ex_dump.dmp schemas=scott

  exclude=INDEX:\"='EMP%'\"  

 

        [exclude | include]=object_name:조건 형식으로 사용하실 수 있습니다.

 

     ③ QUERY : 테이블 내에 있는 데이터 중 특정 조건에 만족하는 데이터 만을 Export 받

        고자 할때 사용 하는 파라메타 입니다. 사용방법은 다음과 같습니다.

        QUERY=SCHEMA.TABLE: "조건" 이며 다음과 같은 예들을 볼 수 있습니다.

        - QUERY=SCOTT.EMP: "where SAL > 1200 '

        SCOTT유저의 EMP 테이블을 Export 하되 SAL 컬럼의 값이 1200 보다 큰 값들만 Export

        한다는 뜻입니다.

     ④ SAMPLE : 오라클 10g 에서 새롭게 지원하는 기능중 하나로써 테이블의 데이터를

        Export 할때 퍼센트를 정하여 지정된 퍼센트 만큼의 데이터를 샘플링 해서 뽑을

        때 사용 하는 옵션입니다. 사용방법은 아래와 같습니다.

        

 

$ expdp dangtong/edu2020 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

  SAMPLE=scott.emp:20

     

 

          SCOTT 유저의 EMP 테이블의 데이터 중 20%만을 Export 하게 됩니다.

        - 입력 가능한 PERCENT 의 범위는 0.000001 ~ 100 까지 입니다.

 

    4) 네트웍링크 파라메타

    원격지 데이터 베이스에 있는 데이터에 접근하여 로컬 데이터베이스 머신에 Export

    된 덤프 파일을 저장하고자 한다면 NETWORK_LINK 파라메타를 사용함으로써 가능합니다.

    원격지 데이터는 DB_LINK를 통해 가져올 수 있으며 NETWORK_LINK 파라메타 를 사용하기

    위해서는 원격지 데이터베이스의 테이블에 대한 DB_LIBK 를 만들어 놓아야 합니다.

    A 데이터베이스에 B 테이터베이스의 EMP 테이블을 소유한 SCOTT_B 유저에 대한

    DB LINK link_b_scott_b 이 존재 한다면 다음과 같이 NETWORK_LINK 파라메타를 사용

    하여 export 할 수 있습니다.

    

 

$ expdp dangtong/edu2006 DIRECTORY=datapump_dir1 dumpfile=datapump.dmp

  NETWORK_LINK=EMP@link_b_scott LOGFILE=datapump.log

 

    5) 암호화 관련 파라메타

    Export 되는 데이터중 일부 컬럼이 암호화 되어 있거나, 중요한 데이터 라면

    ENCRYPTION_PASSWORD 파라메타를 이용하여 Export 시에 암호를 설정 하여 Export

    된 데이터가 위 변조 되지 못하게 설정할 수 있습니다. 사용 방법은 아래와 같습니다.

    

 

$expdp dangtong/edu2006 TABLES=EMP DUMPFILE=datapump.dmp

 ENCRYPTION_PASSWORD=abcdef

 

    

    위와 같이 설정 하게 되면 차후 Import 시에 패스워드를 물어 보게 됩니다.

     

    6) JOB 관련 파라메타

    JOB 관련 파라메타 에는 JOB,STATUS 가 있습니다.

     JOB : JOB 파라메타를 설정하면 Data Pump 의 작업 명을 오라클에서 자동할당 하지

       않고 JOB 파라메타에 주어진 이름으로 등록 하게 되게 됩니다. 작업 마스터 테이블에

       작업명이 등록괴어 작업에 대한 정보들을 JOB 파라메타에 등록된 이름으로 조회할 수

       있습니다.

     STATUS :STATUS 파라메타는 Data Pump Export 작업시에 작업의 갱신된 내용을 STATUS

       에 설정된 크기의 시간 간격으로 진행상태를 보고 받고자 할때 사용하는 파라메타 입

       니다. STATUS=30 이면 30초 간격으로 작업결과를 갱신하여 보여 주게 됩니다. 만약 이

       파라메타를 설정하지 않으면 디펄트는 0입니다. 디펄트로 설정하게 되면 거의 실시간

       으로 작업 정보를 보여 주게 됩니다.

     FLASHBACK_SCN :System Change Number(SCN)는 시스템의 테이블이나 오브젝트가 변경

    되었을 때  변경 되는 SCN값을 가집니다. FLASHBACK_SCN 파라메타를 이용하여 SCN 값을

    지정할 경우에 파라메타에 설정된 SCN  기준 이전까지의 상태를 받게 됩니다.

    

 

$expdp dangtong/edu2006 dircetory=datapump_dir1 dumpfile=datapump.dmp

 FLASHBACK_SCN=120001

 

 

     FLASHBACK_TIME : FLASHBACK_TIME은 번호 대신에 시간 값을 가집니다. FLASH_BACK

    파라메타를 사용하면 파라메타에 지정된 시간까지 의 변경사항만을 Export 하게 됩니다.

    FLASHBACK_TIME 의 값은 TIMESTAMP 형식의 값을 가지며 TO_TIMESTAMP 함수를 사용하여

    설정할 수 있습니다.

     PARALLEL : PARALLEL 파라메타를 사용할 경우 Export 작업시에 프로세스를 필요한

    숫자 만큼 만들어 수행 함으로써 작업의 속도를 향상 시킬 수 있습니다. 디펄트 값은

    1로 설정되어 있으며, 주의할 점은 PARALLEL 에 지정된 갯수 만큼의 dumpfile 을 지정

    해주어야 합니다. 앞서 배운 %U 를 사용 하면 지정된 PARALLEL 갯수 만큼 자동으로 파일

    을 만들게 됩니다.

    

 

$expdp dangtong/edu2006 direcotry=datapump_dir1 dumpfile=datapump%U.dmp

 PARALLEL=3

 

    위와 같이 설정하게 되면 datapump01.dmp, datapump02.dmp, datapump03.dmp 3개의 덤프

    파일이 생성 됩니다.

    

 

$expdp dangtong/edu2006 direcotry=datapump_dir1 dumpfile=(datapump1.dmp,

 datapump2.dmp, datapump3.dmp) PARALLEL=3

 

 

    위와 같이 %U를 사용하지 않고 사용자가 직접 3개의 파일명을 ',' 로 구분하여 입력해도

    무방 합니다.

     ATTACH : ATTACH 파라메타 를 이용하여 Interactive Mode 로 들어 갈수 있습니다.

     오라클에서는 작업을 제어하고 모니터링 하기 위해 Interactive Mode 를 제공합니다.

     Interactive mode 로 들어가는 방법은 2가지가 있으며 다음과 같습니다.

      - Crtl + C 를 입력 함으로써 들어 갈 수 있습니다.

        $expdp dangtong/edu2006 directory=datapump_dir1                

         table=scott.emp dumpfile=datapump.dmp

         LOGFILE=datapump.log JOBNAME=MYJOB

        작업로그.........

        ................. -> 작업에 대한 로그가 떨어질때 Crtl + C 를 누르게 되면

        export> _         -> 와 같이 프롬프트 상태로 진입하게 됩니다.

        로그가 멈춘다고 해서 작업이 중단 된게 아니라 여러분 께서는 이상태에서 Inter

         active mode 명령을 사용하여 작업을 모티너링 하고 작업을 제어 할수 있습니다.

 

      - $expdp username/password ATTACH=SCHEMA.JOB_NAME 형식 으로 원하는 작업의 

        Interactive mode 로 들어 갈수 있습니다.

        

 

 $expdb dangtong/edu2006 ATTACH=scott.MYJOB

 

        하게 되면 조금 전에 실행한 작업의 Interactive mode 로 들어 가게 됩니다.

        이처럼 ATTACH 파라메타는 현재 수행 중신 작업의 Interactive mode 로 진입 하는데

        사용 되어 지며 InterActive Mode 명령에는 다음과 같은 것들이 있습니다.

        

명령어

설명

ADD_FILE

 덤프파일 을 추가 할 때 사용합니다.

CONTINUE_CLIENT

 Interactive Mode 에서 Logging Mode 로 전환 할 때 사용합니다.

EXIT_CLIENT

 Client Session 을 종료하고 Job 의 상태에서 벗어납니다.

HELP

 Interactive mode 도움말페이지

KILL_JOB

 작업을 삭제합니다.

PARALLEL

 현재 수행중인 작업의 프로세스 개수를 조정할때 사용합니다.

START_JOB

 실패한 작업이나 중단된 작업을 다시 시작시킬 때 사용합니다.

STATUS

 현재 작업상태를 모니터링 할 때의 갱신 시간을 설정합니다.

STOP_JOB

 작업의 실행을 중단하고 Client 를 종료합니다.

 

 

 

 

 

 

 

 

 

 

 

Dangtong 의 오라클 <Data Pump Export / Import 3편> 

  

7. Data Pump Import 모드

   지금 까지  Data Pump Export 대해 자세히 알아 보았습니다. 데이터베이스 내에 있는 오브

   젝트를 운영체제 파일시스템으로 옮기는 작업을 Data Pump Export 라고 한

   다면 Data Pump Import 작업은 운영체제 파일시스템에 있는 오브젝트 들을 데이터 베이스

   내의 테이블로 옮기는 작업 입니다.  impdp 명령어를 통하여 사용할 수 있으며,

   Data Pump Import 작업에서 처럼 Command 라인, par 파일, Interactive Mode 모두 사용 하

   실 수 있습니다.

 

    1) 파일 및 디렉토리 관련 파라메타

      

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmpSCHEMAS=SCOTT

 

 

       과 같이 DIRECTORY 는 디렉토리 오브젝트를 받는 파라메타 이고 DUMPFILE 파라메타

       는 Import 될 파일명, SQLFILE 은 작업 수행동안 수행될 DDL문을 저장할 파일이름

       이며, 디렉토리 관련 파라메타 로 설정 됩니다.

    2) 필터링 관련 파라메타

       필터링 파라관련 파라메타 에는 COTENT,INCLUDE,EXCLUDE,TABLE_EXISTS_ACTION 파라메

       터가 있습니다. COTENT,INCLUDE,EXCLUDE 파라메타는 Export 와 마찬가지로 사용 하

       실수 있으며,TABLE_EXISTS_ACTION 파라메타는 오직 Import 작업시에만 사용 할 수 있

       습니다.

        COTENT : CONTENT 파라메타는 DATA_ONLY,ALL,METADATA_ONLY 3가지 값을 가질 수 있

       으며, CONTENT=DATA_ONLY 형식으로 사용 하실 수 있습니다.

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT CONTENT=DATA_ONLY

 

 

 

        INCLUDE : INCLUDE=OBJECT_NAME:"='조건'" 형식으로 사용하실 수 있으며, 오브

       젝트의 종류에는 앞서 배운 것 과 같이 TABLE,INDEX,PORCEDURE,FUNCTION 등이 있습

       니다.

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT INCLUDE=TABLE:"='SAL'"

 

 

 

       SCOTT 유저의 테이블을 Import 하되 SAL 테이블 만 포함 시키라는 명령 이 됩니다

       SCOTT 유저가 EMP,SAL,SALARY 3개의 테이블을 가졌다고 가정하고 하나의 덤프파일에

       3개의 테이블을 Export 받았고, 위와 같은 import 명령을 내린다면 3개의 테이블중

       오직 SAL 테이블 만을 Import 하게 됩니다.

        EXCLUDE : EXCLUDE=OBJECT_NAME:"='조건'" 형식으로 사용하실 수 있으며, 마찬가지

       로 오브젝트 종류는 INCLUDE 와 같습니다.

 

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT EXCLUDE=TABLE:"='SAL'"

 

 

 

       SCOTT 유저의 테이블을 Import 하되 SAL 테이블을 제외한 나머지 테이블을 Import

       하라는 명령이 되겠죠? 마찬가지로 SCOTT 유저가 EMP,SAL,SALARY 3개의 테이블을 가졌

       다고 가정하고 하나의 덤프파일에 3개의 테이블을 Export 받았고, 위와 같은 import

       명령을 내린다면 3개의 테이블중 SAL 을 제외한 EMP,SALARY 테이블만 Import 될 것

       입니다.

        TABLE_EXISTS_ACTION : Import 시에 중요한 옵션입니다. 우리가 Data Pump 를 통

       해 작업을 하게될 경우 같은 이름의 테이블이 존재할 때가 있습니다. 만약 테이블이

       존재 하더라도 Import 하고자 하는 데이터의 row 수가 다를 수고 있고 같을 수도 있

       을 겁니다. 즉, 테이블은 존재하지만 데이터의 내용은 차이가 난다는 거죠.

       이러한 경우에 사용할 수 있는 유용한 파라메타가  TABLE_EXISTS_ACTION 입니다.

       TABLE_EXISTS_ACTION 파라메타는  SKIP,APPEND,TRUNCATE,REPLACE 의 값을 가질수 있으

       며 각 값의 의미는 다음과 같습니다.

       - SKIP     : 같은 테이블을 만나면 지나치고 다음 테이블을 Import 합니다.

       - APPEND   : 같은 테이블을 만나면 기존의 데이터에 추가하여 Import 합니다.

       - TRUNCATE : 같은 테이블을 만날경우 기존의 테이블을 TRUNCATE 하고 새로운 데이

                    터를 Import 합니다.

       - REPLACE  : 같은 테이블을 만날 경우 기존의 테이블을 DROP 하고 테이블을 재생성

                    한후 데이터을 Import 합니다.

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT TABLE_EXISTS_ACTION=SKIP  

 

 

       위와 같이 실행하면 같은 테이블을 만날경우 그냥 지나치고 다른 테이블을 Import

       하겠죠?

      2) JOB 관련 파라메타

       앞서 학습한 JOB_NAME,STATUS,PARALLEL 파라메타를 Export 와 같은 방법으로 사용

       하실 수 있습니다. Export 와 마찬가지로 PARALLEL 작업시에 dumpfile 의 개수를

       %u를 사용하여 지정하여 주거나, 명시적으로 ','를 사용하여 PARALLEL 개수 만큼

       파일을 지정 하셔야 합니다.

 

      3) 리맵핑 관련 파라메타

      리맵핑 관련 파라메타에는 REMAP_SCHEMA,REAMP_DATAFILE,REMAP_TABLESPACE 가 있으며,

      이들 파라메타 를 통하여 우리는 다른 데이터베이스 로 Import 시에 많은 유연성을 제

      공 받을 수 있습니다.

       REMAP_SCHEMA : A 유저 스키마로 Export 받은 데이터를 B 유저 스키마로 Import 하

      고자 할때 사용 합니다.

      

      

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:DANGTONG

 

 

      위와 같이 수행한후 TABLE의 OWNER 을 조회 한다면 DANGTONG 유저의 소유로 테이블

      이 등록 되었음을 확인 하실수 있습니다.

       REMAP_DATAFILE : 전체 데이타베이스 시스템을 Data Pump 를 통하여 옮기고자 할때

      Export 된 daumfile 에는 DataFile 정보까지 포함하게 됩니다. 하지만 다른시스템의

      디스크 경로 상에는 존재하지 않는 경로이기 때문에 Import에 실패하게 됩니다. 이러한

      경우에 사용 할 수 있는 파라메타가 REAMP_DATAFILE 입니다. Export 된 dumpfile 이

      Datafile 정보를 포함한 경우에만 해당합니다.

      

 

impdp dangtong/edu2006 FULL=Y DIRECTORY=datapump_dir1

DUMPFILE=datapump.dmp 

REMAP_DATAFILE='/db1/data/lvol01':'/db2/data/lvol01',

               '/db1/data/lvol02':'/db2/data/lvol02'     

                                .

                                .

                                .

 

 

 

       REMAP_TABLESPACE : Export 받은 데이터 속한 TABLESPACE에서 다른 테이블 스페이

      스로 REMAPPING 하고 하는 경우 사용할 수 있응 파라메타 입니다.

      

 

impdp dangtong/edu2006 REMAP_TABLESPACE='scott_tsb':'dangtong:tbs'

DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp SCHEMAS=SCOTT

 

 

      4) 네트웍 링크 파라메타

      Export 에서와 마찬가지로 DB LINK를 이용하여 원격지 데이터베이스에 대해 Import

      작업을 수행할 수 있습니다.

 

      5) Interactive mode 파라메타

      Export 에서와 마찬가지로 Ctrl + C 를 통하여 Interactive mode 로 진입할 수 있으며

      작업을 통제 할 수 있습니다.

 

   8. Data Pump 모니터링 하기  

   이번 장에서는 SQL을 통한 작업 모니터링 방법에 대하여 학습해 보도록 하겠습니다.

   작업의 진행 경과와 작업속성들 그리고 얼마나 많은 작업들이 존재 하는가를 알 수

   있습니다.

      1) 관련 조회 테이블 및 VIEW 들

     

          DBA_DATAPUMP_JOBS 현재 실행중인 작업의 속성들을 살펴 볼 수 있는 테이블

            입니다.

         SQL> select * from dba_datapump_jods;

         로 조회 하시면  다음과 같은 컴럼이 나옵니다.

         - OWNER_NAME  : DB 작업 계정

         - JOB_NAME    : 작업의 명칭

         - JOB_MODE,   : FULL,TABLE,INDEX,TABLESPACE 등이 있습니다.

         - STATE       : EXECUTING(수행중),DEFINING ,UNDEFINED, NOT RUNNING 의 값을

                         가집니다.

          Pump Session 확인

        Select sid,serial# from v$session session,dba_datapump_session pump_session

        where session.saddr = pump_session.saddr;

         로 조회 하시면 현재 Data Pump 를 통해 수행 중인 모든 Session 들과 상태들을

         모니터링 할 수 있습니다.

          Data Pump  의  모니터링

         SELECT opname,target_desc,sofar,totalwork,(sofar/totalwork*100) Percentage

         FROM v$session_longops;

         opname  : JOBNAME 과 같습니다.

         TOTALWORK : 총 수행하여야할 용량을 가르키며 단위는 Megabytes 입니다.

         sofar     : 현재 수행한 용량 을 가르키며 단위는  Megabytes 입니다.

         target_desc : 작업의 종류를 말합니다. IMPORT/EXPORT 가 값이 될수 있습니다.

 

Dangtong 의 오라클 <ASM 4편- ASM관리 및 모니터링> 

 

4절. ASM 의 관리

 

이절에서는 생성된 ASM 인스턴스와 DiskGroup 을 관리하기 위한 명령어 들과 관리 방법에 대해 보고 더불어 관리를 위한 다양한

VIEW 들에 대해 학습해 보도록 합시다.

 

1. DiskGroup 의 변경과 관리

1) DiskGroup 의 변경

   ① disk 의 추가

 

   

 % Alter diskgroup ecamp_disk1 add disk '/dev/rdsk/c4t20d7s4'   

    rebalance power 11;

 

   디스크 그룹에 디스크를 추가하는 sql문 입니다. 명령문 끋에 REBALACNE 속도를 조절

   하는 옵션을 볼수 있습니다. 앞서 학습한 바와 같이 디스크를  추가하거나 삭제 할대 REB

   ALANCE 이벤트가 발생 하는데요, 마찬가지로 디스크를 추가할때 속도를 해당 오퍼레이

   션에 한에 조절 할 수 있습니다. 옵션을 사용하지 않으면 파라메터에 설정된       

   ASM_POWER_LIMIT 를 기본 값으로 사용합니다. 만약 시스템의 부하가 많고 운영시간중에 디

   스크의 추가나 삭제가 이루어 져야 한단면. rebalance power 옵션을 사용하여 사용자가 조

   절한다면  시스템에 긍정적인 효과를 볼수 있습니다.

   ② disk 의 삭제

   

 SQL> Alter diskgroup ecamp_disk1 drop disk '/dev/rdsk/c4t20d7s4'

    rebalance power 11 ;

 

   마찬가지로 REBALANCE 속도를 조절할수 있습니다. 단. sql문을 수행하면 백그라운드로

   삭제 작업이 수행됩니다.  만약 삭제후 삭제 취소를 하고 싶다면 다음과 같은 sql문을 작성

   하여 실행 하시면 됩니다.

 

   

  SQL> Alter diskgroup ecamp_disk1 undrop disks;

   단, 주의 할점은 백그라운드로 수행되던 삭제 작업이 종료 되었다면, 수행 할수 없으며, 현

   재 수행 중이라면 삭제 작업을 취소 할 수 있습니다.

 

 

   ③ DiskGroup의 Mount 와 Unmount

   기본적으로 ASM 인스턴스의 시작시에 자동으로 디스크 그룹이 마운트 되게 되어 있지만,

   다음과 같은 sql문을 통해 사용자가 메뉴얼 하게 조정 할 수 있습니다.

   

   

 SQL> alter diskgroup alll dismount;  -- 디스크그룹을 마운트 합니다.

   

 SQL> alter diskgroup ecamp_disk1 mount; -- 디스크 그룹을 언마운트 합니다.

   위 sql 문에서 보듯이 all 또는 해당 DiskGroup 명을 명시 할수 있습니다.  

   

   ④ DiskGroup 의 정합성 체크

   

   

 SQL> alter diskgroup ecamp_disk1 check all

   디스크 그룹의 정합성을 체크합니다. 단, 정합성 체크를 위해서는 디스크 그룹이 마운트

   상태 이여햐 합니다. 부가적으로 발생하는 에러 로그 들은 Alert.log 에 생성됩니다.

 

2. ASM 의 디렉토리 생성및 관리

 

ASM 디스크 그룹의 생성 하게 되면 기본적으로 디스크 그룹의 이름이 최상위 root  디렉토리 가 됩니다. ASM 내에 사용자가 디렉토리

를 추가적으로 생성하여 리두로그, 아카이브로그, 콘트롤 파일 들을 기록 할 수 있습니다.

 

① ASM 의 디렉토리 생성

우리가 생성한 디스크 그룹은 ecamp_disk1, ecamp_disk2 입니다. 따라서 다음 과 같이 디렉토리를 생성 할 수 있습니다.

 

 SQL> alter diksgroup ecamp_disk1

       add directory '+ecamp_disk1/mydir' ;

 

위의 sql문에서 '+' 기호는 디렉토리 라는 의미로 사용되어 집니다. '+' 기호가 들어가면 ASM

의 내부 디렉토리로 해석하게 됩니다.

 

② ASM 디렉토리의 RENAME

설정 된 디렉토리 명을 바구기 위해서는 다음과 같은 sql문을 실행 하시면 됩니다.

 

 SQL> alter diskgroup ecamp_disk1 rename directory

       '+ecamp_disk1/mydir' to '+ecamp_disk1/renamed_dir'

 

③ ASM 디렉토리의 삭제

디렉토리를 삭제 할대는 다음과 같은 명령문을 실행하면 됩니다.

 

 SQL> alter diskgroup ecamp_disk1 drop directory 

       '+ecamp_disk1/renamed_dir' FORCE to

       '+ecamp_disk1/renamed_dir'

 

FORCE 옵션은 디렉토리내의 파일이 있을경우 파일까지 모두 삭제 할때 사용합니다. 일반적

으로 FORCE 옵션을 사용하여 삭제 합니다.

 

3. ASM 에서의 파일 템플릿과 파일 생성

 

오라클 10g 에서는 파일을 다룰때 파일이  ASM 디스크 에서 어덯게 기록되며, 기록될때 스트라이핑 이나 미러링의 속성을 어떠한 형

태로 가지게 될까를 템플릿 이라는 새로운 개념을

도입하여 설정합니다. 템플릿은 시스템에 제공 되는 템플릿과 , 사용자 정의 템플릿 두가지가 있습니다 우선 오라클에서 지원되는 파일

의 종류를 살펴 보도록 하겠습니다.

 

File Type

지원여부

템플릿명

콘트롤 파일

yes

CONTROLFILE

데이타 파일

yes

DATAFILE

리두로그 파일

yes

ONLINELOG

아카이브로그 파일

yes

ARCHIVELOG

트레이스 파일

no

N/A

Temporary files

yes

TEMPFILE

Datafile backup pieces

yes

BACKUPSET

Datafile incremental backup pieces

yes

BACKUPSET

Archive log backup piece

yes

BACKUPSET

Datafile copy

yes

DATAFILE

Persistent initialization parameter file(SPFILE)

yes

PARAMETERFILE

Disaster recovery configurations

yes

DATAGUARDCONFIG

Flashback logs

yes

FLASHBACK

Change tracking file

yes

CHANGETRACKING

Data Pump dumpset

yes

DUMPSET

Automatically generated control file backup

yes

AUTOBACKUP

 

 

오라클에서는 트레이스 파일을 제외한 모든 파일 템플릿을 제공합니다.. 그럼 이러한 파일들이 앞서 학습한 NOMAL REDUNDANCY,

HIGH REDUNDANCY, EXTERNAL REDUNDANCY 의 환경에서 어덯게 기록 되는 지 살펴 보도록 하겠습니다.

 

Template Nmae

Striping

Mirroring,

Nomal

Redundancy

Mirroring,

High

Redundancy

Mirroring,

Erternal

Redundancy

ARCHIVELOG

COARSE

MIRROR

HIGH

UNPROTECTED

TEMPFILE

COARSE

MIRROR

HIGH

UNPROTECTED

BACKUPSET

COARSE

MIRROR

HIGH

UNPROTECTED

PARAMETERFILE

COARSE

MIRROR

HIGH

UNPROTECTED

DATAGUARDCONFIG

COARSE

MIRROR

HIGH

UNPROTECTED

FLASHBACK

FINE

MIRROR

HIGH

UNPROTECTED

CHANGETRACKING

COARSE

MIRROR

HIGH

UNPROTECTED

DUMPSET

COARSE

MIRROR

HIGH

UNPROTECTED

XTRANSPORT

COARSE

MIRROR

HIGH

UNPROTECTED

AUTOBACKUP

COARSE

MIRROR

HIGH

UNPROTECTED

DATAFILE

COARSE

MIRROR

HIGH

UNPROTECTED

CONTROLFILE

FINE

HIGH

HIGH

UNPROTECTED

ONLINELOG

FINE

MIRROR

HIGH

UNPROTECTED

 

표에서 보듯 Striping AU(Allocation Unit) 의 크기가 FLASHBACK, CONTROLFILE, ONLINELOG 일경우 항상 FINE GRAINDED 하게 설

정됩니다.  디펄트로 제공되는 템플릿 이되에 사용자가 직접 mirroring 이나 string 정도를 설정 하고 싶을 때에는 다음과 같이 직접

플릿을 작성하여 디스크 그룹에 추가해 주면 됩니다.

 

 SQL> alter diskgroup ecamp_disk1 add template my_temp

       attributes mirror fine

ATTRIBUTES(속성)을 지정하지 않는다면 디스크 그룹이 NOMAL 일경우 MIRROR 가 디펄트 값이며,, HIGH일 경우는 HIGH 가 디펄트

 입니다.  디스크 그룹이 EXTERNAL 일경우에는 UNPROTECTED 값이 자동으로 설정 됩니다.

 

4. ASM 을 사용한 TABLESPACE생성

우리가 ecamp_disk1 DiskGroup 을 상에 테이블 스페이스를 생성하고자 한다면 , 다음과 같은 sql문을 작성하여 실행 할 수 있습니다.

 

           SQL> create tablespace sample DATAFILE 'ecamp_disk1(datafile)';  

 

         

 

그림과 같이 테이터 파일을 생성하게 되면 일련된 이이터 파일은 디스크 그룹내의 여러개의

디스크로 균일하게 쪼개어져 저장됨으로써 디스크 I/O 집중을 막을수 있습니다.

Create tablespace sample datafile '+ecamp_disk1(datafile)' 에서  + 기호는 디렉토리라는

뜻이며 '()' 안의 내용은 생성된 파일의 속성을 템플릿을 이용하여 지정 하였습니다.

datafile 이라는 템플릿을 사용하였으므로 Redundancy 정도에 따라 템플릿 정보에 의해 다르

게 기록 될것입니다.

이러한 방법으로 테이블 스페이스 뿐만 아니라 아카이브 로그 , 리두로그  등을 ASM 을 이용하여 저장할 수 있습니다.

 

5. ASM 을 사용한 Redolog생성

 

init 파라메터 파일에 다음과 같이 값을 설정합니다.

 

DB_CREATE_ONLINE_LOG_DEST1= '+ecamp_disk1'

DB_CREATE_ONLINE_LOG_DEST2= '+ecamp_disk2'

 

설정우 sqlplus 로 접속하여

 

SQL> alter database add logfile;

 

6. ASM 모니터링 하기

 

1) ASMCMD (ASM Command Line Interface) 를 이용한 ASM 모니터링

ASM에서는 sqlplus 를 이용해서 ASM 내에 생성 되는 파일이나 디렉토리를 볼수 있을 뿐만아니라 ASMCMD 라는 Command Line

Interface 를 제공하여 sqlplus 보다 더욱 간편하게 파일이나 디텍토리를 조회 할 수 있습니다. sql문과 마찬가지로 ASMCMD 를 사용

하기 위해서는 환결변수의 변경이 필요합니다. 환경 변수 를 변경하고 asmcmd 를 실행하면 Command Line Mode 로 접속 할 수 있습

니다.

 

% export ORACLE_SID=+ASM

% asmcmd

ASMCMD> help

 

help 명령어는 ASMCMD 의 명령어 사용방법을 알려줍니다. 유니긋 명령어와 유사아여 help 페이지를 토대로 누구나

실습할수 있습니다.

다음과 같이 ASM 내의 디렉토리로 들어간다음 파일 목록들을 볼수 가 있습니다.

 

ASMCMD> cd +ecamp_disk1

ASMCMD> ls -al

Type     Redund    Striped    Time      Sys       Name

                                           Y         ORAASM/

ASMCMD> cd ORAASM

ASMCMD> ls

1_2_589873405.dbf

ARCHIVELOG/

CONTROLFILE/

DATAFILE/

ONLINELOG/

PARAMETERFILE/

TEMPFILE/

spfileoraasm.ora

ASMCMD> du

Used_MB      Mirror_used_MB

1287                     2585

ASMCMD>_

 

위의 예제에서보듯이 'cd' 명령어를 통해 디렉토리에 접근 할 수 있으며 'ls' 명령을 통해 파일 리스트를 확인 할 수 있습니다.

또한 du 명령어를 통해 용량을 확인 할 수 있습니다.

 

2) ASM  관련 VIEW 를 이요한 모니터링

 

VIEW

설명

V$ASM_DISKGROUP

디스크 그룹에 관계된 정보를 저장함.

V$ASM_DISK

디스크 에 관계된 정보를 저장함

V$ASM_FILE

ASM 상에 생성된 파일데 대한 정보를 보여줍니다.

V$ASM_TEMPLATE

ASM 상의 모든디스크 그룹에 설정된 템플릿정보를 보여줍니다.

V$ASM_ALIAS

ASM 디스크 그룹의 별칭 정보를 보여줍니다.

V$ASM_OPERATION

ASM 인스턴스상에서 실행되는 작업들의 현황을 보여줍니다.

V$ASM_CLIENT

ASM 을 사용하는 DB 인스턴스를 보여줍니다.

 

 

① ASM 에 접속된 DB 인스턴스 상태 확인하기

ASM 인스턴스에 접속된 DB 인스턴스의 정보와 연결상태 등을 조회 할 수 있습니다.

 

SQL> select instance_name,db_name,status from v$asm_client

INSTANCE_NAME        DB_NAME      STATUS

oraasm                  oraasm         CONNECTED

② 디스크 그룹 정보 확인

디스크 그룹에 대한 정보를 알수 있습니다.

 

SQL> select name,state,type,total_mb,free_mb from v$asm_diskgroup

NAME         STATE      TYPE     TOTAL_MB   FREE_MB

ecamp_disk1   MOUNTED   NORMAL         3904        1218

ecamp_disk2   MOUNTED   NORMAL          1952        1850

 

③ 디스크 정보 확인

디스크에 대한 정보를 확인할 수 있습니다.

 

SQL> select name,path,group_number from v$asm_disk

NAME                    PATH              GROUP_NUMBER

ECAMP_DISK2_001        /dev/raw/raw6                     2

ECAMP_DISK2_000       /dev/raw/raw6                      2

ECAMP_DISK1_000       /dev/raw/raw6                      1

ECAMP_DISK1_001       /dev/raw/raw6                      1

ECAMP_DISK1_002       /dev/raw/raw6                      1

ECAMP_DISK1_003       /dev/raw/raw6                      1   

 

 

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - SQL TRACE  (0) 2017.01.22
Oracle - 데이터 펌프 (Data Pump) expdp, impdp  (0) 2017.01.22
Oracle - Listener_EM Console  (0) 2017.01.21
Oracle - Pro*C  (0) 2017.01.21
Oracle - Recovery - Point in Time  (0) 2017.01.21
Posted by 농부지기
,

[Oracle - 데이터 펌프 (Data Pump) expdp, impdp ]

 

※ 10g부터 제공.
    expdp, impdp는 exp, imp와 호환돼지 않는다. 기존의 exp로 추출한 데이터를 impdp로 입력할 수 없다.

1. DP의 장점
    - 오브젝트와 데이터의 선택
            EXCLUDE, INCLUDE, CONTENT 파라메터를 이용해서 이전버전 보다 쉽게 추출하거나 입력할 대상을 선택할 수 있다.
    - 데이터베이스의 버전을 명시적으로 정의한다.
            VERSION 파라메터를 사용하여 이동할 객체의 데이터베이스 버전을 지정하면 데이터 펌프를 지원하는 이전 릴리즈의
            오라클 데이터베이스와 호환 가능한 덤프 파일 셋트를 생성한다. 현재는 릴리즈 10, 11 간에 호환이 가능하다.
    - 병렬수행이 가능하다.
    - exp에 필요한 디스크 공간을 예측한다.
    - 분산환경에서의 네트워크 모드
            원격지의 데이터베이스에서 직접 데이터를 추출할 수 있다.
    - remmaping : 데이터를 입력하는 동안 데이터를 입력할 데이터 파일명, 스키마, 테이블 스페이스를 변경할 수 있다.
    - 데이터를 추출할 때, 압축 기능을 사용할 수 있다.
    - 작업이 길어진다면 중간에 멈췄다가 재개할 수도 있다.
            INTERACTIVE COMMAND LINE 모드로 가능하다.

2. DP 인터페이스
    dp를 수행하기 위해서 다음과 같은 인터페이스를 제공한다.
    - command line
            대부분의 파라메터를 커맨드라인에서 입력하여 실행한다.
    - parameter file
            모든 커맨드 라인 파라메터를 파라메터 파일에 정의할 수 있다.
            단, PARFILE은 제외한다. 이 파라메터는 파라메터 파일의 위치를 정의한다.
    - interactive command line
            이 모드를 사용하면, 터미널의 로깅이 중지되고, export 혹은 import 프롬프트가 표시된다. 
            커맨드라인 혹은 파라메터 파일로 시작한 export 작업 중에 '컨트롤+C' 키를 눌러서 활성화한다.
    - database control
            엔터프라이즈 메니져를 쓴다.

3. DP 모드
    다음과 같은 모드들이 있다.
    - Full
    - Schema
    - Table
    - Tablespace
    - Transportable tablespace

 

------------------------------------------------------------

출처:http://kr.forums.oracle.com/forums/thread.jspa?threadID=477162&tstart=60

제품 : ORACLE SERVER

작성날짜 : 2004-05-28


[10G]ORACLE DATA PUMP를 사용하여 이미 존재하는 테이블에 IMPORT 수행
===================================================================

PURPOSE
-------
이 문서는, datapump 파라미터인 TABLE_EXISTS_ACTION과 CONTENT 파라미터를 사용하여 이미 존재
하는 테이블에 데이터를 import 시키는 상세 방법을 지정하는 절차를 보여주는데 목적을 둔다.

Explanation
-----------
Data Pump import는 TABLE_EXISTS_ACTION라는 새로운 파라미터를 사용하며 CONTENT (export, import)
파라미터와 함께, 이미 존재하는 테이블에 데이터를 어떻게 import 하는지를 지정한다.
이 새로운 파라미터는 기존 export/import 유틸리티의 'ROWS'와 'IGNORE' 파라미터와 사용법이
유사하다.

TABLE_EXISTS_ACTION 파라미터:
---------------------------

기본값: SKIP (주의 : CONTENT=DATA_ONLY를 지정할 경우에는 기본 값이 SKIP이 아니라 APPEND 임)


이 파라미터는 생성하고자 하는 테이블이 이미 존재할 경우, 어떤 작업을 수행할지를 지정한다.
지정 가능한 값에는 다음과 같은 것들이 있다 :

SKIP - 테이블을 있는 그대로 두고 다음 객체 생성으로 이동한다. CONTENT 파라미터를 DATA_ONLY로 지정할 경우
SKIP을 지정할 수 없다.
APPEND - 소스로 부터 row를 읽어 들여 테이블에 적재 시키고, 이미 존재하는 row는 그대로 둠
TRUNCATE - 이미 존재하는 row가 있다면 삭제시킨 후 새로 데이터를 적재 시킴
REPLACE - 이미 존재하는 테이블을 드롭 시킨 후, 테이블을 새로 만들고 데이터를 적재 시킴. CONTET 파라미터를
DATA_ONLY로 지정하느 경우 이 값을 지정할 수 없다.

다음은 옵션을 지정하는데 있어 고려해야 할 사항이다 :

TRUNCATE나 REPLACE를 지정할 경우, 영향을 바는 테이블이 참조 무결성에 의해 참조 되지 않는 지 여부를 확인한다.
SKIP, APPEND 또는 TRUCATE를 지정할 경우, 이미 존재하는 테이블에 대한 인덱스나, 권한 부여, 트리거, 제약 조건이
무시된다. REPLACE를 지정할 경우, 의존 관계에 있는 객체들이 먼저 drop 된 후, 재 생성된다. 이것을
피하기 위해서는 EXCLUDE를 사용하여, 명시적으로 제외를 시키거나 임포트 하고자 하는 덤프 파일에 해당 내용이
포함 되지 않아야 한다.
APPEND나 TRUNCATE를 사용할 경우에는,다른 모든 작업에 앞서 덤프 파일의 내용이 이미 존재하는 테이블에 들어갈 수
있는 형태의 데이터인지를 먼저 확인한다.

이미 존재하는 테이블에 대해서는 external 테이블을 사용하여 load 작업이 수행되는데 이것은, external table 이
constraint나 trigger가 제 기능을 하도록 하기 때문이다. 하지만, active constraint를 위반하는 row 가
하나라도 존재하면,load 작업은 취소되어 아무런 데이터도 load 되지 않는다는 점을 기억해 둘 필요가 있다.

만약 데이터를 반드시 load 시켜야 하는데, constraint voilation을 유발시킬 만한 내용이 있다면
constraint를 먼저 disable 시키고, 데이터를 적재 시킨 후, 문제가 되는 row를 삭제 하고 constraint를
다시 enable 시키는 방법을 사용해야 한다.

APPEND를 사용할 때는, 데이터가 언제나 새로운 공간에 load 된다. 기존에 사용중인 공간에 여유 공간이 있더라도
재 사용되지 않는다. 이와 같은 이유 때문에 데이터에 대한 compress를 별도로 수행할 필요가 있을 수도 있다.

CONTENT 파라미터:
---------------

CONTENT 파라미터는 Export 또는 Import 세션에서 사용할 수 있다. 명백하게, export 값이 DATA_ONLY나
METADATA_ONLY였다면, 지정된 데이터만 덤프파일에 존재하여 import 시 사용할 수 있다.

기본값 : ALL

import 될 수 있는 내용을 제한하기 위해서는 다음과 같은 옵션을 사용할 수 있다 :

DATA_ONLY - 이미 존재하는 테이블에 대해서만 데이터를 load 시킨다. 없던 객체를 생성 시키지 않는다.
METADATA_ONLY - 데이터베이스 객체에 대한 정의만 load 시킨다. 테이블의 row 데이터를 load 시키지 않는다.
ALL - 소스의 데이터 및 메타데이터를 load 시킨다. 기본 값.





Example
-------


Reference Documents
-------------------
Note:261013.1 Importing into Existing tables with Oracle Data Pump
Oracle Database Utilities 10g Release 1 (10.1) 

 

 

 

 

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - SQL TRACE  (0) 2017.01.22
Oracle - Data Pump Export / Import 1편  (0) 2017.01.22
Oracle - Listener_EM Console  (0) 2017.01.21
Oracle - Pro*C  (0) 2017.01.21
Oracle - Recovery - Point in Time  (0) 2017.01.21
Posted by 농부지기
,

Listener, EM Console 시작,종료 방법 ]     

 

 10g DB, Listener, EM Console 시작,종료 방법

 

  1. listener, DB, EM 시작방법
 
# su - oracle
 
리스너 시작
$ lsnrctl start
The command completed successfully(마지막 줄에서 확인 가능)
 
리스너 상태확인
$ lsnrctl status
 
sysdba 권한으로 DB 접속
$ sqlplus "/ as sysdba" 
 
DB 시작
SQL> startup
SQL> exit
 
EM Console 시작
$ emctl start dbconsole
 
 
2. EM, listener, DB 종료방법
 
# su - oracle
 
EM Console 정지
$ emctl stop dbconsole
 
리스너 상태확인
$ lsnrctl status
 
리스너 정지
$ lsnrctl stop
The command completed successfully(마지막 줄에서 확인 가능)
 
sysdba 권한으로 DB 접속
$ sqlplus "/ as sysdba"
 
DB 정지
SQL> shutdown immediate
SQL> exit
 
3. 테이블스페이스 공간 확인
 
$ sqlplus "/ as sysdba"
 
SQL> Select tablespace_name,sum(bytes)/1024/1024 from DBA_DATA_FILES Group by tablespace_name;
 
4. 설치 상태 확인
 
sqlplus 접속만으로 설치 버전 확인 가능
$ sqlplus "/ as sysdba"
 
SQL>select * from v$version;
SQL>select * from v$option;
설치된 oracle dbms option이 출력됨. true로 확인
 

5. 프로세스 확인 방법
DB 상태 확인
$ ps -ef|grep ora_

 
listener 상태 확인
$ ps -ef | grep tns

 
 
웹브라우저에서 EM Console(DB 관리 화면)에 접속하려면
 
10g R1
http://DBserver-IP:5500/em/
 
10g R2
http://DBserver-IP:1158/em/
 

 

Posted by 농부지기
,

[ Oracle - Pro*C ]   

 

 

 Pro*C 

 

 
 
-. 오라클 데이타베이스 내의 테이블에 존재하는 레코드들을 조회,수정 등의 데이타 처리를 하고, 
   C프로그램으로 전환하기 위해 사용함.
-. C와의 차이점 
   -. 외형상의 차이 : 확장자가 .pc로 끝난다.
   -. 기본적으로 C문법을 따르며, C프로그램코드에 DB에 접속하여 레코드들을 처리하는 과정이 추가되어 
      작성된다.
      즉, C로 작성된 프로그램코드에 오라클의 SQL의 DML or DDL명령문이 'EXEC'구문과 결합된 형태가
       추가된 것임을 알 수 있다.
   -. 변수선언에서 C언어에서는 사용하지 않는, .arr과 .len이라는 변수가 컴파일된 C source코드에 
      생성되어 있는 것을 확인할 수 있다.

-. 컴파일 과정
   -. filename.pc -> filename.c -> filename.o -> filename*(생성된 오브젝트 파일을 링크해서 
      실행파일을  만드는 과정이다.)
 
-. 실제 컴파일
 -. makefile 위치 
 $ORACLE_HOME에 proc/에 보면 proc.mk파일이 있다.
 
 이중에서 
 1) USERID = uinfo/mation
  -. 오라클 DB에 접속할때 사용할 사용자 아이디와 비밀번호 지정
  
 2) DEST = /home/elfsun/simple/bin
 -. 컴파일후 실행파일을 복사할 디렉토리
 
 3) COMM_OBJ = /home/elfsun/simple/lib/lib1.o\
        /home/elfsun/simple/lib/lib2.o\
        /home/elfsun/simple/lib/lib3.o\
        /home/elfsun/simple/lib/lib4.o
 -. 컴파일시 참조로할 오브젝트 파일들.
 \(백슬레시)로 구분함.
 
 4) all : $(PROGRAM)
 -. 프로그램의 이름을 지정할 수 있다. 이것은 프로그램의 소스 이름이 되며, 컴파일후 생성될 
    실행 파일의 이름이 되기도 한다.
 
 5) install :
 -. 컴파일후 생성된 실행 파일을 복사해주는 작업을 수행
 
 6) clean : 
 -. 컴파일 과정에서 생성되는 C파일과 오브젝트 파일들을 삭제할때 수행
 
 이들중 수행할 각 명령들은 '@'바로 뒤에 작성해 줄 수 있다.
 
 [실제 컴파일 수행 - makefile이름이 proc.mk인 경우]
 
 1) 실제 컴파일을 하기 위해
  $ make -f proc.mk
 
 2) 컴파일한 실행 파일을 ~/bin/ 디렉토리에 복사하기 위해 
  $ make -f proc.mk install
 
 3) 컴파일 후 생성되는 오브젝트 파일과 c파일을 삭제하기 위해
  $ make -f proc.mk clean
  
-. SQLCA관련 변수들...
 -. sqlca.sqlerr[0] : fetch를 사용하여 쿼리된 레코드의 건수를 리컨시켜 주는 역할을 하는 
                      변수이다.
 -. sqlca.sqlwarn : 경고에 대한 정보들을 지니고 있는 변수이다.
 -. sqlca.sqlerrm.sqlerrmc : sql 명령수행중 에러가 발생했을때, 발생한 에러에 대한 내용과 오류 
                            코드번호에 관한 정보를 출력시켜 준다.
    ---------------------------------------
 -. sqlca.sqlcode값        내 용
    ---------------------------------------
    0  sql문이 정상적으로 수행
    
    1403  유일하게 양수값을 갖는 에러코드임.
      조건에 맞는 데이타가 하나도 없을때.
    
    -1405 조회된 값중 null값이 있을때
    ---------------------------------------


-. host변수 선언
 
 -. 호스트변수는 데이타베이스에서 데이타 처리 결과를 저장하기 위해 사용되며, 응용 프로그램내에서는 
    변수로서의 역할을 한다. 따라서 호스트 변수를 선언할 때에는 데이타베이스 내에서 사용되는 칼럼의
    데이타 타입과 그 크기를 고려하여 선언되어야 하며, 프리컴파일 과정을 통해 응용프로그램내에서도
    사용가능한 형태이어야 한다.
 ex)
 EXEC SQL BEGIN DECLARE SECTION;
  varchar username[16], userarea[10];
  int usrno, usrage;
 EXEC SQL END DECLARE SECTION;    
 
 [주의] 
 1) 호스트 변수 선언시에 오라클 예약어를 사용하지 말것.
 2) 호스트 변수에서는 null처리를 해주지 않기 때문에 응용 프로그램에서 반드시 null처리를 해주어야 한다. 
    단, 호스트 변수가 숫자형인 경우에는 예외이다.
   
-. DB접속
 방법1>
 EXEC SQL CONNECT elfsun
  INDENTIFIED BY 1234;
  
 방법2>
 EXEC SQL BEGIN DECLARE SECTION;
  varchar userid[8], passwd[8];
 EXEC SQL END DECALRE SECTION;    
 
 strncpy(userid.arr,"elfsun",6);
 strncpy(passwd.arr,"1234",4);
 
 EXEC SQL CONNECT :userid;
  IDENTIFIED BY :passwd;
 
 -. 일반적으로 방법2를 더 선호함.
 -. 방법2를 쓸때에 변수명 앞에는 반드시 :를 붙여서 사용하고 있는 변수가 호스트 변수임을 
    명시해야 한다.
 
-. CURSOR이용 : 쿼리문으로 조회되는 레코드가 한 건 이상일때 사용함.

 형식> 
 1) EXEC SQL PREPARE statement FROM variable;  (쿼리하고자 하는 sql문장 정의)
 2) EXEC SQL DECLARE cursor_name CURSOR FOR statement; ( 사용할 커서 선언 )
 3) EXEC SQL OPEN cursor_name;   ( 선언한 커서 열기 )  
 4) EXEC SQL FETCH cursor_name INTO :host_variable1, :host_variable2, :host_variable3, ....;  
                                 ( 열어둔 커서 실행 )
 5) EXEC SQL CLOSE cursor_name;  ( 열었던 커서 닫음 )
 

 1) EXEC SQL PREPARE statement FROM variable;  (쿼리하고자 하는 sql문장 정의)
  ex)
  char SqlCmd[100];    (변수 SqlCmd를 선언)
  memset(SqlCmd,0x00,sizeof(SqlCmd));  ( memset함수를 이용하여 초기화 작업함)
  sprintf(SqlCmd,"SELECT usrno, usrname, usrarea FROM forumlist");  (쿼리문을 SqlCmd에 대입함)
  EXEC SQL PREPARE st_1 from :SqlCmd; (EXEC..문장을 이용하여 쿼리할 구조를 정의함)
 2) EXEC SQL DECLARE cursor_name CURSOR FOR statement; ( 사용할 커서 선언 )
  형식1>
  EXEC SQL DECLARE cursor_name CURSOR FOR statement;
  형식2>
  EXEC SQL DECLARE cursor_name CURSOR FOR select 문장;
  
  -. cursor_name : 사용할 커서명
  ex)
  EXEC SQL DECLARE CUR_1 CURSOR FOR ST_1; (ST_1은 PREPARE에서 정의한것과 동일해야 함)
  EXEC SQL DECLARE CUR_1 CURSOR FOR select usrno, username, userarea From forumlist;

 3) EXEC SQL OPEN cursor_name;   ( 선언한 커서 열기 ) 
  ex)
  EXEC SQL OPEN CUR_1;
  
 4) EXEC SQL FETCH cursor_name INTO :host_variable1, :host_variable2, :host_variable3, ....;  
                      ( 열어둔 커서 실행 )
  ex)
  EXEC SQL BEGIN DECLARE SECTION;
   varchar usrname[16], usrarea[10];
   int usrno;
  EXEC SQL END DECLARE SECTION;
   ......
   
  EXEC SQL FETCH CUR_1 INTO :usrno, :usrname, :userarea;
  
  -. 여기서 사용하는 조회된 칼럼들과 1대1로 대응되어야 한다.
  또한 사용될 호스트 변수들은 이미 이전에 선언이 되어 있어야만 사용이 가능하다. 
  칼럼의 데이타 타입과 크기가 일치해야함에도 주의.

 5) EXEC SQL CLOSE cursor_name;  ( 열었던 커서 닫음 )
  ex) 
  EXEC SQL CLOSE CUR_1;

-. 오류 처리
 1) whenever sqlerror 구문 
  형식)
  ① EXEC SQL WHENEVER SQLERROR GOTO stop_st;
  
  ② EXEC SQL WHENEVER SQLERROR GOTO STOP;
  
  ③ EXEC SQL WHENEVER SQLERROR GOTO CONTINUE;
   
  -. 위 문장들은 SQL문장의 수행 결과 리턴되는 sqlca.sqlcode의 값이 음수로서, 에러를 발생시키는 경우, 더이상
  프로그램을 진행시키지 않도록 stop_st루틴(①번에 해당)으로 분기하여 프로그램의 에러처리를 하도록 하는 문장임.
  stop_st대신 STOP나 CONTINUE를 쓰기도 한다.
  
  -. 또한 실행시켰던 SQL문장들이 레코드의 값 자체의 변경과 관련이 있는 문장들, 즉 INSERT, DELETE, UPDATE와 같은
  SQL문장들이었다면, 'EXEC SQL ROLLBACK WORK'명령을 이용하여 그 트렌잭션을 취소시키는 과정을 추가해 주어야 한다.
  
 2) whenever not found 구문
  형식)
  EXEC SQL WHENEVER NOT FOUND GOTO stop_st;
  
  EXEC SQL WHENEVER NOT FOUND STOP;
  
  EXEC SQL WHENEVER NOT FOUND CONTINUE;
  
  -. 위 문장들은 SQL문장 실행 결과 sqlca.sqlcode값이 1403으로 조건에 맞는 레코드 건수가 
     하나도 없는 경우이다.
  
-. ProC내에서의 select 문장
 ex1)
 -------------------------------------------------------------
 EXEC SQL BEGIN DECALRE SECTION;
  varchar usrname[16], usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL SELECT usrno, usrname, usrarea
  INTO : usro, :usrname, :usrarea
  FROM forumlist
  WHERE usrno=5;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 EXEC SQL COMMIT WORK;
 
 printf("\n 회원의 고유번호 =%d",usrno);
 printf("\n 회원의 이름  =%d",usrname.arr);
 printf("\n 회원의 이름(크기) =%d BYTE", usrname.len);
 printf("\n 회원의 거주지역 =%s", usrarea.arr);
 printf("\n 회원의 거주지역(크기) =%d BYTE", usrarea.len);
 
 stop_st :
 printf("\n 에러메시지 =%s", sqlca.sqlerrm.sqlerrmc);
 -------------------------------------------------------------
 -. into 구문은 쿼리 결과에 만족하는 데이타를 검색해 와서 into구문 뒤의 변수에 각각 할당한다.
 -. 호스트 변수명 앞에 (:)을 붙여 줌으로써 조회할 테이블이 칼럼명과 구분을 지어 준다.
 
 ex2)
 -------------------------------------------------------------
 EXEC SQL BEGIN DECALRE SECTION;
  varchar usrname[16], usrarea[10];
  int usrno;
  char SqlCmdp100];
 EXEC SQL END DECLARE SECTION;
 
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(Sqlcmd,"select usrno, usrname, usrarea from forumlist");
 EXEC SQL PREPARE ST_1 FROM :SqlCmd;
 EXEC SQL DECLARE CUR_1 FOR ST_1;
 EXEC SQL OPEN CUR_1;
 EXEC SQL FETCH SUR_1 INTO :usrno, :usrname, :usrarea;
 if (sqlca.sqlcode < && sqlca.sqlcode != -1405)
 {
  printf("\n 에러메시지 = %s", sqlca.sqlerrm.sqlerrmc);
  printf("\n 레코드 조회시 에러 발생!");
  EXEC SQL CLOSE CUR_1;
  EXEC SQL ROLLBACK WORK;
  exit();
 } /* error */
 else if(sqlca.sqlcode == 1403)
 {
  printf("\n 에러메시지 ="%s", sqlca.sqlerrm.sqlerrmc);
  printf('\n 조건에 맞는 데이타가 없슴다!");
  EXEC SQL CLOSE CUR_1;
  EXEC SQL ROLLBACK WORK;
  exit();
 } /* not exist */
 while(sqlca.sqlcode ==0)
 {
  printf("\n 회원의 고유번호 =%d",usrno);
  printf("\n 회원의 이름  =%d",usrname.arr);
  printf("\n 회원의 이름(크기) =%d BYTE",usrname.len);
  printf("\n 회원의 거주지역 =%s", usrarea.arr);
  printf("\n 회원의 거주지역(크기) =%d BYTE", usrarea.len);
  EXEC SQL FETCH CUR_1 INTO :usrno, :usrname, :usrarea;
 } /* while */
 printf("\n 오라클 메시지 = %s",sqlca.sqlerrm.sqlerrmc);
 printf("\n 레코드가 성공적으로 조회되었습니다.");
 EXEC SQL CLOSE CUR_1;
 EXEC SQL COMMIT WORK;
 -------------------------------------------------------------
 
-. PROC속의 UPDATE문장
 -----------------------------------------------------------------------------
 ex1)
 EXEC SQL BEGIN DECLARE SECTION;
  varchar username[16], usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION; 
 
 EXEC SQL SELECT usrno, username, usrarea
  into :usrno, :usrname, :usrarea
  from forumlist
  where usrno=3;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경전 회원[%d]번의 거주지역 =[%s]",usrno,usrarea.arr);
 EXEC SQL COMMIT WORK;
 strcpy(userarea.arr,"SEOUL");
 usrarea.len =5;
 
 EXEC SQL UPDATE FORUMLIST
  SET usrarea =:usrarea
  WHERE usrno =3;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 EXEC SQL COMMIT WORK;
 printf("\n 오라클 메시지 =%s",sqlca.sqlerrm.sqlerrmc);
 
 EXEC SQL SELECT usrno,usrarea
  INTO :usrno, :usrarea
  FROM forumlist
  WHERE usrno=3;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경후의 회원 [%d]번의 거주지역 =[%s]", usrno.usrarea.arr);
 EXEC SQL COMMIT WORK;
 exit();
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n 에러발생 =%s",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 
 -----------------------------------------------------------------------------
 ex2) 
 EXEC SQL BEGIN DECLARE SECTION;
  varchar usrname[16], usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 char SqlCmd[100];
 
 EXEC SQL select usrno,username,usrarea
  into :usrno, :usrname, :usrarea
  from forumlist
  where usrno=3;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경전의 [%d]번째 회원의 거주지역 =[%s]", usrno, usrarea.arr);
 EXEC SQL COMMIT WORK;
 
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(SqlCmd,"UPDATE FORUMLIST set usrarea=%s \ (한 문장이 끝나지 않았기 때문에 \(역슬래시)를
  사용함)
    where usrno=3","seoul");
 EXEC SQL EXCUTE IMMEDIATE :SqlCmd;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 EXEC SQL COMMIT WORK;
 
 EXEC SQL select usrno, usrarea
  into :usrno, :usrarea
  from forumlist
  where usrno=3;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경후의 [%d]번째 회원의 거주지역 =[%s]", usrno,usrarea.arr);
 EXEC SQL COMMIT WORK;
 exit();
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n 에러 메시지 =%s", sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 -. 위의 update문을 약간 수정하면
  sprintf(SqlCmd,"update forumlist set userarea=%s where usrno=%d","seoul",3);로 해도 됨.

-. ProC속의 Insert문장
 -----------------------------------------------------------------------------
 ex1)
 EXEC SQL BEGIN DECLARE SECTION;
  varchar usrname[16], usrarea[10], usrkindcode[4];
  int usrno ;
 EXEC SQL END DECLARE SECTION;
 int tot;
 
 tot =0;
 usrno=10;
 strncpy(usrname.arr,"LEE-Y-S",Strlen("LEE-Y-S"));
 strncpy(usrarea.arr,"seoul",strlen("seoul"));
 strncpy(usrkindcode,"1004",strlen("1004"));
 
 EXEC SQL INSERT INTO FORUMLIST(usrno, usrname, usrarea, usrkindcode)
  values(:usrno, :usrname, :usrarea, :usrkindcode);
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 printf("\n insert success!!");
 printf("\n 오라클 메시지 = %s", sqlca.sqlerrm.sqlerrmc);
 
 EXEC SQL SELECT COUNT(*)
  INTO :TOT
  FROM FORUMLIST
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수 =%d", tot);
 EXEC SQL COMMIT WORK;
 
 EXEC SQL SELECT usrno, usrarea
  INTO :usrno, :usrarea
  FROM FORUMLIST
  WHERE usrno=10;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 추가된 회원 [%d]번의 거주지역 =[%s]", usrno, usrarea.arr);
 EXEC SQL COMMIT WORK;
 
 stop_st;
 EXEC SQL ROLLBACK WORK;
 printf("\n 오라클 에러=%d",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 ex1은 insert문장에 함께 기술해 줄 호스트 변수들을 선언해 주었지만...
 ex2에서는 선언하지 않았다.
 ex2의 첨에 있는 usrarea는 그 다음에 수행할 select명령에 필요한 선언 문장이다.
 -----------------------------------------------------------------------------
 ex2)
 EXEC SQL BEGIN DECLEARE SECTION;
  varchar usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 char SqlCmd[100];
 int tot;
 
 tot=0;
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(SqlCmd,"insert into forumlist(usrno, usrname, usrarea, \
   usrkindcode) values(%d, %s, %s, %s)", \
   10,"lee-k-y","seoul","1004");
 EXEC SQL EXECUTE IMMEDIATE :SqlCmd;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n Insert Success!");
 
 EXEC SQL SELECT count(*)
  into :tot;
  from forumlist
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수 = %d",tot);
 EXEC SQL COMMIT WORK;
 
 EXEC SQL SELECT usrno, usrarea
  into :usrno, :usrarea
  from forumlist
  where usrno=10;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 printf("\ 추가된 회원 [%d]번의 거주지역 =[%s]",usrarea.arr);
 EXEC SQL COMMIT WORK;
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n 오라클 에러 = %d", sqlca.sqlerrm,sqlerrmc);
 -----------------------------------------------------------------------------
-. Proc내에서의 delete문장.
 
 -----------------------------------------------------------------------------
 ex1) 
 EXEC SQL BEGIGN DECLRAE SECTION;
  varchar usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 int tot;
 
 tot=0;
 EXEC SQL DELETE FORUMLIST WHERE USRNO=10;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 EXEC SQL COMMIT WORK;
 
 printf("\n Delete 문장 성공!!");
 
 EXEC SQL SELECT count(*)
  into :tot;
  from forumlist
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수 =%d",tot);
 EXEC SQL COMMIT WORK;
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n Oracle Error =%d",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 -. 어떠한 호스트 변수도 사용하지 않음.
 
 -----------------------------------------------------------------------------
 ex2) 
 EXEC SQL BEGIN DECLARE SECTION;
  varchar usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 char SqlCmd[100];
 int tot;
 tot=0;
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(SqlCmd,"Delete forumlist where usrno=%d",10);
 EXEC SQL EXCUTE IMMEDIATE :SqlCmd;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 EXEC SQL COMMIT WORK;
 
 prinf("\n Delete Success!!");
 
 EXEC SQL SELECT COUNT(*)
  INTO :TOT;
  FROM FORUMLIST
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수=%d",tot);
 EXEC SQL COMMIT WORK;
 
 stop_st;
 EXEC SQL ROLLBACK WORK;
 printf("\n Oracle Error : =%d",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 -. where절에서 회원의 고유번호값을 지정해주었다.는 점이 ex1과 다른점이다.
 -. delete 부분을 다음과 같이 수정해도 된다.
  usrnum=10;
  sqlprintf(SqlCmd,"delete forumlist where usrno=%d",usrnum);
  이처럼 변수를 먼저 선언해준 후 값을 대입해서 삭제 하는 방법도 있다.

-. 트랜잭션의 제어
 
 -. EXEC SQL COMMIT WORK;
     : DML 명령인 INSERT, DELETE ,UPDATE 문장을 수행한 경우에 유용하다.
     : DDL 명령은 자동 COMMIT 되므로 사용안해도 됨.
 
 -. EXEC SQL ROLLBACK WORK;    
     
-----------------------------------------------------------------------------------------------
? memset :

 

Posted by 농부지기
,

[ Oracle - Recovery - Point in Time ]

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

 
Oracle 8i Point-in-Time Recovery는 Archive log mode인 경우 아래의 상황에서 적용할 수 있다.
 
1. 실수로 Table을 delete 혹은 drop 했을 때
2. Datafile Resize 실패로 인한 DB 장애 발생시
 
Delete, Drop, Datafile Resize 장애 시점: Wed Nov 19 15:19:39 2004
 
*Datafile Resize 장애의 예 
Wed Nov 19 15:19:39 2004
/* OracleOEM */ ALTER DATABASE DATAFILE 'D:\ORADATA\ORCL\KANG01.DBF' RESIZE  4096M 
Wed Nov 19 15:20:46 2004
Completed: /* OracleOEM */ ALTER DATABASE DATAFILE 'D:\ORADAT
Wed Nov 19 15:23:50 2004
KCF: write/open error block=0xabc36 omline=1
     file=7 D:\ORADATA\ORCL\KANG01.DBF
     error=27069 txt: 'OSD-04026: 부적당한 매개변수가 보내졌습니다 (OS 703542)'
Automatic datafile offline due to write error on
file 7: D:\ORADATA\ORCL\KANG01.DBF
 

다음의 시나리오는 Full backup(DB를 shutdown 상태에서 받은 Datafiles, Redo log files, controlfiles)이 존재하지 않고
Hot backup(datafile)만 존재하는 상황에서 복구하는 방법이다.

 
**********************  현재 DB에서 작업 **********************
0. DB에 접속한다.
C:\> svrmgrl
SVRMGR> connect internal
or
C:\> sqlplus internal
 
1. 현재 DB 모드가 Archive log mode인지 확인한다.
SVRMGR> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            D:\ORADATA\ARCHIVE
Oldest online log sequence     440
Next log sequence to archive   442
Current log sequence           442
 
2. 현재 controlfile을 trace로 생성한다.
SVRMGR> alter database backup controlfile to trace;
 
3. trace가 어느 경로에 생성 되는지 확인한다.
SVRMGR> show parameter user_dump_dest
 
4. 위에서 확인한 경로에서 가장 최근에 생성된 trc 파일을 열고 수정한다.
NORESETLOGS -> RESETLOGS로 변경(Hotbackup 받은 Datafile로 복구할때)

CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 254
    MAXINSTANCES 1
    MAXLOGHISTORY 678
LOGFILE
  GROUP 1 'D:\ORADATA\ORCL\REDO01.LOG' SIZE 10M reuse,     * --> reuse 추가
  GROUP 2 'D:\ORADATA\ORCL\REDO02.LOG' SIZE 10M reuse,     * --> reuse 추가
  GROUP 3 'D:\ORADATA\ORCL\REDO03.LOG' SIZE 10M reuse      * --> reuse 추가
DATAFILE
  'D:\ORADATA\ORCL\SYSTEM01.DBF',
  'D:\ORADATA\ORCL\RBS01.DBF',
  'D:\ORADATA\ORCL\KANG01.DBF',
  'D:\ORADATA\ORCL\USERS01.DBF',
  'D:\ORADATA\ORCL\TEMP01.DBF',
  'D:\ORADATA\ORCL\TOOLS01.DBF',
  'D:\ORADATA\ORCL\INDX01.DBF'
;
 
5. 현재 DB shutdown
SVRMGR> shutdown immediate
 
6. 현재 DB Cold Backup
장애가 발생한 현재 DB를 모두 백업
(D드라이브의 여유가 충분 하다면 D:\ORADATA 폴더 이름을 D:\ORADATA_20041119 로 변경함)
 
 
**********************  과거 DB에서 작업 **********************
7. 이전에 받은 Hot backup을 복원한다. (cold backup을 restore할 경우 controlfile 재생성은 skip한다.)
백업장치, 혹은 Disk에서 D:\ORADATA로 copy
 
8. DB에 접속한다.
C:\> svrmgrl
SVRMGR> connect internal
or
C:\> sqlplus internal
 
9. DB를 nomount 시킴
SVRMGR> startup nomount
 
10. Controlfile 재생성
SVRMGR>
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 254
    MAXINSTANCES 1
    MAXLOGHISTORY 678
LOGFILE
  GROUP 1 'D:\ORADATA\ORCL\REDO01.LOG' SIZE 10M reuse,
  GROUP 2 'D:\ORADATA\ORCL\REDO02.LOG' SIZE 10M reuse,
  GROUP 3 'D:\ORADATA\ORCL\REDO03.LOG' SIZE 10M reuse
DATAFILE
  'D:\ORADATA\ORCL\SYSTEM01.DBF',
  'D:\ORADATA\ORCL\RBS01.DBF',
  'D:\ORADATA\ORCL\KANG01.DBF',
  'D:\ORADATA\ORCL\USERS01.DBF',
  'D:\ORADATA\ORCL\TEMP01.DBF',
  'D:\ORADATA\ORCL\TOOLS01.DBF',
  'D:\ORADATA\ORCL\INDX01.DBF'
;
 
11. Point-in-Time Recovery 수행
SVRMGR> set autorecovery on
SVRMGR> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL TIME '2004-11-19:15:19:36';   --> 장애발생 이전 시점으로 복구한다.
...
SVRMGR> alter database open resetlogs;   --> recovery에서 until 옵션을 사용할 경우. 즉 Incomplete recovery시 resetlogs 옵션 사용한다.
 
12. 장애가 발생한 Tablespace에 포함된 table 혹은 drop,delete 작업을 수행한 table을 export함.
D:\> exp kang/kang file=kang.dmp log=kang_exp.log tables=emp,dept,bonus,dummy
 
13. export가 완료된 뒤 과거 DB shutdown하고 삭제
SVRMGR> shutdown abort
 
탐색기로 D:\ORADATA 하위 디렉토리 모두 삭제
 
14. 현재 DB 복원
D:\ORADATA_20041117 --> D:\ORADATA 로 폴더이름 변경
 
 
**********************  현재 DB에서 작업 **********************
15. 현재 DB mont
SVRMGR> startup mount
ORACLE instance started.
Total System Global Area                        653465628 bytes
Fixed Size                                          75804 bytes
Variable Size                                   337760256 bytes
Database Buffers                                314572800 bytes
Redo Buffers                                      1056768 bytes
Database mounted.
 
16. 장애가 발생한 Datafile 삭제 (Tablespace에 장애가 발생한 경우만 진행한다.)
SVRMGR> alter database datafile 'D:\ORADATA\ORCL\KANG01.DBF' offline drop;
Statement processed.
SVRMGR> alter database open;
Statement processed.
 
17. 장애가 발생한 Tablespace 삭제 (Tablespace에 장애가 발생한 경우만 진행한다.)
SVRMGR> drop tablespace KANG including contents;
Statement processed.
 
18. 같은 이름의 Tablespace 생성 (Tablespace에 장애가 발생한 경우만 진행한다.)
SVRMGR> create tablespace KANG datafile 'D:\ORADATA\ORCL\KANG01.DBF' size 3000m;
Statement processed.
 
19. 12번에서 생성된 OLD DB의 export파일을 이용하여 import 작업 수행
D:\>imp kang/kang file=kang.dmp fromuser=kang commit=y log=kang_imp.log
 
20. DATA 복원 완료.

Oracle - Listener_EM Console  (0) 2017.01.21
Oracle - Pro*C  (0) 2017.01.21
Oracle - Data를 Insert 문장으로 만들기  (0) 2017.01.21
Oracle - Export Script  (0) 2017.01.21
Oracle - Export  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - Data를 Insert 문장으로 만들기 ] 

 

 

☞ 정의

 

1. 정의 : DB에 저장 되어 있는 자료를 Toad를 이용해서 Insert 문장으로 만들기

☞ 방법

 

1. Toad에서 Schema Browser를 연다.
2. Insert 문장으로 만들고 싶은 테이블을 double click한다.
3. 그러면 아래와 같이 나온다.
4. Data Tab page에서  오른쪽 마우스를 누르면 [Save As]가 나온다.

   



5. 그러면 아래와 같이 POP_UP창이 뜬다.
   - Export Format : Insert Statements  (Insert 문장을 만들기 때문)
   - Insert Table  : Insert 문장을 만들고 싶은 테이블명
   - File : Insert문장을 만들어서 저장할 파일명

   



6. 완료
   - 해당 폴더에 가면 파일이 생성되어져 있고, 그 곳에 insert 문장들이 수두록 하게 존재 한다.
   - 참고, 위 4번 화면.data Tab page에 보여지는 레코드만 insert 문장으로 만들어진다.
           만약, filter를 했을 경우 filter 에 적용된 레코드만 insert 문장으로 만들어진다.

7. Pop_UP창에서
   [Export Format] 콤보에서  --> [Merge Statements]를 하게 되면 Merge sql문장으로 만들 수 있다.

 

 


 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Pro*C  (0) 2017.01.21
Oracle - Recovery - Point in Time  (0) 2017.01.21
Oracle - Export Script  (0) 2017.01.21
Oracle - Export  (0) 2017.01.21
Oracle - SQL*PLUS  (0) 2017.01.21
Posted by 농부지기
,

[ Export Script]     

 

☞ Script만 Export하기

 
1. 정의 : Procedure, Function, View 등 Script만 Export하기

2. Toad에서 방법
   메뉴 : Database -> Export -> Generate Schema Script
               [Source and Output] tab
                    [v] Create Individual Object DDL Files
                    Top Level Directory;
                    [                     ] [...]
               [Object Types] tab 
                  [v] Funcitons
                  [v] Procedures
               [Source and Output] tab에 와서
             위쪽에 있는  초록색[>] 버튼을 누른다.

   

 

   



3. 참고
   - Tables :를 체크 하면
             테이블의 Create Script 문장이 만들어 진다.
 




 

 

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Recovery - Point in Time  (0) 2017.01.21
Oracle - Data를 Insert 문장으로 만들기  (0) 2017.01.21
Oracle - Export  (0) 2017.01.21
Oracle - SQL*PLUS  (0) 2017.01.21
Oracle - Sequence  (0) 2017.01.21
Posted by 농부지기
,

[Oracle - Export  ]

 


 Win오라클 export 자동 백업

 
 제목: 자동 export 및 정기적인 자동 삭제 배치파일 만들기
 
작성자: 강명호
작성일: 2004년 11월 26일
 
배치파일 장점
exp_daily.bat 배치파일을 수행할 경우 매일 export가 수행되고 
exp_delete.bat 배치파일을 수행할 경우 2, 3일의 백업을 항상 보유하며 주기적으로 삭제하기 때문에 더 이상 Disk가 꽉 차는 현상(Disk Full)을 막을 수 있다.
단점.
DB의 Size가 클 경우 매일 export 받는다면 Local Disk의 공간 부족 현상이 발생할 수 있다. 이런 경우에는 여러 개의 백업을 보유하기 힘들기 때문에 좀 더 주기적으로 삭제하거나 백업받은 파일을 압축하여 관리해야 한다. 백업하고 자동으로 압축하는 방법은 다음에... ^_^;;
 
 
1. 배치파일 만들기
시작 --> 실행 --> notepad  실행하여 각각 배치파일의 내용을 붙여넣기 한 다음 설정된 파일 이름으로 변경한다
 
exp_daily.bat
@echo off
SET ORACLE_SID=ORCL
for %%a in (%date%) do SET day=%%a
md D:\ORA_BACKUP\EXP\1\%day%
C:\oracle\ora92\BIN\EXP system/manager file=D:\ORA_BACKUP\EXP\1\%DAY%\%DAY%-full.dmp full=y  log=D:\ORA_BACKUP\EXP\1\%DAY%\%DAY%-full-exp.log
 
exp_daily.bat 설명
D:\ORA_BACKUP\EXP\1\ 하위 디렉토리에 날짜 폴더가 생성되고 
system 유저로 Full export를 수행하며 날짜 이름의 dmp, log 파일이 생성된다
 
exp_delete.bat
rd /s /q D:\ORA_BACKUP\EXP\2
move D:\ORA_BACKUP\EXP\1 D:\ORA_BACKUP\EXP\2
 
exp_delete.bat 설명
D:\ORA_BACKUP\EXP\2 디렉토리를 지우고 
D:\ORA_BACKUP\EXP\1 디렉토리를 D:\ORA_BACKUP\EXP\2 디렉토리로 폴더 이름을 변경한다.
 
 
2. 작업 예약 설정하기

매일 새벽 1시에 export 받는 작업 예약하기
C:\> at 01:00 /every:Su,M,T,W,Th,F,S D:\ORA_BACKUP\exp_daily.bat
 
매주 일,수 밤 10시에 백업 삭제하는 작업 예약하기
C:\> at 22:00 /every:Su,W D:\ORA_BACKUP\exp_delete.bat
 
AT 명령 변수 설명
 /every: date ,... : 
이 매개 변수를 사용하여 매주 금요일이나 매월 8일처럼 
지정된 요일이나 날짜에 작업을 실행하도록 예약합니다. 
하나 이상의 요일(다음 약자 사용: M,T,W,Th,F,S,Su)이나 
하나 이상의 날짜(숫자 1 - 31 사용)로 date를 지정합니다. 
쉼표를 사용하여 여러 날짜 항목을 구분해야 합니다. 
이 매개 변수를 생략하면 현재 날짜에 작업이 실행되도록 예약됩니다.
 
*** 주의 ***
SID, EXP 파일의 경로, 백업 받을 경로, export주기, 삭제 설정은 사용자의 환경에 맞게 수정하여 사용하면 된다.

 Windows 2000 서버에서 오라클 백업하기

 
제가 사용하는 스크립트 입니다.
설명을 붙이 자면 날짜와 시간을 받아서 화일명을  바꾸는 배치화일을 만들고
At 이라는 스케줄러를 이용하여 백업을 합니다.
 
물론 Exp 를 이용하여 벡업을 하고 있습니다.
 
참고로  Doff 라는 프로그램을 이용하며 날짜을 넘겨 받을수 있도록 합니다.(하단 소스 참고)
 
============================================================================
# at 04:00 /every:M,T,W,Th,F,S,Su E:ORACLE_BKscriptfullbackup.bat
at 03:00 /every:M,T,W,Th,F,S,Su E:ORACLE_BKscriptuserdump.bat
at 04:00 /every:M,W,F,Su E:ORACLE_BKscriptfullbackup.bat
=============================================================================
 
================================ Full backup.bat===============================
@echo off
 
for /f "tokens=1-3 delims=/ " %%a in ('doff mm/dd/yyyy -1') do (
set mm=%%a
set dd=%%b
set yyyy=%%c)
 
e:
cd E:ORACLE_BK

rename fullbackup.dmp fullbackup-%yyyy%%mm%%dd%.dmp
exp system/systempass file='E:ORACLE_BKfullbackup.dmp' full=y
===================================================================
 
 
================================ userdump.bat===============================
@echo off
for /f "tokens=1-3 delims=/ " %%a in ('doff mm/dd/yyyy -1') do (
set mm=%%a
set dd=%%b
set yyyy=%%c)
 
e:
cd E:ORACLE_BK

rename user.dmp user-%yyyy%%mm%%dd%.dmp
exp userid=user/userpass file='E:ORACLE_BKuser.dmp'
===================================================================
 
=============================doff.exe ========================================
* 
** doff - prints a formatted date string offset by a specified time interval
**
** File:    doff.c
** Author:  John Fitzgibbon (fitz@jfitz.com http://www.jfitz.com)
** Version: 1.0
** Date:    11/08/1999
**
** This program and code is FREEWARE.
**
**  Command line format: doff [format_str [offset_str [exclude_format_str]]]
**  doff -h to display help.
**
**  Revision History
**  11/08/1999 1.0 Original Version 
*/
char helpstr[] = 
"doff - Prints a formatted date string offset by a specified time intervaln"
"syntax is: doff [format_str [offset_str [exclude_format_str]]]n"
"       or: doff -h   (displays this help screen)n"
"n"
"format_str, (case sensitive), may include any of the following:n"
"  yyyy - replaced by four digit year in output stringn"
"  yy - replaced by two digit year in output stringn"
"  mm - replaced by month (1 - 12) in output stringn"
"  dd - replaced by day (1 - 31) in output stringn"
"  hh - replaced by hour (0 - 23) in output stringn"
"  mi - replaced by minute (0 - 59) in output stringn"
"  ss - replaced by second (0 - 59) in output string (leap seconds = 59)n"
"Other characters in format_str are returned as-isn"
"n"
"offset_str, (case sensitive), is specified as [+/-]n[smhd]n"
"  "n" is the offset valuen"
"  offset qualifiers are: s = seconds, m = minutes, h = hours, d = daysn"
"n"
"exclude_format_str has the same format as format str.n"
"Patterns in exclude_format_str that would normally be translated are ignored.n"
"For example, including "ss" in exclude_format_str means "ss" will appearn"
"untranslated in the output string.n"
"n"
"Default offset value is zero, default offset qualifier is daysn"
"Bad offset values default to zero, bad offset qualifiers default to daysn"
"Note: -10xd will evaluate to "10 days ago", (because atoi("-10x") = -10)n"
"  but -x10d will evaluate to "now", (because atoi("-x10") = 0)n"
"n"
"When both format_str and offset_str are omitted the output format is:n"
"yyyymmddhhmissn";
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
int main (int argc, char * argv[])
{
  time_t etime;
  struct tm * stime;
  char dstr[15];
  char * cp;

  if ((argc > 1) && !strncmp(argv[1],"-h",2))
  {
    puts(helpstr);
    exit(0);
  }
  time(&etime);
  if (argc > 2)
  {
    if ((cp = strstr(argv[2],"s")) != NULL) // offset seconds
    {
      *cp = '

스크랩을 하면서...
doff를 이용하여 날짜를 파일 이름에 넣을 수 있습니다.
 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Data를 Insert 문장으로 만들기  (0) 2017.01.21
Oracle - Export Script  (0) 2017.01.21
Oracle - SQL*PLUS  (0) 2017.01.21
Oracle - Sequence  (0) 2017.01.21
Oracle - Gateway 사용 하기  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - SQL*PLUS]


☞ SQL*PLUS기능

 

1. SQL문을 인식하여 서버로 보내주는 역할 담당
2. SQL의 사용을 편리하게 하기 위해 Oracle 자체로 지원하는 명령어를 제공
3. 축약하여 사용이 가능, 명령어가 긴 경우 라인 구별시 연결 명령어 -(dasu) 사용


☞ SQL*PLUS접속방법
 

1. WEB을 이용한 접속방법
   -http://<host-name>:port/isqlplus - <host-name>은 오라클이 설치된 서버의 이름
2.

 

☞ 버퍼에 있는 명령어 편집하기

 

- A(PPEND) text : line의 끝에 text를 추가함 
- C(HANGE) /old/new : old를 new로 바꿈 
- DEL n : n line를 지움 
- I(NPUT) text : 다음 line에 text를 추가함 
- L(IST) 전체 문장을 보여줌 
- n text : n line전체를 text로 바꿈 
- R(UN) : buffer에 있는 문장을 실행함 (/와 같음) 
- EDIT : buffer에 있는 문장을 파일로 부룸(afdeidt.buf)

 

SQL>  SELECT name , dept-id
2  FROM s_emp ;
SELECT name , dept-id
                    *
ERROR at line 1:
ORA-00904: invalid column name
SQL> c/-/_
1* SELECT name , dept_id
SQL> list
1  SELECT name , dept_id
2* FROM s_emp
SQL> run
1  SELECT name , dept_id
2* FROM s_emp

☞ 파일에 있는 명령어 편집하기

 

1. SAVE a : buffer에 있는 내용을 a.sql 파일로 저장
2. GET a : 파일 a에 있는 내용을 buffer로 부름
3. START a (@a) 파일 a를 실행함

☞ 환경설정 : SET 환경변수 값

 

- COLSEP (text)     : 칼럼이 표시될 때 칼럼간의 구별문자, 기본값은 공백
- FEEDBACK (off|on) : 선택된 행이 몇행인지를 표시함, 기본값은 6행 이상인 경우에 on
- HEADING (off|on)  : 칼럼에 대한 HEADING를 표시함, 기본은 24
- LINESIZE (n)      : 한 라인당 표시되는 문자의 수, 기본값은 80
- PAGES (n)         : 한 페이지당 표시되는 라인 수, 기본값은 24
- PAUSE (off|on|text) : 「ENTER」키를 누를 때마다 화면이 지나감, 기본값은 off
- TIMING (off|on)   : SQL문장이 처리되는데 걸리는 시간을 표시, 기본값은 off
- VERIFY (off|on)   : & 변수로 값을 받는 경우 화면에 확인하기 위해 old, new 를 출력할 것인지 
                    여부, 기본 값은 on
※ SHOW ALL : SET 환경이 어떻게 설정되어 있는지 보는 명령어

☞ㅇ 표시형식

 

- COLUMN : COL(UMN) [칼럼이나 ALIAS] [옵션]
         : 칼럼의 Heading이나 폭, 표시형식을 바꿈
         : 옵션 - CLE(AR), FOR(MAT), HEADING text
- BREAK  : BREAK ON [칼럼명 이나 ALIAS], 해제는 CLEAR BREAK
         : 같은 값의 출력을 하지 않고 한번만 출력 
- TITLE, BTITLE : BTITLE|TTITLE [문자|OFF|OF]

☞기타 명령어

 

- DESC [TABLE 명] : 특정 테이블 구조를 확인 
- HELP [topics] : 도움말을 지원받음

☞치환변수 사용

 

- '&'의 사용 예 : WHERE dept_id = &부서번호 ;
  Enter value for 부서번호: 112 
- '&&'의 사용 : 입력받은 값을 다시 적용 가능 
- 'DEFINE'의 사용 예 : DEFINE title_name = 사원
                       WHERE title = '&title_name'; 
- ACCEPT를 사용 : ACCEPT [변수명] [데이터 타입] [FORMAT PROMPT] [text[ [HIDE]
                : 데이터 타입 - NUMBER, CHAR, DATE 중에서 지정
                : FORMAT - A10, 9, 999 등의 표시 형식 지정
                : PROmPT text - 사용자가 데이터를 입력할 때 보여주는 문장
                : password 등을 지정시 화면에 보이지 않도록 함
                : 사용 예) ACCEPT pswd CHAR PROMPT 'Password : ' HIDE


 

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Export Script  (0) 2017.01.21
Oracle - Export  (0) 2017.01.21
Oracle - Sequence  (0) 2017.01.21
Oracle - Gateway 사용 하기  (0) 2017.01.21
Oracle - Export/Imprt  (0) 2017.01.21
Posted by 농부지기
,