
Terkadang konfigurasi aplikasi Java berisi alamat IP "Utama" dari server basis data, yang dapat berubah, misalnya, dalam kasus berikut:
- Perubahan terkontrol dari peran database. "Utama" menjadi "Siaga" dan sebaliknya, "Siaga" menjadi "Utama". Prosedur ini biasanya disebut "Peralihan".
- Perubahan darurat dari peran "Siaga" menjadi "Utama". Ini biasanya disebut sebagai "Failover".
Dalam kedua kasus tersebut, aplikasi tidak hanya harus "mengetahui" tentang alamat IP dari server "Utama" yang baru, tetapi juga dapat mengaksesnya bila diperlukan. Berikut ini adalah panduan singkat tentang cara melakukan ini menggunakan Oracle Universal Connection Pool (UCP), serta demo "Switchover".
Untuk percobaan, kami akan menggunakan:
- MacBook dengan RAM 16 GB (lebih dari 8 GB diperlukan untuk percobaan)
- Virtual Box versi 6.1.12
- 2x mesin virtual (selanjutnya disebut VM) dengan CentOS 7 Minimal , yang masing-masing memiliki
- 2x vCPU
- RAM 2048 GB (hingga 8 GB sementara, satu per satu)
- HDD 40 GB
- audio dinonaktifkan untuk menghindari 100% beban CPU
- Oracle Database 19c
Mari ikuti langkah-langkah berikut:
- Mengonfigurasi mesin virtual
- Menginstal Oracle
- Replikasi Oracle
- Menginstal dan Mengonfigurasi Oracle Grid
- "Switchover" Java

Kami membuat mesin virtual (selanjutnya disebut VM) dengan jenis Linux Red Hat, start. Saat Virtual Box dimulai, Anda diminta untuk memilih iso untuk memulai VM (dalam percobaan, CentOS-7-x86_64-Minimal-1908.iso digunakan). Biarkan semuanya secara default, reboot, update, instal "Virtual Box Guest Additions", matikan firewalld agar tidak menghalangi. "Semua orang tahu bagaimana polesan dihapus", jadi kami hanya mencatat bahwa setelah memperbarui VM, kami mengalihkan antarmuka jaringan mereka dari adaptor NAT ke "adaptor host virtual" vboxnet0. Untuk adaptor ini, yang dapat dibuat di alat Kotak Virtual, secara manual atur alamat 192.168.56.1/24 dan nonaktifkan DHCP. Pada dasarnya, ini adalah alamat IP gateway default untuk VM dan alamat aplikasi Java. Hanya untuk kejelasan. Dan jika Anda masih membutuhkan internet di CentOS,maka Anda dapat mengaktifkan NAT di macOS:
- Beralih ke root menggunakan perintah 'sudo su -'.
- Izinkan pengalihan lalu lintas menggunakan perintah 'sysctl -w net.inet.ip.forwarding = 1'.
- Tambahkan konten file /etc/pf.conf ke file /var/root/pfnat.conf, di mana, alih-alih baris 3, masukkan aturan untuk NAT:
nat on enX dari vboxnet0: network ke any -> (enX)
di mana enX adalah nama antarmuka jaringan dengan rute default. - Jalankan perintah 'pfctl -f pfnat.conf -e' untuk memperbarui aturan filter paket.
Langkah 2-4 dapat dilakukan dalam satu perintah.
sysctl -w net.inet.ip.forwarding=1 \
&& grep -v -E -e '^#.*' -e '^$' /etc/pf.conf | head -n2 > pfnat.conf \
&& INET_PORT=$(netstat -nrf inet | grep default | tr -s ' ' | cut -d ' ' -f 4) \
&& echo "nat on ${INET_PORT} from vboxnet0:network to any -> (${INET_PORT})" >> pfnat.conf \
&& grep -v -E -e '^#.*' -e '^$' /etc/pf.conf | tail -n+3 >> pfnat.conf \
&& pfctl -f pfnat.conf -e
Tambahkan entri seragam ke / etc / hosts dari semua VM sehingga mereka dapat "melakukan ping" satu sama lain dengan nama domain.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.78 oracle1.localdomain oracle1
192.168.56.79 oracle2.localdomain oracle2
Menginstal Oracle

Kami melakukan instalasi "Hanya Perangkat Lunak" pada oracle1 dan oracle2 menggunakan paket-rpm , direktori yang dapat digunakan bersama dari MacOS melalui Kotak Virtual (Mesin-> Pengaturan-> Folder Bersama).
yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm
Selanjutnya, kami membuat instance DBMS di VM "oracle1". Untuk melakukan ini, jalankan skrip yang sesuai di bawah pengguna oralce.
/etc/init.d/oracledb_ORCLCDB-19c configure
Prosedur ini membutuhkan waktu. Setelah membuat sebuah instance di kedua host, tambahkan baris-baris ini ke file /home/oracle/.bash_profile:
export ORACLE_HOME="/opt/oracle/product/19c/dbhome_1"
export ORACLE_BASE="/opt/oracle"
export ORACLE_SID="ORCLCDB"
export PATH=$PATH:$ORACLE_HOME/bin
Nah, kami juga mengkonfigurasi ssh untuk kenyamanan, agar Anda dapat langsung terhubung sebagai pengguna oracle. Kami terhubung ke host melalui ssh dan terhubung ke database di bawah pengguna oracle.
user@macbook:~$ ssh oracle@oracle1
Last login: Wed Aug 12 16:17:05 2020
[oracle@oracle1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 12 16:19:44 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
Sebenarnya, Oracle. Untuk percobaan, kita juga perlu menyiapkan replikasi.
Replikasi Oracle.

Untuk menyiapkan replikasi, kami akan menggunakan instruksi yang sedikit dimodifikasi :
- Kami mentransfer database di server oracle1 ke "Mode Arsip". Untuk melakukan ini, jalankan perintah di sqlplus:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN; - Tanpa keluar dari sqlplus, aktifkan "Paksa logging" di server oracle1.
ALTER DATABASE FORCE LOGGING;
ALTER SYSTEM SWITCH LOGFILE; - Buat file "ulangi log" di server oracle1.
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 ('/opt/oracle/oradata/ORCLCDB/standby_redo01.log') SIZE 209715200;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 ('/opt/oracle/oradata/ORCLCDB/standby_redo02.log') SIZE 209715200;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 ('/opt/oracle/oradata/ORCLCDB/standby_redo03.log') SIZE 209715200;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 13 ('/opt/oracle/oradata/ORCLCDB/standby_redo04.log') SIZE 209715200; - Nyalakan "FLASHBACK" di server oracle1, itu tidak akan bekerja tanpanya.
SQL> host
[oracle @ oracle1 ~] $ mkdir / opt / oracle / recovery_area
[oracle @ oracle1 ~] $ exit
SQL> ubah set sistem db_recovery_file_dest_size = 2g scope = keduanya;
SQL> mengubah set sistem db_recovery_file_dest = '/ opt / oracle / recovery_area' scope = keduanya;
SQL> ALTER DATABASE FLASHBACK ON; - Kami mengaktifkan sesuatu yang otomatis di server oracle1.
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
- tnsnames.ora listener.ora oracle1 oracle2 :
oracle1, $ORACLE_HOME/network/admin/tnsnames.oraLISTENER_ORCLCDB = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521)) ORCLCDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SID = ORCLCDB) ) ) ORCLCDB_STBY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SID = ORCLCDB) ) )
oracle1, $ORACLE_HOME/network/admin/listener.oraLISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCLCDB_DGMGRL) (ORACLE_HOME = /opt/oracle/product/19c/dbhome_1) (SID_NAME = ORCLCDB) ) ) ADR_BASE_LISTENER = /opt/oracle
oracle2, $ORACLE_HOME/network/admin/tnsnames.oraLISTENER_ORCLCDB = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521)) ORCLCDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle1.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SID = ORCLCDB) ) ) ORCLCDB_STBY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SID = ORCLCDB) ) )
oracle2, $ORACLE_HOME/network/admin/listener.oraLISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle2.localdomain)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCLCDB_STBY_DGMGRL) (ORACLE_HOME = /opt/oracle/product/19c/dbhome_1) (SID_NAME = ORCLCDB) ) ) ADR_BASE_LISTENER = /opt/oracle
- oracle1
listener-.
[oracle@oracle1 ~]$ lsnrctl reload
[oracle@oracle1 ~]$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 — Production on 15-AUG-2020 08:17:24
Copyright © 1991, 2019, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle1.localdomain)(PORT=1521)))
STATUS of the LISTENER
— Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 — Production
Start Date 15-AUG-2020 08:09:57
Uptime 0 days 0 hr. 7 min. 26 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/oracle1/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle1.localdomain)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle1.localdomain)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary…
Service «ORCLCDB» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
Service «ORCLCDBXDB» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
Service «ac8d8d741e3e2a52e0534e38a8c0602d» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
Service «orclpdb1» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
The command completed successfully
( Data Guard: ORCLCDB_DGMGRL)[oracle@oracle1 ~]$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 — Production on 15-AUG-2020 08:17:32
Copyright © 1991, 2019, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle1.localdomain)(PORT=1521)))
STATUS of the LISTENER
— Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 — Production
Start Date 15-AUG-2020 08:09:57
Uptime 0 days 0 hr. 7 min. 34 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/oracle1/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle1.localdomain)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle1.localdomain)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary…
Service «ORCLCDB» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
Service «ORCLCDBXDB» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
Service «ORCLCDB_DGMGRL» has 1 instance(s).
Instance «ORCLCDB», status UNKNOWN, has 1 handler(s) for this service…
Service «ac8d8d741e3e2a52e0534e38a8c0602d» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
Service «orclpdb1» has 1 instance(s).
Instance «ORCLCDB», status READY, has 1 handler(s) for this service…
The command completed successfully - SYS oracle1.
SQL> alter user sys identified by "pa_SSw0rd";
- oracle2 listener .
[oracle@oracle2 ~]$ lsnrctl start
[oracle@oracle2 ~]$ orapwd file=$ORACLE_BASE/product/19c/dbhome_1/dbs/orapwORCLCDB entries=10 password=pa_SSw0rd
[oracle@oracle2 ~]$ echo "*.db_name='ORCLCDB'" > /tmp/initORCLCDB_STBY.ora
[oracle@oracle2 ~]$ mkdir -p $ORACLE_BASE/oradata/ORCLCDB/pdbseed
[oracle@oracle2 ~]$ mkdir -p $ORACLE_BASE/oradata/ORCLCDB/ORCLPDB1
[oracle@oracle2 ~]$ mkdir -p $ORACLE_BASE/admin/ORCLCDB/adump
[oracle@oracle2 ~]$ mkdir /opt/oracle/recovery_area
[oracle@oracle2 ~]$ sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='/tmp/initORCLCDB_STBY.ora'
[oracle@oracle2 ~]$ rman TARGET sys/pa_SSw0rd@ORCLCDB AUXILIARY sys/pa_SSw0rd@ORCLCDB_STBY
RMAN> GANDAKAN TARGET DATABASE UNTUK SIAP DARI SET DATABASE DORECOVER AKTIF SPFILE db_unique_name = 'ORCLCDB_STBY' KOMENTAR 'Siaga' NOFILENAMECHECK; - Luncurkan Data Guard di kedua server (oracle1 dan oracle2).
SQL> ALTER SYSTEM SET dg_broker_start = true;
- Di server oracle1, sambungkan ke konsol manajemen Penjaga Data dan buat konfigurasi.
[oracle @ oracle1 ~] $ dgmgrl sys / pa_SSw0rd @ ORCLCDB
DGMGRL> BUAT KONFIGURASI my_dg_config SEBAGAI DATABASE UTAMA ADALAH ORCLCDB CONNECT IDENTIFIER ADALAH ORCLCDB;
DGMGRL> TAMBAHKAN DATABASE ORCLCDB_STBY SEBAGAI CONNECT IDENTIFIER ADALAH ORCLCDB_STBY DIPERTAHANKAN SEBAGAI FISIK;
DGMGRL> aktifkan konfigurasi;
Jadi, sebagai hasil dari membuat replika dan mengaktifkan Data Guard, kami memiliki status berikut:
DGMGRL> show configuration
Configuration - my_dg_config
Protection Mode: MaxPerformance
Members:
orclcdb - Primary database
orclcdb_stby - Physical standby database
Warning: ORA-16854: apply lag could not be determined
Fast-Start Failover: Disabled
Configuration Status:
WARNING (status updated 40 seconds ago)
Ini adalah kondisi yang buruk. Mari kita tunggu sebentar ...
DGMGRL> show configuration
Configuration - my_dg_config
Protection Mode: MaxPerformance
Members:
orclcdb - Primary database
orclcdb_stby - Physical standby database
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 55 seconds ago)
Sekarang keadaannya bagus! Namun, replika tersebut sangat pasif, replika tersebut tidak menerima permintaan baca (OPEN MODE: MOUNTED).
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED MOUNTED
3 ORCLPDB1 MOUNTED
Mari kita aktifkan replika sehingga menerima permintaan baca. Kemudian kami, di masa mendatang, akan dapat membongkar server dengan basis "Utama". Inilah yang disebut "Penjaga Data Aktif", atau siaga aktif . Di server oracle2, jalankan urutan perintah berikut di sqlplus:
alter database
recover managed standby database cancel;
alter database open;
alter database
recover managed standby database
using current logfile
disconnect from session;
alter pluggable database all open;
Sekarang Anda dapat membaca dari replika (MODE TERBUKA: HANYA BACA):
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ ONLY NO
Dan di konsol DataGuard di server oracle1, semuanya terlihat bagus:
DGMGRL> show configuration;
Configuration - my_dg_config
Protection Mode: MaxPerformance
Members:
orclcdb - Primary database
orclcdb_stby - Physical standby database
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 19 seconds ago)
Terlepas dari kenyataan bahwa kami sekarang memiliki Data Guard Active, cluster tersebut sebagian besar masih pasif. Dia masih tidak akan mengatakan sepatah kata pun kepada kami dan aplikasi Java kami yang luar biasa bahwa Pratama tidak lagi Utama. Untuk melakukan ini, layanan lain, ONS (Oracle Notification Services), harus berjalan di server cluster. Dan sepertinya menginstal Oracle Database tidak cukup untuk menjalankan layanan ini, kita perlu menginstal Oracle Grid.
Menginstal dan mengonfigurasi Oracle Grid.

Semuanya cukup sederhana di sini: seperti dalam proses menginstal Oracle Database, kami hanya akan mengikuti instruksi resminya .
- oracle1 oracle2 root Oracle Grid, gcc-c++, oracle asm. Virtual Box, Oracle, Oracle Grid .
mkdir -p /opt/oracle/product/19c/grid \ && cp -r /mnt/oracle_grid_19300/LINUX/* /opt/oracle/product/19c/grid/ \ && chown -R oracle:oinstall /opt/oracle/product/19c/grid
yum install -y gcc-c++
groupadd asm && usermod -aG asm oracle
- , oracle, Oracle Grid.
cd /opt/oracle/product/19c/grid/ && ./runcluvfy.sh stage -pre hacfg
Verifying Physical Memory ...FAILED
Required physical memory = 8GB
Verifying Swap Size ...FAILED
Required = 2.6924GB (2823138.0KB); Found = 2GB (2097148.0KB)]
- , swap, Oracle Grid , . - oracle2, oracle1.
SQL> shutdown immediate
# poweroff
- oracle1 8192 , VM swap root.
dd if=/dev/zero of=/swap_file bs=1G count=7 \ && chmod 600 /swap_file && mkswap /swap_file \ && echo '/swap_file swap swap defaults 0 0' >> /etc/fstab \ && swapoff -a && swapon -a - , , .
[oracle@oracle1 grid]$ cd /opt/oracle/product/19c/grid/ && ./runcluvfy.sh stage -pre hacfg
Pre-check for Oracle Restart configuration was successful.
! Oracle Grid. - oracle oracle1 /opt/oracle/product/19c/grid/ grid_configwizard.rsp.
cd /opt/oracle/product/19c/grid/ && touch grid_configwizard.rsp
grid_configwizard.rsp , oracle restart, ASM .
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0
INVENTORY_LOCATION=/opt/oracle/oraInventory
oracle.install.option=CRS_SWONLY
ORACLE_BASE=/opt/oracle
oracle.install.asm.OSDBA=oinstall
oracle.install.asm.OSASM=asm
oracle.install.asm.SYSASMPassword=oracle
oracle.install.asm.diskGroup.name=data
oracle.install.asm.diskGroup.redundancy=NORMAL
oracle.install.asm.diskGroup.AUSize=4
oracle.install.asm.diskGroup.disksWithFailureGroupNames=/dev/sdb
- oracle grid .
./gridSetup.sh -silent \ -responseFile /opt/oracle/product/19c/grid/grid_configwizard.rsp - , oracle grid root, .
/opt/oracle/product/19c/grid/root.sh - , oracle restart root roothas.sh.
cd /opt/oracle/product/19c/grid/crs/install/ && ./roothas.sh
- oracle runInstaller.
cd /opt/oracle/product/19c/grid/oui/bin/ \ && ./runInstaller -updateNodeList \ ORACLE_HOME=/opt/oracle/product/19c/grid \ -defaultHomeName CLUSTER_NODES= CRS=TRUE - oracle1 /etc/fstab , /swap_file, 2048 RAM.
- " Oracle Grid" VM oracle2.
- , , Oracle Restart. oracle1 oracle Oracle Restart.
srvctl add database -db ORCLCDB \ -oraclehome /opt/oracle/product/19c/dbhome_1 \ -role PRIMARY
/opt/oracle/product/19c/grid/bin/crsctl modify \ res ora.cssd -attr "AUTO_START=always" -unsupported
/opt/oracle/product/19c/grid/bin/crsctl stop has
/opt/oracle/product/19c/grid/bin/crsctl start has - oracle2 oracle Oracle Restart.
/opt/oracle/product/19c/grid/bin/crsctl modify \ res ora.cssd -attr "AUTO_START=always" -unsupported
/opt/oracle/product/19c/grid/bin/crsctl stop has
/opt/oracle/product/19c/grid/bin/crsctl start has
srvctl add database -db ORCLCDB_STBY \ -oraclehome /opt/oracle/product/19c/dbhome_1 \ -role PHYSICAL_STANDBY \ -spfile /opt/oracle/product/19c/dbhome_1/dbs/spfileORCLCDB.ora \ -dbname ORCLCDB -instance ORCLCDB - Di kedua server, oracle1 dan oracle2, di bawah pengguna oracle menambahkan pendengar ke konfigurasi Oracle Restart.
srvctl add listener - Di server oracle1, di bawah pengguna oracle, tambahkan ke konfigurasi dan mulai layanan database, ORCLCDB.
srvctl add service -db ORCLCDB -service orclpdb -l PRIMARY -pdb ORCLPDB1
srvctl start service -db ORCLCDB -service orclpdb - Di server oracle2, di bawah pengguna oracle, tambahkan layanan database, ORCLCDB_STBY ke konfigurasi, dan mulai instance database
srvctl add service -db ORCLCDB_STBY -service orclpdb -l PRIMARY -pdb ORCLPDB1
srvctl start database -db ORCLCDB_STBY - Di server oracle1 dan oracle2, mulai layanan ons.
srvctl enable ons
srvctl start ons
Demo "Peralihan" pada aplikasi uji Java

Hasilnya, kami memiliki 2 server oracle dengan replikasi dalam mode siaga aktif dan layanan on, ke mana peristiwa sakelar akan dikirim, dan aplikasi Java akan dapat memproses peristiwa ini saat mereka tiba.
Mari buat pengguna uji dan tabel di Oracle.
oracle1 oracle sqlplus
sqlplus / as sysdbaalter session set container=ORCLPDB1;CREATE USER testus IDENTIFIED BY test DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;GRANT CONNECT, CREATE SESSION, CREATE TABLE TO testus;CREATE TABLE TESTUS.MESSAGES (TIMEDATE TIMESTAMP, MESSAGE VARCHAR2(100));
Setelah membuat pengguna uji dan tabel, sambungkan ke server oracle2 dan "buka" instance untuk membaca guna memastikan replikasi berfungsi.
[oracle@oracle2 ~]$ sqlplus / as sysdba
SQL> alter pluggable database all open;
SQL> alter session set container=ORCLPDB1;
SQL> column table_name format A10;
SQL> column owner format A10;
SQL> select table_name, owner from dba_tables where owner like '%TEST%';
TABLE_NAME OWNER
---------- ----------
MESSAGES TESTUS
Aplikasi pengujian hanya terdiri dari satu kelas Main, dalam sebuah loop mencoba menambahkan record ke tabel pengujian, dan kemudian membaca record yang sama (lihat metode "putNewMessage ()" dan "getLastMessage ()"). Ada juga metode "getConnectionHost ()", yang dari objek "koneksi" menggunakan "API Refleksi" mendapatkan alamat IP dari koneksi ke database. Seperti yang Anda lihat di konsol, setelah "peralihan" alamat ini berubah.
Luncurkan aplikasi pengujian dan jalankan "peralihan" di konsol Data Guard.
DGMGRL> switchover to orclcdb_stby;
Kami melihat bagaimana alamat IP koneksi berubah di log aplikasi, waktu henti adalah 1 menit:
[Wed Aug 26 23:56:55 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:56:55| ?
[Wed Aug 26 23:56:56 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:56:56| ?
[Wed Aug 26 23:56:57 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:56:57| ?
[Wed Aug 26 23:56:58 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:02 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:06 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:10 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:14 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:18 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:23 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:27 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:31 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:35 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:39 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:43 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:47 MSK 2020]: SQLException: - !
[Wed Aug 26 23:57:51 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:57:52| ?
[Wed Aug 26 23:57:53 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:57:53| ?
[Wed Aug 26 23:57:54 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:57:54| ?
Beralih kembali untuk memastikan.
DGMGRL> switchover to orclcdb;
Situasinya simetris.
[Wed Aug 26 23:58:54 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:58:54| ?
[Wed Aug 26 23:58:55 MSK 2020]: Host 192.168.56.79: - 2020-08-26 23:58:55| ?
[Wed Aug 26 23:58:56 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:00 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:04 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:08 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:12 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:16 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:20 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:24 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:28 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:32 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:36 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:40 MSK 2020]: SQLException: - !
[Wed Aug 26 23:59:44 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:59:45| ?
[Wed Aug 26 23:59:46 MSK 2020]: Host 192.168.56.78: - 2020-08-26 23:59:46| ?
Juga, perhatikan koneksi TCP pada host oralce1 dan oracle2. Port data sibuk dengan koneksi hanya di primer, port ONS sibuk di primer dan replika.
Sebelum peralihan.
oracle1
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v ":22"
ESTAB 0 0 192.168.56.78:1521 192.168.56.1:49819 users:(("oracle_21115_or"...))
ESTAB 0 0 192.168.56.78:1521 192.168.56.1:49822 users:(("oracle_21117_or"...))
ESTAB 0 0 [::ffff:192.168.56.78]:6200 [::ffff:192.168.56.1]:49820 users:(("ons"...))
oracle2
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v ":22"
ESTAB 0 0 [::ffff:192.168.56.79]:6200 [::ffff:192.168.56.1]:49821 users:(("ons"...))
Setelah peralihan.
oracle1
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v 22 Wed Aug 26 16:57:57 2020
ESTAB 0 0 [::ffff:192.168.56.78]:6200 [::ffff:192.168.56.1]:51457 users:(("ons"...))
oracle2
Every 1.0s: ss -tapn | grep 192.168.56.1 | grep ESTAB | grep -v ":22" Wed Aug 26 16:58:35 2020
ESTAB 0 0 192.168.56.79:1521 192.168.56.1:52259 users:(("oracle_28212_or"...))
ESTAB 0 0 192.168.56.79:1521 192.168.56.1:52257 users:(("oracle_28204_or"...))
ESTAB 0 0 [::ffff:192.168.56.79]:6200 [::ffff:192.168.56.1]:51458 users:(("ons"...))
Kesimpulan
Jadi, kami menyimulasikan cluster Data Guard di lingkungan lab dengan jumlah setelan minimum dan menerapkan koneksi failover dari aplikasi Java pengujian. Sekarang kami tahu apa yang diinginkan pengembang dari DBA, dan DBA ingin dari pengembang. Tetap meluncurkan dan menguji Fast Start Failover, tetapi, mungkin, dalam kerangka artikel terpisah.