반응형

공략 포인트

 

앞의 두 과목을 무사히 통과했다면 이제 기본은 완성되었으므로 약간 긴장을 늦추고 공부 해도 좋다. 네트워크 과목은 좀 다르지만 백업과 복구, 퍼포먼스 튜닝은 기존의 지식을 바탕으로 풀어가는 것이므로 수험자의 체감 부담이 적다.

 

DBA의 가장 중요한 업무에 대해서 설문 조사를 한다면 십 중 팔구 백업이 일순위로 꼽힐 것이다. DBA의 책임 영역은 데이터를 안전하게 보호하고 데이터를 필요로 하는 사람에게 원활한 공급이 이루어 지도록 하는 것이다. 따라서 데이터를 손실 위험으로부터 지키기 위하여 백업을 받고 매끄러운 공급을 위해서 크고 작은 관리작업과 튜닝을 수행한다.

 

백업을 제외한 다른 업무는 제대로 수행하지 못했더라도 얼마든지 만회할 기회가 있다. 데이터베이스의 구조가 잘못 되었다면 추석 연휴를 반납하고라도 뜯어 고치면 되고 기대 이하의 성능에는 다소의 예산을 투입해서 튜닝 진단을 받으면 된다. 또한 디스크가 엉망으로 얽혀버렸는데 복구에 익숙치 않다면 오라클에서 지원을 받을 수도 있다. 데이터베이스가 다운된 후 복구 되기 까지 걸리는 평균 시간(Mean Time To Recovery)이 DBA의 평가 요소에서 큰 부분을 차지하므로 이렇게 자꾸 외부의 힘을 빌리는 것은 곤란하지만 자신의 능력을 넘어서는 일에 대해서는 지체 없이 도움을 받는 것이 현명한 선택일 것이다.

 

그러나 백업은 절대적으로 DBA의 몫이다. 백업 플랜을 작성하고 계획한 절차대로 수행하는 것은 어려운 일이 아니지만 여기서 실수가 발생하면 DBA로서의 자질과 성실성에 큰 손상을 입는다. 또한 백업이 잘못되면 장애 발생시 입게 되는 시간적 금전적 피해 규모는 비교할 상대가 없다.

 

백업은 생명보험과도 같다. 백업을 위해서 들이는 시간과 비싼 저장 장치가 아깝게 느껴지겠지만 만약의 사태가 발생했을 때 믿을 것은 백업밖에 없는 것이다. 백업만 제대로 받아 두면 복구는 시간문제지만 제대로 된 백업이 없을 때에는 별의 별 편법을 동원하여 복구를 해야 할 경우도 생기고 그나마 복구를 하더라도 데이터베이스는 만신창이가 되기도 한다.

 

본 과목은 오라클 아키텍쳐를 충실히 이해하고 있다면 별 어려움을 느끼지 않을 것이다. 다만 지금까지 쌓아온 지식을 보강하고 RMAN 유틸리티의 사용법을 익히는 것으로 훌륭한 준비가 될 것으로 믿는다. 문제 분포를 보면 개별 단원으로는 물리적 백업에 관한 문제가 8문제로 가장 많지만 RMAN과 관련된 부분에서 그보다 두 배 이상이 출제되므로 합격을 결정 짓는 다크호스다. 강좌 초반에 다루는 개념적인 부분과 아카이브에 대한 기본적인 이해도를 묻는 문제도 그에 못지않은 비중을 차지한다. 그리고 가장 마지막에 다룰 스탠바이 데이터베이스에서도 5문제가 나오므로 끝가지 최선을 다해주기 바란다.

 

데이터 복구를 위한 오라클 구조

 

1-1. 데이터베이스를 사용하던 중 실수로 전원 스위치를 내려버렸다. 이와 같은 경우는 어떤 유형의 장애에 해당되는가?

 

a. User Error

b. Statement Error

c. Process Failure

d. Instance Failure

e. Media Failure

 

 

<해설>

 

모든 학문의 시작은 사물과 현상을 분류하는 것에서 비롯되듯이 데이터베이스와 관련된 장애도 성격에 따라서 보기와 같은 다섯 가지로 구분 지을 수 있다.

 

User Error는 유저가 실수로 데이터를 삭제한 것과 같은 경우를 말하는데 이 때에는 백업을 이용해서 원상태로 복구를 시켜주면 되고 만약 백업 받은 것이 없다면 복구를 할 수 없다는 간단한 논리의 적용이 가능하므로 문제 파악이 쉽다.

 

Statement Error는 SQL문을 잘못 작성하였거나 미들웨어와 오라클간의 호환성 결여 로 인한 문제 등을 가리킨다. 예를 들어 TP 모니터와 오라클의 버전이 맞지 않아서 발생하는 까다롭고 미묘한 문제들을 떠올려 볼 수 있다.

 

Process Failure는 유저 프로세스가 비정상적으로 종료된 경우로 유저가 고의로 직접 중단시켰거나 또는 네트워크 회선의 불량으로 접속이 단절된 경우 등이 해당된다.

 

Instance Failure는 정전이나 오라클 백그라운드 프로세스의 정지 등으로 오라클 인스턴스가 다운되는 것을 말하며 본 문제가 여기에 속한다. Instance Failure가 발생하면 다음에 인스턴스를 기동할 때 오라클이 자동으로 복구를 수행하기 때문에 DBA가 직접 관여할 문제는 아니다.

 

Media Failure는 데이터파일과 같이 오라클 데이터베이스를 구성하고 있는 파일이 삭제되거나 손상된 경우를 말하며 심각한 복구 문제는 모두 이 카테고리에서 발생하므로 앞으로 우리가 중점적으로 다룰 분야이다.

 

정답 : (d) (<- 마우스로 정답 부분을 선택하세요)

 

 

1-2. 유저가 실수로 중요한 테이블을 삭제하였다. 다행히 아카이브 모드로 운영중이었는데 어떤 복구 방법을 선택해야 삭제된 테이블을 되살릴 수 있는가?

 

a. Complete Recovery

b. Incomplete Recovery

 

 

<해설>

 

완전 복구(Complete Recovery)는 보관중인 백업을 리스토어 한 다음에 백업 이후에 생성된 모든 리두 로그 파일을 적용하는 복구 방법을 말한다. 모든 리두 로그 파일의 정보를 사용하므로 가장 최신의 상태로 복구가 되지만 본 문제에서는 완전 복구를 수행하면 다시 테이블이 삭제된 상태가 되어버리므로 복구하는 의미가 없다.

 

이런 때에는 데이터베이스를 테이블이 삭제 되기 이전의 시점으로 돌려 놓아야 하므로 백업 받은 이후에 생성된 모든 리두 로그 파일을 적용해선 안 되고 복구를 하던 중간에 작업을 중단하고 데이터베이스를 오픈 시켜야 하는데 이를 일컬어 불완전 복구(Incomplete Recovery)라고 부른다.

 

백업 계획을 수립한 다음에는 반드시 백업 받은 것을 이용해서 복구가 제대로 되는지 테스트 해 보아야 한다.

 

오래 전에 운영 체제를 업그레이드하는 사이트로부터 백업을 어떻게 받아야 하는지를 문의 받은 적이 있었다. 필자는 관리자의 시간을 벌어준답시고 익스포트와 임포트 보다는 간편한 콜드 백업을 받으라고 조언해 주었다.

 

그런데 결국 다음날 일이 터지고 말았다. 운영 체제를 업그레이드 하는 것은 맞기는 한데 단순한 버전 업이 아니라 SunOS에서 Solaris로 전환하는 것이었기 때문에 두 운영 체제 사이의 이진 호환성이 없는 관계로 콜드 백업이 무용지물이 되고 만 것이다. 운영 체제가 다르더라도 익스포트 받은 덤프 파일은 임포트 유틸리티에서 읽을 수 있지만 데이터 파일은 플랫폼간의 호환성이 없기 때문이다.

 

결국 SunOS 재설치 -> 오라클 인스톨 -> 백업 리스토어 -> 익스포트 -> Solaris 재설치 -> 오라클 인스톨 -> 임포트와 같은 과정을 거쳐서 겨우 업그레이드 작업을 마칠 수 있었다. 아무리 완벽하게 백업을 받았더라도 예상치 못한 변수가 터지지 않는다고 보장할 수 없으므로 반드시 실전테스트를 거쳐서 검증해 보아야 한다.

 

정답 : (b) (<- 마우스로 정답 부분을 선택하세요)

 

1-3. 불완전 복구의 유형에 해당되는 것을 모두 선택하시오(정답은 세 가지).

 

a. Point-based recovery

b. Time-based recovery

c. Change-based recovery

d. Transaction-based recovery

e. Cancel-based recovery

 

 

<해설>

 

불완전 복구(Incomplete Recovery)는 완전 복구와는 달리 복구하는 중간에 작업을 중단해야 하며 그 시점에 대한 결정은 DBA의 몫이다.

 

Time-based recovery는 데이터베이스를 특정한 시점까지만 복구하는 방법을 말한다. 2번 문제에서처럼 사용자가 테이블을 삭제한 시간을 알고 있다면 테이블이 삭제되기 직전의 시간을 지정하여 복구를 수행하면 되므로 자주 이용되는 방법이다.

 

Change-based recovery는 SCN을 직접 사용해서 복구를 하는 방법이고 Cancel-based recovery는 로그 파일을 하나씩 적용하면서 복구를 진행해 가다가 원하는 위치에서 CANCEL 명령으로 복구를 중단하고 오픈하는 방법을 말한다. 자세한 내용은 차차 다루기로 하겠다.

 

정답 : (b),(c),(e) (<- 마우스로 정답 부분을 선택하세요)

 

Archive vs. Noarchive

 

2-1. 수동 아카이빙(Manual Archiving) 상태에서 데이터베이스를 셧다운하지 않고 아카이브를 받을 수 있는 명령은? (정답은 세 가지)

 

a. ARCHIVE LOG NEXT;

b. ARCHIVE LOG NEW;

c. ALTER SYSTEM ARCHIVE LOG START;

d. ALTER SYSTEM ARCHIVE LOG ALL;

e. ALTER SYSTEM SWITCH LOGFILE;

 

 

<해설>

 

아키이브로그 모드란 온라인 리두 로그 파일이 순환되어 재사용되기 전에 다른 곳으로 백업해 둠으로써 차후에 복구에 사용할 수 있도록 하는 데이터베이스 운영 방식을 말한다. 시스템 환경이 별로 넉넉하지 못했던 시절에는 아카이브로그 모드가 유발하는 프로세서의 부하와 디스크 I/O의 증가 및 여유 공간의 부족, 그리고 관리자의 미숙 등으로 인해서 다양한 장점에도 불구하고 그다지 좋지 않은 인상을 남겨주는 경우가 있었다.

 

24시간 운영을 하는 곳에서는 백업을 받기 위해서 아카이브로그 모드가 필수적인데 디스크가 넉넉하지 않아서 궁여지책으로 테이프로 직접 아카이브를 받는 곳도 있었다. 그러다 보니 트랜잭션이 몰리는 시간에는 아카이브 받는 속도가 발생되는 트랜잭션의 크기를 따라가지 못해서 데이터베이스가 때때로 멈칫거리는 부작용이 발생하기도 하였다.

 

현재는 컴퓨터 시스템의 중요성에 대한 마인드가 많이 개선되었고 하드웨어의 성능 향상과 가격 인하로 소규모 데이터베이스라고 해도 아카이브로그 모드로 운영하지 않을만한 뚜렷한 이유를 찾기 어렵다.

 

아카이브로그 모드로 처음 운영하기 시작하는 사이트에서 가장 자주 일어나는 실수 가운데 하나는 어떤 이유로든 아카이브가 제대로 수행되지 않음으로써 데이터베이스가 모든 동작을 멈추는 것이다. 구체적인 원인으로는 아카이브로그 파일이 저장되는 디스크에 여유 공간이 부족하거나 아카이브 프로세서를 띄워서 자동으로 아카이브가 수행되도록 설정하는 단계를 건너 뛴 것이 대표적이다.

 

수동으로 아카이브를 시키는 명령은 여러 가지가 있는데 보기 중에서는 (a), (d)가 있으며 (c) 명령을 실행시키면 아카이브 프로세스가 기동되어 자동 아카이브 모드로 운영된다. 단, 인스턴스를 셧다운 하면 그 효력은 상실되므로 계속 자동 아카이브 모드를 유지하려면 파라미터 파일에 LOG_ARCHIVE_START=TRUE 라고 추가해야 한다.

 

정답 : (a), (c), (d) (<- 마우스로 정답 부분을 선택하세요)

 

 

2-2. 아카이브로그 파일의 멀티플렉싱과 아카이브 프로세스는 각각 최대 몇 개 까지 가능한가?

 

a. 2, 2

b. 3, 5

c. 5, 3

d. 5, 5

e. 5, 10

 

 

<해설>

 

“아카이브로그 파일을 굳이 멀티플렉싱할 필요가 있을까?” 하는 의문을 던지는 분들도 있을 것이다. 아카이브로그 모드로 운영하다 보면 생성되는 파일의 개수가 굉장히 많기 때문에 조금의 부주의로 한 두개의 아카이브로그 파일이 없어지는 경우가 심심찮게 발생한다.. 아카이브로그 파일의 특성상 모든 파일을 철저하게 보관하고 있더라도 중간 시점에 생성된 하나만 잃어버리면 그 이후의 아카이브로그 파일은 쓸모가 없기 때문에 전체를 완전하게 보존해야 한다. 그래서 디스크의 가격이 별 문제가 되지 않는 요즘에는 아카이브로그 파일의 멀티플렉싱이 매우 설득력 있는 장애 대비 방법의 하나라고 말할 수 있다.

 

오라클 8.0 버전에서는 아카이브로그 파일의 멀티플렉싱이 두 곳으로만 가능했지만 오라클 8i부터는 최대 다섯 개로 확장되었다. 즉, 이전의 방법은 LOG_ARCHIVE_DEST와 LOG_ARCHIVE_DUPLEX_DEST 파라미터를 사용하여 두 개의 디렉토리를 지정하는 것이었는데 지금은 LOG_ARCHIVE_DEST_1, LOG_ARCHIVE_DEST_2, …, LOG_ARCHIVE_DEST_5와 같은 다섯 개의 파라미터를 이용하여 아카이브로그 파일을 저장하는 디렉토리를 지정할 수 있다. 오라클 8i 에서는 이 두 가지 방법을 모두 사용할 수 있지만 서로 배타적이므로 어느 하나만을 선택해서 이용해야 한다.

 

이렇게 아카이브로그 파일을 여러 곳에 생성하다 보니 자연히 하나의 ARCn 프로세스만으로는 작업을 감당하기 벅차기 때문에 필요에 따라서 최대 10개의 ARCn 프로세스가 떠서 작업을 할 수 있다. 단, 실제로 사용되는 ARCn 프로세스의 개수는 오라클에서 자동으로 결정하며 LOG_ARCHIVE_MAX_PROCESSES 파라미터는 단지 인스턴스 기동시에 뜨는 ARCn 프로세스의 개수를 의미할 뿐이다.

 

정답 : (e) (<- 마우스로 정답 부분을 선택하세요)

 

물리적 백업

 

3-1. 데이터파일이 백업 모드 상태인지를 확인할 수 있는 딕셔너리는? (두 가지)

 

a. V$DATAFILE

b. V$DBFILE

c. V$DATAFILE_HEADER

d. V$BACKUP

e. V$DATABASE

 

 

<해설>

 

백업 모드란 해당 데이터파일이 핫 백업을 받는 상태에 놓여있다는 것을 말한다.

 

ALTER TABLESPACE 테이블스페이스명 BEGIN BACKUP;

 

명령으로 특정 테이블스페이스를 백업하겠다고 지정하면 그 테이블스페이스를 구성하고 있는 모든 데이터파일이 백업 모드로 변경된다.

 

백업 모드에서는 데이터파일의 헤더에 기록되는 SCN은 갱신되지 않지만 해당 테이블스페이스에 대한 SELECT, INSERT 등의 작업이 모두 가능하므로 사용자는 백업 모드라는 것을 의식하지 않고 그대로 사용할 수 있다.

 

그러나 백업 모드에서는 리두로그 파일에 추가적인 정보가 기록되므로 사용자가 적은 시간대를 선택해서 작업을 해야 퍼포먼스 저하를 방지할 수 있다.

 

데이터가 변경되거나 추가될 때 백업 모드 상태의 데이터파일에는 직접 기록되지 않고 리두로그 파일에만 저장되었다가 나중에 백업 모드에서 빠져나오면 리두로그 파일의 정보를 데이터파일에 반영하는 것으로 오해할 소지도 있다. 그러나 실제로는 평상시와 마찬가지로 백업 모드에서도 데이터파일에 변경 사항이 기록되며 단지 헤더에 저장되는 SCN이 갱신되지 않는 것이다.

 

데이터파일이 백업 모드인지를 확인할 때에는 보통 V$BACKUP을 이용한다. V$BACKUP의 STATUS 컬럼의 값이 ACTIVE 라면 해당 데이터파일이 백업 모드임을 의미한다.

 

또한 V$DATAFILE_HEADER의 FUZZY 컬럼의 값이 YES일 때에도 백업 모드라고 판단할 수 있다.

 

여러 개의 테이블스페이스를 한 번에 백업 모드로 전환시켜서 작업하면 어떤 테이블스페이스가 백업 모드 상태인지 혼란스럽고 리두로그 데이터의 생성이 과도하게 늘어날 뿐 아니라 미처 백업 모드를 종료하지 않은 상태에서 데이터베이스가 다운될 경우 복구가 번거로우므로 한 번에 하나씩 백업 모드로 전환해서 작업하는 것이 정석이다.

 

 

정답 : (c),(d) (<- 마우스로 정답 부분을 선택하세요)

 

 

3-2. 다음 명령을 실행했을 때 컨트롤 파일이 백업되는 디렉토리는 어떤 초기화 파라미터에 의해서 결정되는가?

 

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

 

a. BACKGROUND_DUMP_DEST

b. LOG_ARCHIVE_DEST

c. CORE_DUMP_DEST

d. STANDBY_ARCHIVE_DEST

e. USER_DUMP_DEST

 

 

<해설>

 

컨트롤 파일을 백업하는 명령은 두 가지가 있다. 먼저 위의 명령을 실행하면 USER_DUMP_DEST 파라미터에 지정된 위치로 텍스트 포맷의 트레이스 파일이 생성되는데 이 파일은 약간의 편집을 거치면 직접 실행해서 컨트롤 파일을 만들 수 있도록 SQL 스크립트 형식으로 되어 있다.

 

그리고 다음 명령으로도 컨트롤 파일을 백업할 수 있다.

 

ALTER DATABASE BACKUP CONTROLFILE TO ‘/disk1/backup/backup1.ctl’;

 

이 명령을 실행하면 /disk/backup/backup1.ctl 이라는 이름으로 컨트롤 파일이 백업되는데 이 파일은 원래의 컨트롤 파일과 동일한 바이너리 포맷이라는 점이 앞의 명령과 차이가 있다.

 

정답 : (e) (<- 마우스로 정답 부분을 선택하세요)

 

3-3. 다음 두 명령을 실행할 때 각각 어느 시점에 관련된 테이블스페이스를 백업하는 것이 바람직한가?

 

ALTER TABLESPACE users READ ONLY;

 

CREATE TABLE newemp

AS SELECT * FROM emp UNRECOVERABLE;

 

a. 명령 전, 명령 전

b. 명령 전, 명령 후

c. 명령 후, 명령 전

d. 명령 후, 명령 후

e. 필요 없음

 

 

<해설>

 

테이블스페이스를 읽기전용(read-only) 상태로 전환한 다음에는 백업을 받아두는 습관을 기르는 것이 좋다. 읽기전용 상태로 변경하기 전에 백업을 받으면 장애가 발생했을 때 백업을 리스토어 하고 나서 다시 리두로그 파일을 이용한 복구작업을 수행해야 한다. 그러나 읽기전용 상태로 전환한 다음에 백업을 해 주면 단순히 백업을 리스토어 하는 것으로 복구가 끝나므로 복구 시간을 단축할 수 있다..

 

다음의 명령도 비슷한 맥락에서 생각해 볼 수 있다. 이와 같은 Nologging 명령은 리두로그 정보를 발생하지 않기 때문에 실행 속도가 빠르다는 장점은 있지만 대신 장애가 발생했을 때 리두로그 파일을 이용한 복구가 불가능하다. 따라서 Nologging 명령을 수행한 다음에는 바로 백업을 실시하는 것이 좋다. Nologging 명령을 수행하기 전에 받은 백업은 별 의미가 없다.

 

정답 : (d) (<- 마우스로 정답 부분을 선택하세요)

 

완전복구 (Complete Recovery)

 

4-1. 다음은 아카이브로그 모드로 운영중인 데이터베이스의 작업 및 장애 내용을 기록한 것이다.

 

03:00 데이터베이스 전체 백업

09:00 트랜잭션 A 실행

09:10 트랜잭션 B 실행

10:00 트랜잭션 B 커밋

10:10 트랜잭션 A 커밋

11:00 트랜잭션 C 실행

11:05 SYSTEM 데이터 파일이 손상되면서 데이터베이스 다운

 

데이터베이스를 완전히 복구했을 때 복구되는 트랜잭션은?

 

a. 트랜잭션 A

b. 트랜잭션 A,B

c. 트랜잭션 B,C

d. 트랜잭션 A,C

e. 트랜잭션 A,B,C

 

 

<해설>

 

아카이브로그 모드의 장점을 얘기할 때에는 장애가 발생해도 데이터의 손실 없이 완전한 복구가 가능하다는 말이 결코 빠지지 않는다.

 

그러나 아카이브로그 모드도 커밋되지 않은 트랜잭션은 복구시키지 않으므로 완벽하게 장애가 발생하기 직전으로 돌아가는 것은 아니다. 롤 포워드(roll forward)로 복구를 한 후에 커밋되지 않은 트랜잭션은 다시 롤백시키기 때문인데 문서 작업을 하다가 PC가 다운되면 이전에 저장하고 난 다음의 내용은 날아가 버리는 것과 비슷한 이치라고 하겠다.

 

결론적으로 트랜잭션 A, B는 커밋을 했지만 트랜잭션 C는 커밋하기 전에 데이터베이스가 다운되었으므로 트랜잭션 C는 복구 후에 다시 작업해야 한다.

 

 

 

정답 : (b) (<- 마우스로 정답 부분을 선택하세요)

 

 

4-2. 노아카이브로그 모드로 운영중인 데이터베이스에서 USERS 테이블스페이스의 데이터 파일을 실수로 삭제하였다. 전날 콜드 백업을 받아두었다면 어떤 복구 방법을 사용하는 것이 가장 적절한가?

 

a. 삭제된 데이터 파일만 리스토어 하면 된다.

b. 삭제된 데이터 파일만 리스토어 하고 복구한다.

c. 콜드 백업 전체를 리스토어 한다.

d. 콜드 백업에서 모든 데이터 파일만 리스토어 하고 복구를 실시한다.

 

 

<해설>

 

노아카이브로그 모드로 운영할 때에는 복구 방법이 매우 제한적이다. 99.9%의 경우 백업 전체를 내리는 조치밖에는 별다른 대안이 없기 때문에 사실 복구보다는 단순한 리스토어에 가깝다고 할 수 있다.

 

극히 예외적인 경우로 백업을 받은 이후에 온라인 리두로그 파일이 순환되어 덮어씌워지지 않은 상태에서 데이터 파일이 없어졌다면 백업 이후의 작업 내용이 온라인 리두로그 파일에 그대로 살아있으므로 (b)나 (d)와 같은 방법도 가능하다. 그러나 실제 상황에서 이런 행운은 기대하지 않는 편이 좋으므로 정답과는 거리가 있다고 하겠다.

 

일반적으로 콜드 백업을 리스토어 할 때에는 없어진 데이터 파일을 포함하여 나머지도 모두 함께 리스토어 해야 한다. 그렇지 않으면 데이터베이스의 일관성을 유지할 수 없기 때문에 사용할 수 없다.

 

정답 : (c) (<- 마우스로 정답 부분을 선택하세요)

 

4-3. 디스크 에러가 발생하여 백업을 리스토어 하고 데이터베이스를 마운트 시켰다. 복구가 필요한 파일을 알려면 어떤 딕셔너리를 참조하면 되는가?

 

a. v$log_history

b. v$recover_file

c. v$recovery_log

d. v$filestat

e. v$datafile

 

 

<해설>

 

미디어 복구가 필요한 데이터 파일이 있다면 데이터베이스를 오픈할 때 “이러이러한 파일이 미디어 복구가 필요하다”는 에러 메시지가 나오므로 힘들이지 않고도 복구할 파일을 알 수 있다. 그러나 에러가 나오기 전에 미리 문제의 데이터 파일을 알고 싶다면 v$recover_file를 참조하면 된다.

 

v$log_history에는 리두로그 파일이 스위치 되면서 발생하는 과거 기록이 담겨 있다. 아카이브로그 모드가 아니더라도 상관없으며 컨트롤 파일에 들어있는 리두로그 히스토리를 보여준다.

 

 

 

정답 : (c),(d) (<- 마우스로 정답 부분을 선택하세요)

 

 

3-2. 다음 명령을 실행했을 때 컨트롤 파일이 백업되는 디렉토리는 어떤 초기화 파라미터에 의해서 결정되는가?

 

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

 

a. BACKGROUND_DUMP_DEST

b. LOG_ARCHIVE_DEST

c. CORE_DUMP_DEST

d. STANDBY_ARCHIVE_DEST

e. USER_DUMP_DEST

 

 

<해설>

 

컨트롤 파일을 백업하는 명령은 두 가지가 있다. 먼저 위의 명령을 실행하면 USER_DUMP_DEST 파라미터에 지정된 위치로 텍스트 포맷의 트레이스 파일이 생성되는데 이 파일은 약간의 편집을 거치면 직접 실행해서 컨트롤 파일을 만들 수 있도록 SQL 스크립트 형식으로 되어 있다.

 

그리고 다음 명령으로도 컨트롤 파일을 백업할 수 있다.

 

ALTER DATABASE BACKUP CONTROLFILE TO ‘/disk1/backup/backup1.ctl’;

 

이 명령을 실행하면 /disk/backup/backup1.ctl 이라는 이름으로 컨트롤 파일이 백업되는데 이 파일은 원래의 컨트롤 파일과 동일한 바이너리 포맷이라는 점이 앞의 명령과 차이가 있다.

 

정답 : (b) (<- 마우스로 정답 부분을 선택하세요)

 

불완전 복구 (Incomplete Recovery)

 

5-1. Cancel-based recovery의 최소 복구 단위는?

 

a. 초(second)

b. SCN

c. 트랜잭션

d. 리두로그 파일

e. 오라클 블록

 

 

<해설>

 

불완전 복구(Incomplete Recovery)에는 Time-based, Cancel-based, Change-based 이상 세 가지 종류가 있다. 최소 복구 단위라면 얼마나 세밀하게 복구 간격을 조절할 수 있는가를 물어보는 것인데 정밀한 복구가 가능한 방법일수록 좀 더 높은 조작 기술과 상세한 정보를 필요로한다.

 

Time-based 방법의 예를 들면 다음과 같다.

 

RECOVER DATABASE UNTIL TIME ‘2001-03-01:15:24:30’;

 

이 명령을 실행하면 데이터베이스를 2001년 3월 1일 오후 3시 24분 30초의 상태로 만들어 준다. 이 때 지정하는 시간은 초(second) 단위 까지 설정할 수 있으며 SCN이나 로그 시퀀스 번호 보다는 시간이 쉽게 인지할 수 있는 개념이기 때문에 즐겨 이용된다.

 

Cancel-based 방법의 최소 단위는 리두로그 파일이다. 리두로그 파일의 중간 쯤에서 복구를 멈추고 싶다면 이 방법을 사용할 수 없으며 대신 Change-based 방법을 이용해야 한다.

 

Change-based 방법은 SCN 단위로 복구할 수 있기 때문에 가장 섬세한 컨트롤이 가능하다.

 

SCN은 트랜잭션 단위인데 1초 안에 여러 개의 트랜잭션이 발생할 수도 있으므로 Time-based 방법보다 Change-based 방법의 정밀도가 높다고 볼 수 있다. Time-based 방법의 정밀도는 중간 정도이고 Cancel-based 방법은 가장 사용하기 쉬운 반면 또한 가장 정밀도가 떨어진다.

 

 

 

정답 : (d) (<- 마우스로 정답 부분을 선택하세요)

 

 

5-2. 다음 중 불완전 복구를 수행해야 하는 경우가 아닌 것은?

 

a. 테이블을 삭제하기 이전의 상태로 돌아갈 때

b. 블록 손상(corruption)이 발생하기 이전으로 돌아갈 때

c. 커런트(current) 리두로그 파일이 손상되었을 때

d. 정전으로 시스템이 다운되었을 때

 

 

<해설>

 

불완전 복구는 완전 복구를 할 수 없기 때문에 불가피하게 선택하는 수도 있지만 데이터베이스를 과거의 시점으로 돌리기 위해서 일부러 불완전 복구를 하는 고의적인 상황도 있다.

 

대표적인 예가 a)와 b) 같은 경우이다. 특히 b)처럼 블록 손상이 발생하면 마치 하드디스크의 배드 섹터가 발생했을 때의 찜찜한 느낌처럼 문제가 생긴 곳 뿐 아니라 데이터베이스 전체에 대한 불신이 싹트게 된다. 그래서 성격이 깔끔한 사람은 약간의 데이터 손실을 감수하고서라도 블록 손상이 발생하기 이전으로 돌아가는 것을 선호하는 경우도 있다.

 

c)와 같이 현재 LGWR가 기록중인 커런트 리두로그 파일이 깨졌다면 이 파일의 내용은 아카이브되지 않은 상태이기 때문에 데이터의 손실은 불가피하다.

 

d)의 정전에 의한 시스템 다운은 미디어 복구가 아닌 인스턴스 복구만 하면 되므로 데이터의 손상 없이 완전 복구가 이루어진다.

 

정답 : (d) (<- 마우스로 정답 부분을 선택하세요)

 

5-3. 불완전 복구 작업을 완료하고 데이터베이스를 오픈하려고 한다. 다음 중에서 옳은 방법은?

 

a. ALTER DATABASE OPEN;

b. ALTER DATABASE OPEN NORESETLOGS;

c. ALTER DATABASE OPEN RESETLOGS;

d. ALTER DATABASE OPEN READ WRITE;

e. ALTER DATABASE OPEN READ ONLY;

 

<해설>

불완전 복구를 수행한 다음에 데이터베이스를 오픈할 때에는 반드시 RESETLOGS 옵션을 사용해야 한다.

 

RESETLOGS를 이용해서 컨트롤 파일과 데이터 파일의 시퀀스 번호를 초기화 시키고 온라인 리두로그 파일을 깨끗하게 만들어 주는 이유는 과거의 리두로그 파일들이 실수로 적용되는 것을 미연에 방지하기 위한 것이다. RESETLOGS를 사용하면 모든 데이터파일에 새로운 RESETLOGS SCN과 타임스탬프가 기록되는데 이 정보가 일치하지 않는 리두로그 파일은 복구에 사용되지 않기 때문에 잘못된 리두로그 파일이 적용되는 것을 원천적으로 차단할 수 있다.

 

RESETLOGS로 데이터베이스가 오픈되면 기존의 백업이 무의미해지므로 다시 전체 데이터베이스를 꼭 백업해 주어야 한다.

 

 

정답 : (c) (<- 마우스로 정답 부분을 선택하세요)

 

익스포트와 임포트

 

6-1. 다음과 같이 데이터베이스 작업과 백업을 수행하였다.

 

INCTYPE=COMPLETE 백업

BOOKS 테이블 생성

BOOKS 테이블에 10건의 데이터 입력

INCTYPE=INCREMENTAL 백업(a)

BOOKS 테이블에 20건의 데이터 입력

INCTYPE=CUMULATIVE 백업(b)

BOOKS 테이블에 40건의 데이터 입력

INCTYPE=INCREMENTAL 백업(c)

INCTYPE=CUMULATIVE 백업(d)

 

(a),(b),(c),(d) 단계에서 익스포트되는 BOOKS 테이블의 레코드 건수의 총 합은?

 

a. 50

b. 70

c. 90

d. 110

e. 130

 

 

<해설>

 

인크리멘탈(incremental) 익스포트는 증분 익스포트라고도 번역하지만 다소 어색하므로 그냥 소리나는 대로 쓰기로 한다.

 

인크리멘탈 익스포트는 백업 시간을 단축해 보자는 취지로 등장하였다. 익스포트를 받을 때 마다 매번 전부 다 백업하는 것은 비효율적이므로 이전에 익스포트 받은 다음에 변경된 부분만 백업할 수 있다면 시간을 크게 절감할 수 있지 않겠느냐는 것이었다.

 

그러나 결과는 절반의 성공에 그치고 말았다. 분명 이전의 백업 이후에 변경된 부분만 백업되므로 시간을 단축할 수는 있었지만 문제는 기존 테이블에 한 건만 데이터가 추가되어도 테이블 전체를 다시 백업해야 하는 특성 때문이었다.

 

결국 수 많은 테이블이 빈번하게 생성되는 시스템에서는 큰 재미를 보았지만 주로 기존 테이블에 대한 DML 작업이 많은 환경에서는 불필요하게 덤프파일의 개수만 늘어나므로 환영을 받지 못했다.

 

인크리멘탈 익스포트에는 세 가지 타입이 있다.

 

COMPLETE는 데이터베이스 전체를 백업 받는 것이고 CUMULATIVE는 이전의 COMPLETE 또는 CUMULATIVE 백업 이후의 내용을 익스포트 한다. INCREMENTAL은 이전의 COMPLETE, CUMULATIVE 또는 INCREMENTAL 익스포트 이후의 변경 사항을 백업한다.

 

이렇게 여러 레벨로 나누어 놓은 이유는 파일 관리를 좀 더 수월하게 하기 위해서이다. 인크리멘탈 익스포트의 단점 중의 하나가 관리할 덤프 파일이 갈수록 늘어난다는 점인데 여러 차레 인크리멘탈 익스포트를 수행한 다음에 그보다 상위의 모드로 익스포트를 수행하면 이전의 자잘한 덤프파일을 대체할 수 있다.

 

본 문제에서는 인크리멘탈 익스포트를 수행할 때 마다 테이블의 내용이 변경되었기 때문에 (a)=10건, (b)=10+20=30건, (c)=10+20+40=70건이 각각 익스포트 된다. (d)에서는 BOOKS 테이블에 변경 사항이 없으므로 0건이 익스포트 된다. 따라서 모두 합치면 110건이 정답이다.

 

 

 

 

정답 : (d) (<- 마우스로 정답 부분을 선택하세요)

 

 

6-2. 임포트 되는 순서를 올바르게 나열하시오(주관식).

 

a. 테이블 데이터

b. 테이블 정의(definition)

c. 제약 조건, 뷰, 프로시저, 트리거

d. 테이블 인덱스

e. 타입(type) 정의

 

 

 

<해설>

 

객체에 따라서 다른 객체를 참조하지 않는 완전 독립형인 경우도 있지만 대부분 여러 객체가 서로 얽혀 있는 것이 일반적이다. 그래서 임포트될 때 최고의 효율을 꾀하고 의존 관계에 의한 에러를 방지하기 위해서 매우 정교하게 순서가 설정되어 있는데 힘들여 암기할 필요 없이 아래처럼 논리적으로 따져보면 대략 순서를 유추할 수 있다.

 

먼저 테이블을 만들 때 타입 정의를 사용할 수도 있으므로 테이블보다는 타입이 먼저 만들어져야 함을 알 수 있다..

 

그리고 인덱스가 있는 상태에서 데이터를 넣는 것보다 데이터를 먼저 넣은 다음에 인덱스를 생성하는 것이 속도가 빠르기 때문에 데이터와 인덱스의 임포트 순서가 결정된다.

 

그 밖에 제약조건은 특히 레퍼런스 때문에 자연스럽게 뒤로 밀리게 되고 트리거는 테이블의 데이터보다 먼저 만들면 나중에 데이터가 임포트 될 때 불필요하게 실행되므로 이를 방지하기 위해서 역시 우선순위가 낮게 설정된다.

 

이런 관계를 종합해 보면 큰 어려움 없이 정답을 찾아낼 수 있을 것이다.

 

정답 : (f),(c),(b),(e),(d) (<- 마우스로 정답 부분을 선택하세요)

 

6-3. TSPITR(Tablespace Point-In-Time Recovery)와 관련된 초기화 파라미터가 아닌 것은?

 

a. LOCK_NAME_SPACE

b. DB_FILE_NAME_CONVERT

c. LOG_FILE_NAME_CONVERT

d. CONTROL_FILE_NAME_CONVERT

 

<해설>

 

실수로 테이블을 하나 삭제한 후에 이 테이블을 살려내야 한다면?

 

전통적인 복구 전략에 따르면 백업 전체를 리스토어 한 다음에 불완전 복구를 수행하거나 별도의 장소에 백업을 리스토어 한 다음 익스포트/임포트를 이용하여 테이블을 받아와야 할 것이다.

 

TSPITR은 이런 문제에 대한 업그레이드된 해결 방법이다. 전체적인 개념은 두 번째의 익스포트/임포트 방법과 유사하지만 TSPITR은 익스포트/임포트를 통해서는 메타데이터만 전송하고 실제의 데이터 복구는 운영체제 상의 데이터 파일을 복사하는 것으로 대신하기 때문에 속도가 매우 빠르다. 테이블이 아닌 테이블스페이스를 기본 단위로 한다는 특징이 있고 작업 과정이 비교적 복잡한 편이지만 삭제된 테이블의 크기가 클수록 그 가치가 더욱 빛나는 기능이다.

 

LOCK_NAME_SPACE는 클론 데이터베이스(TSPITR을 위해서 생성한 데이터베이스)가 원래의 데이터베이스와 이름이 같아도 기동할 수 있도록 하는 역할을 하므로 데이터베이스 이름을 바꿀 필요가 없도록 해 준다.

 

클론 데이터베이스를 기동할 때 기존 데이터베이스의 컨트롤 파일 백업본을 이용하는데 파일들의 위치가 기존 데이터베이스와 달라지기 때문에 새로운 위치에 있는 파일을 찾을 수 있도록 디렉토리 이름을 바꿔주는 파라미터가 제공된다.

 

데이터 파일은 DB_FILE_NAME_CONVERT, 리두로그 파일은 LOG_FILE_NAME_CONVERT를 이용해서 위치를 변환한다. 파일 이름이 아닌 디렉토리를 지정하는 것임을 주의하기 바란다. 예를 들면 다음과 같다.

 

DB_FILE_NAME_CONVERT = ‘/disk1/oracle/orig’,’/disk1/oracle/clone’

 

정답 : (d) (<- 마우스로 정답 부분을 선택하세요)


반응형
반응형

Oracle Database 10g: DBA를 위한 20가지 주요 기능

Arup Nanda

한층 강화된 엑스포트/임포트: Oracle Data Pump  

Oracle Database 10g 유틸리티로 크게 향상된 데이타 이동 기능

지금까지 엑스포트/임포트 툴세트는 열악한 속도에 대한 불만에도 불구하고 최소한의 노력으로 여러 플랫폼에 데이타를 전송하기 위해사용해 온 유틸리티였습니다. 임포트는 단순히 엑스포트 덤프 파일에서 각 레코드를 읽고 이를 일반적인 INSERT INTO 명령을사용해 대상 테이블에 삽입하기만 하므로 임포트 프로세스가 느린 것은 그리 놀랄만한 일이 아닙니다.
이제 프로세스 속도가월등히 향상된 Oracle Database 10g의 보다 새롭고 빠른 엑스포트/임포트 툴킷인 Oracle Data Pump,the newer and faster sibling of the export/import toolkit in OracleDatabase 10g를 사용해 보십시오.

Data Pump는 엑스포트/임포트 프로세스의 전체 구성을나타냅니다. 일반적인 SQL 문을 사용하는 대신 독점 API로 데이타를 현저하게 빠른 속도로 로드 및 언로드합니다. 제가테스트해본 결과, 직접 모드의 엑스포트보다 병�?10-15배 향상되었으며, 임포트 프로세스 성능도 5배 이상 증가했습니다. 또한엑스포트 유틸리티와 달리 프로시저 같은 특정 유형의 객체만 추출할 수 있습니다.

Data Pump Export

이새로운 유틸리티는 원래의 엑스포트인 exp와 구분하기 위해 expdp라고 합니다. 이 예에서는 Data Pump를 사용해 약3GB 크기의 대형 테이블인 CASES를 엑스포트합니다. Data Pump는 서버 측에서 파일 조작을 사용하여 파일을 생성하고읽으므로 디렉토리를 위치로 사용합니다. 여기서는 filesystem /u02/dpdata1을 사용해 덤프 파일을 유지할예정입니다.

create directory dpdata1 as '/u02/dpdata1';
grant read, write on directory dpdata1 to ananda;


그리고 다음과 같이 데이타를 엑스포트합니다.

expdp ananda/abc123 tables=CASES directory=DPDATA1 dumpfile=expCASES.dmp job_name=CASES_EXPORT
이제 이 명령의 각 부분을 분석해 보겠습니다. 사용자 ID/암호 조합, 테이블 및 덤프 파일 매개변수는 말 그대로이므로 설명이필요 없습니다. 원래의 엑스포트와 달리 파일이 클라이언트가 아닌 서버에 생성됩니다. 위치는 디렉토리 매개변수 값 DPDATA1로지정되며, 이는 이전에 생성된 /u02/dpdata1을 가리킵니다. 또한 프로세스를 실행하면 서버의 디렉토리 매개변수로 지정된위치에 로그 파일이 생성됩니다. 이 프로세스에는 기본적으로 DPUMP_DIR로 명명된 디렉토리가 사용되므로 DPDATA1 대신생성할 수 있습니다.

위의 job_name 매개변수를 보면 원래의 엑스포트에 없는 특별한 항목이 하나 있습니다.모든 Data Pump 작업은 작업(job)을 통해 이뤄집니다. Data Pump 작업은 DBMS 작업과 달리 주 프로세스를대신해 데이타를 처리하는 단순한 서버 프로세스입니다. 마스터 제어 프로세스라고 하는 이 주 프로세스는 AdvancedQueuing을 통해 이러한 작업 노력을 조정하는데, 이는 마스터 테이블이라고 하는 런타임 시 생성된 특수 테이블을 통해이뤄집니다. 제시한 예에서 expdp를 실행하면서 사용자 ANANDA의 스키마를 검사하면 job_name 매개변수에 해당되는CASES_EXPORT 테이블이 있음을 알 수 있습니다. expdp가 종료되면 이 테이블은 삭제됩니다.

엑스포트 모니터링

DPE(DataPump Export)를 실행하면서 Control-C를 누르면 화면상에 메시지 표시를 중지하지만 프로세스 자체를 엑스포트하지는않습니다. 대신 다음과 같이 DPE 프롬프트를 표시합니다. 이제 프로세스는 소위 “대화식” 모드에 들어갑니다.

Export>

이 접근방법에서는 DPE 작업에 여러 명령을 입력할 수 있습니다. 요약을 확인하려면 다음과 같이 프롬프트에 STATUS 명령을 사용합니다.

Export>status Job: CASES_EXPORT Operation: EXPORT Mode: TABLE State: EXECUTINGDegree: 1 Job Error Count: 0 Dump file: /u02/dpdata1/expCASES.dmp byteswritten = 2048 Worker 1 Status: State: EXECUTING Object Schema: DWOWNERObject Name: CASES Object Type:TABLE_EXPORT/TBL_TABLE_DATA/TABLE/TABLE_DATA Completed Objects: 1 TotalObjects: 1 Completed Rows: 4687818
하지만 이것은 상태 표시일 뿐이며 엑스포트는 백그라운드에서 실행되고 있습니다. 화면의 메시지를 계속 확인하려면 Export> 프롬프트에서 CONTINUE_CLIENT 명령을 사용합니다.

병렬 작업

PARALLEL매개변수를 통해 엑스포트시 하나 이상의 스레드를 사용하면 작업 속도를 크게 개선할 수 있습니다. 스레드마다 개별 덤프 파일을생성하므로 매개변수 dumpfile은 병렬화 만큼 많은 여러 항목을 갖게 됩니다. 또한 하나씩 명시적으로 입력하는 대신 다음과같이 대체 문자를 파일 이름으로 지정할 수 있습니다.

expdp ananda/abc123 tables=CASES directory=DPDATA1 dumpfile=expCASES_%U.dmp parallel=4 job_name=Cases_Export
여기서 dumpfile 매개변수에 어떻게 대체 문자 %U가 생기는지 주목합니다. 이 대체 문자는 파일이 필요에 따라 생성되고형식은 expCASES_nn.dmp이 됨을 나타내는데, 여기서 nn은 01에서 시작하며 필요에 따라 증가하게 됩니다.

병렬 모드에서는 상태 화면에 네 개의 작업자 프로세스가 표시됩니다. (기본 모드에서는 프로세스가 한 개만 표시됩니다.) 모든 작업자 프로세스가 데이타를 동시에 추출하며 진행률을 상태 화면에 표시합니다.

데이타베이스 파일 및 덤프 파일 디렉토리 파일 시스템에 액세스하려면 I/O 채널을 반드시 구분해야 합니다. 그렇지 않으면 DataPump 작업의 유지와 관련된 오버헤드가 병렬 스레드의 이점을 뛰어넘어 성능을 저하시킬 수 있습니다. 병렬화는 테이블 수가 병렬값보다 크고 테이블이 대규모인 경우에만 적용됩니다.

데이타베이스 모니터링

데이타베이스 뷰에서실행되는 Data Pump 작업에 관해서도 자세한 정보를 확인할 수 있습니다. 작업을 모니터링하는 기본 뷰는DBA_DATAPUMP_JOBS로 작업에서 실행되는 작업자 프로세스(DEGREE 열)의 수를 알려줍니다. 그 밖의 중요한 뷰에는DBA_DATAPUMP_SESSIONS가 있는데, 이전 뷰 및 V$SESSION과 조인하면 주 포그라운드(Foreground)프로세스 세션의 SID를 확인할 수 있습니다.

select sid, serial# from v$session s, dba_datapump_sessions d where s.saddr = d.saddr;

이 명령에는 포그라운드 프로세스의 세션이 표시됩니다. 경고 로그에서는 보다 유용한 정보를 얻을 수 있습니다. 프로세스가 시작되면 MCP 및 작업자 프로세스가 다음과 같이 경고 로그에 나타납니다.

kupprdp:master process DM00 started with pid=23, OS id=20530 to execute -SYS.KUPM$MCP.MAIN('CASES_EXPORT', 'ANANDA'); kupprdp: worker processDW01 started with worker id=1, pid=24, OS id=20532 to execute -SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA'); kupprdp: worker processDW03 started with worker id=2, pid=25, OS id=20534 to execute -SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA');
경고 로그에는 Data Pump 작업을 위해 시작된 세션의 PID가 표시됩니다. 실제 SID는 이 질의를 사용해 확인합니다.

select sid, program from v$session where paddr in (select addr from v$process where pid in (23,24,25));
PROGRAM열에는 경고 로그 파일의 이름에 해당되는 프로세스 DM(마스터 프로세스) 또는 DW(작업자 프로세스)가 표시됩니다. SID 23같은 작업자 프로세스에서 병렬 질의를 사용하는 경우, V$PX_SESSION 뷰에서 확인할 수 있습니다. 이 뷰에는 SID23으로 표시된 작업자 프로세스에서 실행되는 모든 병렬 질의 세션이 나타납니다.

select sid from v$px_session where qcsid = 23;

V$SESSION_LONGOPS 뷰에서는 작업 완료에 걸리는 시간을 예측하는 또 다른 유용한 정보를 얻을 수 있습니다.

select sid, serial#, sofar, totalwork from v$session_longops where opname = 'CASES_EXPORT' and sofar != totalwork;

totalwork 열에는 총 작업량이 표시되는데, 이 중 현재까지 sofar 작업량을 완료했으므로 이를 통해 얼마나 더 시간이 걸릴지 예측할 수 있습니다.

Data Pump Import

하지만 Data Pump에서 가장 눈에 잘 띄는 부분은 데이타 임포트 성능입니다. 이전에 엑스포트된 데이타를 임포트하려면 다음을 사용합니다.

impdp ananda/abc123 directory=dpdata1 dumpfile=expCASES.dmp job_name=cases_import

임포트 프로세스의 기본 작업 방식은 테이블 및 연관된 모든 객체를 생성하고 테이블이 있는 상태에서 오류를 만들어 내는 것입니다.기존 테이블에 데이타를 추가해야 하는 경우 위의 명령행에 TABLE_EXISTS_ACTION=APPEND를 사용할 수 있습니다.

DPE와 마찬가지로 프로세스 도중 Control-C를 누르면 DPI(Date Pump Import)의 대화식 모드를 표시하며 Import>가 프롬프트됩니다.

특정 객체 작업

한사용자에서 특정 프로시저만 엑스포트하여 다른 데이타베이스나 사용자에 다시 생성해야 했던 경험이 있습니까? 기존의 엑스포트유틸리티와 달리 Data Pump는 특정 유형의 객체만 엑스포트할 수 있습니다. 예를 들어, 다음 명령을 실행하면 테이블, 뷰또는 함수 등은 제외하고 오로지 프로시저만 엑스포트할 수 있습니다.

expdp ananda/iclaimdirectory=DPDATA1 dumpfile=expprocs.dmp include=PROCEDURE To exportonly a few specific objects--say, function FUNC1 and procedurePROC1--you could use expdp ananda/iclaim directory=DPDATA1dumpfile=expprocs.dmp include=PROCEDURE:"='PROC1'",FUNCTION:"='FUNC1'"
이 덤프 파일은 소스의 백업으로 사용됩니다. 때로는 이를 사용해 DDL 스크립트를 생성하여 나중에 사용할 수도 있습니다. DDL 스크립트 파일을 생성하려면 SQLFILE이라고 하는 특수 매개변수를 사용합니다.

impdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp sqlfile=procs.sql

이 명령은 DPDATA1로 지정된 디렉토리에 procs.sql로 명명된 파일을 생성하며 엑스포트 덤프 파일 내의 객체 스크립트가 들어 있습니다. 이 접근방법을 사용하면 다른 스키마에 원본을 보다 신속하게 생성할 수 있습니다.

INCLUDE매개변수를 사용하면 객체가 덤프 파일에서 포함 또는 제외되도록 정의할 수 있습니다. 예를 들어,INCLUDE=TABLE:"LIKE 'TAB%'" 절을 사용하면 이름이 TAB로 시작하는 테이블만 엑스포트할 수 있습니다.마찬가지로 INCLUDE=TABLE:"NOT LIKE 'TAB%'" 구문을 사용하면 TAB으로 시작하는 모든 테이블을 제외시킬수 있습니다. 아니면 EXCLUDE 매개변수를 사용해 특정 객체를 제외시킬 수 있습니다.

Data Pump를사용하면 외부 테이블로 테이블스페이스를 이동할 수도 있는데, 이렇게 하면 진행 중인 병렬화를 다시 정의하고 기존 프로세스에테이블을 추가하는 등의 작업에 매우 효과적입니다. 다음 명령을 실행하면 Data Pump 엑스포트 유틸리티에서 사용 가능한매개변수 목록이 생성됩니다.

expdp help=y

마찬가지로 impdp help=y 명령을 실행하면 DPI의 모든 매개변수가 표시됩니다.

DataPump 작업을 실행하는 동안 DPE 또는 DPI 프롬프트에 STOP_JOB을 실행하여 작업을 일시 중지한 다음START_JOB으로 다시 시작할 수 있습니다. 이 기능은 공간이 부족하여 계속하기 전에 정정해야 하는 경우 유용하게 사용할 수있습니다.

제공 : DB포탈사이트 DBguide.net
반응형
반응형

SYSMAN의 패스워드를 수정하게 되면 OEM(Oracle Enterprise Manager)관련 설정도 바뀐다는 것을 미쳐 몰랐기에 결국 OEM을 재구축하는 상황을 맞이하였습니다.

과거 OEM의 재구축에 관련해서 포스팅한 적이 있으나 RAC환경에 특화된 내용인데다 당시 지식이 부족했던 탓에 여러가지 잡다한 설정이 많았습니만 이번에는 RAC가 아닌 일반적인 싱글 DB환경에서 최소한 간략한 커맨드 구성으로 OEM을 재구축해 보았습니다.

기본적으로 OEM 재구축은 EMCA를 이용해서 다음의 2줄로 끝납니다.
emca -deconfig dbcontrol db -repos drop << 기존 OEM관련 삭제
emca -config dbcontrol db -repos create << OEM 작성


다만 언제나 오라클 관련 작업이 그렇듯 예상치 못했던 트러블이 이번에도 발생했는데요. 이번 작업 내용을 쭉 보면서 그부분도 설명해 보겠습니다.

1. 기존 OEM관련 삭제
[oracle@HostName log]$ emca -deconfig dbcontrol db -repos drop

EMCAの開始: 2008/03/14 14:04:23
EMコンフィギュレーション・アシスタント, リリース10.2.0.1.0 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

次の情報を入力してください:
データベースのSID: orcl
リスナーのポート番号: 1521
SYSユーザーのパスワード:
SYSMANユーザーのパスワード:

続行しますか。 [はい(Y)/いいえ(N)]: y
2008/03/14 14:04:43 oracle.sysman.emcp.EMConfig perform
情報: この操作は/opt/app/oracle/product/10.2.0/db/cfgtoollogs/emca/orcl/emca_2008-03-14_02-04-23-午後.logでロギングされています。
2008/03/14 14:04:43 oracle.sysman.emcp.util.DBControlUtil stopOMS
情報: Database Controlの停止中(少し時間がかかります)...
2008/03/14 14:04:45 oracle.sysman.emcp.EMReposConfig stopDBMSJobs
警告: SQL接続の初期化中にエラーが発生しました。SQL操作を実行できません
2008/03/14 14:04:45 oracle.sysman.emcp.EMReposConfig invoke
警告: DBMSジョブを削除できません。
2008/03/14 14:04:45 oracle.sysman.emcp.EMReposConfig dropRepository
情報: EMリポジトリの削除中(少し時間がかかります)...
2008/03/14 14:05:29 oracle.sysman.emcp.EMReposConfig invoke
情報: リポジトリは正常に削除されました
Enterprise Managerの構成が正常に完了しました
EMCAの終了: 2008/03/14 14:05:29

각 시스템 유저의 패스워드만 잘 기억하고 계시다면 이부분은 별 문제가 없습니다. 메일 관련해서는 그냥 엔터치고 넘어가시면 됩니다.


2. OEM 작성
[oracle@HostName log]$ emca -config dbcontrol db -repos create
shell-init: error retrieving current directory: getcwd: cannot access parent directories: そのようなファイルやディレクトリはありません
Error occurred during initialization of VM
java.lang.Error: Properties init: Could not determine current working directory.

트러블은 이곳에서 발생했는데 위 메세지에서 보이는 getcwd에러는 과거에 오라클과 관련이 없는 부분에서도 본 기억이 있던 내용이었습니다. 즉 오라클 문제가 아니라는 것이죠. 구글신께 2시간 가까이 제사를 드린 결과 다음과 같은 신탁을 얻을 수 있었습니다.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=45511

영어공부를 소홀히 해온 것에 대한 반성의 시간을 가지며 해석을 위해 악전고투한 결과 간신히 bash 버그 문제같다는 뜻을 읽을 수 있었는데요, 언제나 그렇듯 문제점만 확인이 되면 대처는 간단했지요. bash대신 csh을 사용해서 문제를 우회했습니다.

[oracle@HostName log]$ /bin/csh

[oracle@HostName ~]$ emca -config dbcontrol db -repos create

EMCAの開始: 2008/03/14 14:16:42
EMコンフィギュレーション・アシスタント, リリース10.2.0.1.0 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

次の情報を入力してください:
データベースのSID: orcl
リスナーのポート番号: 1521
SYSユーザーのパスワード:
DBSNMPユーザーのパスワード:
SYSMANユーザーのパスワード:
通知用の電子メール・アドレス (オプション):
通知用の送信メール(SMTP)サーバー (オプション):
-----------------------------------------------------------------

次の設定が指定されています

データベースのORACLE_HOME ................ /opt/app/oracle/product/10.2.0/db

データベース・ホスト名 ................ HostName
リスナーのポート番号 ................ 1521
データベースのSID ................ orcl
通知用の電子メール・アドレス ...............
通知用の送信メール(SMTP)サーバー ...............

-----------------------------------------------------------------
続行しますか。 [はい(Y)/いいえ(N)]: y
2008/03/14 14:17:02 oracle.sysman.emcp.EMConfig perform
情報: この操作は/opt/app/oracle/product/10.2.0/db/cfgtoollogs/emca/orcl/emca_2008-03-14_02-16-42-午後.logでロギングされています。
2008/03/14 14:17:03 oracle.sysman.emcp.EMReposConfig createRepository
情報: EMリポジトリの作成中(少し時間がかかります)...
2008/03/14 14:18:22 oracle.sysman.emcp.EMReposConfig invoke
情報: リポジトリは正常に作成されました
2008/03/14 14:18:24 oracle.sysman.emcp.util.DBControlUtil startOMS
情報: Database Controlの起動中(少し時間がかかります)...
2008/03/14 14:19:58 oracle.sysman.emcp.EMDBPostConfig performConfiguration
情報: Database Controlは正常に起動されました
2008/03/14 14:19:58 oracle.sysman.emcp.EMDBPostConfig performConfiguration
情報: >>>>>>>>>>> Database ControlのURLはhttp://HostName:1158/emです <<<<<<<<<<<
Enterprise Managerの構成が正常に完了しました
EMCAの終了: 2008/03/14 14:19:58

재구축작업은 DBSNMP유저의 패스워드 입력이 추가되는것 이외에는 삭제작업과 별 다를 것이 없습니다. 이후 OEM을 기동해서 다시 정상적으로 서비스가 사용가능한 것을 확인했습니다.

이번에 새로 얻은 경험은 sysman유저정보 변경의 위험성과 getcwd관련 에러의 테크니컬 트러블 슈팅이었습니다.

이상.

출처 : http://elflord.egloos.com/3660588
반응형
반응형

Oracle Enterprise Manager를 재설치하던중 새로이 발생한 트러블을 정리해둔다.

과거 포스팅 한 EM재설치 수순의 (2) 를 실행하다가 다음의 에러가 발생했다.

>SQL> drop user sysman cascade;
>drop user sysman cascade
>*
>行1でエラーが発生しました。:
>ORA-00604: 再帰SQLレベル1でエラーが発生しました。
>ORA-00942: 表またはビューが存在しません。
>
>
>SQL> drop user mgmt_view cascade;
>drop user mgmt_view cascade
>          *
>行1でエラーが発生しました。:
>ORA-01918: ユーザー'MGMT_VIEW'は存在しません
>
>
>SQL> drop role mgmt_user;
>drop role mgmt_user
>          *
>行1でエラーが発生しました。:
>ORA-01919: ロール'MGMT_USER'は存在しません
>
>
>SQL> drop public synonym mgmt_target_blackouts;
>drop public synonym mgmt_target_blackouts
>                    *
>行1でエラーが発生しました。:
>ORA-01432: 削除するパブリック・シノニムが存在しません。
>
>
>SQL> drop public synonym setemviewusercontext;
>drop public synonym setemviewusercontext
>                    *
>行1でエラーが発生しました。:
>ORA-01432: 削除するパブリック・シノニムが存在しません。


이미 OEM의 리포지토리가 전부 삭제되었을때 나오는 메세지이다. 하지만 이후 계속 진행하다가 수순 (4)에서 emca -a -c 커맨드를 실행하면 최종적으로 다음의 메세지가 출력되며 설치작업을 실패하였다.

>SEVERE: Repository already exists.  Fix the error(s) and run EM Configuration As
>sistant again in standalone mode.
>Could not complete the configuration. Refer to the log file for details

기존 리포지토리가 전부 삭제되지 않았다는 뜻이다.




이 현상이 발생하는 이유는 EM의 관리자권한을 가진 유저인 sysman의 스키마 딕셔너리 정보에 문제가 발생해서 정합성을 잃어버렸기 때문인데 이를 해결하기 위해서는 해당 DB를 재작성할 필요가 있다. 그러기 위해서는 다음 커맨드를 실행한다.

$ORACLE_HOME/rdbms/admin/catqueue.sql

이후 다시 EM의 재설치수순을 밟아보면 정상적으로 진행되는것을 확인할 수 있다.


이상.

출처 : http://elflord.egloos.com/2355582
반응형
반응형

테스트용 Oracle10g 운용서버의 Enterprise Manager에 문제가 생긴건 거진 두달전 이야기이다. 그동안 줄곧 복구해야겠다고 마음먹었으나 기타 업무가 산적해있던 관계로 줄곧 미루어오다가 드디어 전번주부터 수복작업에 착수했다.

일단 증상으로는 Enterprise Manager에 접속이 되지않고 기동명령을 내리면 기동되었다는 메세지가 나오지만 스테이터스를 확인하면 여전히 not running 상태로 표시된다.

일주일동안 줄곧 OiSC에 문의하고 적용하며 테스트 한 결과 오늘에야 간신히 복구가 가능했다.

결국 내린 해결책은 문제점을 찾아내서 고치는게 아니라 기존의 Enterprise Manager 의 설정 및 Repository, 그리고 서비스 구성파일을 깔끔하게 지워버리고 나서 구성 요소를 새로 인스톨하는 방법이었다. (엘레강스한 방법을 원했건만 결국 무식하게 힘으로 밀어붙이는 방법밖에 알 수 없었다. ㅠㅠ)
이 방법은 Enterprise Manager에 관계된 자료만 손대므로 DB의 데이터는 당연히 안전하다.

복구과정 및 결과를 기록해둔다.
(단 이 과정은 RAC환경에서 ASM을 적용한 서버의 경우이다. 그렇지 않은 경우는 적절히 고쳐야 함.)

Oracle10g Enterprise Manager 복구(재구성) 순서

1) Management Repository 를 삭제한다.

% cd $ORACLE_HOME/sysman/admin/emdrep/bin
% ./RepManager < 호스트 이름 > < 리스너 포트 번호 > < SID > -sys_password < SYS 유저 패스워드 > -action drop

2) DBA권한을 가진 유저로 SQL*Plus 에 접속해서 다음의 명령을 실행한다.

drop user sysman cascade;
drop user mgmt_view cascade;
drop role mgmt_user;
drop public synonym mgmt_target_blackouts;
drop public synonym setemviewusercontext;

3) Enterprise Manager 서비스 구성파일을 삭제한다.

% emca -c -x < DB_NAME > 을 실행.

※ < DB_NAME > 은 초기화 파라메터 db_name 에서 지정하는 값으로 < SID > 가 아닌점에 주의할것.
※ ORACLE_HOME, ORACLE_SID 가 미리 설정되어 있는 환경에서 해야할 필요가 있음. (그냥 오라클 유저로 하는게 제일 속편하다.)

4) Enterprise Manager 서비스 구성파일을 새롭게 설치하기위해 다음 명령을 실행한다.

% emca -a -c

※ -a : ASM 환경에서 설정하는 옵션.
※ -c : Real Application Cluster 환경에서 설정하는 옵션.

5) 4)를 실행하면 다음의 입력을 요구받는다.

리스너의 포트번호
클러스터 이름(모를경우 ORACLE_HOME/install/cluster.ini 에서 cluster_name 으로 지정된 값 확인)
데이터베이스 이름 (초기화 파라메터 dbname 에 지정된 값)
서비스 이름(데이터베이스의 service_name. lsnrctl status < 리스너 이름 > 등으로 확인가능 )
통지용 메일주소:(입력안해도 무관, 걍 엔터)
통지용 메일게이트웨이:(역시 입력안해도 무관, 걍 엔터)
ASM ORACLE_HOME [ ... ] (디폴트설정이면 그냥 엔터)
ASM포트 [ ... ] (역시 디폴트설정이면 그냥 엔터)
ASM유저 롤 [ SYSDBA ] (역시 디폴트설정이면 그냥 엔터)
ASM유저 이름 [ SYS ] (역시 디폴트설정이면 그냥 엔터)
ASM유저패스워드
DBSNMP유저 패스워드
SYSMAN유저 패스워드
SYS유저 패스워드

6) 이상으로 작업종료. Enterprise Manager 가 정상기동 되었는지 확인해본다.

출처 : 오라클 KROWN

이상.
반응형
반응형


유저 : root
파일 : /etc/inittab
시스템 : aix 5.3

주의사항 : respawn 옵션이 있기전에 넣어야 정상적으로 작동
 # USER SHELL #
myroute:2:once:/usr/local/bin/sys_route.sh > /dev/console 2>&1
mydbstart:2:wait:/usr/local/bin/dbstart > /dev/console  2>&1
myjeusstart:2:once:/usr/local/bin/jeusstart > /dev/console 2>&1
mymegatier:2:once:/usr/local/bin/megatierstart > /dev/console 2>&1
#############

myroute 는 라우팅 설정을 하는 파일
mydbstart 는 oracle 을 시작하고 리스너 까지 실행
myjeusstart는 제우스 시작을 함
mymegatier 연계 솔루션을 시작함.

단 mydbstart는 wait를 걸어 실행하고 쉘이 끝날 때까지 기다림.

모든 .sh 쉘 파일은 실행가능한 옵션으로 설정함 (chmod +x 파일명.sh)

su - 사용자계정 -c (실행명령)

파일 : /usr/local/bin/sys_route.sh
 # 시스템 라우팅 세팅 쉘
# 기본 라우팅 설정 세팅
 /usr/sbin/route add 0.0.0.0 -netmask 0.0.0.0 192.168.0.1 -if en2

파일 : /usr/local/bin/dbstart
 su - oracle -c /oracle/product/102/VMS/bin/dbstart

파일 :  /oracle/product/102/VMS/bin/dbstart

#!/usr/bin/sh
# ORACLE START
/oracle/product/102/VMS/bin/sqlplus '/as sysdba' <<-EOF
startup
exit 0

EOF

# LISTENER START
/oracle/product/102/VMS/bin/lsnrctl start


파일 : /usr/local/bin/jeusstart
su - emdnet -c /home/jeus5/bin/jboot


위와 같이 설정하면 정상적으로 작동함...

단.....

AIX에서 inittab 파일에서 default init 설정을 확인하면 대부분이 level 2이므로

/etc/rc.d/rc2.d/ 밑에 S01파일명 형태의 link를 걸어도 무방하다~
반응형
반응형

유닉스도 여러종류가 있는데 어떤 유닉스인가요? hp,sun,ibm...등등..

.profile에 넣어서는 오라클이 자동실행이 되질 않습니다....

sun unix기준으로 자동으로 오라클이 올라오게 하려면...


sun solaris 부팅 시 oracle DB를 auto startup하도록 하는 데 관련된 화일들이다.

/etc/inittab : o/s의 초기화 과정을 조절하는 화일
/etc/rc2 : 부팅 run-level 2 에서 사용되는 스크립트
/etc/rc0 : 부팅 run-level 0 에서 사용되는 스크립트
/etc/rc2.d/S99dbstart : /etc/init.d/dbstart 에 대한 symbolic link
/etc/rc0.d/K01dbshut : /etc/init.d/dbshut 에 대한 symbolic link
/var/opt/oracle/oratab : 시스템에 설치된 오라클 인스턴스에 대한 정보.

(참고)
/etc/init.d/dbstart, dbshut 화일은 super user(root)로 생성하시고,
symbolic link도 super user로 만드시기 바랍니다.
이 화일들은 super user가 owner가 되도록 하고, super user(root)만이
실행 가능하도록 해야 합니다.


1. 먼저 vi /etc/inittab 화일을 열어보십시오.

ap::sysinit:/sbin/autopush -f /etc/iu.ap
fs::sysinit:/sbin/rcS >/dev/console 2>&1 is:3:initdefault:
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/console 2>&1
s0:0:wait:/sbin/rc0 >/dev/console 2>&1 s1:1:wait:/usr/sbin/shutdown -y -iS -g0 >/dev/console 2>&1 s2:23:wait:/sbin/rc2 >/dev/console 2>&1 s3:3:wait:/sbin/rc3 >/dev/console 2>&1 s5:5:wait:/sbin/rc5 >/dev/console 2>&1 s6:6:wait:/sbin/rc6 >/dev/console 2>&1 fw:0:wait:/sbin/uadmin 2 0 >/dev/console 2>&1 of:5:wait:/sbin/uadmin 2 6 >/dev/console 2>&1 rb:6:wait:/sbin/uadmin 2 1 >/dev/console 2>&1 sc:234:respawn:/usr/lib/saf/sac -t 300
co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " -T
sun
-d /dev/console -l console -m ldterm,ttcompat

s1부터 s6까지 os file들에 대해 위와 같이 device redirection이 연결되어
있으면 됩니다.

------------------------------------------------------------------------
s2:23:wait:/sbin/rc2 >/dev/console 2>&1
위와 같이 설정하면 run-level 2일 경우 /sbin/rc2 스크립트가 실행된다.
/sbin/rc2 는 /etc/rc2.d 디렉토리에 들어있는 스크립트를 실행한다.
만약 스크립트가 S 로 시작하면 /sbin/rc2 는 이 스크립트에 startup 파라미
터를 부여하고 여기서 지정된 프로세스를 실행시킨다.
따라서 /etc/rc2.d/S99dbstart 화일을 사용하여 dbstart를 실행한다.

shutdown 과정도 거의 비슷하다. /etc/inittab 에 다음과 같은 라인을 보자.

s0:0:wait:/sbin/rc0 >/dev/console 2>&1
이것은 /sbin/rc0 를 실행시키는데 /sbin/rc0 는 /etc/rc0.d 디렉토리에
들어있는 스크립트를 실행시킨다.
스크립트 이름이 K 로 시작하면 이것은 stop 파라미터를 갖고 실행되어서 이
스크립트에 지정된 프로세스를 정지시킨다.
따라서 /etc/rc0.d/K01dbshut 스크립트는 stop 파라미터를 갖고 실행되며
이 스크립트는 $ORACLE_HOME/bin/dbshut 스크립트를 실행시켜서 오라클을
shutdown 시킨다.
------------------------------------------------------------------------


2. 그 다음에 vi /etc/rc2 화일을 한번 열어보세요.

이 스크립트 화일은 run-level 2에서 사용되는 스크립트입니다.
특별히 수정할 내용은 없으나, 이 화일이 존재하는지 확인해 보십시오.

PATH=/usr/sbin:/usr/bin
set `/usr/bin/who -r`
if [ x$9 = "xS" -o x$9 = "x1" ]
then
echo 'The system is coming up. Please wait.'
BOOT=yes
...


3. 그 다음에 vi /etc/rc0 화일을 한번 열어보세요.

이 스크립트 화일은 run-level 0에서 사용되는 스크립트입니다.
특별히 수정할 내용은 없으나, 이 화일이 존재하는지 확인해 보십시오.

PATH=/usr/sbin:/usr/bin

echo 'The system is coming down. Please wait.'

# make sure /usr is mounted before proceeding since init scripts
# and this shell depend on things on /usr file system
/sbin/mount /usr > /dev/null 2>&1

# The following segment is for historical purposes.
# There should be nothing in /etc/shutdown.d.
if [ -d /etc/shutdown.d ]
then
for f in /etc/shutdown.d/*
{
if [ -s $f ]
then
/sbin/sh ${f}
fi
}
fi
...


4. /etc/init.d/dbstart 와 /etc/init.d/dbshut 스크립트를 만들어야 합니다.
그 내용은 각각 다음과 같이 한 줄로 작성합니다.

/etc/init.d/dbstart 화일은 다음과 같이 만듭니다.
su - -c <$ORACLE_HOME>/bin/dbstart
/etc/init.d/dbshut 화일은 다음과 같이 만듭니다.
su - -c <$ORACLE_HOME>/bin/dbshut



5. /etc/rc2.d/S99dbstart 화일을 /etc/init.d/dbstart에 대한 link로 생성합니다.

ln -s /etc/init.d/dbstart /etc/rc2.d/S99dbstart


6. /etc/rc0.d/K01dbshut 화일을 /etc/init.d/dbshut에 대한 link로 생성합니다.

ln -s /etc/init.d/dbshut /etc/rc0.d/K01dbshut


7. /var/opt/oracle/oratab 화일을 엽니다.

oratab 화일은 일반 텍스트 화일로서 시스템에 설치된 오라클 인스턴스에 대한
정보를 가지고 있는데 보통 3개의 필드로 이루어져 있으며,
첫번재 필드는 ORACLE_SID, 두번째 필드는 ORACLE_HOME, 세번째 필드는 Y 또는
N으로 구성되어 있습니다. 해당 인스턴스를 auto startup 시키려면 세번째
필드가 반드시 Y로 세팅되어 있어야 합니다.

아래에 예를 참조하세요.

ORA805:/oracle4/ora8/app/oracle/product/8.0.5:Y
ORA815:/oracle4/ora8i/app/oracle/product/8.1.5:Y

(주)
만약, <$ORACLE_HOME>/bin/dbstart 수행에 오류가 있으면 기존의 dbstart 화
일을 다른 path에 rename하고, 아래 내용만 가지고 <$ORACLE_HOME>/bin/ 아래
에 dbstart 화일을 다음과 같이 만든다.

svrmgrl connect internal
startup
exit
EOF


Example
-------
none


Reference doc-uments
-------------------
none



블루틴참조


반응형
반응형
http://219.232.242.145/


무료 IPTV 시청 프로그램
반응형
반응형
Oracle C++ Call Interface (OCCI) is an Application Programming Interface (API) that provides C++ applications access to data in an Oracle database. This API is a significant improvement to the Oracle Call Interface (OCI) API as far as ease of use is concerned. Engineers who have written JDBC (Java Database Connectivity) code will find the OCCI API to be quite similar to that of JDBC

1) The table that is used in the example code is:

Code: SQL
CREATE TABLE EMP(
    empno     NUMBER,
    ename     VARCHAR2(10),
    hireDate  Date);
2) Database Query : Select the contents of the EMP table

Code: Cpp
#include <DbManager.h>
#include <iostream>

using namespace std;

using namespace oracle::occi;

const string sqlString("select empno, ename, hiredate from emp");

const string dateFormat("DD-MON-YYYY HH24:MI:SS");

int main(int argc, char **argv)

{
    if (argc != 2)
    {
        cerr << "\nUsage: " << argv[0] << " <db-user-name>\n" << endl;
        exit(1);
    }
   
    // Initialize OracleServices
   
    DbManager* dbm = NULL;
   
    OracleServices* oras = NULL;
   
    Statement *stmt = NULL;
   
    ResultSet *resultSet = NULL;
   
    try
    {
       
        // Obtain OracleServices object with the default args.
       
        dbm = new DbManager(userName);
       
        oras = dbm->getOracleServices();
       
        // Obtain a cached connection
       
        Connection * conn = oras->connection();
       
        // Create a statement
       
        stmt = conn->createStatement(sqlString);
       
        int empno;
       
        string ename;
       
        Date hireDate;
       
        string dateAsString;
       
        // Execute query to get a resultset
       
        resultSet = stmt->executeQuery();
       
        while (resultSet->next())
        {
           
            empno = resultSet->getInt(1)// get the first column returned by the query;
           
            ename = resultSet->getString(2)// get the second column returned by the query
           
            hireDate = resultSet->getDate(3)// get the third column returned by the query
           
            dateAsString="";
           
            //You cannot check for null until the data has been read
           
            if (resultSet->isNull(1))
            {
                cout << "Employee num is null... " << endl;
            }
            if (resultSet->isNull(2))
            {
                cout << "Employee name is null..." << endl;
            }
            if (resultSet->isNull(3))
            {
                cout << "Hire date is null..." << endl;
            }
            else
            {
                dateAsString=hireDate.toText(dateFormat);
            }
            cout << empno << "\t" << ename << "\t" << dateAsString << endl;
           
        }
       
        // Close ResultSet and Statement
       
        stmt->closeResultSet(resultSet);
       
        conn->terminateStatement(stmt);
       
        // Close Connection and OCCI Environment
       
        delete dbm;
       
    }
    catch (SQLException& ex)
    {
        if (dbm != NULL)
        {
            dbm->rollbackActions(ex, stmt, resultSet); // free resources and rollback transaction
        }
    }
    catch (ExoException& ex1)
    {
        cerr << "\nCaught ExoException:\n" << ex1.getExceptionText() << endl;
        exit(2);
    }
   
    return 0;
}

반응형
반응형

정말 감사합니다.
쉽게 해결될 듯도 합니다.

>안녕하세요?
>oracle 8i이상버전에서는 지원가능합니다.
>datafile을 copy하고 , tablespace의 metadata를 export받아서 다른서버에 import하면 됩니다.
>
>방법
>
>1. 제약사항
>*O/S 종류가 동일해야 한다.
>*nls_characterset, nls_ncharcaterset이 동일해야 한다.
>*db_block_size가 동일해야 한다.
>*transport할려는 tablespaces에 object를 만든 user는 반드시 다른 서버에 존재해야 한다.
>*transport할려는 tablespace set은 self-contained tablespace이여야 한다.
>*sys user로 exp/imp한다.
>(tablespace ts01에 연관된 object가 ts02에도 존재 한다면 두개의 tablespace를 transport해야 한다.
>LOB data, partitioned table, index, table등의 기타 object들은 transport할려는 tablespace set에 포함되어야 한다. 따라서 이것을 옮기기전에 옮길려구 하는 테이블이 self-contained tablespace인지를 파악후에 작업하는것이 필요하다.)
>
>2. self-containd tablespace인 확인방법
>declare
>begin
>dbms_tts.transport_set_check('TS01,TS02',TRUE);
>end;
>/
>실행후
>SELECT * FROM TRANSPORT_SET_VIOLATIONS;
>뷰를 확인해서 선택된 것이 없다면 self-contained tablespace들이다.
>TS01,TS02 : transport할려는 tablespace들이다.
>TRUE : referencial constraint에 대해 self-contained 여부를 check해준다
>
>2. source 서버에서의 작업
>* 옮기려는 tablespace들에 대해 read only로 만든다.(파일 copy시 변경작업이 일어 나지 못하도록 하기위해서)
>alter tablespace ts01 read only;
>alter tablespace ts02 read only;
>
>*tablespaces에 속해 있는 모든 datafile을 대상 서버로 copy한다.(ts01.dbf, ts02.dbf)
>
>*console에서 tablespace의 metadata를 export받는다.
>exp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y tablespaces=ts01,ts02(windows)
>
>exp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y tablespaces=ts01,ts02(unix : 816 이상에서)
>
>* export받은 metadata(transtest10.dmp )를 대상서버로 copy한다.
>
>3. 대상 서버에서의 작업
>* transport tablespace에 object를 만든 user에 대해 대상서버에도 user를 생성해준다.
>*console에서 import한다.
>imp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y
>datafiles=/경로/ts01.dbf,/경로/ts02.dbf (windows)
>
>imp 'sys/oracle as sysdba' file=transtest10.dmp transport_tablespace=y
>datafiles=/경로/ts01.dbf,/경로/ts02.dbf (unix : 816 이상에서)
>
>4. source 서버에서 기존의 tablespaces들을 이용하려면 read write로 바꿔준다.
>alter tablespace tp01 read write;
>alter tablespace tp02 read write;
>
>5. source 서버에서 기존의 tablespaces들이 필요없을 경우 삭제한다.
>alter tablespace tp01 including contents;-->datafile을 console에서 삭제한다.(9i이전 버전)
>alter tablespace tp02 including contents and datafiles;(9i 이상에서 tablespace 및 datafile도 자동으로 삭제한다.)
>
>
>수고하세요
>Good Job
>-----------------------------------------------------------------
>
>
>
>>현재 사용하고 있는 서버에서 한개의 테이블스페이스만 다른 서버로 옮기려고합니다.
>>대상 TableSpace가 워낙 자료가 많아 Export를 받기에는 역부족이고 (시간상으로)
>>해서 DataFile을 이용하여 옮길수 있는 방법이 없는지 문의를 드립니다.
>

출처 : http://www.koug.net/xe/4116
반응형

+ Recent posts