이 페이지의 이전 버전을 보고 있습니다. 현재 버전 보기.

현재와 비교 페이지 이력 보기

« 이전 버전 6 다음 »


I. 개요


1. 사용 Software

제품명버전아키텍쳐배포 사이트
VirtualBox6.0.x호스트 환경에 따름https://www.virtualbox.org
Oracle Enterprise Linux8 이상x86 64bit

https://edelivery.oracle.com/linux

Clusterware, Database19.7 이상x86 64bithttp://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

Oracle Database 19.3은 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 에서 받을 수 있습니다.

2. 구성 계획

A) 서버

VMHost NameMemoryNet Adapter 1Net Adapter 2구성 방법비고
NODE1node110GB호스트 전용 어댑터호스트 전용 어댑터 #2리눅스 설치dnsmasq를 사용하여 DNS 구성
NODE2node210GB호스트 전용 어댑터호스트 전용 어댑터 #2NODE1 복제dnsmasq를 사용하여 DNS 구성

리눅스 기반의 2 node RAC로 구성합니다.

B) 스토리지

파일 이름용량타입용도비고
NODE1.vdi100GBDynamic / NormalNODE1 노드 스토리지디스크 사용량을 최소화하기 위해 Dynamic으로 생성합니다.
NODE2.vdi100GBDynamic / NormalNODE2 노드 스토리지vboxmanage clonemedium을 이용하여 NODE1.vdi 파일을 복제합니다.
CRS1.vdi1GBFixed / ShareableOCR / Vote 저장 영역  공유(shareable) 디스크로 사용하기 위해서는 Fixed Size로 생성해야 합니다.  


   


  
CRS2.vdi1GBFixed / Shareable
CRS3.vdi1GBFixed / Shareable
DATA.vdi30GBFixed / ShareableDATA 영역
FRA.vdi20GBFixed / ShareableFast Recovery Area 

Automatic Storage Management를 이용하여 Data 공간과 Fast Recovery Area를 구성합니다.

테스트를 위한 VM이므로 디스크 공간을 절약하기 위해 파일을 업로드 없이 VirtualBox의 게스트 확장 기능으로 VM에서 불러와 사용합니다.

C) 네트워크

VMPublic IPPrivate IPVirtual IPNetmaskGatewayDNS ServerSCAN IP
NODE110.0.1.10110.0.5.10110.0.1.201255.255.255.010.0.1.1127.0.0.1

10.0.1.191, 10.0.1.192, 10.0.1.193

NODE210.0.1.10210.0.5.10210.0.1.202255.255.255.010.0.1.1127.0.0.1

Netmask의 경우 Public과 Private 모두 24bit(255.255.255.0)을 사용합니다.

인터넷 공유기 또는 Gateway의 IP에 맞춰 Public IP와 Virtual IP를 설정하기 바랍니다.

별도의 DNS 서버 구성 없이 dnsmasq를 사용하여 Grid를 구축할 계획이므로 DNS는 Loopback IP로 지정합니다.

3. 호스트 환경

A) 시스템

12c부터는 64비트의 운영체제만을 지원하므로, 호스트 장비 또한 64비트 운영체제를 사용하여 구축해야 합니다.

메모리는 오라클의 권고에 따라 VM 노드당 8GB 이상이 필요하므로, 가능하면 20GB 이상의 메모리가 장착된 환경에서 작업하는 것을 권합니다.

(구축 테스트를 위해 임시적으로 설치하는 것이라면 경고 메시지를 무시하고 8GB 이하로 구성할 수도 있으나, 운영 환경에서는 권고하지 않습니다.)

B) 스토리지

디스크 I/O에 의한 지연을 최소화하기 위해 호스트의 OS가 설치되지 않은 별도의 내장 디스크를 사용하거나 SSD의 사용을 권합니다.

ESATA 또는 USB 3.0 이상의 빠른 속도를 보장하는 외장 디스크를 사용하는 것도 방법일 수 있습니다만 지속적인 연결이 보장되어야 합니다.

사실상 디스크의 속도에 따라 설치에 소요되는 시간이 크게 좌우되므로, 가급적이면 안정적이고 빠른 스토리지를 사용하기 바랍니다.

II. Oracle Linux 8 설치

1.  Oracle Linux 8 설치 준비

A)  부팅 화면


B) 언어 선택


C) 시간 및 날짜



D) 소프트웨어 선택



E) 설치 목적지











F) KDUMP



G) 네트워크 & 호스트 이름













H) 보안 정책



2. 설치 시작


A) 사용자 설정











3. 설치 완료

A) 재부팅 화면



B) 초기 설정






III. OS 기본 환경 설정

1. YUM 설정 및 패키지 설치

A) Local YUM Repository 설정

외부 인터넷 연결을 하지않고 설치 ISO 이미지로 YUM Repository를 구성하여 yum install을 사용할 수 있도록 설정하는 방법입니다.

디스크 마운트
mount /dev/cdrom /mnt
df | grep mnt
[root@node1 ~]# mount /dev/cdrom /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.

[root@node1 ~]# df | grep mnt
/dev/sr0              8141108 8141108         0 100% /mnt

VM에 ISO 파일을 연결하고, cdrom을 디렉토리에 mount 시켜줍니다. 

기존 Repository 파일 정리
mv /etc/yum.repos.d/oracle-linux-ol8.repo /etc/yum.repos.d/oracle-linux-ol8.repo.bak
mv /etc/yum.repos.d/uek-ol8.repo /etc/yum.repos.d/uek-ol8.repo.bak
mv /etc/yum.repos.d/virt-ol8.repo /etc/yum.repos.d/virt-ol8.repo.bak
[root@node1 ~]# mv /etc/yum.repos.d/oracle-linux-ol8.repo /etc/yum.repos.d/oracle-linux-ol8.repo.bak
[root@node1 ~]# mv /etc/yum.repos.d/uek-ol8.repo /etc/yum.repos.d/uek-ol8.repo.bak
[root@node1 ~]# mv /etc/yum.repos.d/virt-ol8.repo /etc/yum.repos.d/virt-ol8.repo.bak

기존에 생성되어 있던 Repository 파일은 모두 이름을 변경하여, 사용하지 않도록 수정합니다.

vi /etc/yum.repos.d/local.repo
[InstallMedia-BaseOS]
name=Oracle Linux 8 - BaseOS
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/BaseOS/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle

[InstallMedia-AppStream]
name=Oracle Linux 8 - AppStream
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
[root@node1 ~]# cat /etc/yum.repos.d/local.repo
[InstallMedia-BaseOS]
name=Oracle Linux 8 - BaseOS
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/BaseOS/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle

[InstallMedia-AppStream]
name=Oracle Linux 8 - AppStream
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/AppStream/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle

local.repo라는 Repository 파일을 생성합니다.

Repository 이름과 연결될 디렉토리 등을 입력합니다.

Repository 로딩 및 확인
yum clean all
yum repolist all
[root@node1 ~]# yum clean all
0 files removed

[root@node1 ~]# yum repolist all
repo id                            repo name                               status
InstallMedia-AppStream             Oracle Linux 8 - AppStream              사용
InstallMedia-BaseOS                Oracle Linux 8 - BaseOS                 사용

Repository를 재로딩하면 정상적으로 등록된 것을 확인할 수 있습니다.

B) 필수 패키지 설치

필수 패키지 설치
yum install elfutils-libelf-devel fontconfig-devel ksh libaio-devel libnsl sysstat
# yum install kmod-oracleasm
[root@node1 ~]# yum install elfutils-libelf-devel fontconfig-devel ksh libaio-devel libnsl sysstat
Oracle Linux 8 - BaseOS                          176 MB/s | 3.2 MB     00:00
Oracle Linux 8 - AppStream                       176 MB/s | 5.8 MB     00:00
마지막 메타 데이터 만료 확인 : 0:00:02 전에 2020년 09월 22일 (화) 오후 01시 10분 06초.
Dependencies resolved.
=================================================================================
 Package               Arch   Version               Repository              Size
=================================================================================
Installing:
 elfutils-libelf-devel x86_64 0.178-7.el8           InstallMedia-BaseOS     58 k
 fontconfig-devel      x86_64 2.13.1-3.el8          InstallMedia-BaseOS    151 k
 ksh                   x86_64 20120801-254.0.1.el8  InstallMedia-AppStream 927 k
 libaio-devel          x86_64 0.3.112-1.el8         InstallMedia-BaseOS     19 k
 libnsl                x86_64 2.28-101.0.1.el8      InstallMedia-BaseOS     97 k
 sysstat               x86_64 11.7.3-2.el8          InstallMedia-AppStream 426 k
Installing dependencies:
 bzip2-devel           x86_64 1.0.6-26.el8          InstallMedia-BaseOS    224 k
 expat-devel           x86_64 2.2.5-3.el8           InstallMedia-BaseOS     55 k
 freetype-devel        x86_64 2.9.1-4.el8           InstallMedia-BaseOS    464 k
 libpng-devel          x86_64 2:1.6.34-5.el8        InstallMedia-BaseOS    327 k
 libuuid-devel         x86_64 2.32.1-22.el8         InstallMedia-BaseOS     95 k
 lm_sensors-libs       x86_64 3.4.0-21.20180522git70f7e08.el8
                                                    InstallMedia-BaseOS     59 k
 zlib-devel            x86_64 1.2.11-13.el8         InstallMedia-BaseOS     57 k

Transaction Summary
=================================================================================
설치  13 Packages

Total size: 2.9 M
Installed size: 9.5 M
Is this ok [y/N]: y
패키지 다운로드중:
경고: /mnt/BaseOS/Packages/bzip2-devel-1.0.6-26.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ad986da3: NOKEY
Oracle Linux 8 - BaseOS                          3.0 MB/s | 3.1 kB     00:00
GPG키 0xAD986DA3를 불러옵니다:
 사용자     : "Oracle OSS group (Open Source Software group) <build@oss.oracle.com>"
  GPG 지문: 76FD 3DB1 3AB6 7410 B89D B10E 8256 2EA9 AD98 6DA3
 출처        : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Is this ok [y/N]: y
성공적으로 가져온 키
트랜잭션 점검 실행 중
트랜잭션 검사가 성공했습니다.
트랜잭션 테스트 실행 중
트랜잭션 테스트가 완료되었습니다.
거래 실행 중
  준비 중입니다  :                                                           1/1
  Installing     : zlib-devel-1.2.11-13.el8.x86_64                          1/13
  Installing     : libpng-devel-2:1.6.34-5.el8.x86_64                       2/13
  Installing     : lm_sensors-libs-3.4.0-21.20180522git70f7e08.el8.x86_6    3/13
  스크립틀릿 실행: lm_sensors-libs-3.4.0-21.20180522git70f7e08.el8.x86_6    3/13
  Installing     : libuuid-devel-2.32.1-22.el8.x86_64                       4/13
  Installing     : expat-devel-2.2.5-3.el8.x86_64                           5/13
  Installing     : bzip2-devel-1.0.6-26.el8.x86_64                          6/13
  Installing     : freetype-devel-2.9.1-4.el8.x86_64                        7/13
  Installing     : fontconfig-devel-2.13.1-3.el8.x86_64                     8/13
  Installing     : sysstat-11.7.3-2.el8.x86_64                              9/13
  스크립틀릿 실행: sysstat-11.7.3-2.el8.x86_64                              9/13
  Installing     : elfutils-libelf-devel-0.178-7.el8.x86_64                10/13
  Installing     : ksh-20120801-254.0.1.el8.x86_64                         11/13
  스크립틀릿 실행: ksh-20120801-254.0.1.el8.x86_64                         11/13
  Installing     : libnsl-2.28-101.0.1.el8.x86_64                          12/13
  Installing     : libaio-devel-0.3.112-1.el8.x86_64                       13/13
  스크립틀릿 실행: libaio-devel-0.3.112-1.el8.x86_64                       13/13
  확인 중        : bzip2-devel-1.0.6-26.el8.x86_64                          1/13
  확인 중        : elfutils-libelf-devel-0.178-7.el8.x86_64                 2/13
  확인 중        : expat-devel-2.2.5-3.el8.x86_64                           3/13
  확인 중        : fontconfig-devel-2.13.1-3.el8.x86_64                     4/13
  확인 중        : freetype-devel-2.9.1-4.el8.x86_64                        5/13
  확인 중        : libaio-devel-0.3.112-1.el8.x86_64                        6/13
  확인 중        : libnsl-2.28-101.0.1.el8.x86_64                           7/13
  확인 중        : libpng-devel-2:1.6.34-5.el8.x86_64                       8/13
  확인 중        : libuuid-devel-2.32.1-22.el8.x86_64                       9/13
  확인 중        : lm_sensors-libs-3.4.0-21.20180522git70f7e08.el8.x86_6   10/13
  확인 중        : zlib-devel-1.2.11-13.el8.x86_64                         11/13
  확인 중        : ksh-20120801-254.0.1.el8.x86_64                         12/13
  확인 중        : sysstat-11.7.3-2.el8.x86_64                             13/13

설치됨:
  bzip2-devel-1.0.6-26.el8.x86_64
  elfutils-libelf-devel-0.178-7.el8.x86_64
  expat-devel-2.2.5-3.el8.x86_64
  fontconfig-devel-2.13.1-3.el8.x86_64
  freetype-devel-2.9.1-4.el8.x86_64
  ksh-20120801-254.0.1.el8.x86_64
  libaio-devel-0.3.112-1.el8.x86_64
  libnsl-2.28-101.0.1.el8.x86_64
  libpng-devel-2:1.6.34-5.el8.x86_64
  libuuid-devel-2.32.1-22.el8.x86_64
  lm_sensors-libs-3.4.0-21.20180522git70f7e08.el8.x86_64
  sysstat-11.7.3-2.el8.x86_64
  zlib-devel-1.2.11-13.el8.x86_64

완료되었습니다!

오라클 설치에 필요한 패키지들을 설치합니다.

필수 패키지 설치 확인
rpm -qa bc
rpm -qa binutils
#rpm -qa dtrace-utils
rpm -qa elfutils-libelf
rpm -qa elfutils-libelf-devel
rpm -qa fontconfig-devel
rpm -qa glibc
rpm -qa glibc-devel
rpm -qa ksh
rpm -qa libaio
rpm -qa libaio-devel
#rpm -qa libdtrace-ctf-devel
rpm -qa libXrender
rpm -qa libX11
rpm -qa libXau
rpm -qa libXi
rpm -qa libXtst
rpm -qa libgcc
rpm -qa libnsl
rpm -qa librdmacm
rpm -qa libstdc++
rpm -qa libstdc++-devel
rpm -qa libxcb
rpm -qa libibverbs
rpm -qa make
rpm -qa smartmontools
rpm -qa sysstat
[root@node1 ~]# rpm -qa bc
bc-1.07.1-5.el8.x86_64
[root@node1 ~]# rpm -qa binutils
binutils-2.30-73.0.1.el8.x86_64
[root@node1 ~]# rpm -qa elfutils-libelf
elfutils-libelf-0.178-7.el8.x86_64
[root@node1 ~]# rpm -qa elfutils-libelf-devel
elfutils-libelf-devel-0.178-7.el8.x86_64
[root@node1 ~]# rpm -qa fontconfig-devel
fontconfig-devel-2.13.1-3.el8.x86_64
[root@node1 ~]# rpm -qa glibc
glibc-2.28-101.0.1.el8.x86_64
[root@node1 ~]# rpm -qa glibc-devel
glibc-devel-2.28-101.0.1.el8.x86_64
[root@node1 ~]# rpm -qa ksh
ksh-20120801-254.0.1.el8.x86_64
[root@node1 ~]# rpm -qa libaio
libaio-0.3.112-1.el8.x86_64
[root@node1 ~]# rpm -qa libaio-devel
libaio-devel-0.3.112-1.el8.x86_64
[root@node1 ~]# rpm -qa libXrender
libXrender-0.9.10-7.el8.x86_64
[root@node1 ~]# rpm -qa libX11
libX11-1.6.8-3.el8.x86_64
[root@node1 ~]# rpm -qa libXau
libXau-1.0.8-13.el8.x86_64
[root@node1 ~]# rpm -qa libXi
libXi-1.7.9-7.el8.x86_64
[root@node1 ~]# rpm -qa libXtst
libXtst-1.2.3-7.el8.x86_64
[root@node1 ~]# rpm -qa libgcc
libgcc-8.3.1-5.0.3.el8.x86_64
[root@node1 ~]# rpm -qa libnsl
libnsl-2.28-101.0.1.el8.x86_64
[root@node1 ~]# rpm -qa librdmacm
librdmacm-26.0-8.el8.x86_64
[root@node1 ~]# rpm -qa libstdc++
libstdc++-8.3.1-5.0.3.el8.x86_64
[root@node1 ~]# rpm -qa libstdc++-devel
libstdc++-devel-8.3.1-5.0.3.el8.x86_64
[root@node1 ~]# rpm -qa libxcb
libxcb-1.13.1-1.el8.x86_64
[root@node1 ~]# rpm -qa libibverbs
libibverbs-26.0-8.el8.x86_64
[root@node1 ~]# rpm -qa make
make-4.2.1-10.el8.x86_64
[root@node1 ~]# rpm -qa smartmontools
smartmontools-6.6-3.el8.x86_64
[root@node1 ~]# rpm -qa sysstat
sysstat-11.7.3-2.el8.x86_64

오라클 설치에 필요한 패키지가 모두 설치되었는지 확인합니다.

2.  GUI 접속 환경 설정

A)  GUI 환경 접속











3. 리눅스 환경 설정

A) 설치 정보 확인

OS 정보 확인
uname -a
cat /etc/oracle-release
[root@node1 ~]# uname -a
Linux node1 5.4.17-2011.1.2.el8uek.x86_64 #2 SMP Mon Apr 20 22:10:46 PDT 2020 x86_64 x86_64 x86_64 GNU/Linux

[root@node1 ~]# cat /etc/oracle-release
Oracle Linux Server release 8.2

먼저 설치된 리눅스의 버전 정보를 확인합니다.

B) 미사용 서비스 정리

미사용 서비스 정리
### 방화벽 중지
systemctl stop firewalld
systemctl disable firewalld
### 블루투스 중지
systemctl stop bluetooth
systemctl disable bluetooth
### 시간 동기화 중지
systemctl stop chronyd
systemctl disable chronyd
mv /etc/chrony.conf /etc/chrony.conf.bak
### NTP 중지
systemctl stop ntpdate
systemctl disable ntpdate
### AVAHI 중지
systemctl stop avahi-daemon.socket
systemctl disable avahi-daemon.socket
systemctl stop avahi-daemon
systemctl disable avahi-daemon
### 가상 시스템 관리 중지
systemctl stop libvirtd
systemctl disable libvirtd
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@node1 ~]# systemctl stop bluetooth
[root@node1 ~]# systemctl disable bluetooth
Removed /etc/systemd/system/dbus-org.bluez.service.
Removed /etc/systemd/system/bluetooth.target.wants/bluetooth.service.

[root@node1 ~]# systemctl stop chronyd
[root@node1 ~]# systemctl disable chronyd
[root@node1 ~]# mv /etc/chrony.conf /etc/chrony.conf.bak

[root@node1 ~]# systemctl stop ntpdate
Failed to stop ntpdate.service: Unit ntpdate.service not loaded.
[root@node1 ~]# systemctl disable ntpdate
Failed to disable unit: Unit file ntpdate.service does not exist.

[root@node1 ~]# systemctl stop avahi-daemon.socket
[root@node1 ~]# systemctl disable avahi-daemon.socket
Removed /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.
[root@node1 ~]# systemctl stop avahi-daemon
[root@node1 ~]# systemctl disable avahi-daemon
Removed /etc/systemd/system/multi-user.target.wants/avahi-daemon.service.
Removed /etc/systemd/system/dbus-org.freedesktop.Avahi.service.

[root@node1 ~]# systemctl stop libvirtd
[root@node1 ~]# systemctl disable libvirtd
Removed /etc/systemd/system/multi-user.target.wants/libvirtd.service.
Removed /etc/systemd/system/sockets.target.wants/virtlogd.socket.
Removed /etc/systemd/system/sockets.target.wants/virtlockd.socket.

테스트 환경에서 사용하지 않는 서비스를 정리합니다.

실습 환경에서는 CTSS를 활성화 모드로 운영할 것이므로 NTP나 chrony 등의 시간 동기화 서비스를 중지할 것입니다.

그러나 실제 운영환경에서는 구성 환경을 고려하여 사용 여부를 결정해야하며, 가급적 NTP를 설정(-x 포함)하여 사용하는 것을 권장합니다.

C) hosts 파일 수정

vi /etc/hosts 로 호스트 파일 수정
### Public
10.0.3.101  node1           node1.localdomain
10.0.3.102  node2           node2.localdomain
### Private
10.0.5.101  node1-priv      node1-priv.localdomain
10.0.5.102  node2-priv      node2-priv.localdomain
### Virtual
10.0.3.201  node1-vip       node1-vip.localdomain
10.0.3.202  node2-vip       node2-vip.localdomain
### SCAN
10.0.3.191  cluster-scan    cluster-scan.localdomain
10.0.3.192  cluster-scan    cluster-scan.localdomain
10.0.3.193  cluster-scan    cluster-scan.localdomain

/etc/hosts 파일에 설치할 모든 서버의 IP와 호스트명을 추가합니다.

오라클 소프트웨어 설치를 정상적으로 진행하기 위해 로컬 노드와 원격 노드에 대한 정보를 정확히 입력해야 합니다.

SCAN IP는 1개만 할당해도 설치에 지장은 없습니다. 다만, 18c부터는 3개를 할당하지 않을 경우, 필요 조건 검사 과정에서 검증 실패 메시지가 출력됩니다.

D) 보안 설정 변경

vi /etc/selinux/config 로 selinux 모드 변경
SELINUX=permissive
SELinux 모드를 온라인 상에서 변경
setenforce permissive

Selinux 모드를 permissive로 변경합니다.

E) dnsmasq 활성화

vi /etc/dnsmasq.conf 로 dnsmasq에 로컬 도메인 정보 추가
local=/localdomain/

dnsmasq 서비스의 환경 설정 파일에 로컬 도메인에 대한 정보를 입력합니다.

resolv.conf 내용 확인 및 dnsmasq 활성화
cat /etc/resolv.conf
systemctl start dnsmasq
systemctl enable dnsmasq
nslookup rac-scan.localdomain	# 경우에 따라 재기동 필요
[root@node1 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 127.0.0.1

[root@node1 ~]# systemctl start dnsmasq
[root@node1 ~]# systemctl enable dnsmasq
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /usr/lib/systemd/system/dnsmasq.service.

[root@node1 ~]# nslookup cluster-scan.localdomain
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   cluster-scan.localdomain
Address: 10.0.3.193
Name:   cluster-scan.localdomain
Address: 10.0.3.191
Name:   cluster-scan.localdomain
Address: 10.0.3.192

[root@node1 ~]# nslookup cluster-scan.localdomain
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   cluster-scan.localdomain
Address: 10.0.3.191
Name:   cluster-scan.localdomain
Address: 10.0.3.192
Name:   cluster-scan.localdomain
Address: 10.0.3.193

[root@node1 ~]# nslookup cluster-scan.localdomain
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   cluster-scan.localdomain
Address: 10.0.3.192
Name:   cluster-scan.localdomain
Address: 10.0.3.193
Name:   cluster-scan.localdomain
Address: 10.0.3.191

별도의 DNS 서비스 없이 SCAN을 사용하기 위해 dnsmasq 서비스를 활성화합니다.

DNS 설정 파일(resolv.conf)에는 "nameserver 127.0.0.1"가 입력되어 있어야 합니다.

F) 가상 메모리 파일 시스템 할당

vi /etc/fstab 로 tmpfs 영역 할당
tmpfs                   /dev/shm                tmpfs   size=8g         0 0
mount 명령으로 /dev/shm 영역 remount
mount -o remount /dev/shm
tmpfs                   /dev/shm                tmpfs   size=8g         0 0
[root@node1 ~]# df -h | grep shm
tmpfs                4.9G     0  4.9G   0% /dev/shm

[root@node1 ~]# cat /etc/fstab | grep tmpfs
tmpfs                   /dev/shm                tmpfs   size=8g         0 0

[root@node1 ~]# mount -o remount /dev/shm

[root@node1 ~]# df -h | grep shm
tmpfs                8.0G     0  8.0G   0% /dev/shm

가상 메모리 파일 시스템(tmpfs) 값을 설정하고 remount하여 적용시킵니다.

G) oracle 제공 추가 패키지 설치

Oracle 사전환경 구성 패키지 및 ASMLib 패키지 설치
rpm -ivh oracle-database-preinstall-19c-*.el8.x86_64.rpm
rpm -ivh oracleasm-support-*.el8.x86_64.rpm
rpm -ivh oracleasmlib-*.el8.x86_64.rpm
[root@node1 sf_oracle]# rpm -ivh oracle-database-preinstall-19c-1.0-1.el8.x86_64.rpm
Verifying...                          ################################# [100%]
준비 중...                         ################################# [100%]
Updating / installing...
   1:oracle-database-preinstall-19c-1.################################# [100%]

[root@node1 sf_oracle]# rpm -ivh oracleasm-support-2.1.12-1.el8.x86_64.rpm
Verifying...                          ################################# [100%]
준비 중...                         ################################# [100%]
Updating / installing...
   1:oracleasm-support-2.1.12-1.el8   ################################# [100%]
알림: 'systemctl enable oracleasm.service'에 요청을 전송하고 있습니다.
Synchronizing state of oracleasm.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable oracleasm
Created symlink /etc/systemd/system/multi-user.target.wants/oracleasm.service → /usr/lib/systemd/system/oracleasm.service.

[root@node1 sf_oracle]# rpm -ivh oracleasmlib-2.0.17-1.el8.x86_64.rpm
Verifying...                          ################################# [100%]
준비 중...                         ################################# [100%]
Updating / installing...

추가로 Oracle Database 설치를 위한 preinstall 패키지와 ASMLib 패키지를 설치합니다.

preinstall 패키지는 Oracle Linux Repository에서 받을 수 있고, ASMLib 패키지는 아래 경로에서 다운로드 합니다.

https://www.oracle.com/technetwork/server-storage/linux/asmlib/rhel7-2773795.html

H) 그룹 및 사용자 계정 작업

그룹 등록 및 사용자 설정 변경
### 그룹 등록 (정책에 따라 생략)
# groupadd oper
# groupadd backupdba
# groupadd dgdba
# groupadd kmdba
# groupadd racdba
groupadd asmadmin
groupadd asmdba
groupadd asmoper
### 유저 그룹 설정 변경 (vboxsf는 VirtualBox의 Guest Additions 사용시 설정)
usermod -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba,asmadmin,asmdba,asmoper,vboxsf oracle
# usermod -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba,asmadmin,asmdba,asmoper oracle
### 계정 암호 변경
passwd oracle
[root@node1 ~]# groupadd asmadmin
[root@node1 ~]# groupadd asmdba
[root@node1 ~]# groupadd asmoper

[root@node1 ~]# usermod -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba,asmadmin,asmdba,asmoper,vboxsf oracle

[root@node1 ~]# passwd oracle
oracle 사용자의 비밀 번호 변경 중
새  암호:
잘못된 암호: 암호는 8 개의 문자 보다 짧습니다
새  암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.

소프트웨어를 설치할 사용자 계정과 그룹을 생성 또는 추가합니다.

preinstall 패키지가 설치되었다면 oracle 유저와 oinstall, dba, oper, backupdba, dgdba, kmdba, racdba 그룹은 이미 생성되어 있습니다.

vboxsf 그룹은 VirtualBox의 Guest Addition을 사용하기 위한 그룹으로, 실제 운영 환경에서 Guest Addition을 사용하지 않는다면 추가하지 않습니다.

passwd 명령어로 각 계정의 암호를 지정해주면 됩니다.

I) 설치 경로 생성

설치 경로 생성 및 권한 부여
mkdir -p /u01/app/oracle
chown -R oracle:oinstall /u01
chmod -R 775 /u01
[root@node1 ~]# mkdir -p /u01/app/oracle
[root@node1 ~]# chown -R oracle:oinstall /u01
[root@node1 ~]# chmod -R 775 /u01

오라클 소프트웨어 설치를 위한 경로를 생성하고, 해당 경로에 대한 권한과 소유권을 수정합니다.

J) 사용자 환경 설정

vi ~oracle/.bash_profile 로 oracle 프로필 설정
export TMP=/tmp
export TMPDIR=$TMP
export EDITOR=vi
export ORACLE_HOSTNAME=node1            # 호스트명에 맞게 변경
export ORACLE_UNQNAME=racdb
export ORACLE_BASE=/u01/app/oracle
export GRID_HOME=/u01/app/19c/grid
export DB_HOME=$ORACLE_BASE/product/19c/db_1
export ORACLE_HOME=$DB_HOME
export ORACLE_SID=sehadb
export ORACLE_TERM=xterm
export BASE_PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$GRID_HOME/bin:$BASE_PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export NLS_LANG=AMERICAN_KOREA.AL32UTF8
export CV_ASSUME_DISTID=OEL7
PS1='[$ORACLE_SID:$PWD]> '

oracle 유저의 .bash_profile을 수정합니다.

root계정에서 해당 파일을 직접 수정할 수 있습니다.

vi ~oracle/.bashrc 로 alias 설정
alias grid_env='export ORACLE_HOME=$GRID_HOME;export ORACLE_SID=+ASM1;export PATH=$ORACLE_HOME/bin:$BASE_PATH'
alias db_env='export ORACLE_HOME=$DB_HOME;export ORACLE_SID=sehadb;export PATH=$ORACLE_HOME/bin:$BASE_PATH'

Grid와 DB 인스턴스 간의 변환을 쉽게 하기 위해 alias를 설정합니다.

vi ~/.bash_profile 로 root 프로필 수정
export ORACLE_BASE=/u01/app/oracle
export GRID_HOME=/u01/app/19c/grid
export DB_HOME=$ORACLE_BASE/product/19c/db_1
export PATH=$PATH:$GRID_HOME/bin

작업의 편의를 위해 root 계정의 .bash_profile에도 경로 정보를 추가로 입력합니다.

IV. 공유 스토리지 설정

1. 공유 스토리지 구성

공유 스토리지 구성을 위해 고정 공간이 할당된 가상 디스크 6개를 추가로 생성합니다.

파일 이름용량타입용도비고

CRS1.vdi

1GBFixed / ShareableCRS 저장 영역공유(shareable) 디스크로 사용하기 위해서 Fixed Size로 생성합니다.
CRS2.vdi1GBFixed / Shareable
CRS3.vdi1GBFixed / Shareable
DATA.vdi30GBFixed / ShareableData 저장 영역
FRA.vdi20GBFixed / ShareableFast Recovery Area

A) 가상 스토리지 파일 생성

공유 스토리지 가상 디스크 생성
vboxmanage createmedium --filename CRS1.vdi --size 1024 --format VDI --variant Fixed
vboxmanage createmedium --filename CRS2.vdi --size 1024 --format VDI --variant Fixed
vboxmanage createmedium --filename CRS3.vdi --size 1024 --format VDI --variant Fixed
vboxmanage createmedium --filename DATA.vdi --size 30720 --format VDI --variant Fixed
vboxmanage createmedium --filename FRA.vdi --size 20480 --format VDI --variant Fixed
PS D:\VM> pwd

Path
----
D:\VM

PS D:\VM> vboxmanage createmedium --filename CRS1.vdi --size 1024 --format VDI --variant Fixed
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 3a6327e8-0367-4edc-bb5b-591efe123e8d
PS D:\VM> vboxmanage createmedium --filename CRS2.vdi --size 1024 --format VDI --variant Fixed
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 9d4524a2-5a06-478a-b733-81cd9889e59e
PS D:\VM> vboxmanage createmedium --filename CRS3.vdi --size 1024 --format VDI --variant Fixed
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: a9d5a021-b91a-4c43-b7d5-2136bf447e83
PS D:\VM> vboxmanage createmedium --filename DATA.vdi --size 30720 --format VDI --variant Fixed
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 94a0fac2-2040-42ec-9b7e-2fecc49bcf05
PS D:\VM> vboxmanage createmedium --filename FRA.vdi --size 20480 --format VDI --variant Fixed
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 8f120938-511d-42b1-b15b-dfd4e20218e9

Host 컴퓨터에서 VM에 연결시킬 CRS, MGMT, DATA와 FRA 디스크를 생성합니다.

디스크는 2개의 노드에서 공유할 것이므로, 반드시 Fixed 모드로 디스크 공간이 사전에 할당되도록 생성해야 합니다.

B) 스토리지 파일 공유 설정

가상 디스크 타입 변경
vboxmanage modifymedium CRS1.vdi --type shareable
vboxmanage modifymedium CRS2.vdi --type shareable
vboxmanage modifymedium CRS3.vdi --type shareable
vboxmanage modifymedium DATA.vdi --type shareable
vboxmanage modifymedium FRA.vdi --type shareable
PS D:\VM> vboxmanage modifymedium CRS1.vdi --type shareable
PS D:\VM> vboxmanage modifymedium CRS2.vdi --type shareable
PS D:\VM> vboxmanage modifymedium CRS3.vdi --type shareable
PS D:\VM> vboxmanage modifymedium DATA.vdi --type shareable
PS D:\VM> vboxmanage modifymedium FRA.vdi --type shareable

생성된 디스크들은 모두 shareable 디스크로 속성 변경이 필요합니다.

VirtualBox의 GUI 툴을 사용하여 변경할 수도 있습니다.

C) VM에 스토리지 연결

정지된 1번 노드의 설정 모드로 들어가서 디스크 파일을 추가합니다.

SATA 콘트롤러의 오른쪽에 하드디스크 모양의 아이콘을 클릭합니다

vboxmanage 명령으로 이미 생성된 디스크 파일을 추가할 것이므로 <기존 디스크 선택하기>를 클릭합니다.

Not Attatched에 등록된 디스크 목록에서 "CRS1.vdi"를 선택한 후 <선택>을 클릭합니다.

만약 생성된 디스크 이미지가 목록에 없다면 <추가> 아이콘을 클릭한 후에 디스크 이미지를 찾아서 추가하면 됩니다.

정상적으로 스토리지가 추가된 것을 확인할 수 있습니다.

다른 공유 디스크들도 같은 방법으로 추가해줍니다.

나머지 디스크 파일 모두 순서에 맞게 SATA 컨트롤러에 등록시켜줍니다.

반드시 동일한 순서대로 다른 노드에도 등록시켜야 합니다.

2. ASM 환경 구성

A) ASM 환경 설정 및 초기화

ASM 환경 설정
oracleasm configure -i
oracleasm init
oracleasm status
oracleasm configure
[root@node1 ~]# oracleasm configure -i
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 <ENTER> 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 []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]:
Writing Oracle ASM library driver configuration: done

[root@node1 ~]# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Configuring "oracleasm" to use device physical block size
Mounting ASMlib driver filesystem: /dev/oracleasm

[root@node1 ~]# oracleasm status
Checking if ASM is loaded: yes
Checking if /dev/oracleasm is mounted: yes

[root@node1 ~]# oracleasm configure
ORACLEASM_ENABLED=true
ORACLEASM_UID=oracle
ORACLEASM_GID=asmadmin
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER=""
ORACLEASM_SCANEXCLUDE=""
ORACLEASM_SCAN_DIRECTORIES=""
ORACLEASM_USE_LOGICAL_BLOCK_SIZE="false"

ASM library에 대한 추가적인 환경 설정(사용자, 그룹, 부팅시 활성화, 부팅시 스캔 여부)을 수행하고 적용 여부를 검증합니다.

B) 디스크 파티셔닝

스토리지 파티션 생성
ls /dev/sd*
fdisk /dev/sdb  ### "n", "p", "1", "엔터", "엔터", "w" 입력
fdisk /dev/sdc  ### "n", "p", "1", "엔터", "엔터", "w" 입력
fdisk /dev/sdd  ### "n", "p", "1", "엔터", "엔터", "w" 입력
fdisk /dev/sde  ### "n", "p", "1", "엔터", "엔터", "w" 입력
fdisk /dev/sdf  ### "n", "p", "1", "엔터", "엔터", "w" 입력
ls /dev/sd*
[root@node1 ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdc  /dev/sdd  /dev/sde  /dev/sdf

[root@node1 ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x5d4aacce.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):

Created a new partition 1 of type 'Linux' and of size 1023 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@node1 ~]# fdisk /dev/sdc

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x104edbfe.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):

Created a new partition 1 of type 'Linux' and of size 1023 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@node1 ~]# fdisk /dev/sdd

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x1780c426.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):

Created a new partition 1 of type 'Linux' and of size 1023 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@node1 ~]# fdisk /dev/sde

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x0401edc8.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-62914559, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-62914559, default 62914559):

Created a new partition 1 of type 'Linux' and of size 30 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@node1 ~]# fdisk /dev/sdf

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xdc12631f.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):

Created a new partition 1 of type 'Linux' and of size 20 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@node1 ~]# ls /dev/sd*
/dev/sda   /dev/sda2  /dev/sdb1  /dev/sdc1  /dev/sdd1  /dev/sde1  /dev/sdf1
/dev/sda1  /dev/sdb   /dev/sdc   /dev/sdd   /dev/sde   /dev/sdf

VM에 연결된 디스크에 fdisk 명령어로 파티션 분할 작업을 수행 합니다.

실습의 편의를 위해 하나의 디스크가 하나의 파티션이 되도록 합니다.

C) ASM 디스크 생성

ASM 디스크 생성 및 확인
oracleasm createdisk CRS1 /dev/sdb1
oracleasm createdisk CRS2 /dev/sdc1
oracleasm createdisk CRS3 /dev/sdd1
oracleasm createdisk DATA /dev/sde1
oracleasm createdisk FRA /dev/sdf1
oracleasm scandisks
oracleasm listdisks
[root@node1 ~]# oracleasm createdisk CRS1 /dev/sdb1
Writing disk header: done
Instantiating disk: done

[root@node1 ~]# oracleasm createdisk CRS2 /dev/sdc1
Writing disk header: done
Instantiating disk: done

[root@node1 ~]# oracleasm createdisk CRS3 /dev/sdd1
Writing disk header: done
Instantiating disk: done

[root@node1 ~]# oracleasm createdisk DATA /dev/sde1
Writing disk header: done
Instantiating disk: done

[root@node1 ~]# oracleasm createdisk FRA /dev/sdf1
Writing disk header: done
Instantiating disk: done

[root@node1 ~]# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...

[root@node1 ~]# oracleasm listdisks
CRS1
CRS2
CRS3
DATA
FRA

VM에 마운트된 디스크를 각각 ASM Disk로 할당해줍니다.

순서대로 마운트가 되었다면, 디바이스 명의 알파벳 순으로 ASM 디스크를 생성하면 됩니다.

V. VM 2번 노드

1. 2번 노드 구성

A) 2번 노드 가상 머신 만들기

.

가상 머신 2번 노드를 만들기 위해 VirtualBox에서 ‘새로 만들기’를 클릭합니다.

가상 머신의 이름을 "rac2"로 정하고, 1번 노드와 동일한 경로를 머신 폴더로 지정합니다.

해당 디렉토리 아래에 rac2라는 디렉토리가 생성되고, 디렉토리 안에 가상 머신 관련 파일들이 저장됩니다.

OS의 종류는 'Linux'로 하고 설치될 버전은 'Oracle (64-bit)'를 선택한 후 <다음>을 클릭합니다.

메모리 크기는 1번 노드와 동일하게 10240MB로 선택한 후 <다음>을 클릭합니다.

B) 1번 노드 VM 복제

2번 노드 가상 디스크 이미지 복제
vboxmanage clonemedium disk .\rac1.vdi ..\rac2\rac2.vdi
PS D:\VM\rac1> vboxmanage clonemedium disk .\rac1.vdi ..\rac2\rac2.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: 28c8742c-e783-4dca-b95c-5919bfd1257e

1번 노드가 정지된 상태에서 1번 노드의 복제본을 rac2 디렉토리에 저장합니다.

1번 노드의 UUID값과 다른 이미지가 생성되도록 반드시 VirtualBox에서 제공하는 방식으로 복제합니다.

하드 디스크는 '기존의 가상 하드 디스크 파일 사용'을 선택합니다.

그리고 방금 복제한 가상 하드 디스크 파일을 선택하기 위해 폴더 모양의 아이콘을 클릭합니다.

vboxmanage 명령으로 디스크를 복제했다면, Not Attatched 항목에 rac2.vdi 파일이 존재합니다.

만약 목록에 없다면 <추가> 버튼을 클릭하여 복제한 이미지를 찾아 불러오면 됩니다.

rac2.vdi 파일을 선택한 후 <선택> 버튼을 클릭합니다.

<만들기>를 클릭하면, 지금까지 선택한 환경에 맞게 가상 머신이 생성됩니다.

C) 2번 노드 VM 환경 설정

기본적으로 생성된 가상 머신을 RAC 환경에 맞게 변경해야 하므로, 2번 노드를 선택하고 <설정>을 클릭합니다.

부팅 순서에서 플로피 디스크를 해제합니다.

1번 노드와 동일한 순서로 공유 디스크를 추가시켜 줍니다.

반드시 같은 순서대로 SATA 컨트롤러에 연결시켜야 합니다.

오디오는 사용하지 않을 것이므로 '오디오 사용하기'를 해제합니다.

어댑터 1의 네트워크 설정을 1번 노드와 동일하게 구성합니다.

본인이 사용할 네트워크 환경에 맞게 설정하면 됩니다.

RAC 노드간의 통신을 위해 어댑터 2를 활성화시킵니다.

어댑터 2번 항목에 가서 '네트워크 어댑터 사용하기'를 체크하고, 1번 노드와 동일하게 '호스트 전용 어댑터'로 구성합니다.

네트워크 구성까지 완료되었으면 <확인>을 클릭해서 변경한 설정 값을 저장하고, 가상머신을 기동합니다.

1번 노드와 동일하게 공유 폴더 기능을 설정합니다.

공유 폴더를 설정할 경우, 호스트 서버에 저장된 설치 파일을 업로드 없이 바로 사용할 수 있습니다.

D) 네트워크 설정 변경

네트워크 설정을 변경하기 위해 root 계정으로 접속한 후에 '프로그램' > '시스템 도구' > '설정'을 클릭합니다.

네트워크 항목으로 이동한 후에 각 이더넷 항목에 톱니바퀴 모양의 아이콘을 클릭하여 설정을 변경합니다.

참고로 VirtualBox를 기준으로 했을 떄, 이더넷 enp0s3은 Public 네트워크이고 enp0s8은 Private 네트워크의 인터페이스입니다.

이더넷 enp0s3의 IPv4 항목에서 주소를 "10.0.1.102"(2번 노드의 Public 네트워크 IP)로 변경한 후 <적용>을 클릭합니다.

리눅스 버전에 따라 네트워크 정보가 초기화되어 있을 수 있습니다.

그럴 때는 아래의 정보와 같이 입력합니다.

항목

입력값

비고

주소10.0.1.1021번 노드 Public IP 주소
네트마스크24서브넷 마스크 값으로  255.255.255.0 사용 가능
게이트웨이10.0.1.1Public 망의 게이트웨이
네임서버(DNS)127.0.0.1dnsmasq를 사용할 경우 loopback IP 사용
검색 도메인localdomain로컬 도메인 정보 입력

이더넷 enp0s8의 IPv4 항목에서 주소를 "10.0.5.102"(2번 노드의 Private 네트워크 IP)로 변경한 후 <적용>을 클릭합니다.

마찬가지로 네트워크 정보가 초기화 되었을 경우, 아래와 같이 입력합니다.

항목

입력값

비고

주소10.0.5.1011번 노드 Private IP 주소
네트마스크24서브넷 마스크 값으로  255.255.255.0 사용 가능

각 이더넷 인터페이스를 껏다가 키면 변경된 설정이 적용됩니다.

또는 명령 프롬프트에서 아래 명령을 수행합니다.

root 유저로 네트워크 재기동 수행
systemctl restart network
2번 노드 IP 주소 변경하기
ip addr show
vi /etc/sysconfig/network-scripts/ifcfg-<public 인터페이스명>
# IPADDR=XXX.XXX.XXX.XXX 부분 변경
vi /etc/sysconfig/network-scripts/ifcfg-<private 인터페이스명>
# IPADDR=XXX.XXX.XXX.XXX 부분 변경
systemctl restart network
ip addr show
[root@rac1 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:72:b8:d8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.101/24 brd 10.0.1.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe72:b8d8/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:fd:6d:a9 brd ff:ff:ff:ff:ff:ff
    inet 10.0.5.101/24 brd 10.0.5.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::cd39:da9a:86ab:40a8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[root@rac1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
... << 생략 >> ...
IPADDR=10.0.1.102
... << 생략 >> ...

[root@rac1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
... << 생략 >> ...
IPADDR=10.0.5.102
... << 생략 >> ...

[root@rac1 ~]# systemctl restart network

[root@rac1 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:72:b8:d8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.102/24 brd 10.0.1.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe72:b8d8/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:fd:6d:a9 brd ff:ff:ff:ff:ff:ff
    inet 10.0.5.102/24 brd 10.0.5.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::cd39:da9a:86ab:40a8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

위의 GUI 방식보다 간단하게 CLI 모드에서 vi 편집기를 사용하여 IP를 수정할 수도 있습니다.

다만 Public Private 이더넷을 혼동하여 잘못 설정할  있으므로 주의가 필요합니다.

E) 호스트명 변경

2번 노드 hostname 변경
hostnamectl status
hostnamectl set-hostname node2
hostnamectl status
[root@node1 ~]# hostnamectl status
   Static hostname: node1
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 173acec393894224b4fb48c8781eab8a
           Boot ID: 14c258e655c845a2880fb1e88fa7b014
    Virtualization: oracle
  Operating System: Oracle Linux Server 8.2
       CPE OS Name: cpe:/o:oracle:linux:8:2:server
            Kernel: Linux 5.4.17-2011.1.2.el8uek.x86_64
      Architecture: x86-64

[root@node1 ~]# hostnamectl set-hostname node2

[root@node1 ~]# hostnamectl status
   Static hostname: node2
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 173acec393894224b4fb48c8781eab8a
           Boot ID: 14c258e655c845a2880fb1e88fa7b014
    Virtualization: oracle
  Operating System: Oracle Linux Server 8.2
       CPE OS Name: cpe:/o:oracle:linux:8:2:server
            Kernel: Linux 5.4.17-2011.1.2.el8uek.x86_64
      Architecture: x86-64

2번 노드의 호스트 명은 CLI 모드에서 간단한 명령어로 변경할 수 있습니다.

2번 노드 CLI 모드로 변경
systemctl set-default multi-user.target
[root@node2 ~]# systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.

설치 과정 중에 리소스를 절약하기 위해 2번 노드는 텍스트 모드로 실행되도록 수정합니다.

F) 사용자 환경 변수 변경

vi ~oracle/.bash_profile로 2번 노드 oracle 프로필 변경
export ORACLE_HOSTNAME=rac2
export ORACLE_SID=racdb2
[root@node2 ~]# cat ~oracle/.bash_profile
# .bash_profile

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

# User specific environment and startup programs

export TMP=/tmp
export TMPDIR=$TMP
export EDITOR=vi
export ORACLE_HOSTNAME=node2            # 호스트명에 맞게 변경
export ORACLE_UNQNAME=racdb
export ORACLE_BASE=/u01/app/oracle
export GRID_HOME=/u01/app/19c/grid
export DB_HOME=$ORACLE_BASE/product/19c/db_1
export ORACLE_HOME=$DB_HOME
export ORACLE_SID=racdb2                # 2번 노드 racdb2
export ORACLE_TERM=xterm
export BASE_PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$GRID_HOME/bin:$BASE_PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export NLS_LANG=AMERICAN_KOREA.AL32UTF8
export CV_ASSUME_DISTID=OEL7
PS1='[$ORACLE_SID:$PWD]> '

oracle 유저의 환경 설정을 2번 노드에 맞게 수정합니다.

vi ~oracle/.bashrc 2번 노드의 alias 설정 변경
alias grid_env='export ORACLE_HOME=$GRID_HOME;export ORACLE_SID=+ASM2;export PATH=$ORACLE_HOME/bin:$BASE_PATH'
alias db_env='export ORACLE_HOME=$DB_HOME;export ORACLE_SID=racdb2;export PATH=$ORACLE_HOME/bin:$BASE_PATH'
[root@node2 ~]# cat ~oracle/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
alias grid_env='export ORACLE_HOME=$GRID_HOME;export ORACLE_SID=+ASM2;export PATH=$ORACLE_HOME/bin:$BASE_PATH'
alias db_env='export ORACLE_HOME=$DB_HOME;export ORACLE_SID=racdb2;export PATH=$ORACLE_HOME/bin:$BASE_PATH'

aslias 설정의 ORACLE_SID 정보도 2번 노드에 맞게 수정합니다.


VI. Grid Infrastructure 설치

1. 전체 노드 Grid Infrastructure 설치

A) 준비 작업

mkdir -p $GRID_HOME
unzip <zip 파일이 있는 경로>/LINUX.X64_193000_grid_home.zip -d $GRID_HOME


$GRID_HOME/OPatch/opatch version
mv $GRID_HOME/OPatch $GRID_HOME/OPatch.old
unzip <zip 파일이 있는 경로>/p6880880_190000_Linux-x86-64.zip -d $GRID_HOME
chown -R oracle:oinstall $GRID_HOME/OPatch
$GRID_HOME/OPatch/opatch version


B) 설치 스크립트 실행

grid_env
cd $GRID_HOME
export CV_ASSUME_DISTID=OEL7
./gridSetup.sh -applyRU <RU 압축 해제 경로>
































VII. ASM 디스크 그룹 추가

grid_env
export CV_ASSUME_DISTID=OEL7
asmca












VIII. Database 소프트웨어 설치

1. 1번 노드 소프트웨어 설치

A) 준비 작업

mkdir -p $DB_HOME
unzip <zip 파일이 있는 경로>/LINUX.X64_193000_db_home.zip -d $DB_HOME


$DB_HOME/OPatch/opatch version
mv $DB_HOME/OPatch $DB_HOME/OPatch.old
unzip <패치 파일 다운로드 경로>/p6880880_190000_Linux-x86-64.zip -d $DB_HOME
chown -R oracle:oinstall $DB_HOME/OPatch
$DB_HOME/OPatch/opatch version


B) 설치 스크립트 실행

cd $DB_HOME
export CV_ASSUME_DISTID=OEL7
./runInstaller -applyRU <RU 압축 해제 경로>














2. 다른 노드로 Database 소프트웨어 복사

$ORACLE_HOME/bin/roohctl -enable
[sehadb:/home/oracle]> $ORACLE_HOME/bin/roohctl -enable
읽기 전용 Oracle 홈을 사용으로 설정하는 중입니다.
읽기 전용 Oracle 홈을 사용으로 설정하려면 orabasetab 파일을 업데이트하십시오.
orabasetab 파일을 성공적으로 업데이트했습니다.
읽기 전용 Oracle 홈에 대한 부트스트랩 디렉토리를 생성하십시오.
부트스트랩 디렉토리를 성공적으로 생성했습니다.
부트스트랩 파일이 성공적으로 처리되었습니다.
읽기 전용 Oracle 홈을 성공적으로 사용으로 설정했습니다.
자세한 내용은 로그 파일 /u01/app/oracle/cfgtoollogs/roohctl/roohctl-200916오후040013.log을(를) 확인하십시오.


chown oracle:oinstall /u01/app/oracle
[root@node2 ~]# chown oracle:oinstall /u01/app/oracle


$DB_HOME/addnode/addnode.sh -silent CLUSTER_NEW_NODES=<추가할 노드명>
[sehadb:/home/oracle]> $DB_HOME/addnode/addnode.sh -silent CLUSTER_NEW_NODES=node2

구성 준비이(가) 진행 중입니다.

구성 준비을(를) 성공했습니다.
..................................................   7% 완료되었습니다.

원격 노드에 파일 복사이(가) 진행 중입니다.
..................................................   12% 완료되었습니다.
..................................................   17% 완료되었습니다.
..............................
원격 노드에 파일 복사을(를) 성공했습니다.
다음 위치에서 이 설치 세션의 로그를 찾을 수 있습니다.
 /u01/app/oraInventory/logs/addNodeActions2020-09-16_04-01-42PM.log

파일 인스턴스화이(가) 진행 중입니다.

파일 인스턴스화을(를) 성공했습니다.
..................................................   49% 완료되었습니다.

클러스터 인벤토리 저장 중이(가) 진행 중입니다.
..................................................   83% 완료되었습니다.

클러스터 인벤토리 저장 중을(를) 성공했습니다.
/u01/app/oracle/product/19c/db_1의 클러스터 노드 추가을(를) 성공했습니다.
자세한 내용은 '/u01/app/oraInventory/logs/silentInstall2020-09-16_04-01-42PM.log'을(를) 확인하십시오.

Oracle 기본 위치 설정이(가) 진행 중입니다.

Oracle 기본 위치 설정을(를) 성공했습니다.
..................................................   90% 완료되었습니다.

읽기 전용 Oracle 홈 설정이(가) 진행 중입니다.

읽기 전용 Oracle 홈 설정을(를) 성공했습니다.
..................................................   97% 완료되었습니다.

루트 사용자로 다음 스크립트를 실행합니다.
        1. /u01/app/oracle/product/19c/db_1/root.sh

다음 노드에서 /u01/app/oracle/product/19c/db_1/root.sh을(를) 실행하십시오.
[node2]


Successfully Setup Software.
..................................................   100% 완료되었습니다.


/u01/app/oracle/product/19c/db_1/root.sh
[root@node2 ~]# /u01/app/oracle/product/19c/db_1/root.sh
Performing root user operation.

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/oracle/product/19c/db_1
   Copying dbhome to /usr/local/bin ...
   Copying oraenv to /usr/local/bin ...
   Copying coraenv to /usr/local/bin ...

Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.


IX. Database 생성



















X. HA 설정 적용

1. HA 설정

A) 초기 설정값 확인

srvctl config database -db <DB명>
[sehadb:/home/oracle]> srvctl config database -db sehadb
데이터베이스 고유 이름: sehadb
데이터베이스 이름: sehadb
Oracle 홈: /u01/app/oracle/product/19c/db_1
Oracle 사용자: oracle
Spfile: +DATA/SEHADB/PARAMETERFILE/spfile.265.1051451337
비밀번호 파일:
도메인:
시작 옵션: open
정지 옵션: immediate
데이터베이스 롤: PRIMARY
관리 정책: AUTOMATIC
서버 풀:
디스크 그룹: FRA,DATA
마운트 위치 경로:
서비스:
유형: SINGLE
OSDBA 그룹: dba
OSOPER 그룹: oper
데이터베이스 인스턴스: sehadb
구성된 노드: node1
CSS 중요: no
CPU 개수: 0
메모리 대상: 0
최대 메모리: 0
데이터베이스 서비스에 대한 기본 네트워크 번호:
관리자 관리 데이터베이스입니다.


B) 패스워드 파일 ASM 영역으로 이동

asmcmd pwcopy <기존 패스워드 파일 경로> +DATA/<DB명>/<패스워드 파일명>
srvctl modify database -db <DB명> -pwfile +DATA/<DB명>/<패스워드 파일명>
[sehadb:/home/oracle]> asmcmd pwcopy /u01/app/oracle/dbs/orapwsehadb +DATA/SEHADB/orapwsehadb
copying /u01/app/oracle/dbs/orapwsehadb -> +DATA/SEHADB/orapwsehadb

[sehadb:/home/oracle]> srvctl modify database -db sehadb -pwfile +DATA/SEHADB/orapwsehadb


C) 노드 간의 HA 설정 및 결과 확인

srvctl modify database -db <DB명> -node <노드1>,<노드2>,...<노드n>
srvctl config database -db <DB명>
[sehadb:/home/oracle]> srvctl modify database -db sehadb -node node1,node2

[sehadb:/home/oracle]> srvctl config database -db sehadb
데이터베이스 고유 이름: sehadb
데이터베이스 이름: sehadb
Oracle 홈: /u01/app/oracle/product/19c/db_1
Oracle 사용자: oracle
Spfile: +DATA/SEHADB/PARAMETERFILE/spfile.265.1051451337
비밀번호 파일: +DATA/SEHADB/orapwsehadb
도메인:
시작 옵션: open
정지 옵션: immediate
데이터베이스 롤: PRIMARY
관리 정책: AUTOMATIC
서버 풀:
디스크 그룹: FRA,DATA
마운트 위치 경로:
서비스:
유형: SINGLE
OSDBA 그룹: dba
OSOPER 그룹: oper
데이터베이스 인스턴스: sehadb
구성된 노드: node1,node2
CSS 중요: no
CPU 개수: 0
메모리 대상: 0
최대 메모리: 0
데이터베이스 서비스에 대한 기본 네트워크 번호:
관리자 관리 데이터베이스입니다.


2. HA Relocate 테스트

A) 작업 전 확인

srvctl status database -db <DB명>
crsctl stat res -t
[sehadb:/home/oracle]> srvctl status database -db sehadb
sehadb 인스턴스가 node1 노드에서 실행 중임

[sehadb:/home/oracle]> crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.chad
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.net1.network
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.ons
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.CRS.dg(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.DATA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.FRA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node2                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.asm(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    Started,STABLE
      2        ONLINE  ONLINE       node2                    Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.cvu
      1        ONLINE  ONLINE       node1                    STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.qosmserver
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.sehadb.db
      1        ONLINE  ONLINE       node1                    Open,HOME=/u01/app/o
                                                             racle/product/19c/db
                                                             _1,STABLE
--------------------------------------------------------------------------------


B) 서비스 노드 전환 후 결과 확인

srvctl relocate database -db <DB명> -node <재배치할 노드>
crsctl stat res -t
[sehadb:/home/oracle]> srvctl relocate database -db sehadb -node node2

[sehadb:/home/oracle]> crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.chad
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.net1.network
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.ons
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.CRS.dg(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.DATA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.FRA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node2                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.asm(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    Started,STABLE
      2        ONLINE  ONLINE       node2                    Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.cvu
      1        ONLINE  ONLINE       node1                    STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.qosmserver
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.sehadb.db
      1        ONLINE  ONLINE       node2                    Open,HOME=/u01/app/o
                                                             racle/product/19c/db
                                                             _1,STABLE
--------------------------------------------------------------------------------



  • 레이블 없음