DBA: Linux

RHEL3 환경의 단일 인스턴스 데이타베이스를 Oracle RAC 10g로 변환하기

by Vincent Chan

Red Hat Enterprise Linux 3 (RHEL3) 플랫폼에서 단일 인스턴스로 구성된 데이타베이스를 Oracle Real Application Clusters (RAC) 10g로 변환하는 방법을 단계별로 설명합니다.

목차
개요
1 단계: 초기 설치 작업
2 단계: 데이타베이스를 ASM으로 마이그레이션
3 단계: Cluster Ready Services (CRS) 소프트웨어의 설치
4 단계: Oracle RAC 소프트웨어의 설치
5 단계: 설치 후 작업
6 단계: Transparent Application Failover (TAF) 테스트
결론

아티클 관련 다운로드:
Oracle Database 10g Enterprise Edition and Clusterware for Linux x86
Oracle ASMlib 드라이버

실제 경험이 부족한 관리자에게는 Oracle RAC 10g를 구축하는 과정이 무척 까다롭게 여겨질 수도 있습니다. 하지만 크게 걱정할 필요는 없습니다.

이 가이드에서는 RHEL3 플랫폼 상에서 단일 인스턴스로 구성된 Oracle 10g 데이타베이스를 Oracle RAC로 변환하는 과정을 설명합니다. 이때 Oracle Automatic Storage Management (ASM)와 오라클 데이타베이스 커널에 내장된 통합 파일 시스템 및 볼륨 관리 솔루션을 이용하여 RAC 데이타베이스 스토리지를 구현함으로써, 데이타베이스 스토리지 관리 작업을 단순화하고 성능 및 안정성을 향상시키는 것이 가능합니다.

기존의 데이타베이스를 RAC로 변환하는 방법에는 여러 가지가 있습니다. 데이타베이스의 규모가 작은 경우에는, ASM에 새로운 RAC 데이타베이스를 설치하고, 기존 데이타베이스를 RAC 데이타베이스로 export/import하는 방법을 고려할 수 있습니다. 큰 규모의 데이타베이스에서는 RMAN을 이용하여 ASM으로 데이타베이스 파일을 직접 마이그레이션하는 방법이 권장됩니다. 이 문서에서는 먼저 데이타를 ASM으로 마이그레이션하고, 단일 인스턴스의 데이타베이스를 RAC로 변환하는 2단계 접근법이 사용됩니다. ASM을 처음 접하는 관리자라면, 이와 같은 마이그레이션 경로를 이용하여 (ASM과 RAC를 동시에 구현하는 대신) ASM 환경에 먼저 친숙해질 수 있도록 하는 것이 좋습니다. (Oracle ASM에 대한 보다 자세한 정보를 확인하시려면 Oracle ASM 제품 센터 또는 제품문서를 참고하시기 바랍니다.

이 가이드는 RAC 아키텍처에 대한 기본적 지식과, 오라클 데이타베이스 및 Red Hat Enterprise Linux의 운영 및 관리 경험을 보유한 사용자들을 대상으로 작성되었습니다. 보다 상세한 정보는 제품문서을 참고하십시오.


개요

RAC 클러스터는 RHEL3 (Kernel 2.4.21-27)이 설치된 두 대의 Intel x86 서버로 구성됩니다. 각 노드는 공유 스토리지를 공유하며 퍼블릭 네트워크와 사설 네트워크에 각각 연결됩니다.

이 가이드는 다음과 같은 단계로 구성됩니다:

  1. 설치 전 준비
  2. 데이타베이스를 ASM으로 마이그레이션
  3. Oracle Cluster Ready Services (CRS) 소프트웨어의 설치
  4. Oracle RAC 소프트웨어의 설치
  5. 설치 후 작업
  6. Transparent Application Failover (TAF) 테스트
별도로 명시된 경우를 제외하고, 모든 작업은 양쪽 노드 모두에서 수행되어야 합니다.

RAC로 변환하기 이전의 단일 인스턴스 데이타베이스의 구성이 다음과 같습니다:

Host Name
Instance Name
Database Name
$ORACLE_BASE
Database File Storage
salmon1 prod1 prod1 /u01/app/oracle ext3

RAC 데이타베이스 환경의 구성은 다음과 같습니다:

Host Name
Instance Name
Database Name
$ORACLE_BASE
Database File Storage
OCR & CRS Voting Disk
salmon1 prod1a prod1 /u01/app/oracle ASM Raw
salmon2 prod1b prod1 /u01/app/oracle ASM Raw

Oracle Home은 구성의 이중화를 위해 양쪽 노드에 설치됩니다. ASM과 RAC 인스턴스는 각 노드에서 동일한 Oracle Home을 공유합니다.

1 단계: 설치 전 준비

1a. 소프트웨어 패키지 버전의 점검.

필요한 패키지를 아래와 같이 설치합니다. 자세한 정보는 제품 문서에서 확인할 수 있습니다.

[root@salmon1]# rpm -qa | grep -i compat
compat-libstdc++-7.3-2.96.128
compat-gcc-c++-7.3-2.96.128
compat-libstdc++-devel-7.3-2.96.128
compat-db-4.0.14-5
compat-glibc-7.x-2.2.4.32.6
compat-slang-1.4.5-5
compat-gcc-7.3-2.96.128
compat-pwdb-0.62-3
[root@salmon1]# 
[root@salmon1]# rpm -qa | grep openmotif
openmotif-2.2.3-3.RHEL3
[root@salmon1]# 
[root@salmon1]# rpm -qa | grep -i gcc
gcc-gnat-3.2.3-42
gcc-c++-ssa-3.5ssa-0.20030801.48
compat-gcc-c++-7.3-2.96.128
libgcc-ssa-3.5ssa-0.20030801.48
gcc-3.2.3-42
gcc-g77-3.2.3-42
gcc-java-3.2.3-42
gcc-ssa-3.5ssa-0.20030801.48
gcc-g77-ssa-3.5ssa-0.20030801.48
gcc-objc-ssa-3.5ssa-0.20030801.48
libgcc-3.2.3-42
gcc-c++-3.2.3-42
gcc-objc-3.2.3-42
gcc-java-ssa-3.5ssa-0.20030801.48
compat-gcc-7.3-2.96.128

1b. 커널 매개변수의 확인.

아래와 같이 커널 매개변수를 확인합니다. 자세한 정보는 제품 문서에서 확인할 수 있습니다. .

[root@salmon1]# sysctl -a | grep shm
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 2147483648
[root@salmon1]# sysctl -a | grep sem
kernel.sem = 250        32000   100     128
[root@salmon1]# sysctl -a | grep -i ip_local
net.ipv4.ip_local_port_range = 1024     65000
[root@salmon1]# sysctl -a | grep -i file-max
fs.file-max = 65536
1c. Oracle Base 디렉토리, oracle 사용자/그룹의 생성

Node 1의 아래 정보를 이용하여, 두 번째 노드에 oracle 사용자와 oinstall, dba 그룹을 생성합니다.


[oracle@salmon1]$ hostname
salmon1.dbsconsult.com
[oracle@salmon1]$ 
[oracle@salmon1]$ id
uid=500(oracle) gid=500(dba) groups=500(dba),501(oinstall)
[oracle@salmon1]$ 
[oracle@salmon1]$ echo $ORACLE_BASE
/u01/app/oracle 
1d. oracle 사용자 환경 파일의 편집
[oracle@salmon1]$ more .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

export PATH=$PATH:$HOME/bin
export ORACLE_SID=prod1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
umask 022
1e. oracle 사용자의 shell limit 설정
[root@salmon1]# more /etc/security/limits.conf
*                soft    nproc           2047
*                hard   nproc           16384
*                soft    nofile           1024
*                hard   nofile           65536
[root@salmon1]# grep pam_limits /etc/pam.d/login
session    required     /lib/security/pam_limits.so				 
1f. public/private 네트워크의 설정

아래 정보를 이용하여 eth0 (public), eth1 (private) 네트워크 인터페이스 디바이스의 설정을 변경합니다.

[root@salmon1]# redhat-config-network
Host Name
IP Address
Type
salmon1.dbsconsult.com 192.168.0.184 Public (eth0)
salmon2.dbsconsult.com 192.168.0.185 Public (eth0)
salmon1.dbsconsult.com 10.10.10.84 Private (eth1)
salmon2.dbsconsult.com 10.10.10.85 Private (eth1)
salmon1-vip.dbsconsult.com 192.168.0.186 Virtual
salmon2-vip.dbsconsult.com 192.168.0.187 Virtual

1g. /etc/hosts 파일의 편집

127.0.0.1       localhost.localdomain            localhost
10.10.10.84     sallocal1.dbsconsult.com         sallocal1
10.10.10.85     sallocal2.dbsconsult.com         sallocal2
192.168.0.184   salmon1.dbsconsult.com           salmon1
192.168.0.185   salmon2.dbsconsult.com           salmon2
192.168.0.186   salmon1-vip.dbsconsult.com       salmon1-vip
192.168.0.187   salmon2-vip.dbsconsult.com       salmon2-vip
호스트명과 네트워크 인터페이스 디바이스의 설정을 확인합니다.
[root@salmon1]# hostname
salmon1.dbsconsult.com
[root@salmon1]# /sbin/ifconfig

1h. SSH를 이용한 user equivalence 환경 구성.

Cluster Ready Services (CRS)와 RAC의 설치 과정에서, oracle 계정으로 패스워드를 묻는 과정 없이 Oracle Universal Installer (OUI)를 복사할 수 있어야 합니다. Oracle 10g 환경에서는 rsh 대신 ssh를 사용하여 이 작업을 수행할 수 있습니다.

“User equivalence” 환경을 구성하려면, 양쪽 노드에 oracle 계정을 위한 public key와 private key를 생성해야 합니다.

[oracle@salmon1]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/oracle/.ssh/id_dsa):
Created directory '/home/oracle/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/oracle/.ssh/id_dsa.
Your public key has been saved in /home/oracle/.ssh/id_dsa.pub.
The key fingerprint is:
5d:8c:42:97:eb:42:ae:52:52:e9:59:20:2a:d3:6f:59 oracle@salmon1.dbsconsult.com
각 노드에서 연결을 테스트합니다. 아래 작업을 두 번째 실행하는 과정에서 패스워드를 묻는 프롬프트가 나타나지 않음을 확인해야 합니다.
ssh salmon1 date
ssh salmon2 date 
ssh sallocal1 date
ssh sallocal2 date
ssh salmon1.dbsconsult.com date
ssh salmon2.dbsconsult.com date
ssh sallocal1.dbsconsult.com date
ssh sallocal2.dbsconsult.com date
1i. hangcheck timer 커널 모듈의 설정.

hangcheck timer 커널 모듈은 시스템의 상태를 모니터링하고 장애가 발생한 RAC 노드를 재시작하는 역할을 담당합니다. 이 커널 모듈은 hangcheck_tick(시스템 모니터링 주기를 정의)와 hangcheck_margin(RAC노드가 재설정되기 전까지 대기하는 최대 지연 시간을 정의)의 두 가지 매개변수를 사용하여 설정됩니다.

/etc/rc.d/rc.local 파일에 아래 라인을 추가하여 hangcheck 모듈이 자동으로 로드되도록 합니다:

[root@salmon1]# grep insmod /etc/rc.d/rc.local 
insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
1j. 데이타베이스 컨트롤 파일의 재생성.

RAC로의 변환 작업을 수행하기 전에 컨트롤 파일의 아래 항목에 대해 그 크기가 적절하게 설정되었는지 확인해야 합니다. 필요한 경우, 적절한 크기로 각 항목을 설정한 뒤 데이타베이스 파일을 재생성해야 합니다.

MAXLOGFILES 
MAXLOGMEMBERS 
MAXDATAFILES 
MAXINSTANCES 
MAXLOGHISTORY 
|1k. 데이타베이스 버퍼 캐시의 크기 조정.

단일 인스턴스로 구성된 데이타베이스를 RAC로 변환하려면, 데이타베이스 버퍼 캐시에 추가 메모리 용량을 할당해 주어야 합니다. RAC 환경에서는 각 블록 버퍼 캐시 별로 Global Cache Service(GCS)에 공간이 할당 됩니다. 필요한 메모리 용량은 애플리케이션의 데이타 액세스 빈도에 따라 달라지게 됩니다.

필자는 테스트 환경에서 버퍼 캐시의 사용량이 약 8% 가량 증가하는 것을 확인한 일이 있습니다. buffer cache advisor를 이용하여 최적의 버퍼 캐시 사이즈를 결정하거나, Oracle Automatic Shared Memory Management (ASMM)로 전환하고 오라클이 캐시 사이즈를 직접 조정하도록 설정할 수 있습니다


제 2 단계: 데이타베이스를 ASM으로 마이그레이션

Oracle Cluster Synchronization Services (CSS) 데몬은 ASM 인스턴스와 데이타베이스 인스턴스 간의 동기화 작업을 수행합니다. 따라서 ASM 인스턴스를 시작하기 전에 먼저 CSS 데몬이 실행 중인지 확인해야 합니다. Oracle Database 10g를 설치 또는 업그레이드하는 과정에서 CSS는 싱글 노드 버전으로 설정되며, 시스템이 리부팅될 때마다 자동으로 재시작됩니다.

 
[root@salmon1]# ps –ef | grep ocssd.bin | wc –l 
      17
2a. ASM RPM 다운로드.

아래와 같은 ASM RPM 파일을 OTN에서 다운로드합니다:

  • oracleasm-support-2.0.0-1.i386.rpm
  • oracleasm-2.4.21-27.EL-1.0.4-2.i686.rpm (UP 커널을 위한 드라이버) or oracleasm-2.4.21-27.ELsmp-1.0.4-1.i686.rpm (SMP 커널을 위한 드라이버)
  • oracleasmlib-2.0.0-1.i386.rpm

2b. ASM RPM 설치

root 계정으로 로그인하여 ASM RPM을 설치합니다.

[root@salmon1]# rpm -i oracleasm-support-2.0.0-1.i386.rpm
[root@salmon1]# rpm -i oracleasm-2.4.21-27.EL-1.0.4-2.i686.rpm
Linking module oracleasm.o into the module path [  OK  ]
[root@salmon1]# rpm -i oracleasmlib-2.0.0-1.i386.rpm
[root@salmon1]# rpm -qa | grep oracleasm
oracleasm-2.4.21-27.EL-1.0.4-2
oracleasm-support-2.0.0-1
oracleasmlib-2.0.0-1
2c. ASM의 설정

root 계정으로 로그인하여 ASMLib을 아래와 같이 설정합니다.

[root@salmon1]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver.  The following questions will determine whether the driver is
loaded on boot and what permissions it will have.  The current values
will be shown in brackets ('[]').  Hitting  without typing an
answer will keep that current value.  Ctrl-C will abort.

Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration            [  OK  ]
Creating /dev/oracleasm mount point                        [  OK  ]
Loading module "oracleasm"                                 [  OK  ]
Mounting ASMlib driver filesystem                          [  OK  ]
Scanning system for ASM disks    
2d. ASM 디스크의 생성

root 계정으로 로그인 하여 한쪽 노드에서 ASM 디스크를 생성합니다.

[root@salmon1]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdg5
Marking disk "/dev/sdg5" as an ASM disk                      [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdg6
Marking disk "/dev/sdg6" as an ASM disk                      [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdg7
Marking disk "/dev/sdg7" as an ASM disk                      [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdg8
Marking disk "/dev/sdg8" as an ASM disk                      [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL5/dev/sdg9
Marking disk "/dev/sdg9" as an ASM disk                      [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL6 /dev/sdg10
Marking disk "/dev/sdg10" as an ASM disk                    [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL7 /dev/sdg11
Marking disk "/dev/sdg11" as an ASM disk                    [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL8 /dev/sdg12
Marking disk "/dev/sdg12" as an ASM disk                    [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL9 /dev/sdg13
Marking disk "/dev/sdg13" as an ASM disk                    [  OK  ]
[root@salmon1]# /etc/init.d/oracleasm createdisk VOL10 /dev/sdg14
Marking disk "/dev/sdg14" as an ASM disk                    [  OK  ]
다른 노드에서도 ASM 디스크가 확인 가능한지 점검합니다.
[root@salmon1]# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
VOL5
VOL6
VOL7
VOL8
VOL9
VOL10
[root@salmon1]# /etc/init.d/oracleasm scandisks
Scanning system for ASM disks                              [  OK  ]
2e. ASM init.ora 생성

첫 번째 노드에서, $ORACLE_HOME/dbs 디렉토리에 init+ASM1A.ora 파일을 아래와 같이 생성합니다.

#asm_diskgroups='DG1', ‘DG2’, ‘RECOVERYDEST’
asm_diskstring='ORCL:VOL*'
background_dump_dest=/u01/app/oracle/admin/+ASM/bdump
core_dump_dest=/u01/app/oracle/admin/+ASM/cdump
user_dump_dest=/u01/app/oracle/admin/+ASM/udump
instance_type=asm
large_pool_size=16M
remote_login_passwordfile=exclusive
+ASM1A.instance_number=1
+ASM1B.instance_number=2
2f. ASM 패스워드 파일의 생성

orapwd 유틸리티를 이용하여, 첫 번째 노드의 $ORACLE_HOME/dbs 디렉토리에 orapw+ASM1A 파일을 생성합니다.

[oracle@salmon1]$ cd $ORACLE_HOME/dbs
[oracle@salmon1]$ orapwd file=orapw+ASM1A password=sys entries=5
2g. 첫 번째 ASM 인스턴스의 생성

첫 번째 노드에 첫 번째 ASM 인스턴스를 생성합니다. 두 번째 ASM 인스턴스는, 두 번째 노드에 CRS 소프트웨어를 설치한 후 생성하게 됩니다.

[oracle@salmon1]$ export ORACLE_SID=+ASM1A
[oracle@salmon1]$ sqlplus / as sysdba

SQL*Plus: Release 10.1.0.3.0 - Production on Thu May 26 05:51:07 2005
 
Copyright (c) 1982, 2004, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  104857600 bytes
Fixed Size                777616 bytes
Variable Size             104079964 bytes
Database Buffers          0 bytes
Redo Buffers              0 bytes
ORA-15110: no diskgroups mounted
2h. ASM 인스턴스 spfile의 생성

ASM 인스턴스가 시작된 직후 spfile을 생성합니다. 이후 새롭게 생성되는 디스크 그룹은 자동으로 spfile에 추가됩니다.

SQL> create spfile from pfile;

File created.
2i. 디스크 그룹의 생성

3개의 디스크 그룹(DG1, DG2, RECOVERYDEST)을 생성합니다. DG1과 DG2는 오라클 데이타 파일과 리두 로그를 저장하는 용도로 사용됩니다. RECOVERYDEST는 플래시 복구 영역(flash recovery area)으로 활용됩니다.

SQL> create diskgroup dg1 normal redundancy
  2  failgroup fg1a disk
  3  'ORCL:VOL1','ORCL:VOL2'
  4  failgroup fg1b disk
  5  'ORCL:VOL3','ORCL:VOL4';
 
Diskgroup created.

SQL> create diskgroup dg2 normal redundancy
  2  failgroup fg2a disk
  3  'ORCL:VOL5','ORCL:VOL6'
  4  failgroup fg2b disk
  5  'ORCL:VOL7','ORCL:VOL8';
 
Diskgroup created.
 
SQL> create diskgroup recoverydest normal redundancy
  2  failgroup fgrd1 disk
  3  'ORCL:VOL9'
  4  failgroup fgrd2 disk
  5  'ORCL:VOL10';
 
Diskgroup created.

SQL> show parameter diskgroup
 
NAME                           TYPE           VALUE
------------------------------ -----------    -----------------------------
asm_diskgroups                 string         DG1, DG2, RECOVERYDEST

SQL>  select name,total_mb from v$asm_diskgroup;
 
NAME                           TOTAL_MB
-------------------------      -------------------
DG1                            36864
DG2                            36864
RECOVERYDEST                   73728
 
3 rows selected.

SQL>  select name,path,failgroup from v$asm_disk;
 
NAME         PATH               FAILGROUP
--------     ---------------    ----------------
VOL1         ORCL:VOL1          FG1A
VOL10        ORCL:VOL10         FGRD2
VOL2         ORCL:VOL2          FG1A
VOL3         ORCL:VOL3          FG1B
VOL4         ORCL:VOL4          FG1B
VOL5         ORCL:VOL5          FG2A
VOL6         ORCL:VOL6          FG2A
VOL7         ORCL:VOL7          FG2B
VOL8         ORCL:VOL8          FG2B
VOL9         ORCL:VOL9          FGRD1
 
10 rows selected.
2j. 플래시 복구 영역(flash recovery area)의 설정
	
SQL> connect sys/sys@prod1 as sysdba
Connected.
SQL> alter database disable block change tracking;

Database altered.

SQL> alter system set db_recovery_file_dest_size=72G;

System altered.

SQL> alter system set db_recovery_file_dest=’+RECOVERYDEST’;

System altered.
2k. 데이타 파일을 ASM으로 마이그레이션

데이타 파일을 ASM 디스크 그룹으로 마이그레이션하기 위해서는 반드시RMAN을 사용해야 합니다. 모든 데이타 파일은 새롭게 생성된 DG1 디스크 그룹으로 마이그레이션 됩니다. 리두 로그와 컨트롤 파일은 DG1과 DG2에 각각 생성됩니다. 실제 운영 환경에서는, 오라클 데이타 파일과 리두 로그를 각각 서로 다른 디스크와 디스크 컨트롤러를 사용하도록 구성하는 것이 권장됩니다.

SQL> connect sys/sys@prod1 as sysdba
Connected.
SQL> alter system set db_create_file_dest=’+DG1’;

System altered. 

SQL> alter system set control_files='+DG1/cf1.dbf' scope=spfile;

System altered.

SQL> shutdown immediate;

[oracle@salmon1]$ rman target /

RMAN> startup nomount;
 
Oracle instance started
 
Total System Global Area      419430400 bytes
Fixed Size                    779416 bytes
Variable Size                 128981864 bytes
Database Buffers              289406976 bytes
Redo Buffers                  262144 bytes
 
RMAN> restore controlfile from '/u02/oradata/prod1/control01.ctl';
 
Starting restore at 26-MAY-05
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=160 devtype=DISK
 
channel ORA_DISK_1: copied controlfile copy
output filename=+DG1/cf1.dbf
Finished restore at 26-MAY-05

RMAN> alter database mount;
 
database mounted
released channel: ORA_DISK_1
 
RMAN> backup as copy database format '+DG1';

Starting backup at 26-MAY-05
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=160 devtype=DISK
channel ORA_DISK_1: starting datafile copy
input datafile fno=00001 name=/u02/oradata/prod1/system01.dbf
output filename=+DG1/prod1/datafile/system.257.1 tag=TAG20050526T073442 recid=1 stamp=559294642
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:02:49
channel ORA_DISK_1: starting datafile copy
input datafile fno=00003 name=/u02/oradata/prod1/sysaux01.dbf
output filename=+DG1/prod1/datafile/sysaux.258.1 tag=TAG20050526T073442 recid=2 stamp=559294735
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:26
channel ORA_DISK_1: starting datafile copy
input datafile fno=00002 name=/u02/oradata/prod1/undotbs01.dbf
output filename=+DG1/prod1/datafile/undotbs1.259.1 tag=TAG20050526T073442 recid=3 stamp=559294750
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile fno=00004 name=/u02/oradata/prod1/users01.dbf
output filename=+DG1/prod1/datafile/users.260.1 tag=TAG20050526T073442 recid=4 stamp=559294758
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile copy
copying current controlfile
output filename=+DG1/prod1/controlfile/backup.261.1 tag=TAG20050526T073442 recid=5 stamp=559294767
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:08
Finished backup at 26-MAY-05

RMAN> switch database to copy;
 
datafile 1 switched to datafile copy "+DG1/prod1/datafile/system.257.1"
datafile 2 switched to datafile copy "+DG1/prod1/datafile/undotbs1.259.1"
datafile 3 switched to datafile copy "+DG1/prod1/datafile/sysaux.258.1"
datafile 4 switched to datafile copy "+DG1/prod1/datafile/users.260.1"

RMAN> alter database open;
 
database opened

RMAN> exit

SQL> connect sys/sys@prod1 as sysdba
Connected.
SQL> select tablespace_name, file_name from dba_data_files;
 
TABLESPACE               FILE_NAME                                          
---------------------    -----------------------------------------
USERS                    +DG1/prod1/datafile/users.260.1                             
SYSAUX                   +DG1/prod1/datafile/sysaux.258.1                          
UNDOTBS1                 +DG1/prod1/datafile/undotbs1.259.1                         
SYSTEM                   +DG1/prod1/datafile/system.257.1                          
2l. temp 테이블스페이스를 ASM으로 마이그레이션
SQL> alter tablespace temp add tempfile size 100M;
 
Tablespace altered.

SQL> select file_name from dba_temp_files;
 
FILE_NAME              
-------------------------------------                            
+DG1/prod1/tempfile/temp.264.3         
2m. 리두 로그를 ASM으로 마이그레이션

기존 리두 로그를 삭제(drop)하고, ASM 디스크 그룹(DG1, DG2)에서 다시 생성합니다.

SQL> alter system set db_create_online_log_dest_1='+DG1';
 
System altered.
 
SQL> alter system set db_create_online_log_dest_2='+DG2';
 
System altered.

SQL> select group#, member from v$logfile;
 
         GROUP#     MEMBER
---------------     ----------------------------------
             1      /u03/oradata/prod1/redo01.log
             2      /u03/oradata/prod1/redo02.log

SQL> alter database add logfile group 3 size 10M;

Database altered. 

SQL> alter system switch logfile;

System altered.

SQL> alter database drop logfile group 1; 

Database altered. 

SQL> alter database add logfile group 1 size 100M;

Database altered. 

SQL> alter database drop logfile group 2; 

Database altered. 

SQL> alter database add logfile group 2 size 100M;

Database altered. 

SQL> alter system switch logfile;

System altered.

SQL> alter database drop logfile group 3; 

Database altered.

SQL> select group#, member from v$logfile;
 
         GROUP#     MEMBER
---------------     ----------------------------------------
              1     +DG1/prod1/onlinelog/group_1.265.3  
              1     +DG2/prod1/onlinelog/group_1.257.1  
              2     +DG1/prod1/onlinelog/group_2.266.3  
              2     +DG2/prod1/onlinelog/group_2.258.1   
2n. spfile로부터 pfile 생성

데이타베이스 pfile의 복사본을 생성합니다. 이후 6 단계 “설치 후 작업”에서 pfile에 RAC 관련 매개변수를 추가하는 작업을 수행하게 됩니다.

SQL> connect sys/sys@prod1 as sysdba
Connected.
SQL> create pfile='/tmp/tmppfile.ora' from spfile;

File created.
2o. 컨트롤 파일의 추가 구성

이중화를 위해 컨트롤 파일을 추가로 구성하고자 하는 경우, (다른 파일시스템에서 작업하는 것과 동일한 방법으로) ASM 파일 상에서 컨트롤 파일을 생성할 수 있습니다.

SQL> connect sys/sys@prod1 as sysdba
Connected to an idle instance.
SQL> startup mount
ORACLE instance started.
 
Total System Global Area      419430400 bytes
Fixed Size                    779416 bytes
Variable Size                 128981864 bytes
Database Buffers              289406976 bytes
Redo Buffers                  262144 bytes
Database mounted.

SQL> alter database backup controlfile to '+DG2/cf2.dbf';
 
Database altered.
 
SQL> alter system set control_files='+DG1/cf1.dbf ','+DG2/cf2.dbf' scope=spfile;
 
System altered.
 
SQL> shutdown immediate; 
ORA-01109: database not open
 
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
 
Total System Global Area      419430400 bytes
Fixed Size                    779416 bytes
Variable Size                 128981864 bytes
Database Buffers              289406976 bytes
Redo Buffers                  262144 bytes
Database mounted.
Database opened.
SQL> select name from v$controlfile;

NAME
---------------------------------------
+DG1/cf1.dbf
+DG2/cf2.dbf
모든 데이타파일을 ASM으로 마이그레이션하는 작업을 성공적으로 마쳤다면, 기존의 데이타 파일은 삭제해도 무방합니다. 이제 ASM 환경에서 단일 인스턴스 데이타베이스를 실행하기 위한 모든 작업이 완료되었습니다!


제 3 단계: Cluster Ready Services (CRS) 소프트웨어의 설치

CRS는 공유 로우 디바이스(shared raw device) 또는 Oracle Cluster File System (OCFS) 상에 두 가지 파일—Oracle Cluster Registry (OCR) 과 Voting Disk—을 요구합니다. 이 파일은 클러스터의 모든 노드에서 액세스 가능해야 합니다. 본 문서에서는 로우 디바이스 상에 두 가지 파일을 구현하는 방법을 기준으로 설명합니다.

3a. OCR과 Voting Disk의 생성

OCR은 최소 100MB, Voting Disk는 최소 20MB의 디스크 공간을 설정해 주어야 합니다.

File
Raw Device
Disk Partition
Filename
Size (MB)
OCR /dev/raw/raw11 /dev/sde1 /u02/oradata/prod1/ocr 100
Voting Disk /dev/raw/raw12 /dev/sde2 /u02/oradata/prod1/vdisk 20
[root@salmon1]# more /etc/sysconfig/rawdevices
/dev/raw/raw11  /dev/sde1
/dev/raw/raw12  /dev/sde2
[root@salmon1]# chown oracle:dba /dev/raw/raw11
[root@salmon1]# chown oracle:dba /dev/raw/raw12
[root@salmon1]# /sbin/service rawdevices restart
Assigning devices:
           /dev/raw/raw11  -->   /dev/sde1
/dev/raw/raw11: bound to major 8, minor 65
           /dev/raw/raw12  -->   /dev/sde2
/dev/raw/raw12: bound to major 8, minor 66
done
[root@salmon1]# su - oracle
[oracle@salmon1]$ ln -s /dev/raw/raw11 /u02/oradata/prod1/ocr
[oracle@salmon1]$ ln -s /dev/raw/raw12 /u02/oradata/prod1/vdisk
3b. CRS 소프트웨어의 설치

소프트웨어를 설치하기 전에 리스너, 데이타베이스, ASM 인스턴스를 셧다운 합니다. CRS CD를 마운트하거나 OTN에서 소프트웨어를 다운로드합니다. OUI는 첫 번째 노드에서만 실행되어야 합니다. 설치 과정에서 인스톨러는 소프트웨어를 두 번째 노드에 자동으로 복사합니다.

[oracle@salmon1]$ export ORACLE_BASE=/u01/app/oracle
[oracle@salmon1]$ /mnt/cdrom/runInstaller
  1. Welcome - Click on "Next."
  2. Specify File Locations:
    1. Name: OraCr10g_home1
    2. Path: /u01/app/oracle/product/10.1.0/crs_1
  3. Language Selection - English
  4. Cluster Configuration:
    1. Cluster Name: crs
    2. Public Node Name: salmon1, Private Node Name: sallocal1
    3. Public Node Name: salmon2, Private Node Name: sallocal2
  5. Private Interconnect Enforcement:
    1. Interface Name: eth0, Subnet: 192.168.0.0, Interface Type: Public
    2. Interface Name: eth1, Subnet: 10.10.10.0, Interface Type: Private
  6. Oracle Cluster Registry:
    1. Specify OCR Location: /u02/oradata/prod1/ocr
  7. Voting Disk:
    1. Enter Voting disk filename: /u02/oradata/prod1/vdisk
  8. 첫 번째 노드의 다른 윈도우에서 root 계정으로 로그인한 뒤, /u01/app/oracle/oraInventory/orainstRoot.sh 스크립트를 실행합니다.
  9. 두 번째 노드의 다른 윈도우에서 root 계정으로 로그인한 뒤, /u01/app/oracle/oraInventory/orainstRoot.sh 스크립트를 실행합니다.
  10. orainstRoot.sh가 양쪽 노드에서 실행되고 있음을 확인하고 “Continue”를 클릭합니다.
  11. Summary - "Install"을 클릭합니다.
  12. 첫 번째 노드의 다른 윈도우에서 root 계정으로 로그인한 뒤, /u01/app/oracle/product/10.1.0/crs_1/root.sh 스크립트를 실행합니다. 이 작업이 완료되기 전까지 아래 과정을 수행하지 않고 대기합니다.
  13. 두 번째 노드의 다른 윈도우에서 root 계정으로 로그인한 뒤, /u01/app/oracle/product/10.1.0/crs_1/root.sh 스크립트를 실행합니다.
  14. root.sh가 양쪽 노드에서 실행 중임을 확인하고 “OK”를 클릭합니다.
  15. End of Installation – “Exit”를 클릭합니다.
[oracle@salmon1]$ /u01/app/oracle/product/10.1.0/crs_1/bin/olsnodes -n
salmon1 1
salmon2 2
[oracle@salmon1]$ ps -ef | egrep "css|crs|evm"

제 4 단계: Oracle RAC 소프트웨어의 설치

4a. oracle 사용자 환경 파일의 편집

노드 1에서 다음과 같이 설정합니다: ORACLE_SID=prod1a

노드 2에서 다음과 같이 설정합니다: ORACLE_SID=prod1b.

[oracle@salmon1]$ more .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

export PATH=$PATH:$HOME/bin
export ORACLE_SID=prod1a
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
export ORA_CRS_HOME=$ORACLE_BASE/product/10.1.0/crs_1 
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
umask 022
4b. RAC 소프트웨어의 설치

Oracle Database 10g Enterprise Edition CD를 마운트하거나, OTN에서 소프트웨어를 다운로드합니다. OUI는 첫 번째 노드에서만 실행하도록 합니다. 설치 과정에서 인스톨러는 두 번째 노드에 소프트웨어를 자동으로 복사합니다. .

[oracle@salmon1]$ . ~/.bash_profile
[oracle@salmon1]$ /mnt/cdrom/runInstaller
  1. Welcome - "Next"를 클릭합니다.
  2. Specify File Locations:
    1. Name: OraDB10g_home1
    2. Path: /u01/app/oracle/product/10.1.0/db_1
  3. Specify Hardware Cluster Installation Mode:
    1. "Cluster Installation" 선택.
    2. "Select All" 선택.
  4. Select Installation Type:
    1. "Enterprise Edition" 선택.
  5. Product-specific Prerequisite Checks:
    1. 다음 단계로 진행하기 전에 모든 점검 작업이 성공적으로 완료되었는지 확인합니다 (단, openmotif-2.1.30-11 warning 메시지는 무시합니다).
  6. Select Database Configuration:
    1. a. "Do not create a starter database" 선택.
  7. Summary - "Install"을 클릭합니다.
  8. 첫 번째 노드의 다른 윈도우에서 root 계정으로 로그인한 뒤, /u01/app/oracle/product/10.1.0/db_1/root.sh 스크립트를 실행합니다. VIP 설정 작업이 완료되기 전까지 두 번째 노드에서 root.sh을 실행하지 않도록 주의합니다.
  9. VIPCA Welcome - "Next"를 클릭합니다.
  10. VIP Configuration Assistance, 1 of 2: Network Interfaces:
    1. "eth0" 선택.
  11. VIP Configuration Assistance, 2 of 2: Virtual IPs for cluster nodes:
    1. Node Name: salmon1
    2. IP Alias Name: salmon1-vip
    3. IP address: 192.168.0.186
    4. Subnet Mask: 255.255.255.0
    5. Node Name: salmon2
    6. IP Alias Name: salmon2-vip
    7. IP address: 192.168.0.187
    8. Subnet Mask: 255.255.255.0
  12. Summary- "Finish”를 클릭합니다.
  13. Configuration Assistant Progress Dialog - "OK"를 클릭합니다.
  14. Configuration Results - "Exit”를 클릭합니다.
  15. 두 번째 노드의 다른 윈도우에서 root 계정으로 로그인한 뒤, /u01/app/oracle/product/10.1.0/db_1/root.sh 스크립트를 실행합니다.
  16. 양쪽 노드의 root.sh 스크립트가 모두 실행완료 된 후, “OK”를 클릭합니다.
  17. End of Installation - "Exit"를 클릭합니다.
4c. Oracle Listener의 설정

Network Configuration Assistant (NETCA)는 두 노드 중 하나에서만 실행되어야 합니다. 구성 작업이 완료되고 나면, NETCA는 양쪽 노드에서 오라클 리스너를 자동으로 시작합니다.

[oracle@salmon1]$ netca 
  1. Oracle Net Configuration Assistant: Real Application Clusters, Configuration:
    1. "Cluster configuration" 선택.
  2. Oracle Net Configuration Assistant: TOPSNodes:
    1. "Select all nodes" 선택.
  3. Oracle Net Configuration Assistant: Welcome:
    1. "Listener configuration"
  4. Oracle Net Configuration Assistant: Listener Configuration, Listener:
    1. "Add" 선택.
  5. Oracle Net Configuration Assistant: Listener Configuration, Listener Name:
    1. Listener Name: LISTENER
  6. Oracle Net Configuration Assistant: Listener Configuration, Select Protocols
    1. Selected Protocols: TCP
  7. Oracle Net Configuration Assistant: Listener Configuration, TCP/IP Protocol:
    1. "Use the standard port number of 1521" 선택.
  8. Oracle Net Configuration Assistant: Listener Configuration, More Listeners?
    1. "No" 선택.
  9. Oracle Net Configuration Assistant: Listener Configuration Done:
    1. "Next" 선택.
  10. Oracle Net Configuration Assistant: Welcome
    1. "Naming Methods configuration" 선택
    2. "Next" 선택.
  11. Oracle Net Configuration Assistant: Naming Methods Configuration, Select Naming:
    1. "Local Naming" 선택.
  12. Oracle Net Configuration Assistant: Naming Methods Configuration Done:
    1. "Next" 선택.
  13. Oracle Net Configuration Assistant: Welcome
    1. "Finish" 선택.
4d. 서비스의 상태 확인

노드 1에서 다음과 같이 확인합니다:

[oracle@salmon1]$ srvctl status nodeapps -n salmon1
VIP is running on node: salmon1
GSD is running on node: salmon1
Listener is running on node: salmon1
ONS daemon is running on node: salmon1
노드 2에서 다음과 같이 확인합니다:
[oracle@salmon2]$ srvctl status nodeapps -n salmon2
VIP is running on node: salmon2
GSD is running on node: salmon2
Listener is running on node: salmon2
ONS daemon is running on node: salmon2
4e. listener.ora 파일

노드 1에서 다음과 같이 확인합니다:

[oracle@salmon1]$ more $ORACLE_HOME/network/admin/listener.ora

LISTENER_SALMON1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
      )
      (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.184)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER_SALMON1 =
  (SID_LIST =
      (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = /u01/app/oracle/product/10.1.0/db_1)
          (PROGRAM = extproc)
      )
  )
노드 2에서 다음과 같이 확인합니다:
[oracle@salmon2]$ more $ORACLE_HOME/network/admin/listener.ora

LISTENER_SALMON2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
      )
      (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.185)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER_SALMON2 =
  (SID_LIST =
      (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = /u01/app/oracle/product/10.1.0/db_1)
          (PROGRAM = extproc)
      )
  )
4f. tnsnames.ora 파일

양쪽 노드에서 다음과 같이 확인합니다:

[oracle@salmon1]$ more $ORACLE_HOME/network/admin/tnsnames.ora
LISTENERS_PROD1 =
  (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
  )

PROD1 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
      (LOAD_BALANCE = yes)
      (CONNECT_DATA =
          (SERVICE_NAME = PROD1)
          (FAILOVER_MODE =
              (TYPE = SELECT)
              (METHOD = BASIC)
              (RETRIES = 200)
              (DELAY = 5)
          )
      )
  )
PROD1A =
(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = salmon1-vip)(PORT = 1521))
    (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = PROD1)
        (INSTANCE_NAME = PROD1A)
    )
)

PROD1B =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = salmon2-vip)(PORT = 1521))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = PROD1)
          (INSTANCE_NAME = PROD1B)
      )
  )

제 5 단계: 설치 후 작업

5a. 첫 번째 노드의 ASM 인스턴스 파일 위치 변경\

ASM 인스턴스 패스워드 파일과 spfile+ASM1A.ora 파일을 새로운 Oracle Home으로 복사합니다.

[oracle@salmon1]$ cp /u01/app/oracle/product/10.1.0/dbs/orapw+ASM1A 
/u01/app/oracle/product/10.1.0/db_1/dbs
[oracle@salmon1]$ cp /u01/app/oracle/product/10.1.0/dbs/spfile+ASM1A.ora 
/u01/app/oracle/product/10.1.0/db_1/dbs 
5b. 두 번째 ASM 인스턴스를 위한 init.ora 파일 생성

두 번째 노드에서, $ORACLE_HOME/dbs 디렉토리에 init+ASM1B.ora 파일을 생성합니다.

asm_diskgroups='DG1', ‘DG2’, ‘RECOVERYDEST’
asm_diskstring='ORCL:VOL*'
background_dump_dest=/u01/app/oracle/admin/+ASM/bdump
core_dump_dest=/u01/app/oracle/admin/+ASM/cdump
user_dump_dest=/u01/app/oracle/admin/+ASM/udump
instance_type=asm
large_pool_size=16M
remote_login_passwordfile=exclusive
+ASM1A.instance_number=1
+ASM1B.instance_number=2
5c. 두 번째 ASM 인스턴스를 위한 패스워드 파일 생성.

유틸리티를 이용하여, 두 번째 노드의 $ORACLE_HOME/dbs 디렉토리에 orapw+ASM1B 파일을 생성합니다.

5d. 두 번째 ASM 인스턴스의 생성.

두 번째 노드에 두 번째 ASM 인스턴스를 생성합니다.

[oracle@salmon2]$ export ORACLE_SID=+ASM1B
[oracle@salmon2]$ sqlplus / as sysdba

SQL*Plus: Release 10.1.0.3.0 - Production on Thu May 26 18:43:14 2005
 
Copyright (c) 1982, 2004, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  104857600 bytes
Fixed Size                777616 bytes
Variable Size             104079964 bytes
Database Buffers          0 bytes
Redo Buffers              0 bytes
ASM diskgroups mounted
SQL> create spfile from pfile;

File created.

SQL> shutdown immediate;
5e. CRS에 ASM 인스턴스 등록.

가용성 향상을 위해, ASM 인스턴스를 CRS 프레임워크에 등록시킵니다. 등록이 완료되면, CRS는 장애가 발생한 인스턴스를 감지하고 자동으로 인스턴스를 재시작합니다. 서버가 리부팅되는 경우에도, CRS는 인스턴스를 자동으로 시작합니다.

노드 1에서 다음과 같이 작업합니다:


[oracle@salmon1]$ srvctl add asm -n salmon1 -i +ASM1A -o /u01/app/oracle/product/10.1.0/db_1
[oracle@salmon1]$ srvctl start asm -n salmon1 
[oracle@salmon1]$ srvctl status asm -n salmon1 
ASM instance +ASM1A is running on node salmon1. 
노드 2에서 다음과 같이 작업합니다:
[oracle@salmon2]$ srvctl add asm -n salmon2 -i +ASM1B -o /u01/app/oracle/product/10.1.0/db_1
[oracle@salmon2]$ srvctl start asm -n salmon2 
[oracle@salmon2]$ srvctl status asm -n salmon2 
ASM instance +ASM1B is running on node salmon2.  

[oracle@salmon1]$ ps -ef | grep dbw | grep -v grep
oracle    8918     1  0   May 26 ?       00:00:01 asm_dbw0_+ASM1A
[oracle@salmon1]$ kill -9 8918
[oracle@salmon1]$ srvctl status asm –n salmon1
ASM instance +ASM1A is not running on node salmon1.
[oracle@salmon1]$ ps -ef | grep dbw | grep -v grep
[oracle@salmon1]$ srvctl status asm –n salmon1
ASM instance +ASM1A is running on node salmon1.
[oracle@salmon1]$ ps -ef | grep dbw | grep -v grep
oracle    8920     1  0   May 26 ?       00:00:01 asm_dbw0_+ASM1A
5f. 두 개의 RAC 인스턴스를 위한 패스워드 생성

orapwd 유틸리티를 이용하여 첫 번째 노드의 $ORACLE_HOME/dbs 디렉토리에 orapwprod1a 파일을, 두 번째 노드의 $ORACLE_HOME/dbs 디렉토리에 orapwprod1b 파일을 생성합니다.

5g. pfile에 RAC 관련 매개변수 추가

2n 단계에서 생성된 pfile을 편집하여, 아래와 같이 매개변수를 추가합니다

*.cluster_database_instances=2
*.cluster_database=true
*.remote_listener='LISTENERS_PROD1’
prod1a.thread=1
prod1a.instance_number=1
prod1a.undo_tablespace='UNDOTBS1'
prod1b.thread=2
prod1b.instance_number=2
prod1b.undo_tablespace='UNDOTBS2'
5h. 두 개의 RAC 인스턴스를 위한 init.ora 파일 수정

노드 1에서 다음과 같이 작업합니다:

[oracle@salmon1]$ more $ORACLE_HOME/dbs/initprod1a.ora
spfile='+DG1/spfileprod1.ora'
노드 2에서 다음과 같이 작업합니다:
[oracle@salmon2]$ more $ORACLE_HOME/dbs/initprod1b.ora
spfile='+DG1/spfileprod1.ora'
5i. 데이타베이스 spfile을 ASM으로 마이그레이션.
SQL> !echo $ORACLE_SID
prod1a

SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup pfile=/tmp/tmppfile.ora
ORACLE instance started.

Total System Global Area     419430400 bytes
Fixed Size                   779416 bytes
Variable Size                128981864 bytes
Database Buffers             289406976 bytes
Redo Buffers                 262144 bytes
Database mounted.
Database opened.

SQL> create spfile='+DG1/spfileprod1.ora' from pfile='/tmp/tmppfile.ora';

File created.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
 
Total System Global Area     419430400 bytes
Fixed Size                   779416 bytes
Variable Size                128981864 bytes
Database Buffers             289406976 bytes
Redo Buffers                 262144 bytes
Database mounted.
Database opened.
SQL> show parameter spfile
 
NAME                       TYPE             VALUE
----------------------     ------------     ---------------------------
spfile                     string           +DG1/spfileprod1.ora
5j. RAC Data Dictionary View의 생성

첫 번째 RAC 인스턴스에서 RAC 데이타 딕셔너리 뷰를 생성합니다.

SQL> !echo $ORACLE_SID
prod1a

SQL> spool /tmp/catclust.log
SQL> @$ORACLE_HOME/rdbms/admin/catclust
...
...
...
SQL> spool off
SQL> shutdown immediate;
5k. RAC 인스턴스를 CRS에 등록

노드 1에서 다음과 같이 작업합니다:

[oracle@salmon1]$ srvctl add database -d prod1 -o $ORACLE_HOME 
[oracle@salmon1]$ srvctl add instance -d prod1 -i prod1a -n salmon1
[oracle@salmon1]$ srvctl add instance -d prod1 -i prod1b -n salmon2
[oracle@salmon1]$ srvctl start instance -d prod1 -i prod1a
5l. 두 번째 RAC 인스턴스를 위한 리두 로그 생성
SQL> connect sys/sys@prod1a as sysdba
Connected.
SQL> alter database add logfile thread 2 group 3 size 100M;
SQL> alter database add logfile thread 2 group 4 size 100M;
SQL> select group#, member from v$logfile;
 
         GROUP#    MEMBER
---------------    ----------------------------------------
              1    +DG1/prod1/onlinelog/group_1.265.3  
              1    +DG2/prod1/onlinelog/group_1.257.1  
              2    +DG1/prod1/onlinelog/group_2.266.3  
              2    +DG2/prod1/onlinelog/group_2.258.1   
              3    +DG1/prod1/onlinelog/group_3.268.1
              3    +DG2/prod1/onlinelog/group_3.259.1
              4    +DG1/prod1/onlinelog/group_4.269.1
              4    +DG2/prod1/onlinelog/group_4.260.1

8 rows selected.

SQL> alter database enable thread 2;

Database altered.
5m. 두 번째 RAC 인스턴스를 위한 undo 테이블스페이스 생성
SQL> create undo tablespace UNDOTBS2 datafile size 200M;


SQL> select tablespace_name, file_name from dba_data_files
     2    where tablespace_name=’UNDOTBS2’;
 
TABLESPACE               FILE_NAME                                          
---------------------    --------------------------------------
UNDOTBS2                 +DG1/prod1/datafile/undotbs2.270.1   
5n. 두 번째 RAC 인스턴스의 실행
[oracle@salmon1]$ srvctl start instance -d prod1 -i prod1b
[oracle@salmon1]$ crs_stat -t
Name                 Type            Target     State      Host        
-----------------------------------------------------------------------
ora....1a.inst       application     ONLINE     ONLINE     salmon1 
ora....1b.inst       application     ONLINE     ONLINE     salmon2
ora.prod1.db         application     ONLINE     ONLINE     salmon1
ora....M1A.asm       application     ONLINE     ONLINE     salmon1
ora....M1B.asm       application     ONLINE     ONLINE     salmon2
ora....N1.lsnr       application     ONLINE     ONLINE     salmon1
ora....on1.gsd       application     ONLINE     ONLINE     salmon1
ora....on1.ons       application     ONLINE     ONLINE     salmon1
ora....on1.vip       application     ONLINE     ONLINE     salmon1
ora....N2.lsnr       application     ONLINE     ONLINE     salmon2 
ora....on2.gsd       application     ONLINE     ONLINE     salmon2
ora....on2.ons       application     ONLINE     ONLINE     salmon2
ora....on2.vip       application     ONLINE     ONLINE     salmon2
[oracle@salmon1]$ srvctl status database -d prod1
Instance prod1a is running on node salmon1
Instance prod1b is running on node salmon2
[oracle@salmon1]$ srvctl stop database -d prod1
[oracle@salmon1]$ srvctl start database -d prod1
[oracle@salmon1]$ sqlplus system/system@prod1

SQL*Plus: Release 10.1.0.3.0 - Production on Fri May 27 05:53:21 2005
 
Copyright (c) 1982, 2004, Oracle.  All rights reserved.
 

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options

SQL> select instance_number instance#, instance_name, host_name, status 
     2    from gv$instance;
   
        INSTANCE#   INSTANCE_NAME     HOST_NAME                 STATUS
-----------------   ----------------- ------------------------- -----------
                1   prod1a            salmon1.dbsconsult.com    OPEN
                2   prod1b            salmon2.dbsconsult.com    OPEN
이것으로 단일 인스턴스 환경의 데이타베이스를 RAC로 변환하는 작업을 모두 완료하였습니다!


제 6 단계: Transparent Application Failover (TAF) 테스트

Oracle TAF의 페일오버 메커니즘을 이용하면, 장애가 발생한 데이타베이스의 연결을 클러스터 내의 다른 노드로 자동 전환할 수 있습니다. 이 페일오버 작업은 사용자의 관점에서 투명하게 수행됩니다. 오라클은 페일오버된 인스턴스의 쿼리를 재실행하고 그 결과를 사용자에게 보여줍니다.

TAF 옵션의 페일오버 메커니즘을 테스트하기 위해, 두 개의 데이타베이스 세션을 연결한 후 아래와 같이 작업을 수행합니다:

6a. PROD1 서비스를 이용한 첫 번째 세션 연결

failover_type와 failover_mode가 ‘NONE으로 확인되는 경우, PROD1 서비스가 tnsnames.ora 파일에 올바르게 설정되어 있는지 점검합니다.

SQL> connect system/system@prod1 as sysdba
Connected.

SQL> select instance_number instance#, instance_name, host_name, status 
     2    from v$instance;
   
         INSTANCE#   INSTANCE_NAME   HOST_NAME                 STATUS                                         
 -----------------   --------------  ------------------------- ----------------
                 1   prod1a          salmon1.dbsconsult.com    OPEN

SQL> select failover_type, failover_method, failed_over 
     2    from v$session where username='SYSTEM';
 
FAILOVER_TYPE              FAILOVER_MODE        FAILED_OVER
-------------------------  -------------------- ----------------------
SELECT                     BASIC                NO
6b. 다른 세션이 사용 중인 인스턴스를 셧다운

sys 사용자 계정으로 prod1a 인스턴스에 연결한 후, 인스턴스를 셧다운합니다.

SQL> connect sys/sys@prod1a as sysdba
Connected.

SQL> select instance_number instance#, instance_name, host_name, status 
     2    from v$instance;
   
        INSTANCE#   INSTANCE_NAME      HOST_NAME                 STATUS                                         
-----------------   ----------------   ------------------------  ----------------
                1   prod1a             salmon1.dbsconsult.com    OPEN

SQL> shutdown abort;    
ORACLE instance shut down.
6c. 세션 페일오버 결과 확인

6a 단계에서 설정한 세션을 통해, 아래 쿼리를 수행하고 세션이 다른 인스턴스로 성공적으로 페일오버 되었는지 확인합니다.

SQL> select instance_number instance#, instance_name, host_name, status 
     2    from v$instance;
   
        INSTANCE#   INSTANCE_NAME      HOST_NAME                 STATUS                                         
-----------------   ----------------   ------------------------  ----------------
                2   prod1b             salmon2.dbsconsult.com    OPEN

SQL> select failover_type, failover_method, failed_over 
     2    from v$session where username='SYSTEM';
 
FAILOVER_TYPE      FAILOVER_MODE   FAILED_OVER
-----------------  --------------  ----------------------
SELECT             BASIC            YES


결론

RAC 아키텍처를 제대로 이해하고 충분한 계획을 수립한다면, RAC를 구성하는 작업도 그리 복잡한 것은 아닙니다. ASM과 RAC 테크놀로지를 조합함으로써 한층 뛰어난 가용성, 확장성, 비즈니스 연속성을 구현할 수 있습니다. 이 문서가 단일 인스턴스 데이타베이스의 RAC 변환을 위한 명확하고 간결한 가이드로써 활용될 수 있기를 바랍니다.


Vincent Chan (vkchan99@yahoo.com)은 MSD Inc.의 선임 컨설턴트입니다. Vincent는 Oracle Certified Master 자격증을 소유한 DBA로서, 9년에 걸쳐 다양한 클라이언트를 위해 오라클 솔루션을 설계하고 구축한 경험을 보유하고 있습니다. .
E-mail this page
Printer View Printer View