|
테스트 환경
OS: 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 연결 및 공유 볼륨은 추가가 완료 된 상황에서의 진행입니다.
OS 설정
/etc/hosts 설정
1,2 번 노드 모두 /etc/hosts 파일을 수정 합니다.
[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
* IP 및 호스트명은 포스티에서의 예시 입니다.
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 패키지 설치
그다음 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"
커널 파라미터 설정
/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
커널 파라미터 수치는 포스팅에서의 예시 입니다.
수치는 사용하는 환경에 맞게 설정이 필요하며 위에서 기재한 파라미터 이외 추가적으로 설정이 필요한 파라미터는 더 있을 수 있습니다.
ulimit / NOZEROCONF / 방화벽 설정
/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 / THP / shm 설정
avahi-daemon disable, 1,2번 노드 모두
systemctl stop avahi-daemon
systemctl disable avahi-daemon
systemctl status avahi-daemon
Transparent Huge Pages 기능 비활성화 , 1,2번 노드 모두
내용이 긴 관계로 아래 포스트 참조하세요
Transparent Huge Pages 기능 비활성화
Transparent Huge Pages 기능
Linux는 메모리에 대한 관리를 Pages 단위로 관리/사용되고 있고 기본 페이지는 4096바이트(4K)로 고정되어 있습니다.
1GB의 메모리는 256,000개의 page로 구성되어있는 것이고 이러한 페이지는 메모리 크기가 늘어남에 따라 관리테이블(TLB)도 커지게 되어 OS의 관리되는 요건이 늘어난다 던지 메모리를 Access 하는 과정에서의 많은 페이지로 인하여 overhead 가 발생할수 있는 내역이 존재 합니다.
/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 수행
# node 1 에서 실행
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
gridSetup.sh 실행
# 1번 노드에서 실행
[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는 종료합니다
[oracle]$ lsnrctl stop
<- 1번 서버의 listener 중지
리스너를 종료해도 connection 된 세션이 끊기지는 않습니다.
root.sh 가 완료 되어 GRID_HOME의 listener 가 구동되면 해당 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번 서버 부터 rac on 으로 변경 합니다
- 2번 서버에서 oracle 유저로 수행
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 위치 변경
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 로그 등으로 특이사항을 확인합니다.
Grid 의 DB Resource
|