오라클(Oracle) 19c - Single to RAC로 변경(Converting)

Last Updated on 11월 21, 2020 by 태랑(정현호)

수년전에 작성한 오라클 10gR2 Single DB에서 RAC로 변경글에 대한 업데이트 글 입니다.

환경: Oracle Linux 7.8 , Oracle/Grid 버전 19.3
Hostname : acs(1번 노드)  , acs2(2번 노드)
사용한 /etc/host
   public : acs , acs2
   vip : acs-vip  , acs2-vip
   scan : acs-cluster-scan
   interconnect : acs-priv , acs2-priv
디렉토리 구성 현항 
  $ORACLE_BASE : /orace/base
  $ORACLE_HOME : /oracle/db
  $GRID_HOME : /oracle/grid


[oracle]$ lsnrctl status
<중략>
Services Summary…
Service "TESTDB" has 1 instance(s).
Instance "TESTDB", status READY, has 1 handler(s) for this service…
Service "TESTDBXDB" has 1 instance(s).
Instance "TESTDB", status READY, has 1 handler(s) for this service…
The command completed successfully

[oracle]$ ps -ef| grep pmon
oracle 6198 1 0 22:59 ? 00:00:00 ora_pmon_TESTDB





테스트 시나리오


acs 호스트에 single 19c db를 사용하는 환경에서 서버를 추가하여 rac로 변경 하는 내용 입니다


/oracle/db  에 oracle sw 가 설치 되어있으며
/oracle/data 에 datafile 에 위치해 있고, 1521 포트를 사용 중입니다
ORACLE_SID 는 TESTDB 로 되어 있습니다.

서버가 추가 된 후 Interconnect 연결 및 공유 볼륨은 추가가 완료 된 상황에서의 진행입니다.





/etc/hosts 에 내용 추가(1,2번 서버 모두)


[root]# vi /etc/hosts

192.168.56.51 acs

to

192.168.56.51 acs
192.168.56.52 acs2
192.168.56.53 acs-vip
192.168.56.54 acs2-vip
192.168.56.55 acs-cluster-scan

100.100.100.1 acs-priv
100.100.100.2 acs2-priv





oracle asmlib 구성


추가된 디스크에 대한 파티션 작업을 진행 합니다.

  * 테스트 환경임으로 1개의 디스크만 사용 합니다
  * 추가된 공유 디스크는 /dev/sdd 임

# 1번이나 2번 서버중 한곳에서 root 로 수행
[root]# fdisk /dev/sdd
Command (m for help): n
Partition type: P
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p

Partition number (1-4, default 1): [엔터]
First sector (2048-143305919, default 2048): [엔터]
Last sector, +sectors or +size{K,M,G} (2048-143305919, default 143305919): [엔터]

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# 모든 노드에서 수행
[root]# partprobe 


그다음 asmlib 패키지를 설치합니다.
Oracle Linux 기준이고 Redhat Kernel은 kmod-oracleasm 가 필요할수 있습니다.


# 1,2 번 서버 모두, root 유저로
[root]# yum install oracleasm-support oracleasmlib
[root]# rpm -Uvh https://download.oracle.com/otn_software/asmlib/oracleasmlib-2.0.12-1.el7.x86_64.rpm

[root]# /usr/sbin/oracleasm configure -i
<중략>
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
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done

[root]# oracleasm init


# 1번서버에서 수행

[root]# oracleasm createdisk ORADISK1 /dev/sdd1


# 2번 서버에서 수행
[root]# # oracleasm scandisks

# 추가된 디스크 확인
[root]# oracleasm querydisk -p ORADISK1
Disk "ORADISK1" is a valid ASM disk
/dev/sdd1: LABEL="ORADISK1" TYPE="oracleasm"




OS 설정 내역 변경


# /etc/sysctl.conf 에 1,2번 노드 모두 내용 추가(있다면 생략)
net.core.rmem_max=4194304
net.core.rmem_default=262144
net.core.wmem_max=1048576
net.core.wmem_default=262144
fs.aio-max-nr = 1048576
fs.file-max = 6815744

# 적용
[root]# sysctl -p


# /etc/security/limits.conf 에 내용추가
# 1,2번 노드 모두 수행(있다면 생략)
oracle hard nofile 65536
oracle hard nproc 16384
oracle soft nproc 2047
oracle soft stack 10240


# NOZEROCONF=yes 추가, 1,2번 모두
[root]# vi /etc/sysconfig/network

NOZEROCONF=yes
 => 내용 추가


# firewalld disable, 1,2번 노드 모두
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

systemctl stop iptables
systemctl disable iptables
systemctl status iptables


# avahi-daemon disable, 1,2번 노드 모두

systemctl stop avahi-daemon
systemctl disable avahi-daemon
systemctl status avahi-daemon


# Transparent Huge Pages 기능 비활성화 , 1,2번 노드 모두
내용이 긴 관계로 아래 포스트 참조하세요



# /dev/shm 사이즈 변경(1,2번 노드 모두, 있다면 생략)
[root]# mount -t tmpfs shmfs -o size=4g /dev/shm

/dev/fstab size 내용 추가
tmpfs /dev/shm tmpfs size=4g 0


# 2번 서버에서 oracle 유저 .bash_profile 생성
1번 서버의 .bash_profile 을 참조하여 생성
ORACLE_SID는 미리 TESTDB2 로 수정





19c GRID 설치


* Node1 에서 oracle or grid 유저로 진행
* 테스트 진행 시에는 oracle 유저만 사용했습니다.
* xserver 는 미리 구성되어 X11 Forwarding 은 가능한 환경 입니다.
* 이미지는 필요한 부분만 설명 하겠습니다.


# cvuqdisk 설치 root 수행
cd /oracle/grid/cv/rpm
export CVUQDISK_GRP=dba
rpm -ivh cvuqdisk-1.0.10-1.rpm
scp cvuqdisk-1.0.10-1.rpm acs2:~

# node 2에서 실행
export CVUQDISK_GRP=dba
rpm -ivh cvuqdisk-1.0.10-1.rpm


[oracle]$ cd /oracle
[oracle]$ unzip LINUX.X64_193000_grid_home.zip -d grid
[oracle]$ cd /orace/grid
[oracle]$ ./gridSetup.sh























하단의 Setup를 통해 노드 1,2 간에 ssh 인증을 설정 한 후 다음(Next) 진행 합니다.













19c 부터 GIMR이 다시 선택으로 변경 되어, 테스트시 선택하지 않겠습니다.













Diskgroup : DATA  , Redundancy : External  로 설정 하고 진행 하겠습니다.


















































* $GRID_HOME/root.sh 스크립트를 1,2번 순으로 root  유저로 수행 합니다.
* 1번에서 수행하기 전에 기존 Single DB Home 에서 구동 중인 listener는 종료합니다
* 리스너를 종료해도 connection 된 세션이 끊기지는 않습니다.
* root.sh 가 완료 되어 GRID_HOME의 listener 가 구동되면 해당 listener 로 접속이 가능 해집니다.


[oracle]$ lsnrctl stop
 <- 기존 listener 중지



# root.sh 수행 - 1,2번 노드 순으로 root 로 수행
[root]# cd /oracle/grid
[root]# ./root.sh


1번 노드의 root.sh 가 완료 되었다면 regiser를 한번 실행 합니다.
[oracle]$ sqlplus / as sysdba

SQL> alter system register;



# 1,2번 .bash_profile 추가
export GRID_HOME=/oracle/grid
export PATH=$PATH:$GRID_HOME/bin


여기 까지 GRID 가 설치가 완료 되었습니다.




OH Copy 및 oraInventory update


2번 서버로 사용중인 ORACLE_HOME을 복사 후 RAC_ON 으로 변경 할 것입니다

# 1번 서버에서 root 로 수행
cd /oracle
tar -cvfzp db.tar.gz db
scp db.tar.gz acs2:~

# 2번 서버에서 root 로 수행
mv db.tar.gz /oracle
tar zxvf db.tar.gz

# 2번 서버에서 oracle 유저로 수행
# 2번 서버 부터 rac on 으로 변경 합니다
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk rac_on
make -f ins_rdbms.mk ioracle


# 1,2 번 노드의 oraInventory 를 업데이트 합니다.

# Attach Home - 2번
su - oracle
cd $ORACLE_HOME/oui/bin
./runInstaller -attachHome -local ORACLE_HOME=/oracle/db CLUSTER_NODES='acs, acs2' LOCAL_NODE=acs2 ORACLE_HOME_NAME="OraDB19Home1"

# Update Home - 1번
su - oracle
cd $ORACLE_HOME/oui/bin
./runInstaller -updateNodeList CLUSTER_NODES=acs,acs2 ORACLE_HOME=/oracle/db -local





DB 변경 준비


# 먼저 파라미터를 변경하기 위해서 init 파일을 생성 후 수정 합니다.

SQL> create pfile from spfile;
SQL> exit;

cd $ORACLE_HOME/dbs
cp initTESTDB.ora initTESTDB1.ora
vi initTESTDB1.ora

# 아래 내용은 기본적인 필요한 내용만 포함되어 있습니다.
*.audit_file_dest='/oracle/base/admin/TESTDB/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='+DATA/TESTDB/controlfile/control01.ctl'
TESTDB1.instance_number=1
TESTDB2.instance_number=2
TESTDB1.thread=1
TESTDB2.thread=2
TESTDB1.undo_tablespace='UNDOTBS1'
TESTDB2.undo_tablespace='UNDOTBS2'
*.db_block_size=8192
*.db_name='TESTDB'
*.diagnostic_dest='/oracle/base'
*.cluster_database=true
*.open_cursors=300
*.pga_aggregate_target=500m
*.processes=320
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1100m
*.remote_listener='acs-cluster-scan:1521'

생성한 initTESTDB1.ora 파일의 내용을 그대로 2번 서버에도 생성 합니다.
파일명은 initTESTDB2.ora

# 2번 서버의 adump 디렉토리 생성
su - oracle
mkdir -p /oracle/base/admin/TESTDB/adump





DB RAC 로 변경 


*  여기서 부터 DB 서비스의 다운타임 입니다.


# 먼저 DB를 종료 후 rac on 를 합니다.
su - oracle
sqlplus / as sysdba
SQL> shutdown immediate;
SQL> exit;


cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk rac_on
make -f ins_rdbms.mk ioracle


$ export ORACLE_SID=TESTDB1

# 1,2 서버 .bash_profile 수정
아래와 같이 각 노드에 맞게 미리 SID를 수정
export ORACLE_SID=TESTDB1
export ORACLE_SID=TESTDB2


# orapw 파일 복사
[oracle]$ cp orapwTESTDB orapwTESTDB1
[oracle]$ scp orapwTESTDB acs2:/oracle/db/dbs


# Datafile 을 Filesystem에서 ASM으로 위치를 변경 합니다.

[oracle]$ rman target /

RMAN> startup nomount
RMAN> restore controlfile from '/oracle/data/TESTDB/control01.ctl';
   * 파일시스템에 위치한 control file 이름을 경로와 함께 지정

Starting restore at 09-OCT-20
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=142 instance=TESTDB1 device type=DISK

channel ORA_DISK_1: copied control file copy
output file name=+DATA/TESTDB/controlfile/control01.ctl
Finished restore at 09-OCT-20


RMAN> alter database mount;
RMAN> backup as copy database format '+DATA';

Starting backup at 09-OCT-20
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=142 instance=TESTDB1 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/oracle/data/TESTDB/system01.dbf
output file name=+DATA/TESTDB/DATAFILE/system.259.1053320299 tag=TAG20201009T045819 RECID=1 STAMP=1053320301
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/oracle/data/TESTDB/sysaux01.dbf
output file name=+DATA/TESTDB/DATAFILE/sysaux.260.1053320303 tag=TAG20201009T045819 RECID=2 STAMP=1053320303
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/oracle/data/TESTDB/undotbs01.dbf
output file name=+DATA/TESTDB/DATAFILE/undotbs1.261.1053320305 tag=TAG20201009T045819 RECID=3 STAMP=1053320306
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/oracle/data/TESTDB/users01.dbf
output file name=+DATA/TESTDB/DATAFILE/users.262.1053320307 tag=TAG20201009T045819 RECID=4 STAMP=1053320306
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 09-OCT-20

Starting Control File Autobackup at 09-OCT-20
piece handle=/oracle/db/dbs/c-2836615139-20201009-00 comment=NONE
Finished Control File Autobackup at 09-OCT-20



RMAN> switch database to copy;

datafile 1 switched to datafile copy "+DATA/TESTDB/DATAFILE/system.259.1053320299"
datafile 2 switched to datafile copy "+DATA/TESTDB/DATAFILE/sysaux.260.1053320303"
datafile 3 switched to datafile copy "+DATA/TESTDB/DATAFILE/undotbs1.261.1053320305"
datafile 4 switched to datafile copy "+DATA/TESTDB/DATAFILE/users.262.1053320307"


RMAN> alter database open;
Statement processed
RMAN> exit;

여기 까지 진행 하였다면 datafile 과 control file 이 ASM 으로 위치가 변경된 상태 입니다.



# UNDO 및 REDO 생성
create undo tablespace UNDOTBS2 datafile '+DATA' size 500M autoextend on;

set lines 500
col MEMBER for a45
select a.group#,b.THREAD# ,a.member, b.bytes/1024/1024 MB,b.status
from v$logfile a, v$log b
where a.group# = b.group#
order by a.group#, a.member;


*  위의 쿼리를 이용해서 inactive 인 그룹부터 삭제 하고 ASM에 신규로 추가를 반복 합니다.

alter database drop logfile group 1;
alter database add logfile THREAD 1 group 1 ('+DATA') size 100m;

alter database drop logfile group 2;
alter database add logfile THREAD 1 group 2 ('+DATA') size 100m;

alter database drop logfile group 3;
alter database add logfile THREAD 1 group 3 ('+DATA') size 100m;

alter system switch logfile;
alter system checkpoint;



# 2번 서버용 redo는 바로 추가 합니다.
alter database add logfile THREAD 2 group 4 ('+DATA') size 100m;
alter database add logfile THREAD 2 group 5 ('+DATA') size 100m;
alter database add logfile THREAD 2 group 6 ('+DATA') size 100m;

# 2번 thread redo 추가 후 수행
alter database enable public thread 2;





Grid 의 DB resource 추가


srvctl 을 통해서 DB 리소스를 추가 합니다.
그전에 먼저 파라미터를 spfile로 변경 합니다.

# 1번 노드에서 ASM 에 spfile 생성
SQL> create spfile='+DATA' from pfile='initTESTDB1.ora';


# asmcmd 를 통해 파일명 확인
[oracle]$ . oraenv
ORACLE_SID = [TESTDB1] ? +ASM1
ORACLE_HOME = [/home/oracle] ? /oracle/grid
The Oracle base has been changed from /oracle to /oracle/base

[oracle]$ asmcmd
cd +data/TESTDB/PARAMETERFILE
ls -al
->>>   spfile.270.1053321341


# 1,2번 서버 init 파라미터 변경
[oracle]$ mv  initTESTDB1.ora  initTESTDB1.ora.backup

각 서버별 init 파일을 별도로 생성 하여 아래 내용을 입력 합니다.
initTESTDB1.ora 과 initTESTDB2.ora

spfile=+data/TESTDB/PARAMETERFILE/spfile.270.1053321341
  => asmcmd 에서 조회한 결과의 파일 경로 와 파일명 입니다.


# srvctl 로 가동하기 위하여 인스턴스 중지(1번 서버)
[oracle]$ sqlplus  / as sysdba

SQL> shutdown immediate;
SQL> exit;


# srvctl 리소스 추가

$ srvctl add database -d TESTDB -o $ORACLE_HOME -p +data/TESTDB/PARAMETERFILE/spfile.270.1053321341 -diskgroup DATA

$ srvctl add instance -d TESTDB -i TESTDB1 -n acs

$ srvctl add instance -d TESTDB -i TESTDB2 -n acs2


# DB 가동 및 확인

[oracle]$ srvctl start database -d TESTDB

[oracle]$ srvctl config database -d TESTDB
Database unique name: TESTDB
Database name:
Oracle home: /oracle/db
Oracle user: oracle
Spfile: +data/TESTDB/PARAMETERFILE/spfile.270.1053321341
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: dba
Database instances: TESTDB1,TESTDB2
Configured nodes: acs,acs2
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed


마지막으로 db alert, grid alert 로그 등으로 특이사항을 확인합니다.




답글 남기기