1. Oracle 12c R1 RAC (Real Application Cluster)
  • Oracle RAC에서는 Oracle Database (데이터를 실제로 보유하고 있는 Storage의 물리적 구조 즉, 데이터 파일들에서 Oracle Instance (데이터 접근 지원을 위해 서버 상에서 실행되는 프로세스 및 메모리 구조)를 분리할 수 있다.
  • 클러스터 데이터베이스는 여러 개의 인스턴스가 접근할 수 있는 단일 데이터베이스이다. 각 인스턴스는 클러스터내의 별도의 서버에서 실행된다. 추가 자원이 필요한 경우, 시스템 중단 없이 클러스터에 노드 및 인스턴스를 손쉽게 추가할 수 있다. 새로운 인스턴스가 시작되면, 애플리케이션이나 애플리케이션 서버를 변경하지 않고도 서비스를 사용하는 애플리케이션이 이를 즉시 활용할 수 있다.
  • Oracle RAC는 Oracle Database의 확장 기능이기 때문에 Oracle Database 12c의 관리 용이성, 안정성 및 보안성을 활용할 수 있다.
  1. Oracle 12c RAC Architecture


  1. 네트워크 구성정보
Hostname Public IP Private IP Virtual IP SCAN IP
XXXDB01 172.30.xxx.xxx 11.0.0.1 172.30.xxx.xxx 172.30.xxx.xxx
XXXDB02 172.30.xxx.xxx 11.0.0.2 172.30.xxx.xxx
  1. Oracle Grid Infrastructure Process 구조


    1. Cluster Synchronization Services (CSS)
  • Cluster에 어떤 node가 추가/제거 되었는지 모니터링 및 정보관리
  • Heartbeat 메커니즘을 이용 (interconnect를 통한 Network Heartbeat)
  • 각 멤버 node 들에게 node membership 정보 전달
  • Vendor clusterware 사용시 직접 통신하면서 node membership 정보 관리
  • Css 프로세스 비정상 종료 시 node reboot
  1. Cluster Ready Services (CRS)
  • Database, Instance, Service, Listener, VIP, Application 등 모든 cluster 리소스들을 OCR에 등록되어 있는 리소스 정보에 기반하여 관리
  • 리소스 모니터링 중 장애발생시 해당 리소스 start, stop, failover 조치
  • cluster 리소스 등록/제거, 모니터링, 시동/중지 관련 명령어 인터페이스를 제공
  • crs 프로세스 종료 시, init process에 의해 자동으로 재 기동
  1. Event Manager
  • evmd.bin 프로세스
  • grid user로 동작
  • crs가 발생시키는 이벤트들을 전파
  • Log 파일에 이벤트를 기록하는 역할 (evmlogger)
  • Racgimon이 전달하는 메시지에 따라 racgevt 프로세스 fork
  • Fail시, 자동 재 기동
  1. Process Monitor Daemon(OPROCD)
  • IO fencing 기능 제공을 위한 Oracle 솔루션
  • Vendor clusterware를 사용하는 경우, 동작 하지 않음
  1. Global Service Daemon(GSD)
  • 9i 이전의 클라이언트가 11g CRS에 접속하여 각 종 관리업무를 수행할 수 있도록 돕는 프로세스
  • 11g에서는 backward compatibility를 위해서만 존재할 뿐 특별한 역할 없음
  1. Virtual IP
  • IP failover를 위해 Oracle CRS가 제공
  • Public network interface에 VIP를 할당
  • Network interface에 오류가 발생하면 CRS가 fail된 VIP의 address를 살아있는 node로 failover
  1. Single Client Access Name(SCAN)
  • 11gR2 RAC부터 소개된 기능으로 Cluster로 구성되어 운영중인 Oracle Database 에 접근하는 모든 Client에서 SCAN으로 접속할 수 있다.
  • SCAN으로 접속 시 자동으로 Server Side Load Balancing을 수행한다. (Default로 Remote Listener에 SCAN이 등록됨)
  • SCAN은 Grid 설치 시 반드시 구성해야 하며, GNS을 사용하지 않는다면, SCAN NAME을 아래와 같이 DNS상에 등록해줘야 한다.
  • 기본적으로 3개의 Public IP를 동일한 이름으로 등록해줘야 하며, Public과 SCAN 의 subset은 동일하여야 한다. (최소 1개의 IP등록)
  1. Oracle Grid Infrastructure 관련 파일
    1. Oracle Cluster Registry(OCR)
  • Cluster 리소스들에 대한 정보 저장소
  • 반드시 shared disk상에 위치
  • Multiplexing 가능 (multiplexing 권장)
  • Enterprise Manager / Server Control Utility (SRVCTL) / Database Configuration Assistant (DBCA)을 통해서 수정 가능
  1. Voting Disk
  • Cluster membership 관리를 위해 css 데몬이 이용
  • Cluster member들의 health check
  • Split brain 상태에서 node의 상태를 판단하기 위한 second heartbeat 역할
  • 반드시 shared disk상에 위치
  • Multiplexing 가능 (multiplexing 권장)
  1. Oracle RAC 기동(Startup), 정지(Shutdown)
    1. Clusterware 기동과 정지
      1. Oracle Clusterware 기동
  • CRSCTL 유틸리티는 Oracle Clusterware를 관리한다.
  • 다음의 명령어로 OHASD process가 기동되면서 Oracle Clusterware 의해 관리되는 프로세스와 리소스를 시작할 수 있다.
  • 각 node에서 root 계정으로 수행하여 Cluster 리소스를 기동한다.
# cd /grid/12.1.0.2/bin
# ./crsctl start crs
CRS-4123: Oracle High Availability Services has been started.
  • oracle 계정으로 아래의 명령 중 선택하여 수행하여 DB instance를 기동한다.
# su – oracle
$ srvctl start database -database -d XXXDB — 모든 node의 instance 기동
$ srvctl start instance -d XXXDB -i XXXDB1 — XXXDB1 instance만 기동
  1. Oracle Clusterware 정지
  • 다음 명령어로 Oracle Clusterware 의해 관리되는 모든 프로세스와 리소스를 정지한다.
  • oracle 계정으로 아래의 명령 중 선택하여 수행하여 DB instance를 정지한다.
# su – oracle
$ srvctl stop database -database -d XXXDB — 모든 node의 instance 정지
$ srvctl stop instance -d XXXDB -i XXXDB1 — XXXDB1 instance만 정지
  • 각 node에서 root 계정으로 수행하여 Cluster 리소스를 정지한다.
# cd /grid/12.1.0.2/bin
# ./crsctl stop crs
CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.crsd’ on ‘XXXDB01’

CRS-2790: Starting shutdown of Cluster Ready Services-managed resources on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.DG_CRS.dg’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.DG_DATA.dg’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.DG_ARCH.dg’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.LISTENER.lsnr’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.LISTENER_SCAN1.lsnr’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.oc4j’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.cvu’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.cvu’ on ‘XXXDB01’ succeeded

CRS-2672: Attempting to start ‘ora.cvu’ on ‘ktms1’

CRS-2677: Stop of ‘ora.LISTENER.lsnr’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.XXXDB01.vip’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.LISTENER_SCAN1.lsnr’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.scan1.vip’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.DG_CRS.dg’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.DG_DATA.dg’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.DG_ARCH.dg’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.DG_CRS.dg’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.DG_DATA.dg’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.DG_ARCH.dg’ on ‘XXXDB01’

CRS-2676: Start of ‘ora.cvu’ on ‘ktms1’ succeeded

CRS-2677: Stop of ‘ora.DG_CRS.dg’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.DG_DATA.dg’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.DG_ARCH.dg’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.asm’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.asm’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.scan1.vip’ on ‘XXXDB01’ succeeded

CRS-2672: Attempting to start ‘ora.scan1.vip’ on ‘ktms1’

CRS-2677: Stop of ‘ora.XXXDB01.vip’ on ‘XXXDB01’ succeeded

CRS-2672: Attempting to start ‘ora.XXXDB01.vip’ on ‘ktms1’

CRS-2677: Stop of ‘ora.oc4j’ on ‘XXXDB01’ succeeded

CRS-2672: Attempting to start ‘ora.oc4j’ on ‘ktms1’

CRS-2676: Start of ‘ora.scan1.vip’ on ‘ktms1’ succeeded

CRS-2672: Attempting to start ‘ora.LISTENER_SCAN1.lsnr’ on ‘ktms1’

CRS-2676: Start of ‘ora.XXXDB01.vip’ on ‘ktms1’ succeeded

CRS-2676: Start of ‘ora.LISTENER_SCAN1.lsnr’ on ‘ktms1’ succeeded

CRS-2676: Start of ‘ora.oc4j’ on ‘ktms1’ succeeded

CRS-2673: Attempting to stop ‘ora.ons’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.ons’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.net1.network’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.net1.network’ on ‘XXXDB01’ succeeded

CRS-2792: Shutdown of Cluster Ready Services-managed resources on ‘XXXDB01’ has completed

CRS-2677: Stop of ‘ora.crsd’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.crf’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.ctssd’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.evmd’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.storage’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.gpnpd’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.drivers.acfs’ on ‘XXXDB01’

CRS-2673: Attempting to stop ‘ora.mdnsd’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.drivers.acfs’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.storage’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.asm’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.crf’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.ctssd’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.mdnsd’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.gpnpd’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.evmd’ on ‘XXXDB01’ succeeded

CRS-2677: Stop of ‘ora.asm’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.cluster_interconnect.haip’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.cluster_interconnect.haip’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.cssd’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.cssd’ on ‘XXXDB01’ succeeded

CRS-2673: Attempting to stop ‘ora.gipcd’ on ‘XXXDB01’

CRS-2677: Stop of ‘ora.gipcd’ on ‘XXXDB01’ succeeded

CRS-2793: Shutdown of Oracle High Availability Services-managed resources on ‘XXXDB01’ has completed

CRS-4133: Oracle High Availability Services has been stopped.

  1. Oracle Clusterware 상태 확인
  • 전체 노드상의 Clusterware stack 상태 확인
# su grid
$ crsctl check cluster -all
**************************************************************

XXXDB01:

CRS-4537: Cluster Ready Services is online

CRS-4529: Cluster Synchronization Services is online

CRS-4533: Event Manager is online

**************************************************************

  • CRS 리소스 상태 확인
$ crsctl status res -t
——————————————————————-
Name Target State Server State details

——————————————————————-

Local Resources

——————————————————————-

ora.DG_ARCH.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_CRS.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_DATA.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.LISTENER.lsnr

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.asm

ONLINE ONLINE XXXDB01 Started,STABLE

ONLINE ONLINE XXXDB02 Started,STABLE

ora.net1.network

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.ons

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

Cluster Resources

——————————————————————-

ora.LISTENER_SCAN1.lsnr

1 ONLINE ONLINE XXXDB01 STABLE

ora.MGMTLSNR

1 ONLINE ONLINE XXXDB01 169.254.110.154 11.0

.0.1,STABLE

ora.cvu

1 ONLINE ONLINE XXXDB01 STABLE

ora.mgmtdb

1 ONLINE ONLINE XXXDB01 Open,STABLE

ora.oc4j

1 ONLINE ONLINE XXXDB01 STABLE

ora.scan1.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB.db

1 ONLINE ONLINE XXXDB01 Open,STABLE

2 ONLINE ONLINE XXXDB02 Open,STABLE

ora.XXXDB01.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB02.vip

1 ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

  1. Database 기동과 정지
    1. DB Instance 기동
  • oracle 계정으로 아래의 명령 중 선택하여 수행하여 DB instance를 기동한다.
# su – oracle
$ srvctl start database -database -d XXXDB — 모든 node의 instance 기동
$ srvctl start instance -d XXXDB -i XXXDB1 — XXXDB1 instance만 기동
  • 아래의 명령으로 instance 상태를 확인한다.
$ crsctl stat res -t
——————————————————————-
Name Target State Server State details

——————————————————————-

Local Resources

——————————————————————-

ora.DG_ARCH.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_CRS.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_DATA.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.LISTENER.lsnr

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.asm

ONLINE ONLINE XXXDB01 Started,STABLE

ONLINE ONLINE XXXDB02 Started,STABLE

ora.net1.network

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.ons

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

Cluster Resources

——————————————————————-

ora.LISTENER_SCAN1.lsnr

1 ONLINE ONLINE XXXDB01 STABLE

ora.MGMTLSNR

1 ONLINE ONLINE XXXDB01 169.254.110.154 11.0

.0.1,STABLE

ora.cvu

1 ONLINE ONLINE XXXDB01 STABLE

ora.mgmtdb

1 ONLINE ONLINE XXXDB01 Open,STABLE

ora.oc4j

1 ONLINE ONLINE XXXDB01 STABLE

ora.scan1.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB.db

1 ONLINE ONLINE XXXDB01 Open,STABLE

2 ONLINE ONLINE XXXDB02 Open,STABLE

ora.XXXDB01.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB02.vip

1 ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

  1. DB Instance 정지
  • oracle 계정으로 아래의 명령 중 선택하여 수행하여 DB instance를 정지한다.
# su – oracle
$ srvctl stop database -database -d XXXDB — 모든 node의 instance 정지
$ srvctl stop instance -d XXXDB -i XXXDB1 — XXXDB1 instance만 정지
  • 아래의 명령으로 instance 상태를 확인한다.
$ crsctl stat res -t
——————————————————————-
Name Target State Server State details

——————————————————————-

Local Resources

——————————————————————-

ora.DG_ARCH.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_CRS.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_DATA.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.LISTENER.lsnr

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.asm

ONLINE ONLINE XXXDB01 Started,STABLE

ONLINE ONLINE XXXDB02 Started,STABLE

ora.net1.network

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.ons

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

Cluster Resources

——————————————————————-

ora.LISTENER_SCAN1.lsnr

1 ONLINE ONLINE XXXDB01 STABLE

ora.MGMTLSNR

1 ONLINE ONLINE XXXDB01 169.254.110.154 11.0

.0.1,STABLE

ora.cvu

1 ONLINE ONLINE XXXDB01 STABLE

ora.mgmtdb

1 ONLINE ONLINE XXXDB01 Open,STABLE

ora.oc4j

1 ONLINE ONLINE XXXDB01 STABLE

ora.scan1.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB.db

1 OFFLINE OFFLINE XXXDB01 Instance Shutdown,ST

ABLE

2 ONLINE ONLINE XXXDB02 Open,STABLE

ora.XXXDB01.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB02.vip

1 ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

  1. Listener 기동과 정지
    1. Listener 기동
  • grid 계정으로 아래의 명령을 수행하여 Listener를 기동한다.
# su – grid
$ srvctl start listener -n XXXDB01 — XXXDB01 node의 listener 기동
  • 아래의 명령으로 listener 상태를 확인한다.
$ crsctl stat res -t
——————————————————————-
Name Target State Server State details

——————————————————————-

Local Resources

——————————————————————-

ora.DG_ARCH.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_CRS.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_DATA.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.LISTENER.lsnr

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.asm

ONLINE ONLINE XXXDB01 Started,STABLE

ONLINE ONLINE XXXDB02 Started,STABLE

ora.net1.network

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.ons

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

Cluster Resources

——————————————————————-

ora.LISTENER_SCAN1.lsnr

1 ONLINE ONLINE XXXDB01 STABLE

ora.MGMTLSNR

1 ONLINE ONLINE XXXDB01 169.254.110.154 11.0

.0.1,STABLE

ora.cvu

1 ONLINE ONLINE XXXDB01 STABLE

ora.mgmtdb

1 ONLINE ONLINE XXXDB01 Open,STABLE

ora.oc4j

1 ONLINE ONLINE XXXDB01 STABLE

ora.scan1.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB.db

1 ONLINE ONLINE XXXDB01 Open,STABLE

2 ONLINE ONLINE XXXDB02 Open,STABLE

ora.XXXDB01.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB02.vip

1 ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

  1. Listener 정지
  • grid 계정으로 아래의 명령을 수행하여 Listener를 정지한다.
# su – grid
$ srvctl stop listener -n XXXDB01 — XXXDB01 node의 listener 정지
  • 아래의 명령으로 listener 상태를 확인한다.
$ crsctl stat res -t
——————————————————————-
Name Target State Server State details

——————————————————————-

Local Resources

——————————————————————-

ora.DG_ARCH.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_CRS.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.DG_DATA.dg

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.LISTENER.lsnr

OFFLINE OFFLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.asm

ONLINE ONLINE XXXDB01 Started,STABLE

ONLINE ONLINE XXXDB02 Started,STABLE

ora.net1.network

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

ora.ons

ONLINE ONLINE XXXDB01 STABLE

ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

Cluster Resources

——————————————————————-

ora.LISTENER_SCAN1.lsnr

1 ONLINE ONLINE XXXDB01 STABLE

ora.MGMTLSNR

1 ONLINE ONLINE XXXDB01 169.254.110.154 11.0

.0.1,STABLE

ora.cvu

1 ONLINE ONLINE XXXDB01 STABLE

ora.mgmtdb

1 ONLINE ONLINE XXXDB01 Open,STABLE

ora.oc4j

1 ONLINE ONLINE XXXDB01 STABLE

ora.scan1.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB.db

1 ONLINE ONLINE XXXDB01 Open,STABLE

2 ONLINE ONLINE XXXDB02 Open,STABLE

ora.XXXDB01.vip

1 ONLINE ONLINE XXXDB01 STABLE

ora.XXXDB02.vip

1 ONLINE ONLINE XXXDB02 STABLE

——————————————————————-

  1. Database 사용자 관리
    1. User의 생성
  • Password와 Default Tablespace 및 Temporary Tablespace를 지정하여 User 생성
$ sqlplus “/as sysdba”
SQL> create user test_user identified by test_user
default tablespace test_data

temporary tablespace test_tmp;

  1. 새로운 User 권한 부여
  • 관리자가 User를 생성하면 해당 User에게 각각 필요한 권한을 부여할 수 있다.
  • 다음 명령어를 통하여 User로 접속 가능하도록 할 수 있는 권한과 Object를 생성할 수 있는 권한을 부여한다.
$ sqlplus “/as sysdba”
SQL> grant resource, connect to test_user;
  1. User 패스워드 변경
  • 다음 명령어를 통하여 password를 test로 변경할 수 있다.
$ sqlplus “/as sysdba”
SQL> alter user test_user identified by test
  1. User 삭제
  • 다음 명령어를 통하여 User를 삭제할 수 있다.
$ sqlplus “/as sysdba”
SQL> drop user test_user cascade;

※ 참고 : cascade option을 이용할 경우 test_user 계정의 스키마는 물론 종속적인 foreign key 까지도 drop 시킨다. 그러므로 이용 시 주의해야 한다.

  1. Database tablespace 관리
    1. Tablespace 종류
  • System tablespace
    Oracle의 Dictionary 가 저장되는 영역으로 재생성은 불가능 하다. Database 당 하나의 System Tablespace가 존재한다.
  • Undo tablespace
    Undo Segment 가 저장되는 공간으로 RAC 의 경우 Instance 각각 독립적인 Undo Tablespace를 가진다. 읽기의 일관성 유지해 줍니다.
  • Temp tablespace
    임시 영역으로 SGA에서 수행할 수 없는 Sort등의 작업 시 사용된다.
  • Data tablespace
    Table 이 저장되는 영역으로 Table 생성시 사용자 임의로 지정한다.
  1. Tablespace 추가 및 삭제
구분 파일 구분 SQL 수행
파일 추가 Datafile alter tablespace test_data add datafile ‘+DG_DATA’ size 30000M;
TEMP File alter tablespace test_tmp add tempfile ‘+DG_DATA’ size 30000M;
신규 생성 Data TBS create tablespace test_data datafile ‘+DG_DATA’ size 30000M;
TEMP TBS create temporary tablespace test_tmp tempfile ‘+DG_DATA’ size 30000M;
UNDO TBS create undo tablespace UNDOTBS1 datafile ‘DG_DATA’ size 30000M;
삭제 drop tablespace test_data including contents and datafiles;
  1. Tablespace 관리
    1. 테이블스페이스 사용률 조회
select * from (
select df.tablespace_name tablespace_name, round(df.total_bytes/1024/1024,2) total_MB,
round((df.total_bytes-fs.free_bytes)/1024/1024,2) used_MB, round(((df.total_bytes-fs.free_bytes)/df.total_bytes)*100,2) used_pct,

round(fs.free_bytes/1024/1024,2) free_MB

from (select tablespace_name, sum(bytes) total_bytes from dba_data_files group by tablespace_name) df,

(select tablespace_name,sum(bytes) free_bytes,max(bytes) max_free from dba_free_space group by tablespace_name) fs

where df.tablespace_name = fs.tablespace_name(+)

union all

select c.tablespace_name, round(sum(b.bytes)/1024/1024,2) total_MB, round(sum(a.bytes_used)/1024/1024,2) used_MB,

round((sum(a.bytes_used)/sum(b.bytes))*100,2) used_pct, round((sum(b.bytes)-sum(a.bytes_used))/1024/1024,2) free_mb

from (select bytes_used, file_id from v$temp_extent_pool) a,

(select bytes, file#, name from v$tempfile) b,

(select file_name, file_id, tablespace_name from dba_temp_files) c

where a.file_id=b.file# and b.file#=c.file_id

group by c.tablespace_name

)

order by 4 desc;

TABLESPACE_NAME TOTAL_MB USED_MB USED_PCT FREE_MB

—————————— ———- ———- ———- ———-

SYSTEM 1024 617.38 60.29 406.63

SYSAUX 1024 451.88 44.13 572.13

UNDOTBS1 1024 180.56 17.63 843.44

UNDOTBS2 1024 136 13.28 888

USERS 500 1.38 .28 498.63

TEMP 1024 0 0 1024

  1. ASM diskgroup 사용률 조회
  • 다음 명령어를 통하여 User를 삭제할 수 있다.
SELECT name, free_mb, total_mb, round(free_mb/total_mb*100,2) as percentage
FROM v$asm_diskgroup;
NAME FREE_MB Total Size (MB) PERCENTAGE

—————————— ———- ————— ———-

DG_CRS 576 10240 5.63

DG_DATA 718312 1013756 70.86

DG_ARCH 506621 511996 99.0

  1. Automatic Storage Management (ASM)
    1. ASM 구조
      1. ASM 개요

      Automatic Storage Management(ASM)는 데이터베이스 구성 시 기본이 되는 디스크를 효율적으로 관리하기 위해 Oracle Database 10g에서 새로 선보이는 데이터베이스 서비스이다. ASM은 하나의 SMP 장비뿐만 아니라, RAC을 구성하는 모든 노드들에 대해서도 지원이 가능하다.

      ASM이 관리하는 모든 디스크에 대해 load balancing 작업을 자동적으로 처리해 줌으로써, 특정 디스크에 load가 집중되는 hot spot 현상을 최소화 할 수 있으며, 이로 인해 성능을 극대화 할 수 있다. 또한, 데이터가 디스크에 균등한 크기로 저장/관리되어 fragmentation 현상이 발생하지 않는다. 그리고, ASM이 관리하는 영역에서 새로운 디스크가 추가되거나 삭제될 때마다, 기존 데이터들에 대해 재구성 작업이 자동적으로 일어난다.

      ASM은 특정 데이터에 대한 복사본을 자기 자신의 디스크에 유지할 수 있기 때문에 Software 미러링 효과를 볼 수 있다. 이처럼 ASM은 데이터에 대한 안정성, 그리고 성능을 어떻게 유지할 것인가에 대해 상당히 유연하게 달리 지정할 수 있다.

      ASM은 기존 데이터베이스 구성과 독립적으로 관리될 수 있다. 즉, 기존 데이터베이스가 데이터 저장소로 파일시스템을 사용하고 있어도, 아니면 RAW Device를 사용하고 있어도 이와는 별도로 새로운 데이터파일을 ASM에 저장/관리할 수 있는 것이다. 기존 데이터 파일들은 ASM 관리 영역으로 이관될 수도 있다.

      ASM을 단순히 기존 파일시스템, RAW Device와 같은 파일 저장소로 간과하면 큰 오산이다. ASM은 여타 디스크 Solution 없이 Striping / Mirroring 효과를 볼 수 있을 뿐만 아니라, 자동적으로 데이터 구성을 재 분배할 수 있는 기능을 제공해 줌으로써, 더 이상 I/O tuning을 할 필요로 없게 만들고 있다. 또한, 자체가 Cluster 파일시스템 이기 때문에 하나 이상의 노드에 있는 다른 데이터베이스에 대해서도 통합 관리가 가능한 것이다. DBA들은 더 이상 스토리지 관리를 위해 엄청난 시간을 투자할 필요가 없게 되었다.

  1. ASM의 기본 개념
  • Oracle 10g부터 지원되는 Volume Manager와 File system의 통합체
  • Oracle 데이터베이스 파일을 위해 특별히 구현된 Storage 관리 시스템
  • Disk간 Balance가 유지될 수 있도록 분산 저장, Mirroring을 지원
  • Oracle은 Volume Manager, File System, Raw Device 등의 방법 대신 ASM의 사용을 권장하고 있음 (11g부터는 Raw Device는 공식적으로 지원되지 않음)


  1. ASM 주요 기능 및 특징
구분 내용
관리 복잡성 제거
  • 매일 처리해야만 하는 스토리지 관리항목이 줄어들거나 제거된다.
  • 모든 Application load에 대해 자동적인 I/O 튜닝이 수행된다.
  • 생성되는 데이터파일에 대해 의미 있는 이름이 자동적으로 부여된다.
  • 관리대상이 혁신적으로 줄어든다(파일시스템과 LVM 관리범위가 ASM Diskgroup 으로 통합 관리됨)
  • 구성이 변경될 때, 자동적으로 데이터 재 분배가 발생한다.
  • 실수로 파일을 삭제할 가능성 배제 (파일시스템 상에 데이터파일이 있는 것이 아니기 때문)
스토리지 제품 구입비용 절약
  • Logical Volume Manager와 파일시스템 기능이 데이터베이스에 포함되어 있다.
  • 저렴한 JBOD 형태의 디스크부터 고가의 SAN 디스크 Array까지 지원
성능/확장/안전성 증대
  • 모든 파일에 대해서 RAW Disk 수준의 I/O 성능을 보장한다.
  • 다른 디스크 Array에 걸쳐 저장되어 있는 데이터파일 들에 대해 striping 할 수 있다.
  • 스토리지 활용도 증대 시킨다.
  • 일반적인 파일시스템 크기 제한을 극복 할 수 있다
  • Software mirroring 지원
RAC (Real Application Cluster) 지원
  • 3rd Party Logical Volume Manager와 Cluster 파일시스템이 필요 없다.
  1. ASM 및 타사 File System 대응 File Type 비교
구분 Local File System Cluster File System ASM NAS/NFS Raw/Block Device
Oracle Software YES YES NO YES NO
Application Related Files YES YES NO YES NO
Clusterware Configuration NO YES YES YES YES
Principal Database Files YES YES YES YES YES
Database Archived log YES YES YES YES NO
Database External Files YES YES NO YES NO
RMAN Backup Files YES YES YES YES NO
  1. ASM Instance의 개념

    RAC 클러스터에서 ASM을 사용하려면 각각의 노드에서 ASM 인스턴스가 실행되고 있어야 한다 ASM 인스턴스는 ASM 디스크그룹의 메타데이터 관리 및 데이터베이스 인스턴스를 지원한다. 다른 데이터베이스 인스턴스가 ASM 스토리지에 있는 파일에 접근하기 전에 ASM 인스턴스가 구동되어 있어야 한다 ASM 인스턴스가 종료되면 모든 클라이언트 데이터베이스 인스턴스도 종료된다. 또한, ASM 인스턴스는 디스크 추가, 제거, 리밸런싱 작업을 처리한다.

    1. ASM Instance의 특징
구분 내용
구조
  • Oracle ASM은 Oracle Database Instance와 동일한 구조로 생성돼 운영됨
  • Oracle ASM Instance도 SGA 영역을 가지며 Database를 mount하지는 않음
  • Oracle ASM은 Oracle Database가 Install되기 전 다른 Oracle Home에 설치됨
  • Oracle clusterware를 통해 cluster되며 Node마다 Database Instance 수와 관계없이 1개의 ASM Instance가 필요함
관리정보
  • Oracle ASM은 Disk Group에 대한 Meta Data를 관리하며 Database Instance에게 File Layout 정보를 제공함
  • 관리대상 Metadata 정보
    • Disk Group에 속하는 Disk
    • Disk Group의 가용 공간 크기
    • Disk Group에 속하는 File 이름
    • Disk Group의 Data file Extent 위치
    • Metadata Block 변경에 대한 Redo Log
    • Oracle ADVM(Oracle ASM Dynamic Volume Manager) Volume 정보
장애/복구
  • Oracle ASM Instance 장애가 발생할 경우 해당 Node에 존재하는 모든 Database Instance 모두 장애가 발생함
  • ASM Instance 장애 시 OS Reboot이 필요치 않으며 RAC 환경에서는 가용 Node로 Failover, Recovery 후 업무를 재개할 수 있음
  1. ASM Instance
  • DB instance와 같은 구조로 생성 (smaller SGA, BG processes)
  • Cluster 환경에서 Node 당 하나의 ASM INSTANCE 를 가진다.
  • ASM 파일(Diskgroup)을 DB 에서 share할 수 있도록 마운트 및 연결
  • Init+ASM.ora 파일에서 파라미터 변경가능(asm설치시 orapwd및 spfile생성)
  • Disk Group 에 대한 Meta data를 관리한다.
  • ASM Metadata 는 디스크 그룹 관리를 위한 정보를 담고 있고, 생성된 디스크 그룹 내에 저장.


  1. ASM Instance Processes
Process 내용
ARBn ASM Rebalance를 수행하는 프로세스. 평상시엔 떠 있지 않다가 실제로 Rebalance를 수행하게 되면 나타남.
RBAL ASM Rebalance를 담당하는 프로세스. Rebalance작업을 관리하며, 각 그룹에 할당된 모든 디스크에 대하여 데이터 재분배를 수행하게 됨. 이 프로세스는 항상 떠있으며, 사용자의 명령을 위해 대기 함.
GMON ASM 디스크 그룹 내 디스크 멤버십을 관리
ASMB 데이터베이스 인스턴스 상에서 동작하며, ASM 인스턴스의 Foreground process와 통신 함. 주기적인 message 교환을 통해 통계정보를 공유하고, ASM과 데이터베이스 인스턴스 heartbeat 를 통한 health check을 수행.
MARK Offline 디스크에 대한 재 동기화를 위해 ASM 할당 단위를 표시 하기 위한 프로세스.
Onnn 메시지를 교환하는 ASM 인스턴스에 대한 연결 풀을 형성하는 하나이상의 ASM 슬레이브 프로세스
PZ9n 하나이상의 병렬 슬레이브 프로세스.
ORBn Rebalance시 ASM data extent의 이동을 담당하는 프로세스, ASM data extent의 이동이 발생하면 순간적으로 프로세스 개수가 여러 개 생길 수 있음.
  1. ASM 디스크
    1. ASM DiskGroup
  • ASM 에 의해 관리되는 최상위 객체.
  • 논리적 단위로써 관리되는 ASM Disks의 집합체
  • 각각의 디스크 그룹 내에 디스크 그룹의 메타데이터 정보를 저장.
  • 하나의 디스크 그룹이 여러 개의 database에 의해 공유될 수 있고, 하나의 database가 여러 개의 디스크 그룹을 사용할 수도 있다.


  1. ASM mirroring Option
  • ASM은 ASM 디스크그룹에 대해 다음 세 가지 중복 구성 유형을 제공한다.
Disk Group Type Supported Mirroring Levels Default Mirroring Level
External redundancy Unprotected (none) Unprotected
Normal redundancy Two-way
Three-way
Unprotected (None)
Two-way
High redundancy Three-way Three-way
  • 외부 중복 구성(External redundancy)은 어떠한 미러링도 하지 않는다. 이것은 RAID나 LVM 같은 기존 운영체제나 스토리지 어레이의 보호 기능을 사용한다. 하지만 외부 중복 구성을 선택했을 경우 하부 스토리지가 올바르게 구성되었는지 확인하는 것은 사용자의 책임이다. ASM은 장애 발생 시 복구를 보장하지 않는다. 또한, 외부 중복 구성을 사용할 경우 어떠한 failure group도 정의할 필요가 없다.
  • 일반 중복 구성(Normal redundancy)은 기본 설정이며 한 개의 주 extent와 한 개의 미러 extent를 사용하여 각 파일 extent를 두 개의 디스크그룹에 기록하는 이중 미러링을 구현한다. 일반 중복 구성을 보장하려면 최소 두 개의 failure group을 정의해야 한다.
  • 높은 중복 구성(High redundancy)은 각각의 파일 extent가 한 개의 주 extent와 두 개의 미러 extent를 사용하여 세 개의 디스크그룹에 기록하는 삼중 미러링으로 구현되어 있다. 높은 중복 구성을 보장하려면 최소 세 개의 failure group을 정의해야 한다.
  1. Failure Group

디스크 컨트롤러에 장애가 발생하면 연결된 모든 디스크에는 접근할 수 없다 ASM은 컨트롤러 같은 단일 장애 지점 에 영향을 받는 디스크를 그룹화하여 failure group으로 정의한다. 중복 구성을 보장하기 위해 각각의 미러는 서로 다른 failure group에 위치해야 한다. 따라서 컨트롤러 장애 같은 상황이 발생했을 때. ASM은 다른 디스크그룹에 미러링 된 extent의 사본을 사용하여 장애가 발생한 디스크그룹을 재구성할 수 있다.

  • 장애 발생시 동일하게 영향을 받게 되는, 공통의 리소스를 공유하는 디스크의 집합체
  • Failure Group은 Data의 Copy 본을 저장하는 목적으로 사용됨
  • Normal Redundancy를 사용하는 File의 경우 Oracle ASM은 서로 다른 Failure Group에 속하는 Primary Copy와 Secondary Copy를 할당함
  • Failure Group 할당 시 동일 H/W 구성요소를 사용하지 않거나 해당 H/W 구성 요소가 이중화된 Diskgroup으로 설정해야 함
  • Extent의 중복된 복사본은 분리된 Failure Group 에 저장
  • Default는 디스크 이름과 Failure group의 디스크로 구성
  • Disk controller 별로 failure Group 의 디스크로 구성
  • DBA나 ASM에 의해 자동으로 지정됨
  1. Striping

ASM은 I/0 성능을 최적화하기 위해 디스크그룹의 디스크에 파일을 분산하여 스트라이핑 한다. 따라서 디스크그룹 내의 모든 디스크는 동일한 유형과 성능 특성을 가져야 한다. 스트라이핑의 두 가지 유형은 coarse와 fine이며, 데이터베이스 파일 유형에 따라 어느 방식을 사용할지 결정된다

Coarse 스트라이핑은 데이터베이스 파일, 트랜스포터블 테이블스페이스(transportable tablespaces), 백업세트, 덤프세트, 컨트롤 파일 자동 백업, 블록 변경 추적 파일(block change tracking file), 데이터 가드 구성 파일 등 대부분의 파일 유형에 사용된다.

또한 fine 스트라이핑은 컨트롤 파일, 온라인 리두 로그, 플래시백 로그에만 사용된다.

  1. Rebalancing
  • File이 Disk Group내에서 보다 균등하게 분포하도록 조정하는 작업
  • Data가 Disk에 균등히 분포할 경우 Load Balancing은 자동으로 이루어짐
  • Rebalancing은 자동/수동으로 이루어질 수 있으며 자동으로 이루어지는 경우는 Storage Configuration이 변경되는 경우에 발생.
  • Rebalancing 수행 중에도 Database는 정상적으로 운영될 수 있음
  • 다만 Rebalancing 작업이 Disk I/O 자원을 많이 사용할 수 있으며 이에 따른 Online 성능 저하 현상을 최소화 하기 위해 Power Setting Parameter (ASM_POWER_LIMIT)를 통해 Rebalancing에 의한 I/O 사용량을 제한할 수 있음
  1. Mirroring

ASM은 데이터를 중복 구성하기 위해 미러링을 사용하며 파일 레벨에서 extent를 미러링 한다. 이것은 디스크 레벨에서 미러링을 수행하는 대부분의 운영체제 미러링과 다르다. ASM 디스크가 손실된 경우, 다른 ASM 디스크에 미러링 된 extent를 사용하여 데이터 손실이나 서비스 중단 없이 작업을 계속할 수 있다. 디스크 장애가 발생한 경우, ASM은 통일 그룹의 다른 디스크에 미러링 된 extent를 사용하여 망가진 extent를 재구성할 수 있다.

미러링은 Diskgroup 생성 (또는 변경) 시 Failure Group을 정의할 수 있으며 Failure Group은 Disk Group Type을 Normal Redundancy / High Redundancy 로 설정할 경우만 유효하다.

  1. ASM 모니터링 및 관리하기
    1. ASM Instance 접속

    오라클 10g에서 ASM 인스턴스에 접속하려면 SYSOPER나 SYSDBA 권한이 필요했었다. 오라클 11.1에서는 스토리지 관리자와 DBA 그룹을 분리할 수 있도록 SYSASM 권한이 새로 도입되었다. 오라클 11.2에서 ASM 관리 작업의 대부분은 SYSASM 권한을 필요로 한다. ASM 인스턴스의 시작, 중지, 마운트, 마운트 해제, 디스크그룹의 점검 및 오프라인, ASM 동적 성능 뷰에 접근하기 위해서는 SYSASM 권한이 필요 하다.

[grid@rac12c01 ~]$ sqlplus / as sysasm
SQL*Plus: Release 12.1.0.2.0 Production on Wed Jun 3 09:14:34 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production

With the Real Application Clusters and Automatic Storage Management options

SQL> select instance_name, status from v$instance;

INSTANCE_NAME STATUS

—————- ————

+ASM1 STARTED

오라클은 각 노드에 하나의 ASM 인스턴스만 존재할 수 있으며, 인스턴스 이름은 수정할 필요가 없다. 인스턴스 이름은 ASM 리소스의 리소스 프로파일 내부에 정의되며, crsctl status resource ora.asm -p 명령어를 사용하여 이를 조회할 수 있다. 다음 예제처럼 생성된 인스턴스 이름을 확인할 수 있다. 일반적으로 1번 노드 ASM Instance 이름은 +ASM1, 2번 노드 ASM Instance 이름은 +ASM2가 된다.

[root@rac12c01 ~]# crsctl status resource ora.asm -p
NAME=ora.asm
TYPE=ora.asm.type

[…]

GEN_USR_ORA_INST_NAME@SERVERNAME(XXXDB01)=+ASM1

GEN_USR_ORA_INST_NAME@SERVERNAME(XXXDB02)=+ASM2

  1. ASM Diskgroup Creation

디스크그룹은 asmca, asmcmd, EM(엔터프라이즈 관리자)을 사용하여 생성할 수 있다 또한, 다음 ASM 인스턴스의 SQL Plus로 접속하여 CREATE DISKGROUP 명령어를 사용해 수동으로 생성할 수도 있다.

  • 디스크 그룹 확인
SQL> select group_number, name, state from v$asm_diskgroup;
GROUP_NUMBER NAME STATE
———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

  • 추가 할 디스크 확인
SQL> select group_number,mount_status,path,total_mb
from v$asm_disk
where mount_status=’CLOSED’;

GROUP_NUMBER MOUNT_S PATH TOTAL_MB

———— ——- ———————————– ———-

0 CLOSED /dev/sdb3 0

  • Disk Group 생성

    일단 CREATE DISKGROUP 명령어가 시작되면 ASM은 새로 생성된 디스크그룹을 자동으로 마운트한다. 동적 성능 뷰 GV$ASM_DISKGROUP을 조회하여 전체 클러스터 노드의 신규 ASM 디스크그룹 상태를 점검할 수 있다.

SQL> create diskgroup ORATEST external redundancy disk ‘/dev/sdb3’;
Diskgroup created.
SQL> select group_number,mount_status,path,total_mb

2 from v$asm_disk

3 where mount_status=’CLOSED’;

no rows selected

SQL> select group_number,name,state from v$asm_diskgroup;

GROUP_NUMBER NAME STATE

———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

4 ORATEST MOUNTED

  1. ASM Disk group Drop

커맨드를 통해서 diskgroup을 drop 할 수 있다. 이를 위해 sysasm으로 접속하여 drop diskgroup diskgroupName 명령어를 실행한다. 이 명령어는 diskgroup이 비어있지 않으면 오류를 발생한다. 파일을 수동으로 삭제하거나 including contents 절을 지정하여 삭제한다.

SQL> select group_number,name,state from v$asm_diskgroup;
GROUP_NUMBER NAME STATE
———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

4 ORATEST MOUNTED

SQL> drop diskgroup oratest;

Diskgroup dropped.

SQL> select group_number,name,state from v$asm_diskgroup;

GROUP_NUMBER NAME STATE

———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

  1. ASM Disk group Mount/Umount

Init+ASM.ora 파일에 asm_diskgroups 항목에 지정된 diskgroup는 자동으로 asm instance 시작 시에 mount된다. ASM 디스크그룹을 수동으로 마운트하려면, alter diskgroup diskgroupName mount 명령어를 사용한다.

SQL> select group_number,name,state from v$asm_diskgroup;
GROUP_NUMBER NAME STATE
———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

4 ORATEST MOUNTED

SQL> alter diskgroup ORATEST dismount;

Diskgroup altered.

SQL> select group_number,name,state from v$asm_diskgroup;

GROUP_NUMBER NAME STATE

———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

4 ORATEST DISMOUNTED

SQL> alter diskgroup ORATEST mount;

Diskgroup altered.

SQL> select group_number,name,state from v$asm_diskgroup;

GROUP_NUMBER NAME STATE

———— —————————— ———–

1 DG_CRS MOUNTED

2 DG_DATA MOUNTED

3 DG_ARCH MOUNTED

4 ORATEST MOUNTED

  1. ASM Disk group disk add

아무리 신중하게 계획했더라도 ASM 디스크그룹의 증설이 필요할 수 있다. ASM 디스크그룹 증설은 일단 전체 클러스터 노드에 블록 디바이스를 제공하고 나면 비교적 간단한 작업이다. ASM에 새 LUN을 추가할 때, 기존 ASM 디스크와 성능과 크기가 통일하거나 가급적 비슷한 디스크를 사용하는 것이 좋다.

Rebalance power 옵션은 asm_power_limit parameter (default 1)의 수치를 해당 operation에 한해 일시적으로 조정하는 옵션이다. 이 수치가 높을수록 disk 추가, 삭제 시에 발생하는 rebalancing 작업이 빠르게 진행된다. (수치가 높을 수록 disk i/o 점유율이 높음)

SQL> select group_number,mount_status,path,total_mb
2 from v$asm_disk where mount_status=’CLOSED’;
GROUP_NUMBER MOUNT_S PATH TOTAL_MB

———— ——- —————————— ———

0 CLOSED /dev/sdb3 0

SQL> select b.name as group_name,

2 a.name as disk_name,

3 a.header_status,

4 a.state,

5 a.free_mb

6 from v$asm_disk a,

7 v$asm_diskgroup b

8 where a.group_number=b.group_number;

GROUP_NAME DISK_NAME HEADER_STATU STATE FREE_MB

————- ————— ———— ——– ———

ORATEST ORATEST_0000 MEMBER NORMAL 5064

DG_DATA DG_DATA_0000 MEMBER NORMAL 2904

DG_CRS DG_CRS_0000 MEMBER NORMAL 2891

DG_ARCH DG_ARCH_0000 MEMBER NORMAL 2857

SQL> alter diskgroup ORADATA add disk ‘/dev/sdb3’ rebalance power 10;

Diskgroup altered.

위 명령어 프롬프트는 거의 즉시 반환되지만 백그라운드에서 리밸런싱 작업이 일어난다. V$ASM_OPERATION 뷰를 조회하여 리밸런싱 작업에 걸리는 시간을 추정할 수 있다.

SQL> select d.name, o.operation, o.state, o.power, o.est_minutes
2 from v$asm_disk d, v$asm_operation o
3 where d.group_number=o.group_number

4 order by 1;

NAME OPERA STAT POWER EST_MINUTES

——————– —– —- ———- ———–

DG_DATA_0000 REBAL RUN 10 0

DG_DATA_0000 REBAL WAIT 10 0

DG_DATA_0001 REBAL WAIT 10 0

DG_DATA_0001 REBAL RUN 10 0

  1. ASM Disk group disk drop

디스크를 drop하면 rebalancing 작업이 일어난다. V$ASM_DISK 뷰에서 제거 대상 디스크의HEADER STATUS가 FORMER인 경우에만 클러스터에서 ASM 디스크를 물리적으로 안전하게 제거할 수 있다. 디스크그룹에서 디스크를 drop 하려면 ALTER DISKGROUP 명령어를 사용한다.

SQL> select b.name as group_name,
2 a.name as disk_name,
3 a.header_status,

4 a.state,

5 a.free_mb

6 from v$asm_disk a,

7 v$asm_diskgroup b

8 where a.group_number=b.group_number;

GROUP_NAME DISK_NAME HEADER_STATU STATE FREE_MB

————- ————— ———— ——– ———

ORATEST ORATEST_0000 MEMBER NORMAL 5064

DG_DATA DG_DATA_0000 MEMBER NORMAL 2904

DG_DATA DG_DATA_0001 MEMBER NORMAL 2904

DG_CRS DG_CRS_0000 MEMBER NORMAL 2891

DG_ARCH DG_ARCH_0000 MEMBER NORMAL 2857

SQL> alter diskgroup ORADATA drop disk DG_DATA_0001 rebalance power 3;

Diskgroup altered.

disk drop 명령실행 후 add와 마찬가지로 내부적으로 리밸런싱 작업이 진행된다.

SQL> select d.name, o.operation, o.state, o.power, o.est_minutes
2 from v$asm_disk d, v$asm_operation o
3 where d.group_number=o.group_number

4 order by 1;

NAME OPERA STAT POWER EST_MINUTES

—————————— —– —- ———- ———–

DG_DATA_0000 REBAL RUN 3 0

DG_DATA_0000 REBAL WAIT 3 0

DG_DATA_0001 REBAL WAIT 3 0

DG_DATA_0001 REBAL RUN 3 0

SQL> select d.name, o.operation, o.state, o.power, o.est_minutes

2 from v$asm_disk d, v$asm_operation o

3 where d.group_number=o.group_number

4 order by 1;

NAME OPERA STAT POWER EST_MINUTES

—————————— —– —- ———- ———–

DG_DATA_0000 REBAL WAIT 3

DG_DATA_0000 REBAL DONE 3

  1. ASM Disk size 변경

ASM DISK의 size를 변경 할 수 있는 방법이 있다. 디스크를 size 없이 추가 했을 때, 해당 디스크는 할당 할 수 있는 영역까지 디스크 용량을 잡는다. 만약 디스크를 추가 할 때 사이즈를 줬다면 추가적으로 사이즈를 더 줄 수 있다.

SQL> select b.name as group_name ,
2 a.name as disk_name,
3 a.header_status,

4 a.state,

5 a.total_mb

6 from v$asm_disk a,

7 v$asm_diskgroup b

8 where a.group_number=b.group_number;

GROUP_NAME DISK_NAME HEADER_STATU STATE FREE_MB

————- ————— ———— ——– ———

ORATEST ORATEST_0000 MEMBER NORMAL 8064

DG_DATA DG_DATA_0000 MEMBER NORMAL 2904

DG_CRS DG_CRS_0000 MEMBER NORMAL 2891

DG_ARCH DG_ARCH_0000 MEMBER NORMAL 2857

SQL> alter diskgroup ORATEST resize disk ORATEST_0000 size 5000m;

Diskgroup altered.

SQL> select b.name as group_name ,

2 a.name as disk_name,

3 a.header_status,

4 a.state,

5 a.total_mb

6 from v$asm_disk a,

7 v$asm_diskgroup b

8 where a.group_number=b.group_number;

GROUP_NAME DISK_NAME HEADER_STATU STATE FREE_MB

————- ————— ———— ——– ———

ORATEST ORATEST_0000 MEMBER NORMAL 5000

DG_DATA DG_DATA_0000 MEMBER NORMAL 2904

DG_CRS DG_CRS_0000 MEMBER NORMAL 2891

DG_ARCH DG_ARCH_0000 MEMBER NORMAL 2857

  1. ASM check Disk

디스크 그룹의 정합성을 체크할 수 있으며, 수행 결과는 ASM Instance의 Alert.log에 기록된다. 단 Diskgroup 이 mount 상태 일 때 만 check 가 가능하다.

SQL> conn / as sysasm
Connected.
SQL> alter diskgroup ORATEST check all

-> alert log 확인

Sun Jun 07 07:35:07 2015

NOTE: starting check of diskgroup ORATEST

Sun Jun 07 07:35:07 2015

GMON querying group 3 at 25 for pid 36, osid 36035

GMON checking disk 0 for group 3 at 26 for pid 36, osid 36035

Sun Jun 07 07:35:07 2015

SUCCESS: check of diskgroup ORATEST found no errors

Sun Jun 07 07:35:07 2015

SUCCESS: alter diskgroup ORATEST check all

  1. Oracle Software 변경 관리
    1. Patch 적용 Process
  • 평상시 : 운영장비로의 Patch 적용은 사전에 테스트 장비를 이용하여 적용한 후 일정 시간 모니터링 후 적용한다.


  • 긴급 상황 시 : 긴급하게 조치해야 할 장애를 위한 패치는 경우에 따라 테스트 장비에서의 점검 프로세스를 생략할 수도 있다.


  1. 적용된 패치 확인
  • 다음 명령어를 통하여 적용된 패치를 확인할 수 있다.
$ opatch lsinventory
Oracle Interim Patch Installer version 12.1.0.1.7
Copyright (c) 2015, Oracle Corporation. All rights reserved.

Oracle Home : /oracle/12.1.0.2

Central Inventory : /grid/oraInventory

from : /oracle/12.1.0.2/oraInst.loc

OPatch version : 12.1.0.1.7

OUI version : 12.1.0.2.0

Log file location : /oracle/12.1.0.2/cfgtoollogs/opatch/opatch2015-06-18_00-20-31AM_1.log

Lsinventory Output file location : /oracle/12.1.0.2/cfgtoollogs/opatch/lsinv/lsinventory2015-06-18_00-20-31AM.txt

——————————————————————————–

Local Machine Information::

Hostname: ktms1

ARU platform id: 267

ARU platform description:: Solaris Operating System (x86-64)

Installed Top-level Products (1):

Oracle Database 12c 12.1.0.2.0

There are 1 products installed in this Oracle Home.

Interim patches (2) :

Patch 20299023 : applied on Thu Jun 18 00:06:44 KST 2015

Unique Patch ID: 18672617

Patch description: “Database Patch Set Update : 12.1.0.2.3 (20299023)”

Created on 18 Mar 2015, 00:15:50 hrs PST8PDT

Sub-patch 19769480; “Database Patch Set Update : 12.1.0.2.2 (19769480)”

Bugs fixed:

19189525, 19065556, 19075256, 19723336, 19077215, 19865345, 18845653

19280225, 19524384, 19248799, 18988834, 19048007, 18288842, 19238590

18921743, 18952989, 16870214, 19928926, 19134173, 19180770, 19018206

19197175, 19149990, 18849537, 19730508, 19183343, 19012119, 19001390

18202441, 19067244, 19189317, 19644859, 19358317, 19390567, 20074391

19279273, 19706965, 19068970, 19841800, 19512341, 14643995, 19619732

20348653, 18607546, 18940497, 19670108, 19649152, 19065677, 19547370

18948177, 19315691, 19637186, 19676905, 18964978, 19035573, 19176326

18967382, 19174430, 19176223, 19532017, 18674047, 19074147, 19054077

19536415, 19708632, 19289642, 20425790, 19335438, 18856999, 19371175

19468347, 19195895, 19154375, 16359751, 18990693, 19439759, 19769480

19272708, 19978542, 19329654, 19873610, 19174521, 19520602, 19382851

19658708, 19304354, 19052488, 19291380, 18681056, 19896336, 17835294

19076343, 19791377, 19068610, 19561643, 18618122, 20440930, 18456643

18909599, 19487147, 19143550, 19185876, 19016730, 18250893, 20347562

19627012, 16619249, 18354830, 19577410, 19687159, 19001359, 19174942

19518079, 18610915, 18674024, 18306996, 19309466, 19081128, 19915271

19157754, 19058490, 20284155, 18791688, 18885870, 19303936, 19434529

19018447, 18417036, 19597439, 20235511, 19022470, 18964939, 19430401

19044962, 19385656, 19501299, 17274537, 19409212, 19440586, 19606174

18436647, 19023822, 19684504, 19178851, 19124589, 19805359, 19024808

19597583, 19155797, 19393542, 19050649, 19028800

Patch 20299022 : applied on Wed Jun 17 23:59:08 KST 2015

Unique Patch ID: 18594999

Patch description: “OCW Patch Set Update : 12.1.0.2.3 (20299022)”

Created on 7 Apr 2015, 11:40:43 hrs UTC

Bugs fixed:

18589889, 19139608, 19280860, 19061429, 19133945, 19341538, 18946768

19135521, 19361757, 19187207, 19302350, 19130141, 19530755, 19699720

19168690, 19266658, 18899171, 19244316, 19653795, 18330979, 19471722

18634372, 19027351, 18707416, 19184188, 19131709, 20235486, 19925992

20006646, 18991776, 18439295, 19380733, 18943696, 19550195, 18135723

19163425, 20014326, 19524857, 18849021, 18890943, 18861196, 19154753

17940721, 19522313, 18748932, 18835283, 19184765, 19499021, 19046190

19051385, 19682695, 19050688, 19831611, 19226141, 19053891, 18871287

18998228, 18922918, 18980002, 19683886, 18956780, 18777835, 19026993

17338864, 18261648, 19513650, 19702758, 18952577, 17447588, 19414274

20752167, 19262534, 19147513, 19473088, 19178517, 19529729, 19455563

19319904, 18703978, 20340620, 18536826, 19703246, 19292605, 19192901

20660273, 20011635, 19479503, 19029647, 19179158, 18901356, 19140712

18964974, 18835366, 19184276, 19013789, 19207286, 20510208, 20001507

18950232, 20079414, 19680763, 19259765, 19148791, 19556820, 19449737

18962892, 19187515, 19513888, 19230771, 19853036, 19453778, 19551830

19068333, 18520351, 18843572, 19185148, 18945435, 19232454, 18541110

18834955, 19319192, 19204743, 19178629, 19304104, 19140891, 19270660

19457575, 19021575, 19069755, 18715884, 19584688, 18798573, 19812592

19018001, 19325701, 19292272, 19270956, 19222693, 18700893, 19662663

18406774, 19010177, 18910576, 18907170, 19700294, 19164099, 19331454

18955644, 18508710, 18798432, 19146822, 19589221, 19537762, 16286734

18762843, 19045143, 18945249, 19146980, 19184799, 19205086, 20091753

18862203, 19537547, 19281106, 19031737, 19079087, 18968981, 19148367

19150517, 20231741, 19217019, 18730096, 18975620, 19205617, 19513351

18843054, 19150313, 18708349, 18953639, 19067804, 19371270, 19203996

20038431, 19054979, 19209951, 19318983, 19154673, 18752378, 19150088

19013444, 19234177, 18998379, 20157569, 18999857, 19273577, 19075747

19367276, 19632437, 19612597, 19874047, 19288396, 18990354, 19557558

19427050, 19127078, 18910443, 20053557, 20033787, 19315567, 19148982

18290252, 18813323, 19777496, 19500293, 18643483, 19277814, 18523468

19134098, 19071526, 18965694, 19226858, 18850051, 19602208, 20061168

18417590, 19370739, 18920408, 19609388, 18636884, 18776786, 18989446

19148793, 19043795, 19585454, 19955755, 18317489, 18260170, 18919682

19807548, 18678829, 19124972, 19147509, 18849896, 18910748, 19273758

18953878, 19076165, 19704993, 18999195, 19498411, 18759724, 19459023

20276459, 19066844, 17208793, 19234907, 13843841, 19538714, 19383028

19649640, 19062675, 19513969, 18859710, 19504641, 19341481, 20293730

19986391, 18304090, 19343245, 19314048, 18834934, 19473851, 19241655

18242738, 19458082, 19470791, 18894342, 18372060, 19522067, 18953889

18827679, 19259290, 19140711, 19023430, 19045388, 19241857, 19076778

19522571, 18875012, 18861564, 19066699, 19273760, 19225265, 18819158

19068003, 18937186, 19049721, 19368917, 19635215, 18868829, 19141785

19885321, 19163887, 19820247, 18715868, 18852058, 19538241, 19804032

Rac system comprising of multiple nodes

Local node = XXXDB01

Remote node = XXXDB02

——————————————————————————–

OPatch succeeded.

  1. Patch 적용
  • Patch 적용 전 적용되는 제품(Clusterware, Database, Listener)은 종료한다.
  • Download 받은 Patch File을 적당한 곳에 두고 압축을 푼다.
  • 패치마다 적용 방법이 다르므로 README.txt 또는 README.html 파일의 지시에 따른다.
  • RAC 의 경우 기본적으로 모든 노드에 동시에 적용되므로, 노드 각각에 따로 적용하는 경우 반드시 -local option을 사용한다.
  • Patch 적용 확인 후 종료된 제품을 시작한다.
  • Opatch 사용 방법 및 옵션 사항
명령어 설 명
opatch apply 현재 디렉토리의 Patch 적용
RAC의 경우 모든 노드에 적용
opatch apply -local 현재 디렉토리의 Patch 를 현재 노드에 적용
opatch apply -invPtrLoc Oracle Inventory를 직접 지정하여 설치하는 경우
opatch lsinventory oh /oracle/product/11.2.0 /oracle/product/11.2.0/db 에 적용된 Patch 표시
opatch lsinventory all 현재 노드에 적용된 모든 Patch 표시
opatch rollback -id patch# 적용된 Patch 복구
opatch rollback -id patch# -local 현재 노드에 적용된 Patch 복구
  1. Oracle Database Parameter 변경 관리

    oracle Database의 Parameter의 설정 값에 따라 system에 미치는 영향이 다양하다. 이에 충분한 검토가 사전에 필요하며, 관련 팀과의 협조가 필요한 부분에 대해서는 조율을 통해 조정토록 한다. Parameter변경은 변경 이력 관리를 통해 사후에 조정될 항목을 미리 점검해 보며, 문제점과 위험성을 도출해 사전 제거토록 한다.

    1. Parameter 변경 Process


    1. Parameter 변경 방법

      XXXDB Database는 SPFile (Server Parameter File) 를 사용하므로 Parameter 변경 시 SQL*Plus 를 사용해야 한다.

alter system [SET|RESET] NAME=VALUE scope=[MEMORY|SPFILE|BOTH] sid=[‘*’|’SID’];
[SET|RESET]
SET : Parameter 값 설정

RESET : Parameter 값을 Default로 설정.

scope=[MEMORY|SPFILE|BOTH]

MEMORY : 현재 기동중인 Instance 에서만 적용. Restart후 원래 값으로 복원

SPFILE : 현재 Instance 에는 적용하지 않고 SPFile 에만 적용. Restart후 적용

BOTH : Memory, SPfile 모두에 적용

sid=[‘*’|’SID’] : Single Instance 에서는 sid 값을 생략해도 된다.

‘*’ : RAC의 경우 모든 Instance 에 적용

‘SID’ : 해당 SID 에 적용

  1. 주요 Parameter
구분 Parameter 설정 값 설명
Archive log_archive_dest_1 LOCATION=/ARCH archive log file 이 저장될 위치
log_archive_format ORAPTL%t_%s_%r.arc archive log file 형식 지정
Cluster
Database
cluster_database TRUE RAC DB 구성 여부
cluster_database_instance 2 Instance 개수
thread 1, 2 Thread 번호
instance_number 1, 2 Instance 번호
SGA/PGA
Memory
db_cache_size 5G DB Buffer Cache 크기
shared_pool_size 2G Shared Pool 크기
java_pool_size 200M Java Pool 크기
large_pool_size 200M Large Pool 크기
pga_aggregate_target 10G PGA 영역 크기
Process
and
Session
processes 2000 사용 가능한 최대 process 개수
sessions 3040 Default 로 (processes*1.5)+22
로 자동 산정됨
open_cursors 300 Open 가능한 최대 Cursor 개수
ETC audit_trail NONE DB 감사기능 설정 여부
sec_case_sensitive_logon FALSE password 대소문자 구분 지정
deferred_segment_creation FALSE segment 생성시 지연된 공간 할당설정
  1. Parameter 적용 예제
OS>sqlplus “/as sysdba”
— Instance가 기동 중일 동안 SGA Size를 3G 로 변경.
SQL> alter system set SGA_TARGET=3G scope=MEMORY;

System altered.

— SPFile 에만 SGA Size를 3G 로 변경.

SQL>alter system set SGA_TARGET=3G scope=SPFILE;

— Instance, SPFile 모두 PARALLEL_MIN_SERVERS 를 6으로 변경.

SQL>alter system set PARALLEL_MIN_SERVERS=6 scope=BOTH;

— Instance 에서 SPFile 에만 OPEN_CURSORS 를 초기화

SQL>alter system reset OPEN_CURSORS scope=SPFILE;

— SPFile 설정값 확인

SQL> select * from v$spparameter where isspecified=’TRUE’;

— 현재의 Parameter 값 확인

SQL> select * from v$parameter where isdefault = ‘FALSE’;

  1. Oracle 로그 파일 관리
    1. ADR(Automatic Diagnostic Repository)

      11g의 새로운 기능으로 ADR(Automatic Diagnostic Repository)이라는 concept으로 관리 되며 ADR은 기존에 BDUMP와 UDUMP로 나뉘어 관리되던 것을 한 곳에 모아 관리하고 손쉽게 Oracle Support에 그 Data를 전달할 수 있다.

      1. ADR 관련 Parameter
$ sqlplus “/as sysdba”
SQL> show parameter diagnostic_dest
NAME TYPE VALUE

———————————— ———– ——————————

diagnostic_dest string /oracle/base

  1. ADR 관련 로그 확인

Oracle Database 및 listener 로그는 자동으로 삭제되지 않는다. 따라서 주기적으로 복사 후 삭제가 필요하다. Database에서 문제 발생시 또는 Action에 대한 Log는 중요한 역할을 하기 때문에 일정기간 보관 후 삭제한다.

로그 위치 Directory Description
/oracle/base/diag/rdbms/<SID>/<SID>/ alert xml형식의 alert log (log.xml)가 저장된다.
cdump core dump 파일이 저장된다.
trace background and server process trace files와 SQL trace files, 그리고 text형식의 alert_SID.log가 저장된다.
incpkg incident packages가 저장된다.
hm health monitor reports가 저장된다.
/grid/base/diag/tnslsnr/<hostname>/listener/ trace Listener 관련 로그 (listener.log)
  1. CRS 관련 로그
로그 위치 Directory Description
/grid/12.1.0.2/log/<hostname> crsd crs daemon이 활동한 로그가 저장된다.
cssd css daemon이 활동한 로그가 저장된다.
evmd evm daemon이 활동한 로그가 저장된다.
  1. 백업과 복구
    1. 백업 개요

      오라클은 다양한 백업(Back-up) 기능을 제공한다. 오라클은 백업의 형태에 따라 데이터베이스가 붕괴된 시점까지도 복구할 수 있다. 그러나, 오라클을 복구하는 과정에서 기본이 되는 것은 데이터베이스 백업(Backup) 이다. 즉, 데이터베이스의 일관성 있는 백업이 선행되어야 오라클 복구(Recovery) 작업도 수월하게 이루어질 수 있다.

      데이터베이스를 구축한다는 것은 하나의 데이터를 여러 유저가 공유하기 위함도 있지만 무엇보다도 데이터의 안정성이다. 만일의 사태가 발생하더라도 데이터의 손실을 막는 것에 목적이 있다.

      오라클은 ARCHIVELOG 모드이냐 NOARCHIVELOG 모드로 운영되느냐에 따라 백업의 형태가 달라지며 백업 정책도 달라진다. 각 모드마다 장단점이 있지만 ARCHIVE 모드가 물론 더 안정적이다.

      오라클에서 제공하는 백업의 종류는 다음과 같다.

      Offline Backup Online Backup Export
      Datafile 과의 관계 Database를 구성하는 Datafile들을 논리적인 내용과는 무관하게 복사하는 방법 물리적인 위치와 무관하게 Database내용을 읽어서 file(dump)에 기록하는 방법
      DBMS 운영 방법 Archive모드, Noarchive모드로 운영가능 Archive모드 운영 시만 가능 Archive모드, Noarchive모드로 운영가능
      DBMS 기동 상태 DBMS 정상 정지 후 사용가능 DBMS 운영 중에만 사용가능 DBMS 운영 중에만 사용가능
      Archive 모드로 운영 시 장애 발생시점까지 복구 가능 장애 발생시점까지 복구 가능 Export 받은 시점까지만 복구 가능
      Noarchive 모드로 운영 시 Cold Backup, 받은 시점까지만 복구가능 적용 불가능 Export 받은 시점까지만 복구 가능

      Oracle ASM 환경에서의 Online Backup은 RMAN으로만 가능하므로 RMAN 기능에 대한 내용은 10장에 소개하고, Export/Import 에 대한 내용은 다음과 같다.

       

    2. Export / Import

      Export 는 Database 에 저장된 내용을 file 형태의 O/S dump file 로 추출하는 tool이다. 반대로 import 는 export 로 받은 O/S Dump file 을 database 에 저장시키는 tool 이다.

      Export / Import 는 모든 user 들의 전체 backup 이나 user 단위, 또는 특정 object만 backup 할 수 있으므로 database 의 backup 은 물론, Oracle database 간의 data 이동이나, Oracle 의 새로운 version upgrade 등에 사용될 수 있으며 문제발생시 특정 object 별 복구가 가능하다는 장점이 있는 반면에, database 복구 시, 물리적인 backup ( cold backup, hot backup ) 과 상호 관련성이 없기 때문에 장애 발생 시점까지의 복구는 불가능하며, 단지 export 를 수행한 시점까지의 복구만이 가능하기 때문에 export 를 이용한 복구는 data 의 손실을 감안하여야 한다는 단점이 있다.

      1. Export option
옵션 내용
userid 유저명과 패스워드를 쓴다.
file export 받는 덤프 파일을 지정한다.
log export 받을 때 로그 파일을 지정한다.
rows 데이터를 받을 것인지 아닌지를 지정한다.
constraints 테이블의 제약 조건을 받을 것인지 지정한다.
indexes 인덱스를 받을 것인지를 지정한다.
tables 유저의 특정 테이블을 받고자 할 때 사용된다.
compress 테이블을 위해 EXTENT 된 값이 Storage 값의 INITIAL 값에 설정된다.
full userid 가 system이거나 dba 권한이 있는 유저일 경우에만 설정 가능하며, 데이터베이스 전체를 받고자 할 때 사용된다.
  1. Import option
옵션 내용
userid 유저명과 패스워드를 쓴다.
file export 받은 덤프 파일을 지정한다.
log import 할 때 로그 파일을 지정한다.
rows 데이터를 삽입 할 것인지 아닌지를 지정한다.
constraints 테이블의 제약 조건을 넣을 것인지 지정한다.
indexes 인덱스를 생성 할 것인지를 지정한다.
tables 유저의 특정 테이블을 지정하여 삽입 할 때 사용된다.
indexfile 데이터를 import하지 않고 create index 문장의 SQL로 파일이 만들어진다.
fromuser 다른 유저에게 export 한 파일을 import 하고자 할 때 export 한 유저를 지정한다.
touser import 할 유저를 지정한다.
  1. Export / Import example
  • Export example
옵션 내용
Database 전체 $exp system/manager file=/backup/full_exp.dmp log=/backup/full_exp.log full=y
User 단위 $exp system/manager file=/backup/scott.dmp log=/backup/scott.log owner=scott
Table 단위 $exp system/manager file=/backup/scott_emp.dmp log=/backup/scott_emp.log tables=scott.emp
  • Import example
옵션 내용
Database 전체 $imp system/manager file=/backup/full_exp.dmp log=/backup/full_imp.log full=y
User 단위 $imp system/manager file=/backup/scott.dmp log=/backup/scott_imp.log fromuser=scott touser=hr
Table 단위 $imp system/manager file=/backup/scott_emp.dmp log=/backup/scott_emp_imp.log tables=scott.emp
  1. Recovery Manager(RMAN)
    1. RMAN 구조
      1. RMAN의 기본 개요

      RMAN은 Database files, Archive logs, 그리고 Control files들을 Backup하고 Restore하기 위하여 사용 된다. 또한 RMAN은 Complete 또는 Incomplete Database Recovery를 수행하기 위하여 사용할 수 있다. 단, RMAN은 initialization files이나 password files는 Backup할 수 없다. RMAN 은 current redo log 에 대한 별도의 백업 방법을 가지고 있지 않으며 수동으로 log switching을 발생시켜야 한다.

      1. RMAN의 특징
  • DB 전체, Tablespace단위, Database files, Archive logs, 그리고 Control files등 Backup이 자주 실행되는 명령들은 script로 저장하여 간단하게 실행할 수 있다.
  • Incremental block level backup을 할 수 있다.
  • 사용되어지지 않은 database block들은 skip한다.
  • Backup / restore 시 각 block 에 대한 checksum 을 통해 Corrupted block 을 발견한다.
  • Tablespace를 Online으로 백업 할 때, tablespace를 backup mode 로 변경 할 필요가 없다.
  • Backup performance를 향상 시킨다. (Parallelization, less redo log 생성)
  • OS 의 open file limit 을 피하기 위해 open file limit 을 지정할 수 있으며, 백업 사이즈의 limit 을 줄 수 있다.
  1. RMAN Architecture

관리자가 RMAN 유틸리티에게 백업이나 복구를 명령하면 RMAN유틸리티는 관리자를 대신하여 대상 서버 (Target Database)에 접속하여 Server Process에게 백업을 수행한다. 그리고 관련 정보를 Recovery Catalog Server가 있으면 Catalog Database에 저장하고, 만약 없다면 Target Database의 Control file에 기록한다.


RMAN은 서버 쪽의 SID를 체크하고 sys 사용자로 로그인 하게 된다. 그리고 인스턴스에 접속하기 위해 Channel Server Process를 생성하게 된다. Channel Server Process의 기본값은 1개다. 이 Server Process가 사용 할 PGA가 할당된다.

이 패키지는 Control file의 정보를 읽어서 데이터베이스 전체 의 파일들에 관한 정보와 체크포인트 정보, 생성 시간 정보, 각 Data file의 온라인/오프라인 정보 및 위치 정보들을 모으게 된다. 이렇게 정보를 모은 후 본격적인 백업 작업을 수행하기 전에 백업되는 동안 변경되는 정보들로부터 현재 시점의 정보를 지키기 위해 Control file을 스냅샷 해서 보관하게 된다.

이 후 DBMS_BACKUP_RESTORE 패키지를 호출하여 정해진 위치에 백업 피스를 만든다. 모든 백업 파일이 백업 피스에 저장 완료되면 RMAN은 다시 DBMS_BACKUP_RESTORE 패키지를 호출해서 백업 피스의 이름과 시간 마지막 체크포인트 정보 등을 Control file에 기록한다. 이 과정까지 끝나면 백업이 완료된다.

  1. Recovery Catalog

Recovery Catalog란 RMAN 사용 시 에 RMAN으로 백업 복구 작업을 하고 관련 정보를 저장해 두는 저장소이다. Recovery Catalog Server가 없을 경우 RMAN은 Target Database Server의 control file에 해당 정보를 저장하고 Recovery Catalog Server가 있을 경우 Recovery Catalog Server에 정보를 저장한다.

Recovery Catalog에 저장되는 정보는 아래와 같다.

  • Data file, Archive file 및 Redo log file의 백업 셋과 copy 된 이미지에 대한 정보
  • 백업 대상서버의 물리적인 구조
  • 자주 사용하는 백업 스크립트 (Recovery Catalog Server를 사용할 경우만 해당)
  1. RMAN 명령어
    1. RMAN 접속

    SQL*Plus로 데이터베이스에 접속하듯이 RMAN으로도 데이터베이스에 접속한다.

    차이점은 RMAN은 SYSDBA 권한을 가지고 타겟과 보조 데이터베이스에 접속해야 하는데 AS SYSDBA 키워드는 사용하지 않아도 묵시적으로 가진 것으로 접속이 가능하다.

    ORACLE USER로 수행 한다.

[oracle@XXXDB01 ~]$ rman target /
Recovery Manager: Release 12.1.0.2.0 – Production on Thu Jun 11 10:00:31 2015
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.

connected to target database: XXXDB (DBID=611517755)

RMAN>

  1. RMAN CONFIGURE COMMAND

configure의 설정된 환경 값을 바르게 설정되어 있는 경우, 간단하게 BACKUP DATABASE; 문을 실행하여 데이터베이스를 백업할 수 있다.

RMAN이 백업과 복구를 실행하는 구성을 미리 작성한 디폴트 configure가 준비되어 적용된다. 또한 CONFIGURE 명령으로 channel parameter를 재 작성할 수 있다.

  • Default RMAN configuration

Show all 명령어를 사용하면, default configuration 값을 확인 할 수 있다.

RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name XXXDB are:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

CONFIGURE BACKUP OPTIMIZATION OFF; # default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘%F’; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE MAXSETSIZE TO UNLIMITED; # default

CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

CONFIGURE ENCRYPTION ALGORITHM ‘AES128’; # default

CONFIGURE COMPRESSION ALGORITHM ‘BASIC’ AS OF RELEASE ‘DEFAULT’ OPTIMIZE FOR LOAD TRUE ; # default

CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS; # default

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO ‘/oracle/12.1.0.2/dbs/snapcf_JCDB1.f’; # default

주요 configuration 수정 하는 방법은 다음과 같다.

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 1 DAYS;
à
이 파라미터는 복구에 사용할 백업 파일의 보존 기간을 설정하는 것으로 1DAYS 하면 1일치만 복구하기 위해 보존한다는 의미이다. 이 정책을 넘어선, 즉 1일이 지난 백업 파일을 모두 지우려면 DELETE OBSOLETE 명령어를 시용하면 된다.
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 1;

à
이 명령어는 백업본의 개수를 지정한다. 만일의 경우 백업 파일이 손상될 수 있기 때문에 REDUNDANCY 숫자만큼 백업 파일을 다중화해서 생성하라는 의미이다. 여기서는 1개로 지정한 내용이다.

RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 2;

à
이 설정은 기본 Channel에 백업을 받을 때 백업 수행 프로세스의 병렬도를 설정하는 것이다. 이 예처럼 설정하면 기본 Channel로 백업 받을 때 백업 프로세스가 2개 생성되어 백업을 동시에 진행할 것이다.

RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK

à
default backup device를 설정한다.

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

à
RMAN의 BACKUP이나 COPY 명령들의 수행 후 자동으로 control file backup을 수행한다.

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘%F’;

à
autobackup되는 control file의 기본 format을 변경한다.

RMAN> CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;

à
datafile, control file의 backup set의 copy본 개수를 지정한다.

RMAN> CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;

à
archivelog file의 backup set의 copy본 개수를 지정한다.

RMAN> CONFIGURE MAXSETSIZE TO UNLIMITED;

à
해당 Channel에서 백업 받아지는 백업셋의 최대 크기를 UNLIMITED로 설정하는 명령어다.

RMAN> CONFIGURE BACKUP OPTIMIZATION ON;

à
이 설정은 만약 백업 받는 경로에 같은 백업 파일이 존재하면 그 파일은 백업 받지 말고 넘어가라는 의미이다. RMAN은 해당 백업 파일이 같은 파일인지 구별하기 위해 백업되어 있는 파일과 지금 백업하려는 파일의 DBID, Checkpoint SCN, Creation SCN, Resetlogs SCN and time을 서로 비교해서 모든 것 이 완벽하게 맞으면 동일 파일로 인정하게 Skip 한다. 기본값은 OFF

RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 50M;

à
이 설정은 해당 Channel로 백업 받을 때 백업 파일 하나의 최대 크기를 지정하는 명령어 이다.

  • Default configuration 변경

만약 default device type을 변경하려면 다음과 같이 변경 하면 된다. 이 외의 다른 configuration 변경도 아래 step 과 동일하다.

RMAN> show default device type;
RMAN configuration parameters for database with db_unique_name XXXDB are:
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

RMAN> CONFIGURE DEFAULT DEVICE TYPE TO SBT;

old RMAN configuration parameters:

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

new RMAN configuration parameters:

CONFIGURE DEFAULT DEVICE TYPE TO ‘SBT_TAPE’;

new RMAN configuration parameters are successfully stored

RMAN> show default device type;

RMAN configuration parameters for database with db_unique_name XXXDB are:

CONFIGURE DEFAULT DEVICE TYPE TO ‘SBT_TAPE’;

  1. SHOW 명령어

Show all 명령어를 사용하면 configuration 값을 모두 사용 할 수 있다. 특정 한 것을 볼 경우 아래와 같이 사용 하면 된다.

RMAN> show default device type;
RMAN configuration parameters for database with db_unique_name XXXDB are:
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

à 변경하지 않은 configuration은 # default 라고 표시 된다.

RMAN> show default device type;

RMAN configuration parameters for database with db_unique_name XXXDB are:

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

à 변경이 된 configuration은 # default가 사라지며 해당 configuration 값이 나타난다.

  1. LIST 명령어
  • LIST DATABASE
RMAN> list backup of database;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

1 Full 467.06M DISK 00:00:18 11-JUN-15

BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20150611T111129

Piece Name: /oracle/12.1.0.2/dbs/01q97fn1_1_1

List of Datafiles in backup set 1

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/system01.dbf

2 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

3 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/undotbs101.dbf

4 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/undotbs201.dbf

5 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/users01.dbf

  • LIST BACKUP OF DATAFILE
RMAN> list backup of datafile ‘+DG_DATA/XXXDB/system01.dbf’;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

1 Full 467.06M DISK 00:00:18 11-JUN-15

BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20150611T111129

Piece Name: /oracle/12.1.0.2/dbs/01q97fn1_1_1

List of Datafiles in backup set 1

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/system01.dbf

  • LIST BACKUP
RMAN> list backup;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

1 Full 467.06M DISK 00:00:18 11-JUN-15

BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20150611T111129

Piece Name: /oracle/12.1.0.2/dbs/01q97fn1_1_1

List of Datafiles in backup set 1

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/system01.dbf

2 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

3 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/undotbs101.dbf

4 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/undotbs201.dbf

5 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/users01.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

2 Full 18.11M DISK 00:00:04 11-JUN-15

BP Key: 2 Status: AVAILABLE Compressed: NO Tag: TAG20150611T111156

Piece Name: /oracle/12.1.0.2/dbs/c-611517755-20150611-00

Control File Included: Ckp SCN: 1184594 Ckp time: 11-JUN-15

  1. Channel 할당하기

    Channel이란 쉽게 말하면 백업과 복구를 하는 경로를 의미한다. 백업을 수행하기 전에 Channel을 할당해주어야 RMAN이 백업/복구를 수행할 수 있다. 복구할 때는 Channel을 할당하지 않아도 되지만 백업할 경우는 반드시 Channel을 할당해 주어야 한다. Channel을 할당하는 방법은 자동 Channel 설정 과 수동 Channel 설정이 있다.

    1. 자동 Channel 할당하기

    자동 Channel 이란 백업을 수행할 때 별도의 경로를 주지 않아도 정해진 위치로 백업을 받는 것을 말하며 default channel의 의미가 있다. 다음과 같이 설정한다.

  • RMAN 접속
[oracle@XXXDB01 ~]$ rman target /
Recovery Manager: Release 12.1.0.2.0 – Production on Fri Jun 12 03:41:41 2015
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.

connected to target database: XXXDB (DBID=611517755)

  • 자동 Channel 설정

아래와 같이 설정하면 default device가 파라미터 파일의 db_recovery_file_dest 파라미터 경로로 설정되며 해당 파라미터가 설정되어 있지 않다면 $ORACLE_HOME/dbs에 저장된다.

RMAN> configure default device type to disk;
using target database control file instead of recovery catalog
old RMAN configuration parameters:

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

new RMAN configuration parameters:

CONFIGURE DEFAULT DEVICE TYPE TO DISK;

new RMAN configuration parameters are successfully stored

  • 자동 Channel 경로 변경

/u01/app/backup 경로를 default device로 설정한다. 즉 앞으로 특별한 경로 없이 백업을 수행하면 이곳에 백업이 생성된다. %U(대문자 U) 는 파일명이 중복되지 않도록 RMAN 이 Unique 한 번호로 파일 이름을 생성하면서 백업을 수행하라는 의미이며 %T는 백업 날짜를 표시 하라는 뜻이다.

RMAN> configure channel device type disk
2> format ‘/u01/app/backup/%U_%T’;
new RMAN configuration parameters:

CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT ‘/u01/app/backup/%U_%T’;

new RMAN configuration parameters are successfully stored

  • 자동 Channel 경로 변경 TEST
RMAN> backup tablespace users;
à경로 지정 없이 백업을 수행 시킴.
Starting backup at 12-JUN-15

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=42 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting full datafile backup set

channel ORA_DISK_1: specifying datafile(s) in backup set

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: starting piece 1 at 12-JUN-15

channel ORA_DISK_1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/05q99aih_1_1_20150612 tag=TAG20150612T035601 comment=NONE

à/oracle/backup 경로에 백업 파일이 생성 된 것을 확인 할 수 있다.

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-01 comment=NONE

Finished Control File Autobackup at 12-JUN-15

  1. 수동 Channel 할당 하기

수동 Channel이란 백업을 수행할 때 백업 받을 경로를 지정해 주는 것이다. 아래 방법은 작업형 명령어를 사용하여 수동 Channel을 할당하는 것이다. /oracle/backup/manual 경로에 백업 파일이 생성 된다.

RMAN> run {
2> allocate channel c1 type disk
3> format ‘/oracle/backup/manual/%U_%T’;

4> backup tablespace users;

5> }

allocated channel: c1

channel c1: SID=42 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/manual/0aq99b12_1_1_20150612 tag=TAG20150612T040346 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-03 comment=NONE

Finished Control File

또는 아래와 같이 독립형 명렁어로도 가능하다.

RMAN> backup tablespace users format ‘/oracle/backup/manual/%U_%T’;
Starting backup at 12-JUN-15
allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=42 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting full datafile backup set

channel ORA_DISK_1: specifying datafile(s) in backup set

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: starting piece 1 at 12-JUN-15

channel ORA_DISK_1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/manual/0cq99b6r_1_1_20150612 tag=TAG20150612T040651 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-04 comment=NONE

Finished Control File Autobackup at 12-JUN-15

  1. Channel 할당 정리

자동 Channel 할당보다 수동 Channel 할당이 더 우선적으로 적용 된다. 그리고 수동 Channel을 사용하면 RMAN은 해당 경로에 받는 백업 파일을 관리하지 않는다. 이 말의 의미는 Retention Policy 등이 설정되어 있더라도 format 파라미터를 사용해서 경로를 변경하면 해당 정책들이 적용 안 된다는 것을 의미 한다. FRA에 저장한다 하더라도 format 파라미터로 경로가 정해지면 관리자가 수동으로 백업 파일을 관리 해야만 한다.

  1. RMAN BACKUP

    RMAN의 BACKUP 방법은 독립형 명령어(standalone)으로 백업 받기와 작업형 명령으로 백업 받기 가 있다. 독립형 명령어는 한 개의 명령어가 수행되는 것을 말하며, 작업형 명령어는 마치 프로그램의 스크립트처럼 여러 개의 명령어를 한꺼번에 사용하는 방법이다. 앞으로 예제는 작업형 명령어로 수행 하겠다.

    1. Database full backup

    전체 DB에 대한 백업을 수행 한다.

  • Database full backup 수행

/oracle/backup 경로에 백업 파일을 생성하며, database full 백업을 수행한다. List backup으로 확인 했을 때 tag는 구분 하기 쉽게 FULL_DB로 보여 지게 된다.

RMAN> run {
2> # backup the complete database to disk
3> allocate channel c1 type disk;

4> backup

5> full

6> tag full_db

7> format ‘/oracle/backup/db_%U_%T’

8> (database);

9> release channel c1;

10> }

released channel: ORA_DISK_1

allocated channel: c1

channel c1: SID=42 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00001 name=+DG_DATA/XXXDB/system01.dbf

input datafile file number=00002 name=+DG_DATA/XXXDB/sysaux01.dbf

input datafile file number=00003 name=+DG_DATA/XXXDB/undotbs101.dbf

input datafile file number=00004 name=+DG_DATA/XXXDB/undotbs201.dbf

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/db_0eq99c4i_1_1_20150612 tag=FULL_DB comment=NONE

channel c1: backup set complete, elapsed time: 00:00:25

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-05 comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  • Database full backup 확인

경로 및 Tag에 위에서 수행한 내용이 나타나 있다.

RMAN> list backupset of database;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

11 Full 508.86M DISK 00:00:24 12-JUN-15

BP Key: 11 Status: AVAILABLE Compressed: NO Tag: FULL_DB

Piece Name: /oracle/backup/db_0eq99c4i_1_1_20150612

List of Datafiles in backup set 11

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 Full 1291744 12-JUN-15 +DG_DATA/XXXDB/system01.dbf

2 Full 1291744 12-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

3 Full 1291744 12-JUN-15 +DG_DATA/XXXDB/undotbs101.dbf

4 Full 1291744 12-JUN-15 +DG_DATA/XXXDB/undotbs201.dbf

5 Full 1291744 12-JUN-15 +DG_DATA/XXXDB/users01.dbf

  1. Tablespace backup

Tablespace 별로 백업 받을 때 사용 할 수 있다.

  • Tablespace backup 수행

아래 예제는 USERS TABLESPACE와 SYSAUX TABLESPACE의 백업 수행 내용 이다.

/oracle/backup 경로에 백업 파일이 생성 된다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag tbs_users_sysaux

5> format ‘/oracle/backup/tbs_%U_%T’

6> (tablespace users, sysaux);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=42 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00002 name=+DG_DATA/XXXDB/sysaux01.dbf

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/tbs_0gq99cp3_1_1_20150612 tag=TBS_USERS_SYSAUX comment=NONE

channel c1: backup set complete, elapsed time: 00:00:07

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-06 comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  • Tablespace backup 확인

위에서 개별적으로 백업 받은 내용뿐만 아니라, FULL BACKUP 받았던 내용까지 나온다. FULL BACKUP 내역에 해당 테이블 스페이스가 존재 하기 때문이다.

RMAN> list backupset of tablespace sysaux;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

1 Full 467.06M DISK 00:00:18 11-JUN-15

BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20150611T111129

Piece Name: /oracle/12.1.0.2/dbs/01q97fn1_1_1

List of Datafiles in backup set 1

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

2 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

11 Full 508.86M DISK 00:00:24 12-JUN-15

BP Key: 11 Status: AVAILABLE Compressed: NO Tag: FULL_DB

Piece Name: /oracle/backup/db_0eq99c4i_1_1_20150612

List of Datafiles in backup set 11

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

2 Full 1291744 12-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

13 Full 194.69M DISK 00:00:04 12-JUN-15

BP Key: 13 Status: AVAILABLE Compressed: NO Tag: TBS_USERS_SYSAUX

Piece Name: /oracle/backup/tbs_0gq99cp3_1_1_20150612

List of Datafiles in backup set 13

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

2 Full 1292370 12-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

  1. Datafile backup

Datafile 별로 백업 받을 때 사용 할 수 있다.

  • Datafile 확인

Report schema를 확인 한다. 현재 datafile 및 tempfile을 알 수 있다.

RMAN> report schema;
Report of database schema for database with db_unique_name XXXDB
List of Permanent Datafiles

===========================

File Size(MB) Tablespace RB segs Datafile Name

—- ——– ——————– ——- ————————

1 700 SYSTEM YES +DG_DATA/XXXDB/system01.dbf

2 550 SYSAUX NO +DG_DATA/XXXDB/sysaux01.dbf

3 290 UNDOTBS1 YES +DG_DATA/XXXDB/undotbs101.dbf

4 200 UNDOTBS2 YES +DG_DATA/XXXDB/undotbs201.dbf

5 5 USERS NO +DG_DATA/XXXDB/users01.dbf

List of Temporary Files

=======================

File Size(MB) Tablespace Maxsize(MB) Tempfile Name

—- ——– ——————– ———– ——————–

1 23 TEMP 32767 +DG_DATA/XXXDB/temp01.dbf

  • Datafile backup 수행

작업형 명령어로 아래와 같이 수행 할 수 있다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag df_users

5> format ‘/oracle/backup/df_%U_%T’

6> (datafile ‘+DG_DATA/XXXDB/users01.dbf’);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/df_0lq99hic_1_1_20150612 tag=DF_USERS comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-08 comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

또는 위에서 확인 한 report schema의 결과 내용을 보고 file number로 백업 받을 수도 있다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag df_users2

5> format ‘/oracle/backup/df_%U_%T’

6> (datafile 5);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/df_0nq99hu1_1_1_20150612 tag=DF_USERS2 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-09 comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  • Datafile backup 확인

Datafile backup 내용 확인 같은 경우, 해당 datafile number를 적어 주어도 되고, 해당 datafile path를 적어 주어도 된다.

RMAN> list backupset of datafile ‘+DG_DATA/XXXDB/users01.dbf’;
RMAN> list backupset of datafile 5;
List of Backup Sets

===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

17 Full 1.03M DISK 00:00:00 12-JUN-15

BP Key: 17 Status: AVAILABLE Compressed: NO Tag: DF_USERS

Piece Name: /oracle/backup/df_0lq99hic_1_1_20150612

List of Datafiles in backup set 17

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

5 Full 1296675 12-JUN-15 +DG_DATA/XXXDB/users01.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

19 Full 1.03M DISK 00:00:00 12-JUN-15

BP Key: 19 Status: AVAILABLE Compressed: NO Tag: DF_USERS2

Piece Name: /oracle/backup/df_0nq99hu1_1_1_20150612

List of Datafiles in backup set 19

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

5 Full 1297097 12-JUN-15 +DG_DATA/XXXDB/users01.dbf

  1. Control file backup

Controlfile backup 같은 경우에 수동으로 현재 control file을 백업 받을 수 있고, autobackup을 활성화 시켜, 데이터베이스 메타데이타가 변경될 대마다 자동 백업을 수행한다. 아래 예제는 수동으로 control file을 백업 받는 내용이다.

  • Control file backup 수행
RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag control_bk

5> format ‘/oracle/backup/cf_%U_%T’

6> (current controlfile);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting full datafile backup set

channel c1: specifying datafile(s) in backup set

including current control file in backup set

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/cf_0pq99ijk_1_1_20150612 tag=CONTROL_BK comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-0a comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  • Control file backup 확인

현재 해당 DB에는 CONTROLFILE AUTOBACKUP ON 으로 되어 있어, tag CONTRL_BK로 controlfile을 백업 했을 때, 같이 자동으로 controlfile이 backup 되었다.

RMAN> list backup of controlfile;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

21 Full 18.11M DISK 00:00:03 12-JUN-15

BP Key: 21 Status: AVAILABLE Compressed: NO Tag: CONTROL_BK

Piece Name: /oracle/backup/cf_0pq99ijk_1_1_20150612

Control File Included: Ckp SCN: 1298018 Ckp time: 12-JUN-15

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

22 Full 18.11M DISK 00:00:02 12-JUN-15

BP Key: 22 Status: AVAILABLE Compressed: NO Tag: TAG20150612T061312

Piece Name: /oracle/12.1.0.2/dbs/c-611517755-20150612-0a

Control File Included: Ckp SCN: 1298025 Ckp time: 12-JUN-15

  1. Archive log backup

Archive log 를 백업 받을 때 사용한다.

  • Archive log 확인

현재 백업 받아져 있는 archive log 를 확인 한다. 현재 백업 받아져 있는 archive는 하나도 없다.

RMAN> list backupset of archivelog all;
specification does not match any backup in the repository
  • Archive log backup

작업형 명령어로 archive log를 백업 받을 수 있다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> format ‘/oracle/backup/log_%U_%T’

5> (archivelog all);

6> release channel c1;

7> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

current log archived

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=2 sequence=5 RECID=10 STAMP=882156427

input archived log thread=1 sequence=33 RECID=8 STAMP=882156427

input archived log thread=2 sequence=6 RECID=11 STAMP=882156428

input archived log thread=1 sequence=34 RECID=9 STAMP=882156427

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_0rq99j1l_1_1_20150612 tag=TAG20150612T062035 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:03

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=1 sequence=1 RECID=12 STAMP=882166835

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_0sq99j1o_1_1_20150612 tag=TAG20150612T062035 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:03

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-0b comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  • Archive log backup 확인

RAC 이기 때문에 Thread 1,2 모두 백업 받아 진다.

RMAN> list backupset of archivelog all;
List of Backup Sets
===================

BS Key Size Device Type Elapsed Time Completion Time

——- ———- ———– ———— —————

23 17.53M DISK 00:00:00 12-JUN-15

BP Key: 23 Status: AVAILABLE Compressed: NO Tag:TAG20150612T062035

Piece Name: /oracle/backup/log_0rq99j1l_1_1_20150612

List of Archived Logs in backup set 23

Thrd Seq Low SCN Low Time Next SCN Next Time

—- ——- ———- ——— ———- ———

1 33 1175083 11-JUN-15 1285038 12-JUN-15

1 34 1285038 12-JUN-15 1287932 12-JUN-15

2 5 903151 03-JUN-15 1184015 11-JUN-15

2 6 1184015 11-JUN-15 1184017 11-JUN-15

BS Key Size Device Type Elapsed Time Completion Time

——- ———- ———– ———— —————

24 11.98M DISK 00:00:01 12-JUN-15

BP Key: 24 Status: AVAILABLE Compressed: NO Tag:TAG20150612T062035

Piece Name: /oracle/backup/log_0sq99j1o_1_1_20150612

List of Archived Logs in backup set 24

Thrd Seq Low SCN Low Time Next SCN Next Time

—- ——- ———- ——— ———- ———

1 1 1287932 12-JUN-15 1298316 12-JUN-15

  • 특정 범위의 Sequence Archive log backup

Archive log file을 전부 다 받는 것이 아니고, 특정 sequence의 범위를 줘서 백업 받을 수 있다. 아래 테스트는 1번 노드의 archive log file 중에 sequence 가 1부터 3번까지 백업 받는 내용 이다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag log_1_3

5> format ‘/oracle/backup/log_%U_%T’

6> (archivelog from sequence=1 until sequence=3 thread 1);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=1 sequence=1 RECID=12 STAMP=882166835

input archived log thread=1 sequence=2 RECID=13 STAMP=882167494

input archived log thread=1 sequence=3 RECID=14 STAMP=882167497

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_0uq99jnk_1_1_20150612 tag=LOG_1_3 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-0c comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  • 특정 시간이 경과한 Archive log backup

Sequence 뿐만 아니라, 시간의 범위를 지정하여 백업 받을 수도 있다. 아래 예제는 하루 이내에 생성된 archive log들에 대해 백업 하는 내용이다. Backup 한 이후에 해당 archive log file을 삭제 한다.

구분 내용
sysdate – 1

현재 날짜와 시간보다 1일전

sysdate – 7

현재 날짜와 시간보다 7일전

sysdate – 1/24

현재 날짜와 시간보다 1시간 전

sysdate – 9/24

현재 날짜와 시간보다 9시간 전

sysdate – 5/3600

현재 날짜와 시간보다 5분 전

all delete input

Backup이 완료되면 삭제가 된다. 만일 Backup이 실패를 한다면 Archivelog 들은 지워지지 않는다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag log_oneday

5> format ‘/oracle/backup/log_%U_%T’

6> (archivelog from time ‘sysdate-1’ all delete input);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

current log archived

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=2 sequence=5 RECID=10 STAMP=882156427

input archived log thread=1 sequence=33 RECID=8 STAMP=882156427

input archived log thread=2 sequence=6 RECID=11 STAMP=882156428

input archived log thread=1 sequence=34 RECID=9 STAMP=882156427

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_10q99jv0_1_1_20150612 tag=LOG_ONEDAY comment=NONE

channel c1: backup set complete, elapsed time: 00:00:03

channel c1: deleting archived log(s)

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_2_seq_5.274.882156427 RECID=10 STAMP=882156427

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_33.272.882156427 RECID=8 STAMP=882156427

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_2_seq_6.275.882156429 RECID=11 STAMP=882156428

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_34.273.882156427 RECID=9 STAMP=882156427

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=1 sequence=1 RECID=12 STAMP=882166835

input archived log thread=1 sequence=2 RECID=13 STAMP=882167494

input archived log thread=1 sequence=3 RECID=14 STAMP=882167497

input archived log thread=1 sequence=4 RECID=15 STAMP=882167776

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_11q99jv5_1_1_20150612 tag=LOG_ONEDAY comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

channel c1: deleting archived log(s)

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_1.276.882166835 RECID=12 STAMP=882166835

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_2.277.882167495 RECID=13 STAMP=882167494

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_3.278.882167497 RECID=14 STAMP=882167497

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_4.279.882167777 RECID=15 STAMP=882167776

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-0d comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  1. Online redo log backup

Online Redolog는 RMAN을 이용해서 Backup할 수 없다. 이것을 Backup하기에 앞서서 반드시 Archiving 되어야 한다. 즉 다음과 같은 sql command를 이용하여 Backup을 한다.

RMAN> run {
2> allocate channel c1 type disk;
3> sql “alter system archive log current”;

4> backup

5> format ‘/oracle/backup/log_%U_%T’

6> (archivelog from time ‘sysdate-1’ all delete input);

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=39 instance=XXXDB1 device type=DISK

sql statement: alter system archive log current

Starting backup at 12-JUN-15

current log archived

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=2 sequence=5 RECID=1 STAMP=882097839

input archived log thread=1 sequence=33 RECID=7 STAMP=882156401

input archived log thread=2 sequence=6 RECID=2 STAMP=882097840

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_13q99kkh_1_1_20150612 tag=TAG20150612T064744 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

channel c1: deleting archived log(s)

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_11/thread_2_seq_5.256.882097839 RECID=1 STAMP=882097839

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_33.271.882153957 RECID=7 STAMP=882156401

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_11/thread_2_seq_6.270.882097841 RECID=2 STAMP=882097840

channel c1: starting archived log backup set

channel c1: specifying archived log(s) in backup set

input archived log thread=1 sequence=5 RECID=16 STAMP=882168463

input archived log thread=1 sequence=6 RECID=17 STAMP=882168464

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/log_14q99kkj_1_1_20150612 tag=TAG20150612T064744 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:01

channel c1: deleting archived log(s)

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_5.279.882168463 RECID=16 STAMP=882168463

archived log file name=+DG_ARCH/XXXDB/ARCHIVELOG/2015_06_12/thread_1_seq_6.278.882168465 RECID=17 STAMP=882168464

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-0e comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

  1. Incremental backup

    Archivelog mode 인 경우 open 상태에서 database, tablespace, datafile 단위에서 incremental backup 이 가능하다. 즉 parent incremental backup 의 SCN 과 비교해서 큰 block 만을 copy 한다. incremental 은 differential incremental 과 cumulative incremental 로 나뉜다. default 는 differential 이다.

    Level N incremental Backup은 가장 최근의 N 또는 N보다 작은 Backup이후의 변경된 부분만을 Backup하는 것이다. List Backup Set을 조회해 보면 Type Column에는 ‘Incr’, LV Column에는 ‘0’이라고 나타날 것이다.

    만약 recovery time 이 disk space 보다 중요한 고려사항이라면 cumulative backup 이 differential backup 보다 유리하다.

    10g 이상부터는 block change tracking 을 enable 시키면 datafile 을 full scan 하지 않고서도 변경된 block 을 tracking 할 수 있으므로 backup 시 성능향상을 꾀할 수 있다.

    1. Incremental backup 수행

      아래 예제는 level 0으로 데이터베이스 전체를 백업 받는 내용 이다. Filesperset 파라미터는 backup file에 최대 4개의 데이터 파일씩 백업 받도록 하는 파라미터이다

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag full_level0

5> incremental level 0

6> filesperset 4

7> format ‘/oracle/backup/full_level0_%U_%T’

8> (database);

9> release channel c1;

10> }

allocated channel: c1

channel c1: SID=36 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting incremental level 0 datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00001 name=+DG_DATA/XXXDB/system01.dbf

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

input datafile file number=00004 name=+DG_DATA/XXXDB/undotbs201.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/full_level0_16q9aseg_1_1_20150612 tag=FULL_LEVEL0 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:15

channel c1: starting incremental level 0 datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00002 name=+DG_DATA/XXXDB/sysaux01.dbf

input datafile file number=00003 name=+DG_DATA/XXXDB/undotbs101.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/full_level0_17q9asf0_1_1_20150612 tag=FULL_LEVEL0 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:15

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-0f comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

Backup 내용을 확인 해 보면 Incremental backup을 level 0으로 수행 한 것을 볼 수 있다.

RMAN> list backupset of database;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

34 Incr 0 272.41M DISK 00:00:07 12-JUN-15

BP Key: 34 Status: AVAILABLE Compressed: NO Tag: FULL_LEVEL0

Piece Name: /oracle/backup/full_level0_16q9aseg_1_1_20150612

List of Datafiles in backup set 34

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 0 Incr 1404169 12-JUN-15 +DG_DATA/XXXDB/system01.dbf

4 0 Incr 1404169 12-JUN-15 +DG_DATA/XXXDB/undotbs201.dbf

5 0 Incr 1404169 12-JUN-15 +DG_DATA/XXXDB/users01.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

35 Incr 0 202.17M DISK 00:00:07 12-JUN-15

BP Key: 35 Status: AVAILABLE Compressed: NO Tag: FULL_LEVEL0

Piece Name: /oracle/backup/full_level0_17q9asf0_1_1_20150612

List of Datafiles in backup set 35

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

2 0 Incr 1404175 12-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

3 0 Incr 1404175 12-JUN-15 +DG_DATA/XXXDB/undotbs101.dbf

  1. Incremental Backup을 이용한 Backup 전략의 예
구분 내용
Sun night level 0 backup performed
Mon night level 2 backup performed
Tue night level 2 backup performed
Wed night level 2 backup performed
Thu night level 1 backup performed
Fri night level 2 backup performed
Sat night level 2 backup performed

만일 Database가 토요일 아침에 Crash가 발생했다고 가정하면 RMAN은 Sunday, Thursday, Friday 의 Backup을 이용하여 Recovery를 할 수 있다. 왜냐하면 Thursday의 level 1 Backup은 Sunday이후의 모든 변화된 내용을 포함하고 있고 Friday의 level 2는 Thursday이후에 모든 변화된 내용을 포함하고 있기 때문이다.

  1. Cumulative Incremental Backup

    Cumulative incremental Backup은 가장 최근의 N보다 작은 Backup이후의 변경된 부분만을 Backup하는 것이다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag Inc_level1

5> format ‘/oracle/backup/full_level1_%U_%T’

6> incremental level 1 cumulative database;

7> release channel c1;

8> }

allocated channel: c1

channel c1: SID=36 instance=XXXDB1 device type=DISK

Starting backup at 12-JUN-15

channel c1: starting incremental level 1 datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00001 name=+DG_DATA/XXXDB/system01.dbf

input datafile file number=00002 name=+DG_DATA/XXXDB/sysaux01.dbf

input datafile file number=00003 name=+DG_DATA/XXXDB/undotbs101.dbf

input datafile file number=00004 name=+DG_DATA/XXXDB/undotbs201.dbf

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

channel c1: starting piece 1 at 12-JUN-15

channel c1: finished piece 1 at 12-JUN-15

piece handle=/oracle/backup/full_level1_1bq9b10e_1_1_20150612 tag=INC_LEVEL1 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:15

Finished backup at 12-JUN-15

Starting Control File Autobackup at 12-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-11 comment=NONE

Finished Control File Autobackup at 12-JUN-15

released channel: c1

Backup 내용을 확인 해 보면 Incremental backup을 level 1으로 수행 한 것을 볼 수 있다.

RMAN> list backupset of database;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

39 Incr 1 6.87M DISK 00:00:13 12-JUN-15

BP Key: 39 Status: AVAILABLE Compressed: NO Tag: INC_LEVEL1

Piece Name: /oracle/backup/full_level1_1bq9b10e_1_1_20150612

List of Datafiles in backup set 39

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 1 Incr 1407864 12-JUN-15 +DG_DATA/XXXDB/system01.dbf

2 1 Incr 1407864 12-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

3 1 Incr 1407864 12-JUN-15 +DG_DATA/XXXDB/undotbs101.dbf

4 1 Incr 1407864 12-JUN-15 +DG_DATA/XXXDB/undotbs201.dbf

5 1 Incr 1407864 12-JUN-15 +DG_DATA/XXXDB/users01.dbf

  1. RMAN 백업 작업 진행 사항 확인하기

    RMAN 작업을 하다 보면 얼마나 진행되었고 얼마나 남았는지 궁금할 경우가 있다. 이럴 때는 아래의 방법으로 조회하면 결과를 알 수 있다.

SQL> r
1 SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,
2 ROUND(SOFAR/TOTALWORK* 100,2) “%_COMPLETE”

3 FROM V$SESSION_LONGOPS

4 WHERE OPNAME LIKE ‘RMAN%’

5 AND OPNAME NOT LIKE ‘%aggregate%’

6 AND TOTALWORK != 0

7* AND SOFAR <> TOTALWORK

SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE

———- ———- ———- ———- ———- ———-

36 37905 1 101613 223360 45.49

SQL> r

1 SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,

2 ROUND(SOFAR/TOTALWORK* 100,2) “%_COMPLETE”

3 FROM V$SESSION_LONGOPS

4 WHERE OPNAME LIKE ‘RMAN%’

5 AND OPNAME NOT LIKE ‘%aggregate%’

6 AND TOTALWORK != 0

7* AND SOFAR <> TOTALWORK

SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE

———- ———- ———- ———- ———- ———-

36 37905 1 180526 223360 80.82

SQL> r

1 SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,

2 ROUND(SOFAR/TOTALWORK* 100,2) “%_COMPLETE”

3 FROM V$SESSION_LONGOPS

4 WHERE OPNAME LIKE ‘RMAN%’

5 AND OPNAME NOT LIKE ‘%aggregate%’

6 AND TOTALWORK != 0

7* AND SOFAR <> TOTALWORK

no rows selected

à작업이 완료되면 no rows selected 로 나타남.

  1. Recovery
    1. Datafile 장애 복구

    사용자가 DB shutdown 중 실수로 Datafile 을 삭제하였을 경우 또는 해당 Datafile이 깨졌을 경우 에 이와 같은 방법을 사용 할 수 있다

  • 장애 발생 예제

ASM DISK Group은 Online 중에는 아래와 같이 삭제 되지 않는다.

ASMCMD [+DG_DATA/XXXDB] > rm users01.dbf
ORA-15032: not all alterations performed
ORA-15028: ASM file ‘+DG_DATA/XXXDB/users01.dbf’ not dropped; currently being accessed (DBD ERROR: OCIStmtExecute)

Instance shutdown 이후 삭제를 진행 한다.

SQL> shutdown immediate
Database closed.
Database dismounted.

ORACLE instance shut down.

USERS TABLESPACE의 datafile을 삭제 한다.

ASMCMD [+DG_DATA/XXXDB] > rm users01.dbf

Datafile이 없으므로 mount 상태에서 open 되지 않는다. 5번 datafile이 깨지거나 삭제되어서 장애가 났음을 확인 할 수 있다.

SQL> startup
ORACLE instance started.
Total System Global Area 1157627904 bytes

Fixed Size 2923632 bytes

Variable Size 855638928 bytes

Database Buffers 285212672 bytes

Redo Buffers 13852672 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 5 – see DBWR trace file

ORA-01110: data file 5: ‘+DG_DATA/XXXDB/users01.dbf’

  • Datafile 복구 restore

데이터파일을 restore 한다. 5번 datafile 인 +DG_DATA/XXXDB/users01.dbf 파일을 restore 하는 과정이다. 위에서 백업 했던 incremental Backup의 level 0번을 가지고 restore 한다.

RMAN> restore datafile 5;
Starting restore at 12-JUN-15
using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=43 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00005 to +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_16q9aseg_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_16q9aseg_1_1_20150612 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:03

Finished restore at 12-JUN-15

  • Datafile 복구 recover

Restore 한 datafile에 대해 recover를 시행 시켜야 한다. 예제에서는 level0 full backup 이후 level1로 incremental backup을 받았는데, 가장 최근의 backup 파일 이므로 level1의 backup piece를 가지고 추가 recover를 시행 한다.

RMAN> recover datafile 5;
Starting recover at 12-JUN-15
using channel ORA_DISK_1

channel ORA_DISK_1: starting incremental datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

destination for restore of datafile 00005: +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level1_1dq9b2nk_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level1_1dq9b2nk_1_1_20150612 tag=INC_LEVEL1

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

starting media recovery

media recovery complete, elapsed time: 00:00:01

Finished recover at 12-JUN-15

  • Datafile 복구 Open 및 확인

정상적으로 recover가 되었는지 확인 한다. 정상적으로 +DG_DATA/XXXDB/users01.dbf 파일이 생성된 것을 확인 할 수 있다.

SQL> alter database open;
Database altered.
SQL> select instance_name, status from v$instance;

INSTANCE_NAME STATUS

—————- ————

XXXDB1 OPEN

SQL> select name from v$datafile;

NAME

———————————————

+DG_DATA/XXXDB/system01.dbf

+DG_DATA/XXXDB/sysaux01.dbf

+DG_DATA/XXXDB/undotbs101.dbf

+DG_DATA/XXXDB/undotbs201.dbf

+DG_DATA/XXXDB/users01.dbf

  1. Tablespace 장애 복구

위에서 확인 하였던 datafile 장애 복구와 방법은 동일 하다. Restore 및 recover 할 때 tablespce로 복구 하면 된다. 아래 예제는 USERS TABLESPACE에 대해 RMAN script로 복구 하는 방법이다.

  • Tablespace 복구

장애가 발생한 users tablespace 에 대해 restore 후 recover 로 복구 하는 내용 이다.

RMAN> run {
2> RESTORE TABLESPACE users;
3> RECOVER TABLESPACE users;

4> }

Starting restore at 12-JUN-15

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=38 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00005 to +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_16q9aseg_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_16q9aseg_1_1_20150612 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

Finished restore at 12-JUN-15

Starting recover at 12-JUN-15

using channel ORA_DISK_1

channel ORA_DISK_1: starting incremental datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

destination for restore of datafile 00005: +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level1_1dq9b2nk_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level1_1dq9b2nk_1_1_20150612 tag=INC_LEVEL1

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:02

starting media recovery

media recovery complete, elapsed time: 00:00:00

Finished recover at 12-JUN-15

  • Tablespace 복구 Open 및 확인

    정상 복구 되었는지 확인 한다. Users tablespace 가 정상적으로 복구 되었는지 확인 한다.

SQL> alter database open;
Database altered.
SQL> select instance_name, status from v$instance;

INSTANCE_NAME STATUS

—————- ————

XXXDB1 OPEN

SQL> select name from v$datafile;

NAME

——————————————-

+DG_DATA/XXXDB/system01.dbf

+DG_DATA/XXXDB/sysaux01.dbf

+DG_DATA/XXXDB/undotbs101.dbf

+DG_DATA/XXXDB/undotbs201.dbf

+DG_DATA/XXXDB/users01.dbf

  1. Database 장애 복구

가장 최근에 백업한 backupset을 이용하여 database 전체 복구를 진행하는 방법이다. 아래 명령어를 수행하면 mount 까지 올린 상태에서 restore 및 recover 를 수행 한 다음, 데이터베이스를 open 시키는 방식이다.

기본적으로 restore controlfile command에 의하여 init.ora에 지정되어 있는 control_files의 위치로 자동적으로 controlfile들이 restore된다. 이렇게 하지 않고 특정한 위치를 지정하기 위해서는 restore controlfile to ‘filename’ 이라고 지정하면 된다.

RMAN> RUN {
2> startup mount;
3> RESTORE DATABASE;

4> RECOVER DATABASE;

5> sql ‘ALTER DATABASE OPEN’;

6> }

Oracle instance started

database mounted

Total System Global Area 1157627904 bytes

Fixed Size 2923632 bytes

Variable Size 855638928 bytes

Database Buffers 285212672 bytes

Redo Buffers 13852672 bytes

Starting restore at 12-JUN-15

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=41 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to +DG_DATA/XXXDB/system01.dbf

channel ORA_DISK_1: restoring datafile 00004 to +DG_DATA/XXXDB/undotbs201.dbf

channel ORA_DISK_1: restoring datafile 00005 to +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_16q9aseg_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_16q9aseg_1_1_20150612 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00002 to +DG_DATA/XXXDB/sysaux01.dbf

channel ORA_DISK_1: restoring datafile 00003 to +DG_DATA/XXXDB/undotbs101.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_17q9asf0_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_17q9asf0_1_1_20150612 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

Finished restore at 12-JUN-15

Starting recover at 12-JUN-15

using channel ORA_DISK_1

channel ORA_DISK_1: starting incremental datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

destination for restore of datafile 00001: +DG_DATA/XXXDB/system01.dbf

destination for restore of datafile 00002: +DG_DATA/XXXDB/sysaux01.dbf

destination for restore of datafile 00003: +DG_DATA/XXXDB/undotbs101.dbf

destination for restore of datafile 00004: +DG_DATA/XXXDB/undotbs201.dbf

destination for restore of datafile 00005: +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level1_1dq9b2nk_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level1_1dq9b2nk_1_1_20150612 tag=INC_LEVEL1

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:07

starting media recovery

media recovery complete, elapsed time: 00:00:04

Finished recover at 12-JUN-15

sql statement: ALTER DATABASE OPEN

  1. Drop table 후 복구

Drop table이나 drop user, update, delete 장애 등이 이 경우에 해당되며 모두 복구하는 원리는 동일하다. 이 방법에서 가장 중요한 것은 장애 난 시점의 시간인데 그 시간을 확인한 후 복구를 진행한다. 예로 test01 table을 생성 하고 drop 한 뒤 복구를 진행한다.

  • Test table 생성
SQL> set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;

TABLESPACE MB FILE_NAME

———- ———- ————————————————–

SYSTEM 700 +DG_DATA/XXXDB/system01.dbf

SYSAUX 550 +DG_DATA/XXXDB/sysaux01.dbf

UNDOTBS1 290 +DG_DATA/XXXDB/undotbs101.dbf

UNDOTBS2 200 +DG_DATA/XXXDB/undotbs201.dbf

USERS 5 +DG_DATA/XXXDB/users01.dbf

SQL> conn wmsuser/wmsuser

Connected.

SQL> create table test01 (no number) tablespace users;

Table created.

à테스트 유저인 wmsuser에서 test01 이라는 테이블을 생성한다.

SQL> insert into test01 values(1);

1 row created.

SQL> insert into test01 values(2);

1 row created.

SQL> commit;

Commit complete.

à총2건의 데이터를 insert 한다.

SQL> select * from test01;

NO

———-

1

2

SQL> select to_char(sysdate, ‘YYYY-MM-DD:HH24:MI:SS’)

2 from dual;

TO_CHAR(SYSDATE,’YY

——————-

2015-06-12:21:56:00

à위 시간까지 테이블이 존재하는 시간이다.

  • Test table 삭제

테스트를 위해 위에서 생성한 table을 삭제 한다.

SQL> drop table test01 purge;
Table dropped.
SQL> select * from test01;

select * from test01

*

ERROR at line 1:

ORA-00942: table or view does not exist

à해당 테이블을 삭제하여 조회가 되지 않는다.

  • Test table 복구

DB를 정상 종료 시킨 후 해당 시간으로 복구를 진행하여, 위에서 삭제된 테이블을 복구 시킨다. Set until time은 그 시점까지 복구 하겠다는 의미이다. 이 시간은 위에서 테이블을 삭제 하기 전 시간이다.

이 방법에서 가장 핵심은 set until time 부분과 그 윗부분에 NLS_DATE_FORMAT 설정하는 부분이다. Drop table만 예로 했지만 drop user나 DML 장애 시에도 같은 방법으로 복구하면 된다.

RMAN> run {
2> startup mount;
3> sql ‘alter session set nls_date_format=”YYYY-MM-DD:HH24:MI:SS”‘;

4> set until time=’2015-06-12:21:56:00′;

5> restore database;

6> recover database;

7> alter database open resetlogs;

8> }

Oracle instance started

database mounted

Total System Global Area 1157627904 bytes

Fixed Size 2923632 bytes

Variable Size 855638928 bytes

Database Buffers 285212672 bytes

Redo Buffers 13852672 bytes

using target database control file instead of recovery catalog

sql statement: alter session set nls_date_format=”YYYY-MM-DD:HH24:MI:SS”

executing command: SET until clause

Starting restore at 12-JUN-15

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=41 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to +DG_DATA/XXXDB/system01.dbf

channel ORA_DISK_1: restoring datafile 00004 to +DG_DATA/XXXDB/undotbs201.dbf

channel ORA_DISK_1: restoring datafile 00005 to +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_16q9aseg_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_16q9aseg_1_1_20150612 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00002 to +DG_DATA/XXXDB/sysaux01.dbf

channel ORA_DISK_1: restoring datafile 00003 to +DG_DATA/XXXDB/undotbs101.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_17q9asf0_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_17q9asf0_1_1_20150612 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:15

Finished restore at 12-JUN-15

Starting recover at 12-JUN-15

using channel ORA_DISK_1

channel ORA_DISK_1: starting incremental datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

destination for restore of datafile 00001: +DG_DATA/XXXDB/system01.dbf

destination for restore of datafile 00002: +DG_DATA/XXXDB/sysaux01.dbf

destination for restore of datafile 00003: +DG_DATA/XXXDB/undotbs101.dbf

destination for restore of datafile 00004: +DG_DATA/XXXDB/undotbs201.dbf

destination for restore of datafile 00005: +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level1_1dq9b2nk_1_1_20150612

channel ORA_DISK_1: piece handle=/oracle/backup/full_level1_1dq9b2nk_1_1_20150612 tag=INC_LEVEL1

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:07

starting media recovery

media recovery complete, elapsed time: 00:00:09

Finished recover at 12-JUN-15

Statement processed

  • Test table 복구 확인

정상적으로 위에서 삭제한 테이블이 복구 되었는지 확인 한다.

SQL> select * from test01;
NO
———-

1

2

  1. Drop tablespace 복구

사용자가 명령어로 수행 시킨 tablespace를 복구 시키는 방법 이다.

  • Drop tablespace test 현재 상태 확인

현재 DB 상태를 확인 한다.

SQL> set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50

SQL> select tablespace_name, bytes/1024/1024 MB, file_name

2 from dba_data_files;

TABLESPACE MB FILE_NAME

———- ———- ————————————————–

SYSTEM 700 +DG_DATA/XXXDB/system01.dbf

SYSAUX 550 +DG_DATA/XXXDB/sysaux01.dbf

UNDOTBS1 290 +DG_DATA/XXXDB/undotbs101.dbf

UNDOTBS2 200 +DG_DATA/XXXDB/undotbs201.dbf

USERS 5 +DG_DATA/XXXDB/users01.dbf

  • Drop tablespace test 용 테이블스페이스 생성

테스트를 위해 임시로 테이블 스페이스를 하나 생성한다.

SQL> create tablespace test
2 datafile ‘+DG_DATA/XXXDB/test01.dbf’ size 5M;
Tablespace created.

SQL> select tablespace_name, bytes/1024/1024 MB, file_name

2 from dba_data_files;

TABLESPACE MB FILE_NAME

———- ———- ————————————————–

SYSTEM 700 +DG_DATA/XXXDB/system01.dbf

SYSAUX 550 +DG_DATA/XXXDB/sysaux01.dbf

UNDOTBS1 290 +DG_DATA/XXXDB/undotbs101.dbf

UNDOTBS2 200 +DG_DATA/XXXDB/undotbs201.dbf

USERS 5 +DG_DATA/XXXDB/users01.dbf

TEST 5 +DG_DATA/XXXDB/test01.dbf

  • Drop tablespace test 전체 백업

해당 데이터베이스에 대해 전체 백업을 수행 한다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup

4> tag full_level0

5> incremental level 0

6> filesperset 4

7> format ‘/oracle/backup/full_level0_%U_%T’

8> (database);

9> release channel c1;

10> }

using target database control file instead of recovery catalog

allocated channel: c1

channel c1: SID=69 instance=XXXDB1 device type=DISK

Starting backup at 13-JUN-15

channel c1: starting incremental level 0 datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00001 name=+DG_DATA/XXXDB/system01.dbf

input datafile file number=00005 name=+DG_DATA/XXXDB/users01.dbf

input datafile file number=00006 name=+DG_DATA/XXXDB/test01.dbf

input datafile file number=00004 name=+DG_DATA/XXXDB/undotbs201.dbf

channel c1: starting piece 1 at 13-JUN-15

channel c1: finished piece 1 at 13-JUN-15

piece handle=/oracle/backup/full_level0_1jq9c7ql_1_1_20150613 tag=FULL_LEVEL0 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:15

channel c1: starting incremental level 0 datafile backup set

channel c1: specifying datafile(s) in backup set

input datafile file number=00002 name=+DG_DATA/XXXDB/sysaux01.dbf

input datafile file number=00003 name=+DG_DATA/XXXDB/undotbs101.dbf

channel c1: starting piece 1 at 13-JUN-15

channel c1: finished piece 1 at 13-JUN-15

piece handle=/oracle/backup/full_level0_1kq9c7r5_1_1_20150613 tag=FULL_LEVEL0 comment=NONE

channel c1: backup set complete, elapsed time: 00:00:15

Finished backup at 13-JUN-15

Starting Control File Autobackup at 13-JUN-15

piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150613-00 comment=NONE

Finished Control File Autobackup at 13-JUN-15

released channel: c1

  • Drop tablespace test 용 테이블 및 데이터 입력

테스트를 위해 테이블 생성 및 데이터를 입력 한다. 위에서 생성한 테스트용 테이블 스페이스에 테이블을 생성 한다.

SQL> create table test02 (no number) tablespace test;
Table created.
SQL> insert into test02 values (1);

1 row created.

SQL> insert into test02 values (2);

1 row created.

SQL> commit;

SQL> @time

TO_CHAR(SYSDATE,’YY

——————-

2015-06-13:06:30:14

à위 시간까지는 해당 테이블 스페이스가 존재 한다.

  • Drop tablespace test 테이블스페이스 장애 발생

사용자가 실수로 해당 테이블스페이스를 삭제 한 내용이다. Drop tablespace 명령어를 사용하였다면 해당 데이터베이스의 alert log에 시간이 찍힌다.

SQL> drop tablespace test including contents and datafiles;
Tablespace dropped.
àalert log 확인

Sat Jun 13 06:31:11 2015 à 위시간 이전까지 테이블 스페이스가 존재 함.

drop tablespace test including contents and datafiles

Sat Jun 13 06:31:14 2015

Deleted file +DG_DATA/XXXDB/test01.dbf

Completed: drop tablespace test including contents and datafiles

  • Drop tablespace test 복구 시작

데이터베이스를 정상 기동 시킨 후, 가장 최근의 control file을 restore 한 후, 테이블 스페이스 삭제 전까지 복구를 진행 하면 된다. nls_date_format을 사용하여 NLS format 변경 후 위에서 확인 하였던 drop tablespace 전의 시간까지 복구를 진행 하면 된다. 아래 내용을 확인 하면 archive log file까지 적용하여 데이터까지 복구 된 것을 확인 할 수 있다.

RMAN> run {
2> startup nomount;
3> restore controlfile from ‘/oracle/12.1.0.2/dbs/c-611517755-20150613-00’;

4> sql ‘ALTER DATABASE MOUNT’;

5> sql ‘alter session set nls_date_format=”YYYY-MM-DD:HH24:MI:SS”‘;

6> set until time=’2015-06-13:06:31:09′;

7> restore database;

8> recover database;

9> alter database open resetlogs;

10> }

Oracle instance started

Total System Global Area 1157627904 bytes

Fixed Size 2923632 bytes

Variable Size 855638928 bytes

Database Buffers 285212672 bytes

Redo Buffers 13852672 bytes

Starting restore at 13-JUN-15

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=41 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:03

output file name=+DG_DATA/XXXDB/control01.ctl

output file name=+DG_DATA/XXXDB/control02.ctl

Finished restore at 13-JUN-15

sql statement: ALTER DATABASE MOUNT

released channel: ORA_DISK_1

sql statement: alter session set nls_date_format=”YYYY-MM-DD:HH24:MI:SS”

executing command: SET until clause

Starting restore at 13-JUN-15

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=41 instance=XXXDB1 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to +DG_DATA/XXXDB/system01.dbf

channel ORA_DISK_1: restoring datafile 00004 to +DG_DATA/XXXDB/undotbs201.dbf

channel ORA_DISK_1: restoring datafile 00005 to +DG_DATA/XXXDB/users01.dbf

channel ORA_DISK_1: restoring datafile 00006 to +DG_DATA/XXXDB/test01.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_1jq9c7ql_1_1_20150613

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_1jq9c7ql_1_1_20150613 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00002 to +DG_DATA/XXXDB/sysaux01.dbf

channel ORA_DISK_1: restoring datafile 00003 to +DG_DATA/XXXDB/undotbs101.dbf

channel ORA_DISK_1: reading from backup piece /oracle/backup/full_level0_1kq9c7r5_1_1_20150613

channel ORA_DISK_1: piece handle=/oracle/backup/full_level0_1kq9c7r5_1_1_20150613 tag=FULL_LEVEL0

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

Finished restore at 13-JUN-15

Starting recover at 13-JUN-15

using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 3 is already on disk as file +DG_DATA/XXXDB/redo01.log

archived log file name=+DG_DATA/XXXDB/redo01.log thread=1 sequence=3

media recovery complete, elapsed time: 00:00:06

Finished recover at 13-JUN-15

Statement processed

  • Drop tablespace test 최종 확인
SQL> set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50

SQL> select tablespace_name, bytes/1024/1024 MB, file_name

2 from dba_data_files;

TABLESPACE MB FILE_NAME

———- ———- ————————————————–

SYSTEM 700 +DG_DATA/XXXDB/system01.dbf

SYSAUX 550 +DG_DATA/XXXDB/sysaux01.dbf

UNDOTBS1 290 +DG_DATA/XXXDB/undotbs101.dbf

UNDOTBS2 200 +DG_DATA/XXXDB/undotbs201.dbf

USERS 5 +DG_DATA/XXXDB/users01.dbf

TEST 5 +DG_DATA/XXXDB/test01.dbf

6 rows selected.

SQL> select * from test02;

NO

———-

1

2

  1. RMAN 관리하기

    RMAN에 등록되어 있는 backupset등을 수작업을 통해 정리 할 필요가 생길 수도 있다. 아래 내용들은 RMAN의 정보를 동기화 및 정리 하는 방법 들이다.

    1. Crosscheck

    이 명령어는 정보를 동기화 시키는 역할을 한다. 불필요 backup들을 crosscheck 한다. 해당 명령어를 수행하여 backup의 상태를 확인 할 수 있다. 아래에서 AVAILABLE 이라는 것은 정상이라는 의미이다.

RMAN> crosscheck backup;
using channel ORA_DISK_1
crosschecked backup piece: found to be ‘AVAILABLE’

backup piece handle=/oracle/12.1.0.2/dbs/01q97fn1_1_1 RECID=1 STAMP=882097890

crosschecked backup piece: found to be ‘AVAILABLE’

backup piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-00 RECID=2 STAMP=882156448

crosschecked backup piece: found to be ‘AVAILABLE’

backup piece handle=/oracle/backup/05q99aih_1_1_20150612 RECID=3 STAMP=882158161

만약 해당 backupset을 물리적으로(OS) 삭제 한 후 다시 crosscheck 수행을 해 보았다. 내용 중에서 파일이 삭제된 마지막 backupset을 보면 상태가 EXPIRED로 보인다. 이것은 backupset 목록에는 있는데 실제 백업 파일이 삭제되고 없다는 의미로 문제가 있음을 나타낸다. 즉 백업 파일을 지울 때도 RMAN 명령어로 삭제해야 하는데 그렇지 않고 0S 명령어로 삭제할 경우 이런 문제가 발생한다. 이럴 경우 backupset에서 EXPIRED 된 목록을 삭제해야 한다.

RMAN> crosscheck backup;
using channel ORA_DISK_1
crosschecked backup piece: found to be ‘AVAILABLE’

backup piece handle=/oracle/12.1.0.2/dbs/01q97fn1_1_1 RECID=1 STAMP=882097890

crosschecked backup piece: found to be ‘AVAILABLE’

backup piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-00 RECID=2 STAMP=882156448

crosschecked backup piece: found to be ‘EXPIRED’

backup piece handle=/oracle/backup/05q99aih_1_1_20150612 RECID=3 STAMP=882158161

  1. Delete expired backupset;

backupset에서 expired 된 목록을 삭제 하는 방법이다. EXPIRED된 목록이 나오면서 삭제 할것인지 선택 하는 부분이 나온다. 삭제를 선택 하면 RMAN 정보에서 삭제된 것을 알 수 있다.

RMAN> delete expired backupset;
using channel ORA_DISK_1
List of Backup Pieces

BP Key BS Key Pc# Cp# Status Device Type Piece Name

——- ——- — — ———– ———– ———-

3 3 1 1 EXPIRED DISK /oracle/backup/05q99aih_1_1_20150612

Do you really want to delete the above objects (enter YES or NO)? y

deleted backup piece

backup piece handle=/oracle/backup/05q99aih_1_1_20150612 RECID=3 STAMP=882158161

Deleted 1 EXPIRED objects

  1. Delete

특정 backup set을 삭제하고자 할 대 사용하는 명령어이다.

  • Backupset 목록 확인

현재 backup set 목록을 확인 한다.

RMAN> list backupset;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

1 Full 467.06M DISK 00:00:18 11-JUN-15

BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20150611T111129

Piece Name: /oracle/12.1.0.2/dbs/01q97fn1_1_1

List of Datafiles in backup set 1

File LV Type Ckp SCN Ckp Time Name

—- — —- ———- ——— —-

1 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/system01.dbf

2 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/sysaux01.dbf

3 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/undotbs101.dbf

4 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/undotbs201.dbf

5 Full 1184537 11-JUN-15 +DG_DATA/XXXDB/users01.dbf

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

2 Full 18.11M DISK 00:00:04 12-JUN-15

BP Key: 2 Status: AVAILABLE Compressed: NO Tag: TAG20150612T032724

Piece Name: /oracle/12.1.0.2/dbs/c-611517755-20150612-00

Control File Included: Ckp SCN: 1288040 Ckp time: 12-JUN-15

  • 특정 backupset 삭제

목록에서 BS Key 라고 된 곳이 backup set number 이다. 해당 backup set을 삭제하려면 이 번호를 사용해야 한다.

RMAN> delete backupset 1;
using channel ORA_DISK_1
List of Backup Pieces

BP Key BS Key Pc# Cp# Status Device Type Piece Name

——- ——- — — ———– ———– ———-

1 1 1 1 AVAILABLE DISK /oracle/12.1.0.2/dbs/01q97fn1_1_1

Do you really want to delete the above objects (enter YES or NO)? Y

deleted backup piece

backup piece handle=/oracle/12.1.0.2/dbs/01q97fn1_1_1 RECID=1 STAMP=882097890

Deleted 1 objects

  • Backupset 삭제 확인

Backup set number 1이 삭제 되었는지 확인 한다.

RMAN> list backupset;
List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time

——- —- — ———- ———– ———— —————

2 Full 18.11M DISK 00:00:04 12-JUN-15

BP Key: 2 Status: AVAILABLE Compressed: NO Tag: TAG20150612T032724

Piece Name: /oracle/12.1.0.2/dbs/c-611517755-20150612-00

Control File Included: Ckp SCN: 1288040 Ckp time: 12-JUN-15

  1. Delete obsolete

RMAN은 보존 정책에 의해 폐기된 것으로 표시된 백업을 자동으로 삭제하지 않는다. 대신 RMAN은 이러한 백업을 REPORT OBSOLETE 출력 및 V$BACKUP_FILES의 OBSOLETE 컬럼에 OBSOLETE로 표시한다. RMAN은 사용자가 DELETE OBSOLETE 명령을 실행하면 폐기된 파일을 삭제한다.

RMAN> delete obsolete;
RMAN retention policy will be applied to the command
RMAN retention policy is set to redundancy 1

using channel ORA_DISK_1

Deleting the following obsolete backups and copies:

Type Key Completion Time Filename/Handle

——————– —— —————— ——————–

Backup Set 2 12-JUN-15

Backup Piece 2 12-JUN-15 /oracle/12.1.0.2/dbs/c-611517755-20150612-00

Backup Set 4 12-JUN-15

Backup Piece 4 12-JUN-15 /oracle/12.1.0.2/dbs/c-611517755-20150612-01

Backup Set 5 12-JUN-15

Backup Piece 5 12-JUN-15 /oracle/backup/07q99aub_1_1_20150612

Backup Set 6 12-JUN-15

Backup Piece 6 12-JUN-15 /oracle/12.1.0.2/dbs/c-611517755-20150612-02

Backup Set 7 12-JUN-15

Backup Piece 7 12-JUN-15 /oracle/backup/manual/0aq99b12_1_1_20150612

Do you really want to delete the above objects (enter YES or NO)? Y

deleted backup piece

backup piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-00 RECID=2 STAMP=882156448

deleted backup piece

backup piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-01 RECID=4 STAMP=882158164

deleted backup piece

backup piece handle=/oracle/backup/07q99aub_1_1_20150612 RECID=5 STAMP=882158540

deleted backup piece

backup piece handle=/oracle/12.1.0.2/dbs/c-611517755-20150612-02 RECID=6 STAMP=882158543

deleted backup piece

backup piece handle=/oracle/backup/manual/0aq99b12_1_1_20150612 RECID=7 STAMP=882158626

Deleted 5 objects

  1. Oracle Database 정기점검 Checklist
    1. 일일 Checklist
      1. DATABASE
  • 매일 alert_SID.log 파일의 내용과 trace file의 내용을 체크한다. 이 파일에서 internal error나 다른 oracle error들을 알 수 있다. 이 파일의 내용은 무한히 커지므로 이 파일이 위치한 file system 공간도 체크 할 필요가 있다.
  • alert_SID.log 파일이나 trace 파일 일정 크기 이상이 되면 backup을 받는다. alert_SID.ora는 무한히 커지므로 적당한 양만큼 backup을 받는다. 이 파일로 장애 발생의 유추가 가능하므로 일정 기간 이상은 보존이 필요하다.
  • Diagnostic dest 의 free space여부를 항상 확인한다.
  • 각 tablespace에 free space를 생성되는 속도를 확인한다. 즉, database의 성장 속도를 확인하여 space 부족으로 생길 수 있는 DB가 hang이 걸리는 문제를 미리 대비할 수 있도록 한다.
  1. Control file
  • 매일 control file backup을 받았는지 alert_SID.log에서 확인 한다.
  1. Online Redo Log file
  • log switch interval을 체크한다. Log Switch가 너무 자주 발생하면 Disk I/O에 영향이 있을 수 있고, 심해지면 DB hang이 걸릴 수 있다.
  • checkpoint 간격을 자주 확인하라. 권할 만한 checkpoint의 간격은 매 10에서 15분 정도이다. 이 checkpoint의 간격은 Background process가 죽어서 instance가 abort되는 극한 상황에서 database를 살리고 잠깐의 시간 동안 crash recovery를 할 때 반영된다. 위의 간격을 조절하려면 database에서 checkpoint interval setting 또는 checkpoint_timeout을 조절함에 의해 가능하다. checkpoint_timeout을 0으로 그리고 checkpoint_interval을 online redo log file의 크기보다 크게 두면 checkpoint는 log switch가 일어날 때마다 발생한다. 잦은 checkpoint는 crash recovery의 기간은 줄여주나 dirty buffers를 자주 쓰는 것과 file headers를 자주 update하는데 드는 overhead가 발생한다.
  1. Archived log (Archive log Mode로 운영 시에만 해당됩니다.)
  • archive file이 생성되는 destination에 여유 공간이 있도록 유지한다. XXXDB의 경우에는 DG_ARCH disk group을 확인해야 하며, 여유 공간이 없을 시 DB Hang이 발생 할 수 있다.
  • alert.log에 Archive log들에 관한 error가 있는지 확인하라.

  1. 주 단위 Checklist
  • UNDO tablespace에 충분한 공간을 확보하여 ORA-1555 error를 피한다. ORA-1555에러는 Undo 공간이 부족해서 발생하면 발생하지만, bad query로도 유발될 수 있다.
  • SYSTEM tablespace 내에 다른 일반 사용자의 object들이나 temporary segments가 있는지 확인한다.
  • OS의 운영 상태를 확인할 수 있는 통계를 만들어서 관리한다.

  1. 월 단위 Checklist
  • 월 단위 지표 별 DB성능증감 추이를 만들어 관리한다.
  • 6개월에 한 번씩 recovery test를 한다. 장애가 발생할 때 대처할 수 있는 속도를 증가시키는 의미에서 6개월에 한번씩 recovery test가 필요하다.
  1. ASM Disk Path 변경 방법
    1. XXXDB stop (Node:1)

$ srvctl stop database -d XXXDB

  1. DG_DATA, DG_ARCH Multi-Path Change Owner (Node:Both)

# chown grid:dba /dev/sddlmaa2

# chown grid:dba /dev/sddlmab1

  1. DG_DATA, DG_ARCH Diskgroup Stop (Node:1)

$ srvctl stop diskgroup -g DG_DATA

$ srvctl stop diskgroup -g DG_ARCH

  1. DG_DATA, DG_ARCH Single-Path Change Owner (Node:Both)

# chown root:disk /dev/sdb2

# chown root:disk /dev/sdc1

  1. DG_DATA, DG_ARCH Diskgroup Start & Check (Node:1)

# srvctl start diskgroup -g DG_DATA

# srvctl start diskgroup -g DG_ARCH

  1. XXXDB Start & Check & Stop (Node:1)

$ srvctl start database -d XXXDB

$ crs_stat t

$ crsctl stat res t

– alert log check

$ srvctl stop database -d XXXDB

  1. OCR & Vote Migration (Node:1)

# /grid/12.1.0.2/bin/ocrcheck

# /grid/12.1.0.2/bin/ocrconfig -add +DG_ARCH

# /grid/12.1.0.2/bin/ocrconfig -delete +DG_CRS

# /grid/12.1.0.2/bin/ocrcheck

# /grid/12.1.0.2/bin/crsctl query css votedisk

# /grid/12.1.0.2/bin/crsctl replace votedisk +DG_ARCH

# /grid/12.1.0.2/bin/crsctl query css votedisk

  1. CRS Stop (Node : Both)

# /grid/12.1.0.2/bin/crsctl stop crs

  1. DG_CRS Multi & Single Path Change Ownership (Node:Both)

# chown grid:dba /dev/sddlmaa1

# chown root:disk /dev/sdb1

  1. CRS Stat (Node:Both)

# /grid/12.1.0.2/bin/crsctl start crs

  1. OCR & Vote Migration (Node:1)

# /grid/12.1.0.2/bin/ocrcheck

# /grid/12.1.0.2/bin/ocrconfig -add +DG_CRS

# /grid/12.1.0.2/bin/ocrconfig -delete +DG_ARCH

# /grid/12.1.0.2/bin/crsctl query css votedisk

# /grid/12.1.0.2/bin/crsctl replace votedisk +DG_CRS

# /grid/12.1.0.2/bin/crsctl query css votedisk

  1. XXXDB Start & Check (Node:1)

$ srvctl start database -d XXXDB

$ crs_stat -t

$ crsctl stat res t

– alert log check

  1. /etc/rc.d/rc.local modify (Both)

# vi /etc/rc.d/rc.local

chown grid:dba /dev/sddlmaa1

chown grid:dba /dev/sddlmaa2

chown grid:dba /dev/sddlmab1

# chmod +x /etc/rc.d/rc.local

  1. Server Reboot & Device Ownership Check (Both)

/grid/12.1.0.2/bin/crsctl stop crs

Reboot

  1. 11g R2 이상버전에서 사설 네트워크 정보를 수정하는 방법

11.2 이상의 그리드 인프라스트럭처에서, 사설 네트워크 구성은 OCR에 저장될 뿐만 아니라 gpnp 프로파일에도 저장됩니다.

만약 사설 네트워크가 가용하지 않거나 그 정의가 잘못되었다면, CRSD 프로세스는 기동되지 않을 것이며 OCR에 그 다음의 어떠한 변화도 불가능할 것입니다.

그러므로 사설 네트워크의 구성을 변경할 때는 주의를 기울이는 것이 필요합니다. 올바른 순서로 변경을 수행하는 것은 중요합니다.

또한 gpnp 프로파일의 수동변경은 지원되지 않으니 주의하시기 바랍니다.

수행전에 모든 클러스터 노드에 있는 profile.xml 을 grid 유저로 백업하시기 바랍니다:

$ cd $GRID_HOME/gpnp/<hostname>/profiles/peer/

$ cp -p profile.xml profile.xml.bk

  1. 모든 오라클 클러스터웨어가 기동중인지 확인.
  2. grid 유저로 현재의 정보를 얻으시기 바랍니다. 예를 들면

$ oifcfg getif

eth1 100.17.10.0 global public

eth0 192.168.0.0 global cluster_interconnect

* 새로운 cluster_interconnect 정보를 추가합니다:

$ oifcfg setif -global <interface>/<subnet>:cluster_interconnect

For example:

a. add a new interface bond0 with the same subnet

$ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect

b. add a new subnet with the same interface name but different subnet or new interface name

$ oifcfg setif -global eth0/192.65.0.0:cluster_interconnect

or

$ oifcfg setif -global eth3/192.168.1.96:cluster_interconnect

* 참고사항

1. 이것은 인터페이스가 아직 가용하지 않을지라도 -global 옵션을 통해 수행될 수 있습니다.

그러나 만약 인터페이스가 가용하지않다면 이것은 -node 옵션으로는 수행될 수 없으며 이것은노드 이빅션으로 연결될 것입니다.

2. 만약 인터페이스가 그 서버에서 가용하다면 서브넷 주소는 다음의 명령에 의해서

알 수 있습니다.

$ oifcfg iflist

그것은 네트워크 인터페이스와 그것의 서브넷 주소의 목록을 보여줍니다.

이 명령은 오라클 클러스터웨어가 기동중이 아닐지라도 수행될 수 있습니다.

서브넷 주소가 x.y.z.0 의 형태가 아닐 수도 있고 x.y.z.24, x.y.z.64 또는 x.y.z.128 등등 일 수도 있음을 주의하십시오.

예를 들면,

$ oifcfg iflist

lan1 18.1.2.0

lan2 10.2.3.64 << 이것은 사설 네트워크 IP: 10.2.3.86 과 관련있는 사설 네트워크 서브넷 주소입니다

3. 존재하는 사설 네트워크를 대체하는게 아닌 2번째 사설 네트워크를 추가하는 것이라면 두 인터페이스의 MTU 크기가 동일한지 확인하고

그렇지않으면 인스턴스 기동시 에러가 나타날 것입니다.

ORA-27504: IPC error creating OSD context

ORA-27300: OS system dependent operation:if MTU failed with status: 0

ORA-27301: OS failure message: Error 0

ORA-27302: failure occurred at: skgxpcini2

ORA-27303: additional information: requested interface lan1:801 has a different MTU (1500) than lan3:801 (9000),

which is not supported. Check output from ifconfig command

변경을 확인하십시오:

$ oifcfg getif

  1. root유저를 통해 모든 노드의 오라클 클러스터웨어를 내리고 비활성화하시기 바랍니다.

# crsctl stop crs

# crsctl disable crs

  1. 요구된 사항으로 OS레벨에서 네트워크 구성 변경을 수행하고, 그 변경이후 모든 노드에서 새로운 인터페이스가 가용한지 확인하시기 바랍니다.

$ ifconfig -a

$ ping <private hostname>

  1. 오라클 클러스터웨를 활성화하고 root유저로서 모든 노드에서 오라클 클러스터웨어를 재기동하시기 바랍니다.

# crsctl enable crs

# crsctl start crs

  1. 필요하다면 기존 인터페이스를 제거하시기 바랍니다.

$ oifcfg delif -global <if_name>[/<subnet>]

eg:

$ oifcfg delif -global eth0/192.168.0.0

  1. 주의사항
    1. 만약 기본적인 네트워크 구성이 변경되었지만 그 동일 변경을 위한 oifcfg 가 수행되지않았다면, 오라클 클러스터웨어가 재기동될 때 CRSD는 기동되지 않을 것입니다.

The crsd.log 는 다음과 같을 것입니다:

2010-01-30 09:22:47.234: [ default][2926461424] CRS Daemon Starting

..

2010-01-30 09:22:47.273: [ GPnP][2926461424]clsgpnp_Init: [at clsgpnp0.c:837] GPnP client pid=7153, tl=3, f=0

2010-01-30 09:22:47.282: [ OCRAPI][2926461424]clsu_get_private_ip_addresses: no ip addresses found.

2010-01-30 09:22:47.282: [GIPCXCPT][2926461424] gipcShutdownF: skipping shutdown, count 2, from [ clsinet.c : 1732], ret gipcretSuccess (0)

2010-01-30 09:22:47.283: [GIPCXCPT][2926461424] gipcShutdownF: skipping shutdown, count 1, from [ clsgpnp0.c : 1021], ret gipcretSuccess (0)

[ OCRAPI][2926461424]a_init_clsss: failed to call clsu_get_private_ip_addr (7)

2010-01-30 09:22:47.285: [ OCRAPI][2926461424]a_init:13!: Clusterware initunsuccessful : [44]

2010-01-30 09:22:47.285: [ CRSOCR][2926461424] OCR context init failure. Error: PROC-44: Error in network address and interface operations Network address and interface operations error [7]

2010-01-30 09:22:47.285: [ CRSD][2926461424][PANIC] CRSD exiting: Could not init OCR, code: 44

2010-01-30 09:22:47.285: [ CRSD][2926461424] Done.

위의 에러는 OS 설정(oifcfg iflist)과 gpnp 프로파일 설정 profile.xml 간의 부정합을 나타냅니다.

회피방법: OS 네트워크 구성을 원래 상태로 복원하시기 바랍니다. 그리고나서 다시 그 변경을 위한 위의 단계들을 수행하시기 바랍니다.

만약 기본 네트워크가 변경되지 않았지만 oifcfg setif 가 잘못된 서브넷 주소나 인터페이스명을 가지고 수행되었다면 동일한 문제가 일어날 것입니다.

  1. 클러스터에 어느 한 노드라도 다운되었다면 oifcfg 명령은 다음의 에러와 함께 실패할 것입니다.

$ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect

PRIF-26: Error in update the profiles in the cluster

회피방법: 기동되어 있지않은 노드의 오라클 클러스터웨어를 기동하시기 바랍니다. 오라클 클러스터웨어가 모든 클러스터 노드에서 기동중인지 확인하시기 바랍니다.

만약 어떤 OS 문제로 그 노드가 다운되었다면 사설 네트워크 변경을 수행하기전에 클러스터로부터 그 노드를 제거하시기 바랍니다.

  1. 만약 그리드 인프라스트럭처 소유자가 아닌 유저가 위의 명령을 수행하면, 다음과 같은 에러가 발생하며 실패할 것입니다.

$ oifcfg setif -global bond0/192.168.0.0:cluster_interconnect

PRIF-26: Error in update the profiles in the cluster

회피방법: 그러한 명령을 수행하기위해 그리드 인프라스트럭처 소유자로 로그인하였는지 확인하시기 바랍니다.

  1. 11.2.0.2 부터, 새로운 인터페이스를 추가하지 않고 마지막 사설 인터페이스(cluster_interconnect)를 지우려고 시도한다면 다음의 에러가 발생.

PRIF-31: Failed to delete the specified network interface because it is the last private interface

회피방법: 기존 사설 인터페이스를 지우기전에 우선 새로운 사설 인터페이스를 추가하시기 바랍니다.

  1. 오라클 클러스터웨어가 노드에서 다운시, 다음의 에러 발생

$ oifcfg getif

PRIF-10: failed to initialize the cluster registry

회피방법: 그 노드에서 오라클 클러스터웨어를 기동하시기 바랍니다

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

15 thoughts on “Oracle 12C RAC DB 운영 매뉴얼”
  1. 1. 각 설명에 해당하는 AWS 구성요소
    -> Internet gateway, Peering, Direct Connect, Subnet
    (하나는 생각안남, 어려운 내용은 아니었음)

    2. S3 Bucket의 백업 정책을 위한 스크립트 빈칸 채우기
    -> s3.PutObject/CreatBucket(?), 버킷명/폴더명, 유저명(숫자)

    3. AWS Beanstalk, Azure app service, GCP App Engine 같은 PaaS에서 불가능한 작업
    -> 제공하지 않는 Binary 를 직접 설치했다?

    4. AWS Lambda에 대한 설명으로 틀린것?
    -> Document 내용 그대로 나옴

    5. AWS CodeDeloy 관련 설명으로 틀린것은?
    -> Lambda는 Blue/Green, In-place 배포 모두 가능하다
    (AWS Lambda 컴퓨팅 플랫폼 배포는 인플레이스 배포 유형을 사용할 수 없음.)

    6. AWS에서 DB를 별도의 HA 솔루션을 사용하지 않고 장애시 복구할수 있는 방법?
    > RDS 다중 AZ 배포

    7. AWS SG에 대한 설명 중 틀린것은?
    > Outbound rule 수정이 불가하다(x)

    8. Hyper-V에서 Azure 로 마이그레이션 하려고한다. 가능한 것은?
    -> Gen 2 만 가능(답 2개)

    9. Azure 리눅스 VM의 root암호를 잃어버려 접속을 못하고 있다. 해결책은?(50자 이내)
    ->VM을 삭제하고 연결된 디스크를 다른 임시VM에 데이터 디스크로 연결해서 다시 설정 후 원복

    10. Azure Availability set에 Web 서버 4대, DB 서버 2대를 구성하려고 한다.
    다음중 맞는 방안은?
    -> Web 2대/DB 1대씩 set 구성
    -> web 4eo / DB2대 각각 따로 set 구성
    -> 각 VM 따로 구성
    -> 기억안남
    (답은 불확실)

    11. Azure 4대의 VM이 동일 Availability set에 있는데 그중 1대 VM의 메모리를 늘려야하는데 HW Cluster spec이 맞지 않

    는다고 한다. 어떻게 늘려야하는가?

    12. Azure VM을 업무시간 이후에는 자동으로 끄고 아침에 켜는 커맨드를 Cron에 등록했는데 비용은 24시간 쓴 비용이 나


    이유는 뭐고 어떻게 해야하나?

    13. GCP 개인정보와 같은 중요정보를 분류해서 비식별하는 서비스가 무엇인가?
    DLP (Data Loss Prevention)

    14. 클라우드 위협방지, 데이터 보호, 가시성 확보, 규제 준수 가능한 보안 솔루션?
    > CASB (Cloud Access Security Broker)

    15. 메일발송이 늘어나다가 어느순간 발송이 안된다. 이유 및 해결책은?
    -> SES limit (오답)

    Amazon EC2는 기본적으로 모든 인스턴스의 SMTP(25) 트래픽을 제한하고 있습니다.
    하지만, EC2를 메일서버로 구성하고자 할 때는 이러한 제한을 풀어야함

    1.Elastic IP(EIP) 준비
    아웃바운드 이메일을 보내는데 사용하는 EIP 주소가 필요합니다. 혹, EIP 주소가 스팸 주소로 등록되어 차단될 경우를 대

    비하여 두 개의 EIP를 준비합니다. EIP는 EC2에 attach 하면 EC2 당 1개는 비용이 발생하지 않지만 추가 EIP는 월 $3.66

    비용이 발생합니다.

    2. Route53에 EIP에 대한 reverse DNS 등록
    대부분의 대형 포털 메일서버는 수신한 메일의 스팸성을 스팸하우스 같은 안티스팸 기구에서 운영하는 디비를 참조하여

    판단합니다. 메일 발송지의 아이피의 Reverse DNS 조회 결과와 메일 발신자의 도메인이 일치하도록 reverse DNS를 등록해

    두면 스팸 판정을 크게 줄일 수 있습니다.
    Route53에서 Hosted Zone을 만들고 위에서 준비한 EIP로 메일도메인의 A 레코드를 등록하고 이에 따른 PTR 레코드를 등록

    해 줍니다.
    Route53의 Hosted Zone 당 월 $0.50 비용이 발생합니다.

    3. 제한 해제 신청
    SMTP 제한 해제는 Root 계정 자격으로만 가능합니다. 아래 페이지에서 위에서 준비한 두가지 정보를 입력하고 해제신청을

    합니다.
    해제신청: Request to Remove Email Sending Limitation
    요청이 승인되면 25번 포트의 차단이 제거되었음을 알리는 이메일을 받게됩니다.

    1. On-Premise 환경 AWS로 마이그레이션
    1-1.
    -VPC를 운영용, 관리용으로 나눔
    -DB는 단일, Web,WAS는 AZ 이중화
    -NAT Gateway, Bastion Host 구성

    [소문항1번 AWS 구성도 작성(배점12점)]
    ○출제의도
    온프레미스를 AWS로 이관하려고 할 때 이관 전략에 따라 구성도를 작성할 수 있는지 확인

    ▶피드백
    (-1) VPC간 연결 구성(VPC Peering or TGW)누락 or 오류
    (-1) 관리자용 VPN연결 구성 누락
    (-1) NAT G/W 누락
    (-1) EFS 누락
    (-1) AWS Polly 구성 누락

    1-2
    -AWS로 그대로 마이그레이션이 불가능한 항목과 대체방안,
    IP기반어쩌구 혹은 ERP 상용제품?

    [소문항2번 AWS 마이그레이션 고려사항 이관 전략 계획 수립(배점 8점)]
    ○출제의도
    온프레미스에서 AWS로 이관할 때 고려할 사항에 대하여 판별하고 해결방안을 제시할 수 있는지 확인

    ▶피드백
    * 첫번째 문항
    (-1) Tomcat7 Multicast가 클라우드에서 미지원 사유 누락
    (-1) 대체방안으로 redis나 별도 세션클러스터링 솔루션 적용안 누락
    (-1) Windows 2000 OS 미지원 사유 누락
    (-1) OS업그레이드를 통한 해결안 미작성

    2.
    2-1 443통신이 안되는데 표1에서 빠진 내용?
    2-2 통신을 위해 설정해줘야 하는것?
    – NACL Rule 이 잘못됨?

    [소문항1번 AWS 서브넷 NACL 설정(배점13점)]
    ○출제의도
    AWS 서브넷 범위 보안 설정인 NACL 적용 기준을 이해하는지 여부 확인

    ▶피드백
    ① 설정 정보 : private sunbet NACL에
    sip : 0.0.0.0/0 or any , protocol : tcp, port range :1024-65535 모두 포함 돼야 함.
    (-7) VPC내 EC2에서 인터넷 서버 접근 후 응답이 수신 되러면 port 1024 이상에 대해
    private subnet NACL inbound 오픈이 필요함

    ② 이유 : VPC에서 인터넷 서버 접속 후 인터넷으로부터 응답을 수신하기 위한
    tcp 1024 이상의 port에 대한 NACL inbound 오픈이 필요
    (-4) VPC내 EC2에서 인터넷 서버 접근 후 응답이 수신 안되는 부분에 대한 이슈임
    port 1024 이상에 대해 private subnet NACL inbound 오픈이 필요함

    [소문항2번 AWS 서브넷 범위의 라우팅 테이블 관리(배점 7점)]
    ○출제의도
    AWS 서브넷 내부 자원들의 라우팅 경로를 지정하는 방법을 아는지 확인

    ▶피드백
    ① 설정 정보 : Private subnet routing table에
    dest ip : 10.20.1.0/25 Next hop : VGW 설정이 정답
    (-2) Private subnet routing table 문구 없음
    (-1) dest ip : 10.20.1.0/25 지정 필요
    (-1) Next hop : VGW 설정 문구 필요

    ===========

    ==================================================

    Q) 다음 aws 서비스 중 서버리스가 아닌 것 두 가지는?

    ① RDS
    ② Athena
    ③ Fargate
    ④ EKS

    ==================================================

    Q) 특정 시간대에 게시글 및 댓글 작성이 집중된 시스템이 있을 때, 일부 무결성을 감수하더라도 이를 처리하는데에 가장 알맞은 데이터 관리 서비스는?

    ① Aurora
    ② DynamoDB
    ③ ElastiCache
    ④ Redshift

    ==================================================

    Q) (1)aws elb 세 가지 타입을 기술하고, (2)미디어 스트리밍 서비스를 하는데에 알맞은 elb 타입과 그 이유?

    ==================================================

    Q) 다음 설명으로 틀린 것은?

    ① 각 vpc에 오직 하나의 igw만 연결할 수 있으며, 한 퍼블릭 서브넷의 라우팅 테이블이 source 0.0.0.0/0에 대해 destination이 igw로 설정되어 있을 경우 해당 서브넷의 인스턴스는 eip를 할당하지 않아도 인터넷에 연결할 수 있다.

    ② vpc에 igw가 연결되어있어야만 인스턴스를 인터넷에 연결할 수 있다.

    ==================================================

    Q) Google 오픈소스 기술을 기반으로, 하이브리드 클라우드와 클라우드 기반 환경을 개발, 보호, 운영하는 방식을 현대화할 수 있도록 지원하는 통합 플랫폼입니다. Kubernetes, Istio, Knative를 비롯해 클라우드와 온프레미스 환경 간의 일관성을 확보할 수 있도록 하는 이 솔루션은?

    A) Anthos

    ==================================================

    Q) Azure를 통해 vm을 생성하고 볼륨 디스크 /mnt/sdb1(=/mnt/resource)에 애플리케이션을 설치한 이후, vm을 shutdown하여 다시 실행할 경우 애플리케이션이 삭제되어있는 것을 볼 수 있었다. 그 이유는?

    A) azure에서 linux vm을 생성시에 나타나는 /mnt/resource 디스크는 임시 디스크로, vm 종료 후 실행 등의 과정에서 데이터가 손실됨

    ==================================================

    Q) s3을 통해 미디어를 제공하는 시스템을 구축할 때, 사용자들이 직접적으로 컨텐츠에 대한 public access를 금지시키고자 할 경우 s3에 대한 정책 방식으로 옳은 것은?

    ① s3에 대한 iam role을 생성하고 부여
    ② OAI(Origin Access ID)를 사용하여 s3에 대한 액세스를 제한
    ③ s3에서 계정의 접근을 허용하는 정책 생성

    ==================================================

    Q) azure에서 웹 서버를 50대 생성했을 때, 보안을 위해 각 웹 서버마다 서로 다른 이름의 NSG(network security group)를 부여하려고 한다(or 했다). 이 때, 웹 서버에서 실행 데몬이 추가될 때마다 각 NSG를 수정해야 하는 문제를 해결 할 수 있는 방법은?

    ==================================================

    Q) Code Deploy 과정으로 옳은 순서는?
    1 .에이전트에서 appspec 및 배포 파일 다운&배포
    2. elb에서 ec2 접근 차단
    3. s3에 appspec 및 배포 파일 업로드
    4. code deploy에서 에이전트에 배포 요청

    ==================================================

    1. 정보 보안 컴플라이언스가 필요한 곳
    ㄱ. 서비스 제공자
    ㄴ. 서비스 이용자

    ==================================================

    5. disk type gp2, io2, .. 등과 처리 속도 (IOPS, MB/s), 처리량에 따른 요금,
    기타 등등의 속성이 나열된 표가 있을 경우, 이 표를 이용하여 각 조건에 맞는
    비용 최적화된 요금 계산

    ==================================================

    6. 다음 중 BP와 맞는 아키텍처를 골라라.
    Bastion이 프라이빗에 있을 수 있는지를 알아야 함. 퍼블릭 vs 프라이빗
    로드 밸런서가 NAT GW와 비교해서 어디에 위치하는지 알아야 함.

    ==================================================

    7. yaml 파일을 주고 빈칸 채우기
    (output -> attribute를 가져오는 부분에 빈칸이 있음)

    ==================================================

    Q) 신문 기사를 게시하는 시스템을 aws로 마이그레이션 하려고 하는데, 멀티 리전으로 구성 후 사용자가 가까운 리전으로 서비스 받을 수 있도록 하려고 할 때 사용해야 할 서비스는?
    (단, 시스템 상의 이유로 CloudFront는 사용불가)

    8. 리전 간 VPC 접근이 가능해야 하고, 네트워크 이용 시
    AWS Backbone을 이용하고, 이용 중인 VPC 모니터링이 가능한 서비스
    (단 CloudFront는 이용할 수 없음)

    –> 같은 문제인데, 합치기 어려움.
    ==================================================

    11. Azure managed disk에 대한 설명으로 틀린것은?
    ① 같은 디스크 type은 확장이 가능하다
    ② 디스크 크기는 축소 불가

    ==================================================

    서술형 1-1. 나열되어 있는 AWS의 특징들이 있다. 그와 대비되는 Azure의 특징을 서술 (빈칸 채우기)
    1-2. 어떤 회사가 마이그레이션 하려는데, 이러저러한 특징을 갖고 있다.
    1-1을 참고하여 어떤 서비스를 이용하는 것이 좋은지 이유를 세 가지 들 것.

    ==================================================

    서술형 2-1. 다음의 사항을 고려하여 AWS 아키텍처를 그릴 것.
    1. WEB auto scaling 고려
    2. 부하 분산 고려
    3. WAS, DB 이중화
    4. WEB, WAS Sticky한 연결 X
    5. 온프레미스와 VPN IPsec를 통해 연결
    6.

    ================
    #객관식
    – Azure Blob 스토리지 옵션에 따른 데이터 복제 개수를 적어봐
    LRS : 3벌
    GRS : 6벌 (3벌씩 2개)
    RA-GRS : 6벌

    – Azure NSG를 VM에만 걸어 쓰다가 Subnet에 걸었더니 사용자가 서비스를 못쓰네
    어딜봐야할까? (100자 기술)
    VM Inbound Rule에는 TCP 80 Allow 만 있는데
    Subnet Inbound Rule에는 TCP 8080 만 있음

    – GCP Region을 선택하는 기준 3개 기술해봐 (100자 이내)

    – GCP Stack Driver 사용시 제약점이 아닌거
    Auto scale 적용하려면 60초 단위로 점검해야한다
    (답인듯) Auto scale 적용시 and or 조건을 모두 사용 가능하다 (안되는걸로 doc에 있음)

    – Cloud 도입 단계를 순서대로 나열해
    Assessment -> Cloud PoC -> Migration -> Cloud 서비스 적극사용 -> 최적화

    – AWS에서 VPC를 만들고 EC2 인스턴스를 만들고 볼륨을 만들고
    이제 지워야겠다 해서 EC2 인스턴스를 AMI 로 떠놓고 EC2를 지웠어
    돈이 어디서 나가고 있을까? (2개 적어)
    AMI, 볼륨, VPC, 스냅샷

    – AWS에서 DR을 하려고 다른 리전에 EC2를 미러를 뜰꺼야
    이 과정에서 생성하지 않아도 되는걸 모두 골라
    [Route53 record set, EIP, Subnet, VPC, IAM Policy, Security Group, Launch configration]

    – Security Group의 특징이 아닌거 두개 골라
    egress에 대한 allow rule을 추가 할 수 있다
    stateless 하다

    – Azure Resource Group의 특징이 아닌거?
    한개의 리소스는 여러개 그룹에 속할 수 있다 (안댐)

    – AWS 서비스 설명에 틀린거 골라
    AWS에서 SSL 인증서관리를 KMS를 사용해 했어

    – AWS 서비스 구성을 하려는데 다음 설명중 틀린것은?
    RDS를 생성하면 자동으로 AZ간 HA가 구성된다
    서로다른 AZ에 생성한 EBS를 사용하는 EC2 인스턴스의 볼륨을 Linux에 DM-Mirror를 사용해 이중화 했다
    서로다른 AZ에 EC2에 EFS를 사용해 파일을 공유 했다

    – Cloudwatch에 관한 문제. 틀린거 골라
    CPU 모니터링을 했다
    Disk I/O를 모니터링 했다
    Disk Usage를 모니터링 했다 (안댐)
    NW Packet In/Out을 모니터링 했다

    – 다음중 클라우드 사용에 대한 틀린거 골라
    AWS 인스턴스 내부 모니터링을 위해 레거시에서 사용하던 SMS를 설치했다

    – IaaS, PaaS, SaaS 의 특징을 매칭해봐
    IaaS는 OS부터
    PaaS는 런타임부터
    SaaS는 제공 SW 부터

    – 레거시에 있던 오라클을 클라우드에 올리려고해
    DB 쿼리가 변경이 없는한에서 암화하 방법을 모두 골라
    OS에서 FS를 암호화해
    SSL 암호화
    DB 엔진 암호화
    Table 컬럼 단위 암호화

    – PaaS 사용자가 고려해야 할 보안사항은?
    인프라에 대한 보안관리
    미들웨어에 대한 보안관리
    데이터에 대한 보안관리
    Virtualization에 대한 보안관리

    – 스냅샷을 백업으로 활용하려 해. 특징이 아닌거
    볼륨의 백업을 위해 스냅샷을 생성했다
    스냅샷을 생성하면 최근것만 남고 이전것은 알아서 지워진다
    EC2인스턴스의 스냅샷을 위해 Poweroff 했다
    EC2인스턴스가 Stoped 상태에서 스냅샷을 생성했다

    – Windows 라이선스 비용 최적화를 위해 할 일이 아닌거
    기존 ? Type ? Type 의 VM을 Dedicate로 변경했다
    별도 라이선스를 구매해서 BOYL로 구성했다
    4 vCore 기준의 라이선스를 구매해서 VM을 기존 E8 v3에서 E4 v3으로 변경했다

    #서술형
    1. Hybrid Cloud Arch. 그리기
    1-1) 온프레미스 Private Cloud와 AWS에 신규 서비스를 구성해서 Hybrid를 구성하려 해
    기존 http://www.bcdcard.com 서비스에 이벤트 페이지인 event.bcdcard.com만 AWS에 구성하려해
    그림을 그려봐
    [공통 요구사항]
    개발 vpc와 운영 vpc를 구분하고 싶어
    온프레미스의 DB를 쓸꺼야. 부하가 최소화 되었으면 해
    NAT GW를 통해서 인터넷에 접근해야해
    [운영 요구사항]
    모든 구성요소가 이중화 및 부하분산이 되었으면 해
    AWS에서 제공하는 웹방화벽을 썼으면해. 3rd파티꺼 UTM 말고
    [개발 요구사항]
    개발 vpc가 직접적으로 운영vpc에 연결안되었으면 해
    AZ를 단일화 해줘

    1-2) 다음을 만족시키는걸 찾아봐
    1-2-1) 해외 사용자도 원활하게 쓸 수 있어야해
    -> CDN 서비스인 Cloudfront 사용
    1-2-2) 사용자가 event.bcdcard.com 을 요청하면 직접 AWS에 붙었으면 해
    -> Route53사용
    1-2-3) Autoscale을 쓰다보니 돈이 많이나와. 절감방안 줘
    -> Spot instance 사용
    1-2-4) 온프레미스의 DB를 데이터 분석용으로 S3에 넣을꺼야. AWS의 serverless 서비스를 들어 설명해
    -> Datalake 사용

    2. 멀티 리전 네트워크 그리기
    2-1)너는 신규 서비스를 AWS에 구성하려는 담당자야
    리전은 미국, 유럽, 한국을 사용해야 하고
    온프레미스와 직결되어야 해
    각 리전에 구성된 vpc간에도 통신이 되어야 하지
    AWS를 사용해 그림을 그려봐

    2-2) 전용회선 장애에 따른 백오프 방안을 설명해봐

  2. 검색어 기능
    문자열에서 숫자 추출

    /**
    * 유효한 검색어 목록을 추출하는 기능
    *
    * @param inputData List 입력데이터(검색어 목록)
    * @return List 유효한 검색어
    */
    public List getValidWordList(List inputData) {
    List validWordList = null;
    validWordList = new ArrayList();
    ////////////////////////여기부터 구현 (1) —————->
    String num = “1234567890”;

    for(String a : inputData) {

    boolean chk = false;
    String k = null;
    for(int i = 0 ;i < num.length() ; i++) {
    char t = num.charAt(i);
    k = a;
    if(a.indexOf(t) != -1) {
    System.out.println("탈락 숫자 : "+ k); // debug
    chk = true;
    break;
    }
    }
    if(!chk) {
    validWordList.add(k);
    }
    }
    ///////////////////////////// <————– 여기까지 구현 (1)
    return validWordList;
    }

    /**
    * 실시간 검색어 순위 1위를 계산하는 기능
    *
    * @param validWordList List 유효한 검색어
    * @return String 실시간 검색어 순위 1위
    */
    public String getSearchWord(List validWordList) {
    String searchWord = “”;
    ////////////////////////여기부터 구현 (2) —————->
    /* Map map = new HashMap();
    for(String str : validWordList) {
    String key = str.toUpperCase();
    if(map.containsKey(key)) {
    int cnt = map.get(key);
    map.put(key, ++cnt);
    } else {
    map.put(key, 1);
    }
    }
    int max = 0;

    for(Iterator iter = map.keySet().iterator(); iter.hasNext() ; ){
    String key = iter.next();
    int tmp = map.get(key);
    if(tmp > max) {
    max = tmp;
    searchWord = key;
    }

    }
    */

    List arr = null;
    arr = new ArrayList();

    String key = “”;

    int index = 0;
    for(String a : validWordList) {
    key = a.toUpperCase();

    System.out.println(“원본 : ” + a + ” 대문자 : “+ key); // debug

    if(!arr.contains(key)) {
    arr.add(key);
    }

    }

    List arr2 = null;
    arr2 = new ArrayList();

    for(int i = 0 ; i < arr.size(); i++ ) {
    int cnt = 0;

    String b = arr.get(i);
    arr2.add(b);

    for (int j = 0 ; j < validWordList.size();j++) {

    String c = validWordList.get(j);

    if(b.equals(c.toUpperCase() ) ) {
    cnt ++;
    }

    }
    arr2.add(Integer.toString(cnt));
    }

    //debug
    for(String ans : arr2) {
    System.out.println(" arr2 value : " + ans ); // debug
    }

    //여기까지 디버그

    int ansCnt =0 ;
    int bestCnt = 0 ;
    for(int k = 1 ; k bestCnt) {
    bestCnt = a;
    searchWord = arr2.get(k-1);
    }

    k++;
    }

    System.out.println(” bset cnt value : ” + bestCnt );

    ///////////////////////////// <————– 여기까지 구현 (2)
    return searchWord;
    }
    }

    =========================

    이름 변환

    public List changeNotation(List inputData) {
    List changedList = new ArrayList();
    for(String name : inputData){
    String [] splitName=name.split(” “);

    //debug
    for(String abc : splitName) {
    //System.out.println(“abc : “+abc);

    }

    String secondName = splitName[1].substring(0, 1).toUpperCase() + splitName[1].substring(1);
    // String thirdName = splitName[2].substring(0, 1).toLowerCase() + splitName[2].substring(1);

    String thirdName = splitName[2].toLowerCase();

    name=splitName[0]+” “+secondName+thirdName;
    changedList.add(name);
    }
    return changedList;
    }

    ======================

    숫자 체크

    ////////////////////////여기부터 구현 (1) —————->
    int num = (int)(Math.log10(inputData)+1);
    String input = Integer.toString(inputData);
    for(int i = 0 ; i < num ; i++) {
    checkNum += Character.getNumericValue(input.charAt(i)) * (num -i);
    }
    /////////////////////////////
    int 자릿수 = (int)(Math.log10(inputData)+1);
    int 몫 = checkNum / 10;
    int 나머지 = checkNum % 10;
    if(몫 > 0) { //두자리 이상
    if(몫 > 나머지) {
    String tmp = “”+몫 + inputData + 나머지;
    newNum = Integer.parseInt(tmp);
    } else {
    String tmp = “”+나머지 + inputData + 몫;
    newNum = Integer.parseInt(tmp);
    }
    } else { // 몫이 0 -> 한자리라는 뜻
    newNum = inputData * 10 + 나머지;
    }

    ==================

    //////////////////////여기부터 구현 (1) —————->
    String input = “”+inputData;
    String tmp = “”;
    for(int i = 0 ; i = n2) {
    num = n1 / n2;
    } else {
    num = n1 % n2;
    }
    tmp+= num;
    }
    operationResult = Integer.parseInt(tmp);
    /////////////////////////////
    String tmp = “”+operationResult;
    String ret = “”;
    for(int i = 0 ; i < tmp.length() ; i++) {
    char n = tmp.charAt(i);
    if(ret.indexOf(n) == -1) {
    ret += Character.getNumericValue(n);
    }
    }
    number = Integer.parseInt(ret);
    ///////////////////////////// <————– 여기까지 구현 (2)
    return number;

  3. 1. 2010년부터2016년까지출생아수데이터가입력으로제공된다.
    2.출생아수가가장많은연도를검색한다.
    ※ 출생아수가동일한연도는없다.

    3.직전연도에비해출생아수가가장크게감소한연도를검색한다.
    ※ 직전연도와비교한출생아수의차가같은경우는없다.

    1.입력으로제공되는데이터를이용하여“문항설명1”에서설명한출생아수가가장많은연도를검색하는기능을구현하시오.※ 출생아수가동일한연도는없다.
    2.입력으로제공되는데이터를이용하여“문항설명2”에서설명한직전연도에비해출생아수가가장크게감소한연도를검색하는기능을구현하시오.※ 직전연도와비교한출생아수의차가같은경우는없다.

    ==
    [초기입력데이터]
    2010201120122013201420152016
    출생아수470200471300484600436500435400438400406200
    ————————————————————
    [출생아수가가장많은연도]: 2012
    ————————————————————
    [출생아수가가장크게감소한연도]: 2013
    ————————————————————
    ====

    public class Statistic {

    /**
    * 출생아 수가 가장 많은 연도 검색 기능
    *
    * @param inputData int[] 입력데이터(출생아 수 데이터) ([0]:2010년, [1]:2011년, [2]:2012년, [3]:2013년, [4]:2014년, [5]:2015년, [6]:2016년)
    * @return int 출생아 수가 가장 많은 연도
    */
    public int getMaxYear(int[] inputData) {
    int maxYear = 0;
    //////////////////////// 여기부터 구현 (1) —————->

    int max = 0;
    for (int i = 0; i < inputData.length; i++) {
    if(max < inputData[i]) {
    max = inputData[i];
    maxYear = 2010 + i;
    }
    }

    /////////////////////////////

    int Decrease = inputData[1] – inputData[0];
    maxDecreaseYear = 2011;

    for (int i = 1; i temp) {
    Decrease = temp;
    maxDecreaseYear = 2010 + (i+1);
    }
    }

    ///////////////////////////// <————– 여기까지 구현 (2)
    return maxDecreaseYear;
    }

    }

  4. 1.입력으로제공되는7 ~ 9 자리숫자열을뒤에서부터3자리단위로구분하여3자리숫자로만든뒤큰순서대로정렬한다.※ 입력으로제공되는7 ~ 9 자리숫자에는숫자“0”이사용되지않는다.
    ※ 7자리또는8자리숫자인경우개수가모자란숫자뒤에1또는12를연결한다.
    [입력1] 132362289
    [뒤에서부터3자리로구분] 289 362 132
    [큰순서로정렬] 362 289 132

    [입력2] 4217836
    [뒤에서부터3자리로구분] 836 217 412 (2자리가모자라기때문에12를추가함)
    [큰순서로정렬] 836 412 217

    [입력3] 92118451
    [뒤에서부터3자리로구분] 451 118 921(1자리가모자라기때문에1을추가함)
    [큰순서로정렬] 921 451 118

    2.정렬된세수를이용하여세수의각자릿수끼리덧셈연산한결과를이용하여새로운수를만든다.
    ※ 일의자리는일의자리끼리더하고십의자리는십의자리끼리, 백의자리는백의자리끼리더한다.
    ※ 세수의각자릿수의덧셈결과가10이상이면일의자리만선택한다.
    ※ 단,백의자리연산의결과가10이되어0이선택되는경우라면새로운수생성에사용하지않는다.

    [입력1] 362 289 132
    [각자릿수끼리덧셈연산] 3+2+1=6, 6+8+3 =17, 2+9+2=13
    [결과가10이상이면일의자리숫자를선택] 6 7 3
    [새롭게생성된수] 673

    [입력2] 362 689 132
    [각자릿수끼리덧셈연산] 3+6+1=10, 6+8+3 =17, 2+9+2=13
    [결과가10이상이면일의자리숫자를선택] 0 7 3
    [새롭게생성된수] 73 -> 백의자리수연산결과0이선택된경우에는새로운수생성에사용하지않는다.

    ===
    1.입력으로제공되는7 ~ 9 자리의숫자열을이용하여“문항설명1”의세수를만들어서큰순서로정렬하는기능을구현하시오.
    2.세수를이용하여“문항설명2”의새로운수를생성하는기능을구현하시오.
    ===

    public class Calculation {

    /**
    * 세 수를 만들어서 큰 순서로 정렬하는 기능
    *
    * @param inputData String 입력데이터(숫자열)
    * @return List 정렬된 숫자열 목록
    */
    public List sortNumbers(String inputData) {
    List sortedNumbers = null;

    ////////////////////////여기부터 구현 (1) —————->

    sortedNumbers = new ArrayList();

    char[] charData = inputData.toCharArray();

    int count = 0;
    int[] intNumbers = new int[3];
    for (int i = (charData.length); i >= 0; i=i-3) {
    if(i >= 3){
    intNumbers[count++] = Integer.parseInt(inputData.substring(i-3, i));
    } else if(i==2){
    intNumbers[count++] = Integer.parseInt(inputData.substring(i-2, i)+”1″);
    } else if(i==1){
    intNumbers[count++] = Integer.parseInt(inputData.substring(i-1, i)+”12″);
    }
    }

    Arrays.sort(intNumbers);

    for (int i = intNumbers.length-1; i >= 0; i–) {
    sortedNumbers.add(intNumbers[i]+””);
    }

    ///////////////////////////// <————– 여기까지 구현 (1)
    return sortedNumbers;
    }

    /**
    * 세 수를 이용하여 새로운 수를 생성하는 기능
    *
    * @param sortedNumbers List 정렬된 숫자열 목록
    * @return int 생성된 숫자
    */
    public int generateNumber(List sortedNumbers) {
    int generatedNumber = 0;
    ////////////////////////여기부터 구현 (2) —————->

    int[] num = {0,0,0}; // [0] 1의 자리 [1] 2의 자리 [2] 3의자리
    for (int i = 0; i < sortedNumbers.size(); i++) {
    num[2] += Integer.parseInt(sortedNumbers.get(i).substring(0, 1));
    num[1] += Integer.parseInt(sortedNumbers.get(i).substring(1, 2));
    num[0] += Integer.parseInt(sortedNumbers.get(i).substring(2, 3));
    }

    for (int i = 0; i < num.length; i++) {
    num[i] %= 10;
    generatedNumber += num[i]*Math.pow(10, i);
    }

    ///////////////////////////// <————– 여기까지 구현 (2)
    return generatedNumber;
    }

    }

  5. 1.재활용품과일반쓰레기의정보를담고있는문자열이입력으로제공된다.
    ※ 재활용품종류와일반쓰레기의표현은아래표의영문자를이용한다.
    ※ 각재활용품과일반쓰레기의양은정수이며영문자앞에1자리로표현한다. ( 1부터9까지)

    2.입력으로제공되는문자열을분석하여각재활용품의양을계산한후가장많이수거된재활용품의종류를검색한다.※ 가장많이수거된재활용품의종류가여러개이면순서에상관없이모두검색한다.

    3.입력으로제공되는문자열을이용하여재활용품과일반쓰레기를합한전체에서재활용품의백분율을계산한다.※ 재활용품의백분율계산시소수점이하버림으로처리한다.

    ===
    초기입력데이터]
    [입력문자열]: 3P4B2S4W5G2P4B2S1W4G6P5S2G4B7W2P3G8S1B6P2S
    ————————————————————
    [가장많이수거된재활용품]: 플라스틱스티로폼
    ————————————————————
    [재활용품의백분율]: 81
    ————————————————————
    ====

    public class Garbage {

    /**
    * 가장 많이 수거된 재활용품의 종류 검색 기능
    *
    * @param inputData String 입력데이터(재활용품과 일반쓰레기 정보를 담고 있는 정보)
    * @return List 가장 많이 수거된 재활용품 (P:플라스틱, B:비닐, S:스티로폼, W:종이)
    */
    public List getNameList(String inputData) {
    List nameList = null;
    //////////////////////// 여기부터 구현 (1) —————->

    nameList = new ArrayList();

    char[] charData = inputData.toCharArray();
    HashMap NameMap = new HashMap();

    NameMap.put(‘P’, 0);
    NameMap.put(‘G’, 0);
    NameMap.put(‘B’, 0);
    NameMap.put(‘S’, 0);
    NameMap.put(‘W’, 0);

    for (int i = 0; i < charData.length-1; i=i+2) {
    int tempCount = (int) NameMap.get((Character)charData[i+1]) + Integer.parseInt(charData[i]+"");
    NameMap.put(charData[i+1], tempCount);
    }

    int maxCount = 0;
    for (Character c : NameMap.keySet()) {
    if(!c.equals('G') && maxCount < NameMap.get(c)) {
    maxCount = NameMap.get(c);
    }
    }

    for (Character c : NameMap.keySet()) {
    if(!c.equals('G') && maxCount == NameMap.get(c)) {
    nameList.add(c);
    }
    }

    /////////////////////////////
    char[] charData = inputData.toCharArray();
    HashMap NameMap = new HashMap();

    NameMap.put(‘P’, 0);
    NameMap.put(‘G’, 0);
    NameMap.put(‘B’, 0);
    NameMap.put(‘S’, 0);
    NameMap.put(‘W’, 0);

    for (int i = 0; i < charData.length-1; i=i+2) {
    int tempCount = (int) NameMap.get((Character)charData[i+1]) + Integer.parseInt(charData[i]+"");
    NameMap.put(charData[i+1], tempCount);
    }

    int G = 0;
    int PBSW = 0;
    for (Character c : NameMap.keySet()) {
    if(c.equals('G')) {
    G = NameMap.get(c);
    } else {
    PBSW += NameMap.get(c);
    }
    }

    ratio = (100 * PBSW) / (G + PBSW);

    ///////////////////////////// <————– 여기까지 구현 (2)
    return ratio;
    }

    }

  6. whoah this weblog is magnificent i love reading
    your articles. Keep up the good work! You understand, many people
    are hunting around for this info, you could aid
    them greatly.

  7. 118867 224826Intersting post and internet site. Very good that Google listed so i was able to get here. This internet site will go no in my bookmarks from now. 68529

  8. Hi, I do believe this is an excellent web site. I stumbledupon it 😉
    I’m going to revisit once again since I bookmarked it.

    Money and freedom is the best way to change, may you
    be rich and continue to guide other people.

  9. Wow that was odd. I just wrote an extremely long comment but after I
    clicked submit my comment didn’t show up. Grrrr…
    well I’m not writing all that over again. Anyway, just wanted to say fantastic blog!

  10. 좋은 자료 감사합니다!

    저에게 유용한 정보가 많아서 즐겨찾기 해놓았습니다

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다