Oracle RAC(Real Application Clusters) 環境の構築が終わり、開発者から「tnsnames.ora の設定はどうすればいいですか?」と聞かれ、Oracle SCAN (スキャン) という聞き慣れない名前が出てきて戸惑っていませんか?
RAC 環境では、データベースのリスナーも Oracle Grid Infrastructure (GI) によってリソースとして管理されています。SCANリスナー とは何か、そして GI が管理するノード・リスナーとどう連携するのか、その仕組みを理解することが鍵となります。
この記事では、Oracle RAC への接続をシンプルにする「SCAN」の基本的な仕組みと、クライアント(アプリサーバー)に必要な tnsnames.ora の具体的な設定例を、初心者向けにわかりやすく解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
この記事でわかること: SCAN 接続のための tnsnames.ora 最短設定例
Oracle RAC (19c/12c以降) 環境へ接続するための、最も標準的な tnsnames.ora の設定です。クライアントはこの設定ファイル(または同等の接続文字列)を使います。
# "V19RAC" は任意の接続識別子
V19RAC =
(DESCRIPTION =
# HOST にはクラスタの「SCAN名」を指定する
(ADDRESS = (PROTOCOL = TCP)(HOST = v19rac-scan)(PORT = 1521))
(CONNECT_DATA =
# SID ではなく「サービス名」を指定する
(SERVICE_NAME = v19rac)
)
)
ポイント:
CONNECT_DATA:SIDではなく、DBA が RAC 上で定義したSERVICE_NAMEを指定します。HOST: ノード名ではなく、クラスタの代表名である SCAN 名 を指定します。
■1 つめのセッション
[oracle@v19rac2 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
V19RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = v19rac-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = v19rac)
)
)
[oracle@v19rac2 admin]$ sqlplus system/oracle@v19rac
SQL*Plus: Release 19.0.0.0.0 - Production on 日 11月 16 01:12:19 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> set lin 1000
SQL> col instance_name for a20
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
-------------------- ------------------------------------
v19rac1 OPEN
~~~~~~~★ノード 1
■2 つめのセッション
[oracle@v19rac2 ~]$ sqlplus system/oracle@v19rac
SQL*Plus: Release 19.0.0.0.0 - Production on 日 11月 16 01:14:01 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> set lin 1000
SQL> col instance_name for a20
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
-------------------- ------------------------------------
v19rac2 OPEN
~~~~~~~★ノード 2
SCANリスナーとは?なぜ必要なのか?
Oracle RAC 環境で必ず耳にする「SCAN(スキャン)」ですが、通常のリスナー(ローカルリスナー)との違いや、その必要性が直感的に理解しにくい機能でもあります。 ここでは、SCANの役割と導入された背景について、技術的な観点から平易に解説します。
1. なぜSCANが必要なのか?(従来の課題)
SCAN(Single Client Access Name)が導入される以前(Oracle 11g R1まで)のRAC環境では、クライアントがデータベースに接続するために、クラスタを構成する全ノードのIPアドレス(VIP) を知っておく必要がありました。
具体的には、クライアント側の設定ファイル(tnsnames.ora)に、すべてのノード情報を記述しなければなりませんでした。これには大きな運用上の課題がありました。
- 拡張時の課題: ノードを追加して処理能力を上げようとした場合、数百台・数千台あるすべてのクライアント端末の設定ファイルを書き換え、新しいノードのIPアドレスを追加する必要がありました。
- 縮退時の課題: 逆にノードを削除する場合も同様に設定変更が必要であり、変更漏れがあると接続エラーの原因となりました。
つまり、「サーバー側の構成変更が、クライアント側の設定変更を強制する」 という密結合な状態が、大規模な運用におけるボトルネックとなっていました。
2. SCANが解決したこと(導入のメリット)
この課題を解決するために Oracle 11g R2 から導入されたのが SCAN です。 SCANは、クラスタ内のノード数に関わらず、外部に対して 「単一の接続先(ドメイン名)」 を提供します。
これにより、以下のメリットが生まれました。
- クライアント設定の固定化: クライアントは「SCAN名」1つを設定しておくだけで済みます。
- 構成変更の隠蔽: サーバー側でノードを増減させても、DNS上でSCAN名に対応するIPアドレスを管理するだけで済み、クライアント側の設定変更は一切不要になります。
SCANの導入により、データベース管理者はクライアントへの影響を気にすることなく、柔軟にクラスタ構成を変更できるようになりました。
3. SCANリスナーの仕組み(接続リダイレクト)
SCANの実体は、DNSに登録されたホスト名と、それに対応する3つのIPアドレス(SCAN VIP)、そしてそのIPで稼働する SCANリスナー です。
通常のリスナー(ローカルリスナー)が「データベース・インスタンスへの接続を処理する」のに対し、SCANリスナーは 「適切なノードへの振り分け(ロードバランシング)」 を専門に行います。
【接続の流れ】
- 初回アクセス: クライアントは SCAN名 に対して接続要求を送ります。
- 負荷分散の判断: 接続を受け付けた SCANリスナー は、クラスタ内の各ノードの負荷状況(LBA: Load Balancing Advisory)を確認し、現在最も余裕のあるノードを選定します。
- リダイレクト: SCANリスナーはクライアントに対し、「選定したノードのローカルリスナーへ接続し直してください」という情報を返します。
- 実接続: クライアントは案内されたローカルリスナーへ自動的に再接続し、データベースとのセッションを確立します。
この仕組みにより、特定のノードに接続が偏ることを防ぎつつ、障害時には自動的に健全なノードへ誘導することが可能になっています。
参考:SCANリスナーのステータスを確認するコマンド
SCANリスナーの状態を確認するには、Grid Infrastructure を所有するOSユーザー(通常は grid または oracle)で srvctl コマンドを使用します。
稼働状況の確認:srvctl status scan_listener
SCANリスナーが現在どのノードで起動しているかを確認する基本コマンドです。
$ srvctl status scan_listener
# 【実行結果の例】
# SCANリスナーLISTENER_SCAN1はノードrac-node1で有効です
# SCANリスナーLISTENER_SCAN1はノードrac-node1で実行中です
# SCANリスナーLISTENER_SCAN2はノードrac-node2で有効です
# SCANリスナーLISTENER_SCAN2はノードrac-node2で実行中です
# ...
- 確認ポイント: ステータスが「有効(Enabled)」であり、かつ「実行中(Running)」であることを確認します。
- SCANリスナーは特定のノードに固定されず、障害時などは別のノードへ移動(フェイルオーバー)して稼働を継続します。
設定内容の確認:srvctl config scan_listener
使用しているポート番号や、登録されている名前などの構成情報を確認します。
$ srvctl config scan_listener
# 【実行結果の例】
# SCANリスナーLISTENER_SCAN1が存在します。ポート: TCP:1521
# 登録名: LISTENER_SCAN1
# 登録エンドポイント:
# ...
サービス登録状況の確認:lsnrctl status <SCANリスナー名>
srvctl はクラスタリソースとしての状態確認ですが、実際に「データベース・サービスが登録されているか(インスタンスを認識しているか)」を確認するには、従来の lsnrctl コマンドを使用します。 SCANリスナーは複数あるため、必ずリスナー名を指定(例:LISTENER_SCAN1)する必要があります。 ※SCANリスナーが稼働しているノード上で実行してください。
$ lsnrctl status LISTENER_SCAN1
# 【実行結果の例(抜粋)】
# ...
# サービスのサマリ...
# サービス "ORCL" には、2件のインスタンスがあります。
# インスタンス "ORCL1"、状態 READY には、このサービスに対して1ハンドラがあります...
# インスタンス "ORCL2"、状態 READY には、このサービスに対して1ハンドラがあります...
# コマンドは正常に終了しました。
- 確認ポイント:
サービスのサマリにデータベースのサービス名が表示され、各ノードのインスタンス(例: ORCL1, ORCL2)が認識されていることを確認します。ここが空の場合、クライアントは接続できません。
SCAN リスナーとノード・リスナー: Grid Infrastructure による管理
Oracle RAC 環境では、SCAN リスナーも、各ノードで稼働する「ノード・リスナー」も、単体で動作しているわけではありません。これらはすべて Oracle Grid Infrastructure (GI) の一部である Oracle Clusterware によって「リソース」として自動管理されています。
- GI が管理する: 起動、停止、ノード障害時のフェイルオーバー(別ノードでの再起動)はすべて GI が自動で行います。
srvctlで制御: このため、lsnrctl start/stopといった古いコマンドでリスナーを制御するのではなく、srvctl start scan_listenerやsrvctl stop listenerといったsrvctlコマンドを使ってリソースとして制御するのが正しい作法です。listener.oraの場所: パラメータファイル (listener.ora) も、DB Home ではなく Grid Home (/u01/app/19.0.0/grid/network/admin/など) 配下に配置され、GI によって管理されます。
この2種類のリスナーの役割分担は以下の通りです。
- SCAN リスナー (受付・振り分け係):
- SCAN 名に紐づく「SCAN VIP」上で動作します。
- クライアントからの最初の接続要求を受け付けます。
- その時点でクラスタ内で最も負荷の低いノード(のノード・リスナー)を選び出し、その情報をクライアントに返します(リダイレクト)。
- ノード・リスナー (実際の接続担当):
- 各ノードの VIP 上で動作します(リソース名は
ora.LISTENER.lsnrなど)。 - SCAN リスナーから紹介(リダイレクト)されたクライアントからの接続要求を受け取り、担当ノードの DB インスタンスに接続を確立させます。
- 各ノードの VIP 上で動作します(リソース名は
【SCAN 接続の簡単な流れ】
(1) クライアント
「DNS さん、"v19-scan" の IP 教えて」
↓
(2) DNS
「はいよ。192.168.10.101 (SCAN VIP-1) ね」
↓
(3) クライアント
「192.168.10.101 (SCAN リスナー) さん、"v19rac_srv" に接続したい」
↓
(4) SCAN リスナー (ノード2で稼働中)
「OK。今ノード1が暇そうだから、"v19rac1-vip" (ノード1のVIP) に繋いでね」
↓
(5) クライアント
「"v19rac1-vip" (ノード・リスナー) さん、"v19rac_srv" に接続したい」
↓
(6) ノード・リスナー (ノード1)
「OK。DB インスタンス1 に繋ぎます」
↓
(7) 接続完了!
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
srvctl と lsnrctl によるリスナーの確認
リスナーは GI リソースであるため、制御は srvctl、詳細確認は lsnrctl と使い分けるのが基本です。
1. srvctl による制御と稼働状況の確認
srvctl は、リソースが「クラスタ内のどのノードで稼働すべきか/しているか」を管理・確認するコマンドです。
# grid ユーザーで実行
# 全 SCAN リスナーの状態と稼働ノードを確認
$ srvctl status scan_listener
SCAN Listener LISTENER_SCAN1 is enabled
SCAN Listener LISTENER_SCAN1 is running on node v19rac2
SCAN Listener LISTENER_SCAN2 is enabled
SCAN Listener LISTENER_SCAN2 is running on node v19rac1
SCAN Listener LISTENER_SCAN3 is enabled
SCAN Listener LISTENER_SCAN3 is running on node v19rac1
実行結果の補足:
srvctl は、SCAN リスナーがクラスタ全体に分散して稼働していることを示します。
2. lsnrctl による詳細ステータスの確認
lsnrctl status は、指定したリスナーが「具体的にどの IP/ポートで」「どのサービスを」待ち受けているか、詳細を確認するコマンドです。
# grid ユーザーで実行
$ lsnrctl status LISTENER_SCAN1
[grid@v19rac1 ~]$ lsnrctl status LISTENER_SCAN1
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 16-11月-2025 01:07:45
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))に接続中
リスナーのステータス
------------------------
別名 LISTENER_SCAN1
バージョン TNSLSNR for Linux: Version 19.0.0.0.0 - Production
開始日 16-11月-2025 00:39:30
稼働時間 0 日 0 時間 28 分 15 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /u01/app/19.0.0/grid/network/admin/listener.ora
ログ・ファイル /u01/app/grid/diag/tnslsnr/v19rac1/listener_scan1/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.54)(PORT=1521)))
サービスのサマリー...
サービス"v19rac"には、2件のインスタンスがあります。
インスタンス"v19rac1"、状態READYには、このサービスに対する1件のハンドラがあり ます...
インスタンス"v19rac2"、状態READYには、このサービスに対する1件のハンドラがあり ます...
サービス"v19racXDB"には、2件のインスタンスがあります。
インスタンス"v19rac1"、状態READYには、このサービスに対する1件のハンドラがあり ます...
インスタンス"v19rac2"、状態READYには、このサービスに対する1件のハンドラがあり ます...
コマンドは正常に終了しました。
[grid@v19rac1 ~]$
実行結果の補足:
この出力から、以下の重要な事実がわかります。
- GI 管理の証拠:
パラメータ・ファイルのパスが DB Home ではなく Grid Home (/u01/app/19.0.0/grid/) になっており、GI リソースであることがわかります。 - SCAN VIP で待機:
HOST=192.168.56.54(SCAN VIP の一つ) で待機しています。 - クラスタ全体を認識:
v19rac1で稼働しているLISTENER_SCAN1が、v19rac1とv19rac2の両方のインスタンスの状態をREADYとして認識しています。これが、SCAN リスナーが負荷分散(リダイレクト)を行える理由です。
トラブルシューティング: SCAN 接続でよくあるエラー
| ORA-エラー例 | 原因の推測 | 確認・対処法 |
ORA-12545: Connect failed because target host... | DNS で SCAN 名が解決できない。 | クライアント側で nslookup <scan-name> を実行し、IP が返るか確認。返らない場合、DNS 設定を見直す。 |
ORA-12541: TNS:no listener | SCAN VIP または SCAN リスナーが停止している。 | サーバー側 (grid ユーザー)で srvctl status scan および srvctl status scan_listener を実行し、running 状態か確認。 |
ORA-12514: TNS:listener does not currently know of service | tnsnames.ora の SERVICE_NAME が間違っている。 | DB 側で正しいサービス名を確認する。または、サービスがリスナーに登録されていない(srvctl status service でサービスが起動しているか確認)。 |
Oracle SCAN に関する FAQ
Q. SCAN IP はなぜ3つ推奨なのですか?
A. 高可用性(HA)のためです。もし SCAN VIP が1つだけだと、その VIP が稼働するノードが停止した場合、クラスタ全体が稼働していても最初の接続(受付)ができなくなります。3つに分散することで、1ノード(または2ノード)が停止しても、残りの SCAN VIP/リスナーが接続要求を受け付けられます。
Q. tnsnames.ora に SCAN 名ではなく、ノードの VIP を直接書いてもいいですか?
A. 技術的には可能ですが、非推奨です。そのノードが停止した場合、フェイルオーバーが正しく機能しない(または遅延する)可能性があります。また、ノード追加時に tnsnames.ora の修正が必要になるなど、SCAN のメリットをすべて放棄することになります。
Q. lsnrctl status を実行したら SCAN リスナーが出てきません。
A. lsnrctl status (引数なし) は、デフォルトで LISTENER という名前の「ノード・リスナー」の状態を表示しようとします。SCAN リスナーは LISTENER_SCAN1 のような別名で、かつ Grid Infrastructure (GI) 管理下で動作しています。状態確認は grid ユーザーで srvctl status scan_listener を使うか、lsnrctl status LISTENER_SCAN1 のようにリスナー名を明示的に指定してください。
まとめ
Oracle RAC への接続における SCAN の役割は非常に重要です。
- RAC 環境のリスナーは、Grid Infrastructure (GI) によってリソースとして自動管理されます。
- SCAN は、RAC クラスタ全体への単一の接続窓口(代表名)です。
- SCAN を使うことで、クライアントはノードの増減や構成変更を意識する必要がなくなります。
- 「SCAN リスナー(受付)」が「ノード・リスナー(接続担当)」へリダイレクト(振り分け)を行います。
tnsnames.oraにはHOST=<scan-name>とSERVICE_NAME=<service-name>を指定するのが 19c での標準設定です。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?



コメント