忘れかけのIT備忘録

今まで学んできた知識や小技、なるほど!と思ったことをメモするブログです。

ASMの障害グループを使用したデータ保護検証

ASMの障害グループについて、机上の知識はあるものの、実務経験が無いため、実際の動きを検証してみました。

■検証環境
OS:Oracle Linux 6.5
GI:Oracle Grid Infrastructure 12c Release 1 (12.1.0.2.0) Enterprise Edition
DB:Oracle Database 12c Release 1 (12.1.0.2.0) Enterprise Edition
※2ノードRAC(管理者管理型DB)

■前提
・ASMの冗長構成は標準冗長構成(2多重)

■設定情報

クラスタリソース情報
[root@node1 ~]# /u01/app/12.1.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.DATA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.FRA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.asm
               ONLINE  ONLINE       node1                    Started,STABLE
               ONLINE  ONLINE       node2                    Started,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.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       node1                    169.254.243.236 192.
                                                                                 168.100.101,STABLE
ora.cvu
      1        ONLINE  ONLINE       node2                    STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       node1                    Open,STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.oc4j
      1        ONLINE  ONLINE       node2                    STABLE
ora.orcl.db
      1        ONLINE  ONLINE       node1                    Open,STABLE
      2        ONLINE  ONLINE       node2                    Open,STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
--------------------------------------------------------------------------------

ディスク・グループ構成
SQL> select
  2    g.group_number, g.name, g.type REDUNDANCY, d.disk_number, d.MOUNT_STATUS, d.HEADER_STATUS, d.MODE_STATUS, d.STATE, round(d.TOTAL_MB/1024, 2) TOTAL_GB, round(d.FREE_MB/1024, 2) FREE_GB, d.NAME, d.FAILGROUP, d.PATH, d.VOTING_FILE
  3  from
  4    v$asm_disk d, v$asm_diskgroup g
  5  where
  6    d.group_number = g.group_number
  7  order by
  8    g.group_number, d.disk_number;

GROUP_NUMBER NAME       REDUNDANCY         DISK_NUMBER MOUNT_STATUS         HEADER_STATUS        MODE_STATUS          STATE                  TOTAL_GB    FREE_GB NAME       FAILGROUP            PATH                 VOT
------------ ---------- ------------------ ----------- -------------------- -------------------- -------------------- -------------------- ---------- ---------- ---------- -------------------- -------------------- ---
           1 CRS        NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8       5.02 CRS_0000   CRS_0000             /dev/sdb1            Y
           1 CRS        NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8       5.03 CRS_0001   CRS_0001             /dev/sdc1            Y
           1 CRS        NORMAL                       2 CACHED               MEMBER               ONLINE               NORMAL                        8       5.02 CRS_0002   CRS_0002             /dev/sdd1            Y
           2 DATA       NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8        6.3 DATA_0000  FG2                  /dev/sdg1            N
           2 DATA       NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8        6.3 DATA_0001  FG2                  /dev/sdh1            N
           2 DATA       NORMAL                       2 CACHED               MEMBER               ONLINE               NORMAL                        8        6.3 DATA_0002  FG1                  /dev/sde1            N
           2 DATA       NORMAL                       3 CACHED               MEMBER               ONLINE               NORMAL                        8        6.3 DATA_0003  FG1                  /dev/sdf1            N
           3 FRA        NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8       7.83 FRA_0000   FRA_0000             /dev/sdi1            N
           3 FRA        NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8       7.83 FRA_0001   FRA_0001             /dev/sdj1            N
※DATA:アプリデータのみ格納
※CRS:OCR、投票ディスク、ASM SPFILE、ASM パスワードファイルなど格納
※FRA:制御ファイル、DB SPFILE、REDOログ、アーカイブログ、DB パスワードファイルなど格納

 

■検証パターン
①DATAディスク・グループのFG1障害グループ障害 (一部破損)
②DATAディスク・グループのFG1、FG2障害グループ障害 (全損)

■検証
①DATAディスク・グループのFG1障害グループ障害 (一部破損)
一部の障害グループ(FG1)が破損した場合、DBからアプリデータをSELECTできるか検証します

【検証手順】
1. FG1障害グループ破壊前にDBからアプリデータをSELECT
2. ddコマンドでFG1障害グループを構成するASMディスクを論理破壊
3. FG1障害グループ破壊後にDBからアプリデータをSELECT

【想定】
FG1障害グループが破損しても、FG2障害グループが稼働しているため、正常にアプリデータをSELECTできるはず

【検証結果】
FG1障害グループ破損後も正常にアプリデータをSELECTできた

【作業ログ】

1. FG1障害グループ破壊前にDBからアプリデータをSELECT
SQL> select * from emp;

     EMPNO ENAME                          JOB                                MGR HIREDATE        SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- -------- ---------- ---------- ----------
      7369 SMITH                          CLERK                             7902 80-12-17        800                    20
      7499 ALLEN                          SALESMAN                          7698 81-02-20       1600        300         30
      7521 WARD                           SALESMAN                          7698 81-02-22       1250        500         30
      7566 JONES                          MANAGER                           7839 81-04-02       2975                    20
      7654 MARTIN                         SALESMAN                          7698 81-09-28       1250       1400         30
      7698 BLAKE                          MANAGER                           7839 81-05-01       2850                    30
      7782 CLARK                          MANAGER                           7839 81-06-09       2450                    10
      7839 KING                           PRESIDENT                              81-11-17       5000                    10
      7844 TURNER                         SALESMAN                          7698 81-09-08       1500          0         30
      7900 JAMES                          CLERK                             7698 81-12-03        950                    30
      7902 FORD                           ANALYST                           7566 81-12-03       3000                    20
      7934 MILLER                         CLERK                             7782 82-01-23       1300                    10

12行が選択されました。

2. ddコマンドでFG1障害グループを構成するASMディスクを論理破壊
[root@node1 ~]# dd if=/dev/zero of=/dev/sde bs=1M
dd: writing `/dev/sde': デバイスに空き領域がありません
8193+0 records in
8192+0 records out
8589934592 bytes (8.6 GB) copied, 5.5338 s, 1.6 GB/s
[root@node1 ~]# dd if=/dev/zero of=/dev/sdf bs=1M
dd: writing `/dev/sdf': デバイスに空き領域がありません
8193+0 records in
8192+0 records out
8589934592 bytes (8.6 GB) copied, 5.90776 s, 1.5 GB/s

3. FG1障害グループ破壊後にDBからアプリデータをSELECT
SQL> select * from emp;

     EMPNO ENAME                          JOB                                MGR HIREDATE        SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- -------- ---------- ---------- ----------
      7369 SMITH                          CLERK                             7902 80-12-17        800                    20
      7499 ALLEN                          SALESMAN                          7698 81-02-20       1600        300         30
      7521 WARD                           SALESMAN                          7698 81-02-22       1250        500         30
      7566 JONES                          MANAGER                           7839 81-04-02       2975                    20
      7654 MARTIN                         SALESMAN                          7698 81-09-28       1250       1400         30
      7698 BLAKE                          MANAGER                           7839 81-05-01       2850                    30
      7782 CLARK                          MANAGER                           7839 81-06-09       2450                    10
      7839 KING                           PRESIDENT                              81-11-17       5000                    10
      7844 TURNER                         SALESMAN                          7698 81-09-08       1500          0         30
      7900 JAMES                          CLERK                             7698 81-12-03        950                    30
      7902 FORD                           ANALYST                           7566 81-12-03       3000                    20
      7934 MILLER                         CLERK                             7782 82-01-23       1300                    10

12行が選択されました。

インスタンス2のDBアラートログに下記メッセージが出力されていました
Hex dump of (file 3, block 84609) in trace file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_w000_3232.trc

Corrupt block relative dba: 0x00c14a81 (file 3, block 84609)
Completely zero block found during buffer read

Reading datafile '+DATA/orcl/sysaux01.dbf' for corruption at rdba: 0x00c14a81 (file 3, block 84609)
Read datafile mirror 'DATA_0003' (file 3, block 84609) found same corrupt data (no logical check)
Read datafile mirror '' (file 3, block 84609) found valid data
Hex dump of (file 3, block 84609) in trace file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_w000_3232.trc

Hex dump of (file 3, block 84610) in trace file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_w000_3232.trc

Corrupt block relative dba: 0x00c14a82 (file 3, block 84610)
Completely zero block found during buffer read

 

②DATAディスク・グループのFG1、FG2障害グループ障害 (全損)
すべての障害グループ(FG1、FG2)が破損した場合、アプリデータをSELECTできるか検証します

【検証手順】
1. FG2障害グループ破壊前にDBからアプリデータをSELECT
2. ddコマンドでFG2障害グループを構成するASMディスクを論理破壊
3. FG2障害グループ破壊後にDBからアプリデータをSELECT

【想定】
検証パターン①でFG1障害グループが破損しており、FG2障害グループも破損するため、アプリデータをSELECTできないはず

【検証結果】
FG2障害グループ破損後はアプリデータをSELECTできなかった

【作業ログ】

1. FG2障害グループ破壊前にDBからアプリデータをSELECT
SQL> select * from emp;

     EMPNO ENAME                          JOB                                MGR HIREDATE        SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- -------- ---------- ---------- ----------
      7369 SMITH                          CLERK                             7902 80-12-17        800                    20
      7499 ALLEN                          SALESMAN                          7698 81-02-20       1600        300         30
      7521 WARD                           SALESMAN                          7698 81-02-22       1250        500         30
      7566 JONES                          MANAGER                           7839 81-04-02       2975                    20
      7654 MARTIN                         SALESMAN                          7698 81-09-28       1250       1400         30
      7698 BLAKE                          MANAGER                           7839 81-05-01       2850                    30
      7782 CLARK                          MANAGER                           7839 81-06-09       2450                    10
      7839 KING                           PRESIDENT                              81-11-17       5000                    10
      7844 TURNER                         SALESMAN                          7698 81-09-08       1500          0         30
      7900 JAMES                          CLERK                             7698 81-12-03        950                    30
      7902 FORD                           ANALYST                           7566 81-12-03       3000                    20
      7934 MILLER                         CLERK                             7782 82-01-23       1300                    10

12行が選択されました。

2. ddコマンドでFG2障害グループを構成するASMディスクを論理破壊
[root@node1 ~]# dd if=/dev/zero of=/dev/sdg bs=1M
dd: writing `/dev/sdg': デバイスに空き領域がありません
8193+0 records in
8192+0 records out
8589934592 bytes (8.6 GB) copied, 4.9955 s, 1.7 GB/s
[root@node1 ~]# dd if=/dev/zero of=/dev/sdh bs=1M
dd: writing `/dev/sdh': デバイスに空き領域がありません
8193+0 records in
8192+0 records out
8589934592 bytes (8.6 GB) copied, 5.21187 s, 1.6 GB/s

3. FG2障害グループ破壊後にDBからアプリデータをSELECT
SQL> select * from emp;
select * from emp
*
行1でエラーが発生しました。:
ORA-03135: 接続が失われました
プロセスID: 23842
セッションID: 142、シリアル番号: 35899

インスタンス1・2のDBアラートログに下記メッセージが出力されていました
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_dbw0_25889.trc:
ORA-01157: ???????1???/???????? - DBWR??????????????????
ORA-01110: ???????1: '+DATA/orcl/system01.dbf'
ORA-17503: ksfdopn:2 ????+DATA/orcl/system01.dbf????????????
ORA-15001: ?????????"DATA"??????????????????????
ORA-15001: diskgroup "DATA" does not exist or is not mounted
Tue Sep 06 16:50:04 2022
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_dbw0_25889.trc:
ORA-01157: ???????3???/???????? - DBWR??????????????????
ORA-01110: ???????3: '+DATA/orcl/sysaux01.dbf'
ORA-17503: ksfdopn:2 ????+DATA/orcl/sysaux01.dbf????????????
ORA-15001: ?????????"DATA"??????????????????????
ORA-15001: diskgroup "DATA" does not exist or is not mounted
Tue Sep 06 16:50:04 2022
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_dbw0_25889.trc:
ORA-01157: ???????5???/???????? - DBWR??????????????????
ORA-01110: ???????5: '+DATA/orcl/example01.dbf'
ORA-17503: ksfdopn:2 ????+DATA/orcl/example01.dbf????????????
ORA-15001: ?????????"DATA"??????????????????????
ORA-15001: diskgroup "DATA" does not exist or is not mounted
Tue Sep 06 16:50:04 2022
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_dbw0_25889.trc:
ORA-01157: ???????6???/???????? - DBWR??????????????????
ORA-01110: ???????6: '+DATA/orcl/users01.dbf'
ORA-17503: ksfdopn:2 ????+DATA/orcl/users01.dbf????????????
ORA-15001: ?????????"DATA"??????????????????????
ORA-15001: diskgroup "DATA" does not exist or is not mounted
Ping without log force is disabled

インスタンス1・2のトレースファイルを見たら日本語が文字化けせず出力されていました
ORA-751 occurred during recovery, instance will be terminated
ORA-00751: ファイルのミラー復元ステータスを取得できませんでした
ORA-01110: データファイル1: '+DATA/orcl/users01.dbf'
ORA-15118: ASMディスク・グループ'DATA'が強制ディスマウントされました。

★ASMインスタンスでディスク・グループ情報を取得したところ、最終的にDATAディスク・グループの情報が削除されました

SQL> select
  2    g.group_number, g.name, g.type REDUNDANCY, d.disk_number, d.MOUNT_STATUS, d.HEADER_STATUS, d.MODE_STATUS, d.STATE, round(d.TOTAL_MB/1024, 2) TOTAL_GB, round(d.FREE_MB/1024, 2) FREE_GB, d.NAME, d.FAILGROUP, d.PATH, d.VOTING_FILE
  3  from
  4    v$asm_disk d, v$asm_diskgroup g
  5  where
  6    d.group_number = g.group_number
  7  order by
  8    g.group_number, d.disk_number;

GROUP_NUMBER NAME       REDUNDANCY         DISK_NUMBER MOUNT_STATUS         HEADER_STATUS        MODE_STATUS          STATE                  TOTAL_GB    FREE_GB NAME       FAILGROUP            PATH                 VOT

------------ ---------- ------------------ ----------- -------------------- -------------------- -------------------- -------------------- ---------- ---------- ---------- -------------------- -------------------- ---
           0 DATA                                    0 CLOSED               CANDIDATE            ONLINE               NORMAL                        0          0                                 /dev/sde1            N
           0 DATA                                    1 CLOSED               CANDIDATE            ONLINE               NORMAL                        0          0                                 /dev/sdg1            N
           0 DATA                                    2 CLOSED               MEMBER               ONLINE               NORMAL                        0          0                                 /dev/sdh1            N
           0 DATA                                    4 CLOSED               CANDIDATE            ONLINE               NORMAL                        0          0                                 /dev/sdf1            N
           1 CRS        NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8       5.02 CRS_0000   CRS_0000             /dev/sdb1            Y
           1 CRS        NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8       5.03 CRS_0001   CRS_0001             /dev/sdc1            Y
           1 CRS        NORMAL                       2 CACHED               MEMBER               ONLINE               NORMAL                        8       5.02 CRS_0002   CRS_0002             /dev/sdd1            Y
           3 FRA        NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8        5.5 FRA_0000   FRA_0000             /dev/sdi1            N
           3 FRA        NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8        5.5 FRA_0001   FRA_0001             /dev/sdj1            N
 ↓ 数秒後
GROUP_NUMBER NAME       REDUNDANCY         DISK_NUMBER MOUNT_STATUS         HEADER_STATUS        MODE_STATUS          STATE                  TOTAL_GB    FREE_GB NAME       FAILGROUP            PATH                 VOT
------------ ---------- ------------------ ----------- -------------------- -------------------- -------------------- -------------------- ---------- ---------- ---------- -------------------- -------------------- ---
           1 CRS        NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8       5.02 CRS_0000   CRS_0000             /dev/sdb1            Y
           1 CRS        NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8       5.03 CRS_0001   CRS_0001             /dev/sdc1            Y
           1 CRS        NORMAL                       2 CACHED               MEMBER               ONLINE               NORMAL                        8       5.02 CRS_0002   CRS_0002             /dev/sdd1            Y
           3 FRA        NORMAL                       0 CACHED               MEMBER               ONLINE               NORMAL                        8        5.5 FRA_0000   FRA_0000             /dev/sdi1            N
           3 FRA        NORMAL                       1 CACHED               MEMBER               ONLINE               NORMAL                        8        5.5 FRA_0001   FRA_0001             /dev/sdj1            N

クラスタリソース情報もDATAディスク・グループ、DBリソースがOFFLINEになっていました
[root@node1 ~]# /u01/app/12.1.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.DATA.dg
               OFFLINE OFFLINE      node1                    STABLE
               OFFLINE OFFLINE      node2                    STABLE
ora.FRA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.asm
               ONLINE  ONLINE       node1                    Started,STABLE
               ONLINE  ONLINE       node2                    Started,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.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       node1                    169.254.243.236 192.
                                                                                 168.100.101,STABLE
ora.cvu
      1        ONLINE  ONLINE       node2                    STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       node1                    Open,STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.oc4j
      1        ONLINE  ONLINE       node2                    STABLE
ora.orcl.db
      1        ONLINE  OFFLINE                               Instance Shutdown,ST
                                                                             ABLE
      2        ONLINE  OFFLINE                               Instance Shutdown,ST
                                                                             ABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
--------------------------------------------------------------------------------

 

■参考資料
オラクルマスター教科書 Oracle Expert RAC 11gR2
Oracle Database 11g Release 2 RAC実践ガイド 基礎から学ぶRAC構築・管理

■おわりに
今回は標準冗長構成(2多重)でしたが、外部冗長構成の場合、ASMエクステントはストライピングやミラーリングされないため、ストレージ側で冗長化します(RAID)

なお、ASM側とRAID側でそれぞれミラーリングする場合、書き込みのオーバーヘッドが問題になるため、非推奨だそうです。

サービスのTAF(透過的アプリケーションフェイルオーバー)検証

サービスのTAF(透過的アプリケーションフェイルオーバー)について、机上の知識はあるものの、実務経験が無いため、実際の動きを検証してみました。

■検証環境
OS:Oracle Linux 6.5
GI:Oracle Grid Infrastructure 12c Release 1 (12.1.0.2.0) Enterprise Edition

DB:Oracle Database 12c Release 1 (12.1.0.2.0) Enterprise Edition
※2ノードRAC(管理者管理型DB)

■前提
・SCANを使用しています
DNSサーバはdnsmasqを使用しています
・ノード1を疑似クライアントとしています (※1)
(※1) 本来ならクライアント用のアプリケーションサーバを建てて、JDBCやOCI等のドライバを入れるべきですが割愛しました

■設定情報

クラスタリソース情報
[root@node1 ~]# /u01/app/12.1.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.FRA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.asm
               ONLINE  ONLINE       node1                    Started,STABLE
               ONLINE  ONLINE       node2                    Started,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.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       node1                    169.254.105.185 192.
                                                                                 168.100.101,STABLE
ora.cvu
      1        ONLINE  ONLINE       node2                    STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       node1                    Open,STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.oc4j
      1        ONLINE  ONLINE       node2                    STABLE
ora.orcl.db
      1        ONLINE  ONLINE       node1                    Open,STABLE
      2        ONLINE  ONLINE       node2                    Open,STABLE
ora.orcl.fuga.svc ★検証用のサービス
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
--------------------------------------------------------------------------------

リスナーの登録情報
#ノード1
[grid@node1 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"fuga"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...

#ノード2
[grid@node2 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"fuga"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...

疑似クライアントのネットサービス名情報
#ノード1、ノード2
[oracle@node1 ~]$ cat /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

FUGA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = fuga)
    )
  )

 

■検証パターン
①フェイルオーバータイプNONEの検証
②フェイルオーバータイプSESSIONの検証
③フェイルオーバータイプSELECTの検証

■検証
①フェイルオーバータイプNONEの検証
疑似クライアントからfugaサービス(failovertype:NONE)に接続後、接続先インスタンスで疑似障害を発生させ、セッションがフェイルオーバーされるか検証します

サービスの情報
[oracle@node1 ~]$ srvctl config service -db orcl -service fuga
サービス名: fuga
サーバー・プール: 
カーディナリティ: 2
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: 
フェイルオーバー・メソッド: 
TAFフェイルオーバー再試行: 
TAFフェイルオーバー遅延: 
接続ロード・バランシングの目標: LONG
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: NONE
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2
使用可能なインスタンス:

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@fuga」を実行する
2. 接続先インスタンス(本検証ではインスタンス2)のSMONプロセスをキルして疑似障害を発生させる
3. 接続中のセッションでSELECT(インスタンス情報取得)を実行する
 →たぶん実行できないので、いったんセッションを終了してインスタンスへ再接続する
4. インスタンスへ再接続

【想定】
セッションはフェイルオーバーされないが、SMONプロセスが再起動され、任意のインスタンスへ再接続できるはず

【検証結果】
インスタンスへ再接続できた

【作業ログ】

1. 疑似クライアントからインスタンスへ接続
[oracle@node1 ~]$ sqlplus system/password@fuga

SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2 ★インスタンス2へ接続中

※別セッションで接続中のセッション情報確認
SQL> select inst_id, username, sid, service_name, failover_type, failover_method, failed_over from gv$session where username='SYSTEM';

INST_ID    USERNAME             SID        SERVICE_NAME         FAILOVER_TYPE                           FAILOVER_METHOD                FAILED_OVER
---------- -------------------- ---------- -------------------- --------------------------------------- ------------------------------ -----------
2          SYSTEM               249        fuga                 NONE                                    NONE                           NO

2. 接続先インスタンス(本検証ではインスタンス2)のSMONプロセスをキル
[root@node2 ~]# ps -ef | grep smon | grep -v grep
grid      3831     1  0 14:18 ?        00:00:00 asm_smon_+ASM2
root      3896     1  0 14:18 ?        00:00:20 /u01/app/12.1.0/grid/bin/osysmond.bin
oracle    4990     1  0 14:19 ?        00:00:00 ora_smon_orcl2
[root@node2 ~]# kill -9 4990

3. 接続中のセッションでSELECT(インスタンス情報取得)を実行
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました プロセスID:
22335
セッションID: 249、シリアル番号: 14843


SQL> select instance_name from v$instance;
ERROR:
ORA-03114: Oracleに接続されていません。

4. インスタンスへ再接続
[oracle@node1 ~]$ sqlplus system/password@fuga

SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1
インスタンスへ再接続できた(たまたまorcl1ですが、ロードバランスでorcl1に接続されただけでフェイルオーバーされたわけではありません)

※別セッションで接続中のセッション情報確認
SQL> select inst_id, username, sid, service_name, failover_type, failover_method, failed_over from gv$session where username='SYSTEM';

INST_ID    USERNAME             SID        SERVICE_NAME         FAILOVER_TYPE                           FAILOVER_METHOD                FAILED_OVER
---------- -------------------- ---------- -------------------- --------------------------------------- ------------------------------ -----------
1          SYSTEM               260        fuga                 NONE                                    NONE                           NO

 

②フェイルオーバータイプSESSIONの検証
疑似クライアントからfugaサービス(failovertype:SESSION)に接続後、接続先インスタンスで疑似障害を発生させ、セッションがフェイルオーバーされるか検証します

サービスの情報
[oracle@node1 ~]$ srvctl config service -db orcl -service fuga
サービス名: fuga
サーバー・プール: 
カーディナリティ: 2
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: SESSION
フェイルオーバー・メソッド: BASIC
TAFフェイルオーバー再試行: 180
TAFフェイルオーバー遅延: 5
接続ロード・バランシングの目標: LONG
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: BASIC
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2
使用可能なインスタンス:

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@fuga」を実行する
2. 接続先インスタンス(本検証ではインスタンス2)のSMONプロセスをキルして疑似障害を発生させる
3. 接続中のセッションでSELECT(インスタンス情報取得)を実行する

【想定】
セッションはフェイルオーバーされるはず(インスタンスへ再接続しなくてもSELECT(インスタンス情報取得)を実行できるはず)

【検証結果】
セッションはフェイルオーバーされた(インスタンスへ再接続しなくてもSELECT(インスタンス情報取得)を実行できた)

【作業ログ】

1. 疑似クライアントからインスタンスへ接続
[oracle@node1 ~]$ sqlplus system/password@fuga

SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2 ★インスタンス2へ接続中

※別セッションで接続中のセッション情報確認
SQL> select inst_id, username, sid, service_name, failover_type, failover_method, failed_over from gv$session where username='SYSTEM';

INST_ID    USERNAME             SID        SERVICE_NAME         FAILOVER_TYPE                           FAILOVER_METHOD                FAILED_OV
---------- -------------------- ---------- -------------------- --------------------------------------- ------------------------------ ---------
2          SYSTEM               131        fuga                 SESSION                                 BASIC                          NO

2. 接続先インスタンス(本検証ではインスタンス2)のSMONプロセスをキル
[root@node2 ~]# ps -ef | grep smon | grep -v grep

grid      3831     1  0 14:18 ?        00:00:00 asm_smon_+ASM2
root      3896     1  0 14:18 ?        00:00:30 /u01/app/12.1.0/grid/bin/osysmond.bin
oracle   23542     1  0 15:01 ?        00:00:00 ora_smon_orcl2
[root@node2 ~]# kill -9 23542

3. 接続中のセッションでSELECT(インスタンス情報取得)を実行
SQL> --kill直後
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
行1でエラーが発生しました。:
ORA-25408: 安全にコールを再実行することはできません。


SQL> --killから5秒後(failoverdelayに指定した時間)
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1
★セッションがインスタンス1へフェイルオーバーしましたが、セッションは継続して使用可能

※別セッションで接続中のセッション情報確認
SQL> select inst_id, username, sid, service_name, failover_type, failover_method, failed_over from gv$session where username='SYSTEM';

INST_ID    USERNAME             SID        SERVICE_NAME         FAILOVER_TYPE                           FAILOVER_METHOD                FAILED_OVER
---------- -------------------- ---------- -------------------- --------------------------------------- ------------------------------ -----------
1          SYSTEM               370        fuga                 SESSION                                 BASIC                          YES
★フェイルオーバーされたので「FAILED_OVER」列が「YES」に変わっています

 

③フェイルオーバータイプSELECTの検証
疑似クライアントからfugaサービス(failovertype:SELECT)に接続後、接続先インスタンスでSELECT(テストテーブルのフルスキャン)実行中に疑似障害を発生させ、セッションがフェイルオーバーされ、SELECT(テストテーブルのフルスキャン)が継続して実行されるか検証します
※事前にSELECT用のテストテーブル(約10MB)を作成しています

サービスの情報
[oracle@node1 ~]$ srvctl config service -db orcl -service fuga
サービス名: fuga
サーバー・プール: 
カーディナリティ: 2
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: SELECT
フェイルオーバー・メソッド: BASIC
TAFフェイルオーバー再試行: 180
TAFフェイルオーバー遅延: 5
接続ロード・バランシングの目標: LONG
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: BASIC
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2
使用可能なインスタンス:

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@fuga」を実行する
2. 接続中のセッションでテストテーブルをSELECTする
3. SELECT実行中の状態で、接続先インスタンス(本検証ではインスタンス2)のSMONプロセスをキルして疑似障害を発生させる

【想定】
セッションはフェイルオーバーされるはず(インスタンスへ再接続しなくてもテストテーブルのSELECTは継続されるはず)

【検証結果】
セッションはフェイルオーバーされた(インスタンスへ再接続しなくてもテストテーブルのSELECTは継続された)

【作業ログ】

1. 疑似クライアントからインスタンスへ接続
[oracle@node1 ~]$ sqlplus system/password@fuga

SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2 ★インスタンス2へ接続中

※別セッションで接続中のセッション情報確認
SQL> select inst_id, username, sid, service_name, failover_type, failover_method, failed_over from gv$session where username='SYSTEM';

INST_ID    USERNAME             SID        SERVICE_NAME         FAILOVER_TYPE                           FAILOVER_METHOD                FAILED_OVER
---------- -------------------- ---------- -------------------- --------------------------------------- ------------------------------ -----------
2          SYSTEM               372        fuga                 SELECT                                  BASIC                          NO

2. 接続中のセッションでテストテーブルをSELECTする
SQL> select * from taf_test;

TEXT
----------------------------------------------------------------------------------------------------
DEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEAD
DEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEAD
DEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEAD



★SELECT完了まで10秒ぐらいかかります

3. SELECT実行中の状態で、接続先インスタンス(本検証ではインスタンス2)のSMONプロセスをキルして疑似障害を発生させる
[root@node2 ~]# ps -ef | grep smon | grep -v grep
grid      3831     1  0 14:18 ?        00:00:00 asm_smon_+ASM2
root      3896     1  0 14:18 ?        00:01:02 /u01/app/12.1.0/grid/bin/osysmond.bin
oracle    6662     1  0 15:51 ?        00:00:00 ora_smon_orcl2
[root@node2 ~]# kill -9 6662

※テストテーブルをSELECT中のセッション画面



DEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEAD
DEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEAD
DEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEADBEAFDEAD

60000行が選択されました。

SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1
★セッションがインスタンス1へフェイルオーバーしましたが、テストテーブルのSELECTは継続されていました

※別セッションで接続中のセッション情報確認
SQL> select inst_id, username, sid, service_name, failover_type, failover_method, failed_over from gv$session where username='SYSTEM';

INST_ID    USERNAME             SID        SERVICE_NAME         FAILOVER_TYPE                           FAILOVER_METHOD                FAILED_OVER
---------- -------------------- ---------- -------------------- --------------------------------------- ------------------------------ -----------
1          SYSTEM               251        fuga                 SELECT                                  BASIC                          YES
★フェイルオーバーされたので「FAILED_OVER」列が「YES」に変わっています

 

■おわりに
今回はTAF(透過的アプリケーションフェイルオーバー)の具体的な動きを確認することができました。

ただし、12c Release 1のため、AC(アプリケーション・コンティニュイティ:INSERT、UPDATE等のトランザクションの自動再実行)は検証できませんでした。
機会があれば検証してみようと思います。

サービスのロード・バランシング検証

サービスのロード・バランシングについて、机上の知識はあるものの、実務経験が無いため、実際の動きを検証しました。

■検証環境
OS:Oracle Linux 6.5
GI:Oracle Grid Infrastructure 12c Release 1 (12.1.0.2.0) Enterprise Edition
DB:Oracle Database 12c Release 1 (12.1.0.2.0) Enterprise Edition
※2ノードRAC(管理者管理型DB)

■前提
・SCANを使用しているため、サーバ側ロード・バランシングの検証になります
DNSサーバはdnsmasqを使用しています
・ノード1を疑似クライアントとしています (※1)
・接続時ロード・バランシングのみの検証です (※2)
(※1) 本来ならクライアント用のアプリケーションサーバを建てて、JDBCやOCI等のドライバを入れるべきですが割愛しました
(※2) コネクションプールを使用していないため、実行時ロード・バランシング(ランタイム・ロード・バランシング)は検証していません(ロード・バランシング・アドバイザ未使用)

■設定情報

 クラスタリソース情報
[root@node1 ~]# /u01/app/12.1.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.FRA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
ora.asm
               ONLINE  ONLINE       node1                    Started,STABLE
               ONLINE  ONLINE       node2                    Started,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.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       node1                    169.254.105.185 192.
                                                                                 168.100.101,STABLE
ora.cvu
      1        ONLINE  ONLINE       node2                    STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       node1                    Open,STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.oc4j
      1        ONLINE  ONLINE       node2                    STABLE
ora.orcl.db
      1        ONLINE  ONLINE       node1                    Open,STABLE
      2        ONLINE  ONLINE       node2                    Open,STABLE
ora.orcl.hoge.svc ★検証用のサービス
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
--------------------------------------------------------------------------------

リスナーの登録情報
#ノード1
[grid@node1 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...

#ノード2
[grid@node2 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...

疑似クライアントのネットサービス名情報
#ノード1、ノード2
[oracle@node1 ~]$ cat /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

 

■検証パターン
①セッション数均等化の検証
②CPU負荷分散の検証(全ノード:CPU負荷なし)
③CPU負荷分散の検証(ノード1:CPU負荷あり、ノード2:CPU負荷なし)

■検証
①セッション数均等化の検証
1秒単位で疑似クライアントからhogeサービス(clbgoal:LONG)に接続するのを1分間実行し、セッションが各インスタンスに振り分けられる割合を検証します

サービスの情報
[oracle@node1 ~]$ srvctl config service -db orcl -service hoge
サービス名: hoge
サーバー・プール: 
カーディナリティ: 2
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: 
フェイルオーバー・メソッド: 
TAFフェイルオーバー再試行: 
TAFフェイルオーバー遅延: 
接続ロード・バランシングの目標: LONG
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: NONE
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2
使用可能なインスタンス:

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で1分間実行する
2. gv$sessionから全インスタンスのセッション情報を取得する (※1)
(※1) セッション情報取得SQL
select inst_id, count(inst_id) as curr_sessions
from gv$session
where username = 'SYSTEM' and program like '%sqlplus%'
group by inst_id
order by inst_id;

【想定】
セッションは各インスタンスにほぼ均等に振り分けられるはず

【検証結果】
   INST_ID CURR_SESSIONS
---------- -------------
         1            30
         2            30
★セッションが各インスタンスに綺麗に均等に振り分けられました

②CPU負荷分散の検証(全ノード:CPU負荷なし)
全ノードでCPU負荷が発生していない状態で、1秒単位で疑似クライアントからhogeサービス(clbgoal:SHORT、rlbgoal:NONE)に接続するのを1分間実行し、セッションが各インスタンスに振り分けられる割合を検証します

サービスの情報
[oracle@node1 ~]$ srvctl config service -db orcl -service hoge
サービス名: hoge
サーバー・プール: 
カーディナリティ: 2
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: 
フェイルオーバー・メソッド: 
TAFフェイルオーバー再試行: 
TAFフェイルオーバー遅延: 
接続ロード・バランシングの目標: SHORT
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: NONE
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2
使用可能なインスタンス:

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で1分間実行する
2. gv$sessionから全インスタンスのセッション情報を取得する (※1)
(※1) セッション情報取得SQLは、検証パターン①と同じです

【想定】
セッションは各インスタンスにほぼ均等に振り分けられるはず

【検証結果】
   INST_ID CURR_SESSIONS
---------- -------------
         1            29
         2            31
★セッションが各インスタンスにほぼ均等に振り分けられました

③CPU負荷分散の検証(ノード1:CPU負荷あり、ノード2:CPU負荷なし)
ノード1でCPU負荷が発生している状態で、1秒単位で疑似クライアントからhogeサービス(clbgoal:SHORT、rlbgoal:NONE)に接続するのを1分間実行して、セッションが各インスタンスに振り分けられる割合を検証します

サービスの情報
検証パターン②と同じ

【検証手順】
1. ノード1で疑似的にCPU負荷を発生させる (※1)
2. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で1分間実行する
3. gv$sessionから全インスタンスのセッション情報を取得する (※2)
(※1) ノード1で「yes > /dev/null &」を複数回実行し、CPU使用率が90%前後の状態を作っています
(※2) セッション情報取得SQLは、検証パターン①と同じです

【想定】
セッションはノード2(インスタンス2)に振り分けられるはず

【検証結果】
   INST_ID CURR_SESSIONS
---------- -------------
         1             1
         2            59
★ほとんどのセッションはノード2(インスタンス2)に振り分けられました

■おわりに
今回はSCANを使用したサービスのロード・バランシングの具体的な動きを確認することができました。
なお、サービスのロード・バランシングはSCANを使用しなくても可能です。
SCANを使用しない場合、各ノードのtnsnames.oraに各ノードVIPを指定して、local_listenerにローカルリスナー、remote_listenerに相手ノードのリスナーを指定します。
11gR2以降ならlistener_networksでネットワークセグメントを制御することも可能です。(前提としてクラスタリソースにネットワークリソースを追加する必要があります)

SCAN検証

SCANについて、机上の知識はあるものの、実務経験が無いため、実際の動きを検証しました。

SCAN(Single Client Access Name:単一クライアントアクセス名)は、11gR2の新機能でクライアントがインスタンスやサービスが起動しているノードを意識せず、DBに接続する方法です。
SCANはSCANリスナーと対応付けられており、SCANリスナーによってロードバランス(サーバー・ロード・バランス)とフェイルオーバーが提供されます。(従来(11gR1)までは各ノードのリスナーが提供していました)
ポリシー管理型データベースの場合、ノードVIPとインスタンスやサービスが動的に変更される(固定されていない)ため、SCANで接続するのが一般的です。

従来(11gR1)まではクライアントでノード名(ノードVIP)、ポート番号、サービス名を指定してDBに接続していました。
SCANはクライアントでSCAN名(SCAN VIP)、ポート番号、サービス名を指定してDBに接続します。

(例1) ローカルネーミング接続でノード名(ノードVIP)を指定する場合
HOGE =
  (DESCRIPTION =
    (FAILOVER = ON)(LOAD_BALANCE = ON)
    (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip.oracle12c.jp)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip.oracle12c.jp)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = node3-vip.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

(例2) ローカルネーミング接続でSCAN名(SCAN VIP)を指定する場合
HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

SCAN名はDNSサーバーかhostsファイルに設定します。
なお、DNSサーバーを使用する場合、最大3つまでのSCANリスナーを登録できますが、hostsを使用する場合、1つだけSCANリスナーを登録できます。
SCANリスナーはランダムにいずれかのノードで起動しており、クライアントが接続するインスタンスやサービスが登録されているローカルリスナーのアドレスをクライアントへ戻します。

SCANのメリットはノード追加・削除した場合でもクライアントのtnsnames.oraを修正せずにDBに接続できることだと思います。(とりあえずSCANに接続すれば、後はSCANリスナーが接続先のローカルリスナーアドレスを戻してくれるため)
ノードVIPを指定している場合、いちいちクライアントのtnsnames.oraを修正しないといけません。

では早速、SCANの動きを見てみようと思います。

■検証環境

①SCAN名で問い合わせ
②SCANリスナーアドレスを戻す(DNSラウンドロビンでSCANリスナーアドレスを1つ戻す)
③SCANリスナーに接続できるローカルリスナーを問い合わせ
④ローカルリスナーアドレスを戻す(対象サービスを提供するインスタンスのノード)
⑤ローカルリスナーに接続

■前提
DNSサーバーはdnsmasqを使用しています
・検証環境図ではクライアントからサービスへ接続するように書いていますが、検証ではnode1を疑似クライアントにしています(手抜きですみません)
・3ノードRAC(管理者管理型DB)

■設定情報

DNSサーバーのhosts
[root@dns ~]# cat /etc/hosts
192.168.56.101  node1.oracle12c.jp      node1      #ノード1
192.168.56.102  node2.oracle12c.jp      node2      #ノード2
192.168.56.103  node3.oracle12c.jp      node3      #ノード3
192.168.56.111  node1-vip.oracle12c.jp  node1-vip  #ノード1(VIP)
192.168.56.112  node2-vip.oracle12c.jp  node2-vip  #ノード2(VIP)
192.168.56.113  node3-vip.oracle12c.jp  node3-vip  #ノード3(VIP)

#scan
192.168.56.201  scan.oracle12c.jp       scan       #SCAN1
192.168.56.202  scan.oracle12c.jp       scan       #SCAN2
192.168.56.203  scan.oracle12c.jp       scan       #SCAN3

#dns
192.168.56.254  dns.oracle12c.jp        dns        #DNS

クラスタリソース情報
[root@node1 ~]# /u01/app/12.1.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.DATA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.FRA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.asm
               ONLINE  ONLINE       node1                    Started,STABLE
               ONLINE  ONLINE       node2                    Started,STABLE
               ONLINE  ONLINE       node3                    Started,STABLE
ora.net1.network
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.ons
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node2                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node3                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       node1                    169.254.243.236 192.
                                                                                 168.100.101,STABLE
ora.cvu
      1        OFFLINE OFFLINE                               STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       node1                    Open,STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.node3.vip
      1        ONLINE  ONLINE       node3                    STABLE
ora.oc4j
      1        ONLINE  ONLINE       node3                    STABLE
ora.orcl.db
      1        ONLINE  ONLINE       node1                    Open,STABLE
      2        ONLINE  ONLINE       node2                    Open,STABLE
      3        ONLINE  ONLINE       node3                    Open,STABLE
ora.orcl.hoge.svc
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
      3        ONLINE  ONLINE       node3                    STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node3                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
--------------------------------------------------------------------------------

サービス設定情報
[oracle@node1 ~]$ srvctl config service -db orcl -service hoge
サービス名: hoge
サーバー・プール: 
カーディナリティ: 3
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: 
フェイルオーバー・メソッド: 
TAFフェイルオーバー再試行: 
TAFフェイルオーバー遅延: 
接続ロード・バランシングの目標: LONG
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: NONE
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2,orcl3
使用可能なインスタンス:

SCAN設定情報 ※ノード2・3も同様
[grid@node1 ~]$ srvctl config scan
SCAN名: scan.oracle12c.jp、ネットワーク: 1
サブネットIPv4: 192.168.56.0/255.255.255.0/eth0, static
サブネットIPv6
SCAN 0 IPv4 VIP: 192.168.56.203
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
SCAN 1 IPv4 VIP: 192.168.56.201
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
SCAN 2 IPv4 VIP: 192.168.56.202
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています

SCAN状態 ※ノード2・3も同様
[grid@node1 ~]$ srvctl status scan
SCAN VIP scan1は有効です
SCAN VIP scan1はノードnode2で実行されています
SCAN VIP scan2は有効です
SCAN VIP scan2はノードnode3で実行されています
SCAN VIP scan3は有効です
SCAN VIP scan3はノードnode1で実行されています

SCANリスナー設定情報 ※ノード2・3も同様
[grid@node1 ~]$ srvctl config scan_listener
SCANリスナーLISTENER_SCAN1は存在します。ポート: TCP:1521
登録招待ノード: 
登録招待サブネット: 
SCANリスナーは有効です。
SCANリスナーはノード: で個別に有効になっています
SCANリスナーはノード: で個別に無効になっています
SCANリスナーLISTENER_SCAN2は存在します。ポート: TCP:1521
登録招待ノード: 
登録招待サブネット: 
SCANリスナーは有効です。
SCANリスナーはノード: で個別に有効になっています
SCANリスナーはノード: で個別に無効になっています
SCANリスナーLISTENER_SCAN3は存在します。ポート: TCP:1521
登録招待ノード: 
登録招待サブネット: 
SCANリスナーは有効です。
SCANリスナーはノード: で個別に有効になっています
SCANリスナーはノード: で個別に無効になっています

SCANリスナー状態 ※ノード2・3も同様
[grid@node1 ~]$ srvctl status scan_listener
SCANリスナーLISTENER_SCAN1は有効です
SCANリスナーLISTENER_SCAN1はノードnode2で実行されています
SCANリスナーLISTENER_SCAN2は有効です
SCANリスナーLISTENER_SCAN2はノードnode3で実行されています
SCANリスナーLISTENER_SCAN3は有効です
SCANリスナーLISTENER_SCAN3はノードnode1で実行されています

SCANリスナー状態
#ノード1
[grid@node1 ~]$ lsnrctl status LISTENER_SCAN3
サービスのサマリー...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード2
[grid@node2 ~]$ lsnrctl status LISTENER_SCAN1
サービスのサマリー...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード3
[grid@node3 ~]$ lsnrctl status LISTENER_SCAN2
サービスのサマリー...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

listener.ora設定情報
#ノード1
[grid@node1 ~]$ cat /u01/app/12.1.0/grid/network/admin/listener.ora
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR))))        # line added by Agent

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3 = ON

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2 = ON

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1 = ON

VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN3=OFF     # line added by Agent

VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN2=OFF     # line added by Agent

VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN1=OFF     # line added by Agent

VALID_NODE_CHECKING_REGISTRATION_LISTENER = SUBNET

LISTENER =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
    )
  )

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON

LISTENER_SCAN3 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN3))
    )
  )

LISTENER_SCAN2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN2))
    )
  )

LISTENER_SCAN1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN1))
    )
  )

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON              # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET        # line added by Agent

#ノード2
[grid@node2 ~]$ cat /u01/app/12.1.0/grid/network/admin/listener.ora
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3))))        # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2))))        # line added by Agent
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR))))                    # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))                    # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))))        # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN1=OFF                                             # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET                                                # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET                                                # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN2=OFF                                             # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN3=OFF                                             # line added by Agent

#ノード3
[grid@node3 ~]$ cat /u01/app/12.1.0/grid/network/admin/listener.ora
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR))))                    # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))                    # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2))))        # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN2=OFF                                             # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET                                                # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET                                                # line added by Agent

リスナー情報
#ノード1
[grid@node1 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード2
[grid@node2 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード3
[grid@node3 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

クライアントのtnsnames.ora設定情報
[oracle@node1 ~]$ cat /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

 

■検証パターン
hogeサービスへ接続

■検証
hogeサービスへ接続
疑似クライアントからSCANを使用してhogeサービスへ接続できるか検証します

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で10回実行する
2. 各ノードのリスナーログ、SCANリスナーログを確認して接続状況を確認する

【想定】
SCANを使用してhogeサービスへ接続できるはず

【検証結果】
SCANを使用してhogeサービスへ接続できた

【作業ログ】

1. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で10回実行する
※10回繰り返すスクリプトを使いました

2. 各ノードのリスナーログ、SCANリスナーログを確認して接続状況を確認する
接続するコマンドを10回繰り返した後の各ノードのリスナーログ、SCANリスナーログ見てみます
※接続時間帯で抜粋しています

ノード1のSCANリスナーログ(listener_scan3.log)
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42010)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42018)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42024)) * establish * hoge * 0

ノード1のリスナーログ(listener.log)
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32557)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32559)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32567)) * establish * hoge * 0

ノード2のSCANリスナーログ(listener_scan1.log)
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20101)) * establish * hoge * 0
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20109)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20115)) * establish * hoge * 0
18-9月 -2022 22:03:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20121)) * establish * hoge * 0

ノード2のリスナーログ(listener.log)
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28751)) * establish * hoge * 0
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28753)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28767)) * establish * hoge * 0

ノード3のSCANリスナーログ(listener_scan2.log)
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26347)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26355)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26361)) * establish * hoge * 0

ノード3のリスナーログ(listener.log)
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18658)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18666)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18668)) * establish * hoge * 0
18-9月 -2022 22:03:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18674)) * establish * hoge * 0

★ノードに関係なく、時系列でソートしてみます
SCANリスナーログ
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20101)) * establish * hoge * 0
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42010)) * establish * hoge * 0
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26347)) * establish * hoge * 0
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20109)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42018)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26355)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20115)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42024)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26361)) * establish * hoge * 0
18-9月 -2022 22:03:33 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26367)) * establish * hoge * 0

リスナーログ
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28751)) * establish * hoge * 0
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28753)) * establish * hoge * 0
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18658)) * establish * hoge * 0
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32557)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32559)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18666)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18668)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28767)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32567)) * establish * hoge * 0
18-9月 -2022 22:03:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18674)) * establish * hoge * 0
※ログでは2秒おきに記録されていますが、スクリプトでは1秒おきに接続するようにしています(おそらく接続時に1秒+スリープ1秒で計2秒かかっている?)

 

■参考資料
オラクルマスター教科書 Oracle Expert RAC 11gR2

■おわりに
SCANリスナーからどのローカルリスナーにリダイレクトしたかを見る方法は分かりませんでした。
ただ、SCANリスナーからいずれかのローカルリスナーにリダイレクトされていることは確認できるため、時間帯を見れば推測できると思います。

OracleクライアントとOracleサーバの基本的な接続形態(専用サーバー接続)

OracleクライアントがOracleサーバ上のデータベースのサービスに接続するまでの基本的な流れを整理しました。
なお、前提として専用サーバー接続の流れを書いています。

1.OracleクライアントがOracleサーバー上のリスナーに接続リクエストを要求する
2.着信を受けたリスナーは指定されたサービスを提供するインスタンスを検索する
3.リスナーが該当するサービスを持つサーバー・プロセスを生成する
4.リスナーが確立した接続をサーバー・プロセスに引き継ぐ
  →以降、Oracleクライアントとサーバー・プロセスが直接通信できる

サービス登録方法
サービスをリスナーに登録する方法は2種類ある
・静的サービス登録
・動的サービス登録

静的サービス登録
1521以外のポート番号、LOCAL_LISTENER初期化パラメータにリスナー名を指定していないときの登録方法

手動でリスナー起動後、リスナーがサービスを登録する
静的登録するサービス名をリスナー側(listener.ora)で設定する

(例)
・listener.ora
------------------------------------------------------------
<listener_name> =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = <port_number>))
    )
  )

SID_LIST_<listener_name> =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = <instance_name>)
      (GLOBAL_DBNAME = <glocal_dbname>)
      (ORACLE_HOME = <oracle_home_path>)
    )
  )
------------------------------------------------------------

動的サービス登録
インスタンス起動時、リスナープロセス(11gまではPMON、12c以降はLREG)が自動的にサービスをリスナーに登録する
動的登録するリスナー名をインスタンス側(LOCAL_LISTENER初期化パラメータ)で設定する
RACやData Guardでは必須の設定

(例)
・listener.ora
------------------------------------------------------------
<listener_name> =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = <port_number>))
    )
  )
------------------------------------------------------------

・LOCAL_LISTENER初期化パラメータ
------------------------------------------------------------
LOCAL_LISTENER = (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = <port_number>))
------------------------------------------------------------
※直接ADDRESS句を指定するのではなく、tnsnames.oraで設定した接続識別子(ネット・サービス名)を指定してもOK

※「SID_NAMEとか指定しなくていいの?」

 →不要です。SID_NAMEとかはインスタンスが持っている情報でサービス登録時にリスナーに自動的に登録される想定

なお、リスナーに登録されているサービスの確認方法も書いておきます。

サービスの情報は階層構造になっており、「サービス」>「インスタンス」>「ハンドラ」の順番で表示されます。
別の記事でも書いていますが、専用サーバー接続はリスナーが直接サーバー・プロセスへ接続要求を渡し、共有サーバー接続はリスナーがディスパッチャへ接続要求を渡し、負荷が低い共有サーバー・プロセスへ接続要求を渡します。

(例)
$ lsnrctl services LISTENER
------------------------------------------------------------
(略)
サービス"ORCL.oracle.com"には、1件のインスタンスがあります。
 インスタンス"ORCL"、状態READY には、このサービスに対する1件のハンドラがあります...
  ハンドラ:
   "DEDICATED" 確立:1 拒否:0
    LOCAL SERVER
(略)
------------------------------------------------------------

(補足)
ハンドラ…サービスに接続するときに使用する接続タイプ(専用サーバー接続・共有サーバー接続)
状態…サービス/インスタンスの登録状態

READY

動的サービス登録によって登録されたサービス
リスナーにサービスが登録されている=インスタンスは必ず稼働している(インスタンス起動時にリスナーがサービスを登録するため)、という前提のため、「READY」となる

UNKNOWN
静的サービス登録によって登録されたサービス
リスナーにサービスは登録されているが、インスタンスが稼働しているかは不明のため、「UNKNOWN」となる

特定のネットワークアドレス/サブネットマスクにて、IPアドレスを割り当て可能なホスト数および割り当て可能なIPアドレスを求める

例として、192.168.2.128/26ネットワークからIPアドレスを割り当て可能なホスト数および割り当て可能なIPアドレスを求めてみます。

192.168.2.128    ←ネットワークアドレス数(10進表記)
11000000.10101000.00000010.10000000    ←ネットワークアドレス数(2進表記)
11111111.11111111.11111111.11000000    ←サブネットマスク

赤色のビット:ネットワーク部
青色のビット:ホスト部

IPアドレスを割当て可能なホスト数
ホスト部のビットをすべて1に変換後、合計して+1する
 ★64
 ※111111(2) → 63+1 = 64
 ※ホスト部のビットの合計は63だが、IPアドレスの範囲は0始まりのため、0~63となる。個数で言うと64個になる
 ※別解として、255からサブネットマスクの第4オクテット192(11000000)を減算して+1する方法もある

ホスト部のうち、ビットがALL0(ネットワークアドレス)とALL1(ブロードキャストアドレス)はホストのIPアドレスとして割り当てられないため、「①」の値から-2する
 ★62
 ※これがホストに割り当て可能なIPアドレス
 ※ブロードキャストアドレスは「ネットワークアドレス + ホスト部のビット数の合計」の値から求められる。この例だと「128 + 63」= 191

ホストに割当て可能なIPアドレスの範囲
192.168.2.128/26ネットワークで割当て可能なIPアドレスは192.168.2.129~192.168.2.190となる。
※192.168.2.128はネットワークアドレスのため、ホストに割り当て不可
※192.168.2.191はブロードキャストアドレスのため、ホストに割り当て不可

Data Pump

●オブジェクトのデータだけエクスポートする場合、「content(ALL、DATA_ONLY、METADATA_ONLY)」パラメータを使用する

●エクスポートで出力するダンプファイルの出力先となるディレクトリオブジェクトが複数ある場合、下記の順番で決める
1.ファイルごとのディレクトリオブジェクト
2.DIRECTORYパラメータで指定されたディレクトリオブジェクト
3.環境変数DATA_PUMP_DIR
4.特権ユーザのDATA_PUMP_DIRディレクトリオブジェクト

●Data PumpのREMAPパラメータとして下記がある
・REMAP_DATAFILE
・REMAP_TABLE
・REMAP_TABLESPACE
・REMAP_SCHEMA