Oracleマスター Silver 12ｃ Oracleネットワーク環境の設定

※用語はなるべく、Oracle® Databaseリファレンス　12c リリース1 (12.1) より抜粋しております。

【太字】：試験最重要ポイント
【青色】：試験問題を解くために必要な理解
【赤字】：最低限押さえておきたい知識
出題例：正解のみ掲載しています

###■公式チェックリストより出題範囲
●Oracleネットワーク環境の設定
　・Oracle Net Servicesを設定する
　・Oracleネットワークを設定および管理するためのツールを使用する
　・クライアント側ネットワークを設定する
　・データベース間の通信を設定する

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

###要点
ネットワークについては、「接続の確立」「ネーミングメソッド」「リスナー制御ユーティリティー」「共有サーバ接続」「データベースリンク」が頻出ポイントです。

覚えることが非常に多いが、出題数も多いので何度も復習しよう。

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

###Oracle Net Servicesを設定する
　■Oracle Net Services
　　Oracleソフトウェアをインストールしたマシン上でクライアントアプリケーションを起動するのではなく、別のクライアントマシンでアプリケーションを起動するためには、ネットワークの接続が必要になります。
ネットワーク接続のために必要な機能を提供するのがOracle Net Servicesです。

　■Oracle Net
　　Oracleサーバーにネットワーク接続するために、必要な情報を構成し、経路の確定と接続の維持を行うのがOracle Netです。
実際に使用するプロトコルなどは<FONT COLOR=red>クライアントマシンと、データベースサーバーマシンの両方にインストール</FONT>しておく必要があります。


####リスナー
　　　**リスナー**とは、データベースが外部アプリケーションとの接続を調整する役割を果たすプロセスです。
リスナーが存在しなければ、外部（クライアント）からの接続はできません。
<font color="Blue">1つのリスナーは多くのクライアントからの接続要求を受け付けるだけでなく、1つ以上のデータベースに対する接続要求も受け付けることができます。</font>

他にも
・外部のコードライブラリにアクセスできる。
・**Oracle異機種間サービスを介して、Oracle以外のデータソース（DB2、SQLServerなど）にOracleインスタンスを接続したりできます。**

リスナーはクライアントからの接続を受け止めると、そのクライアントのためのサーバープロセスを起動し、接続を渡します。以降のクライアントからは要求されたＳＱＬなどの処理はこの**サーバープロセス**が行うため、<FONT COLOR=red>リスナーは最初の接続要求のときだけ使用されます。</FONT>

●listener.oraファイル

Oracle Net構成ファイル
　　　・listener.ora：リスナー構成ファイル
　　　・tnsnames.ora：ローカルネーミング使用時の構成ファイル
　　　・sqlnet.ora　：ネーミングメソッドの優先順位などのプロファイル構成ファイル

・Oracle Net構成ファイルはデフォルトで次の場所に配置されます。
`$ORACLE_HOME/network/admin/`

・デフォルト以外の場所に配置したNet構成ファイルを使用する場合は**環境変数TNS_ADMIN**に、ファイルを配置した場所を指定します。

listener.oraファイルの構成情報

| 要素       　　　|       概要 　　　　|
|:----------------|:------------------|
| リスナー名        |デフォルトはLISTENER|
| リスナーアドレス   |ホスト名、プロトコル、ポート番号|
| 接続先データベース |グローバルデータベース名、SID名|
| リスナーパラメータ |ログやトレースファイルの場所、名前など|

リスナーアドレス（TCP/IP：1521）と動的サービス登録を使用する場合は、listenere.oraファイルの構成は不要です。また、デフォルトリスナー（リスナー名「LISTENER」）を使用して動的サービスを登録する場合は、listenere.oraファイルが存在していなくても、リスナーを起動することが出来ます。

####リスナー制御ユーティリティ
リスナー制御ユーティリティを起動する構文
`lsnrctl`

リスナー制御ユーティリティを使用して次のことが出来ます。
・リスナーの起動、停止
・リスナーのステータスの確認
・構成ファイルパラメータからのリスナーの再初期化
・多数のリスナーの動的構成
・リスナーのパスワードの変更

●リスナーの起動
　start[リスナー名]
<font color="Red">デフォルトリスナーである「LISTENER」であれば、リスナー名は省略</font>することが出来る。
リスナー名が存在する場合は、STOP リスナー名、RELOAD リスナー名のように宣言する
または`SET CURRENT_LISTENER リスナー名`で操作するリスナー名を指定した後に、stop、reloadコマンドなどを使用する。

●リスナーの停止
　stop[リスナー名]
リスナーの起動と同様、デフォルトリスナー名であれば、省略可能です。

●SERVICESコマンド
　リスナーに登録された、「サービス」「インスタンス」「各インスタンスに割り当てられたサービスハンドラの詳細情報」を確認できる。
サービス：登録されたサービス
インスタンス：インスタンスの状態を表示する。UNKNOWNの場合、listner.oraファイルに静的登録されていることを示す。
ハンドラ：クライアントの接続数を示す。establishednは**確立したクライアント数**を示す

●リスナーの再読み込み
　reload[リスナー名]
listener.oraが再読み込みされます。起動中のリスナーに対してその内容を反映する場合に使用します。
listener.oraファイルを読み込みなおしたい場合は、一度リスナーを停止するか、または**reloadコマンド**を実行します。
この時、<font color="Blue">リスナーへ動的に登録されていたデータベースサービス、インスタンス、サービスハンドラおよびリスニングエンドポイントの登録は解除</font>されます。
しかし、その後動的サービス登録によって再度登録されます。

####動的サービス登録
接続先データベース情報を**lisneter.oraファイルに記述せずに、LREGプロセスによってリスナーに情報登録**することを動的サービス登録といいます。
動的サービス登録を正しく機能させるには、初期化パラメータファイルに次のパラメータが含まれている必要があります。
● SERVISE_NAMES：データベースサービス名
● INSTANCE_NAME：インスタンス名
● LOCAL_LISTENER：ローカルリスナーアドレス（省略可能）
● REMOTE_LISTENER：リモートリスナーアドレス（リモート先がある場合）

デフォルトのLREGプロセスでは、TCP/IP：1521のローカルアドレス上のローカルリスナーにサービス情報が登録されます。
TCP/IPまたは1521を使用しない場合は、初期化パラメータファイルのLOCAL_LISTENERパラメータに登録先のローカルリスナーアドレスを指定します。

**共有サーバー環境**
初期化パラメータの**DISPATCHERSパラメータ**のLISTENER属性を使用して次のようにディスパッチャを非デフォルトのローカルリスナーに登録できます。
`DISPATCHERS="(PROTOCOL=tcp）（LISTENER=listener_sales1)"`

LREGプロセスでは、ディスパッチャ情報のリスナーの登録にLOCAL_LISTENERパラメータとLISTENER属性が使用できるため、リスナーの値が同じ場合（デフォルトの場合、ローカルリスナーと同じ場合）は、パラメータと属性の両方の指定は不要です。

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###クライアント側の設定
　データベースサーバーに直接ログインしている状態でOracleデータベースに接続するには、ユーザー名とパスワードだけを指定すれば十分です。
サーバー側：ORACLE_環境変数でインスタンス名が指定されているため接続先のデータベース情報は省略可能
クライアント側：ユーザー名+パスワードと接続先のデータベース名、ホスト名が必要。

`connect user/password@oraora.oracle.com`(ﾕｰｻﾞｰ/ﾊﾟｽﾜｰﾄﾞ@接続識別子)

<font color="Blue">**接続識別子と接続記述子の違い</font>
①[oracle_name_shikibetsushi]=
②(DESCRIPTION =
③  (ADDRESS = [protocol_TCP]
④  (CONNECT_DATA =
⑤   (SERVISE_NAME = [service_name])
⑥  )
⑦)
①行目：接続識別子。
②～⑦行目：接続記述子。

接続記述子には接続先のサーバ情報が上記のフォーマットで記述されています。この接続記述子をtnsnames.oraガイルでマッピングして名前解決してくれるのが接続識別子ということになります。
上記のconnect user/password@以降に接続記述子を直接記載することもできますが、tnsname.oraファイルを編集しておけば簡略的に接続識別子を指定するだけで済みますよということです。

####ネーミングメソッド
　クライアントからOracleサーバーへ接続するために必要な情報をどこで管理しているのかを決めるのが、**ネーミングメソッド**です。
■簡易接続ネーミング
　TCP/IPにおいて、ホスト名、リスナーポート、データベースサービス名を使用する。
フェイルオーバー：✖　ロードバランス：✖　プロトコル：**TCP/IPのみ**

■ローカルネーミング
　クライアント側のローカル構成ファイルである、**tnsnames.ora**ファイルに格納した接続情報を使用する
フェイルオーバー：〇　ロードバランス：〇　プロトコル：すべて
OSのコマンドライン：`splplus ユーザー名/パスワード@ネットサービス名`　もしくは
SQL*Plus：`connect ユーザー名/パスワード@ネットサービス名`

■ディレクトリネーミング
　**LDAP対応**のディレクトリサーバーで管理された接続情報を使用する
フェイルオーバー：✖　ロードバランス：✖　プロトコル：TCP/IPのみ

■外部ネーミング
　Network Information Serivece(NIS）などで提供される外部ネーミングサービスで管理された接続情報を使用する。

####sqlnet.ora
　どのネーミングメソッドを使用して解釈させるかは、クライアント側に配置するsqlnet.oraファイルの**NAMES.DIRECTORY_PATH**パラメータで指定します。

####簡易接続
　簡易接続ネーミングは、接続に必要なすべての情報を接続文字列の一部として指定します。**クライアント側で何も構成する必要がない**ため、<FONT COLOR=red>最も簡単な方法です</FONT>

必要な環境
●TCP/IP接続が可能であること。
●Oracle Netがインストールされていること。

　簡易接続ネーミングはデフォルトで有効になっていますが、クライアント側のsqlnet.oraファイルのNAMES.DIRECTORY_PATHパラメータを設定している場合は「EZCONNECT」がパラメーターで指定されていることを確認してください。

簡易接続ネーミングの構成
`@ホスト名[：リスナーポート][データベースサービス名]`

リスナーポートは、デフォルトポートである1521、データベースサービス名はホスト名と同じデータベースサービス名であれば、省略可能です。
例
ホスト名：orasvl1
リスナーポート：1522
データベースサービス名：orcl.oracle.com
`SQL > connect user/password@orasvr1:1522/orcl.oracle.com`

**メリット**
ローカルネーミングで必要とされるクライアントごとの**ローカル構成ファイル（tnsnames.oraファイル）は必要ない**という点。
--クライアント側の構成が不要で名前の通り、一番簡易な方法である。

**デメリット**
接続時にフェールオーバーなどの拡張接続オプションはサポートされていません。
___

####ローカルネーミング
ローカルネーミングは**tnsnames.oraファイルを使用する方法です。**

●必要な環境
　－ Oracle Netがインストールされていること
　－ tnsnames.oraファイルを構成すること

ローカルネーミングはデフォルトで有効になっていますが、クライアント側のsqlnet.oraファイルのNAMES.DIRECTORY_PATHパラメーターを設定している場合は「TNSNAMES」になっていることを確認してください。

【重要】
tnsnames.oraファイルの基本的な構成
① ORCLE =
② (DESCRIPTION =
③ (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
④ (CONNECT_DATA = 
⑤ (SERVER = DECICATED)
⑥ (SERVICE_NAME = orcl.oracle.com
⑦ ))

①ネットサービス名
③リスナー情報（プロトコル、ホスト名、ポート番号）
④～⑦接続データベース情報
⑤接続方法（DEDICATED：専用サーバー接続、SHARED：共有サーバー接続、省略：データベースのデフォルト）
⑥データベースサービス（グローバルデータベース名）

ネットサービス名にドメイン名が含まれる場合、デフォルトではドメイン名を省略することはできません。
省略する場合はクライアント側のsqlnet.oraファイルのNAMES.DEFAULT_DOMAINパラメータで省略するドメイン名を指定します。
___

####ディレクトリネーミング
ディレクトリ・ネーミング・メソッドでは、Oracle Internet DirectoryやMicrosoft Active DirectoryなどのLDAPディレクトリ・サーバーに含まれる接続記述子に接続識別子をマップします。ディレクトリでは、データベース・サービスおよびネット・サービス名の**集中管理が提供**され、**サービスの追加または再配置が容易**になります

　●新しいサービス名がLDAPディレクトリに追加されるとすぐに、ユーザーがそのサービス名を接続に使用できる
　●Oracle Net Services 構成を頻繁に変更する組織に適している

少しややこしいので**太字**が目的で導入されるということだけは覚えよう

___


####外部ネーミング
Oracle以外のサポートされているネーミングサービス名が格納されています。
　●Network Information Service(NIS)外部ネーミング
　●**分散コンピューティング環境(DCE)**セルディレクトリサービス(CDS)

___

###接続時フェイルオーバーの構成
　リスナーは、**複数のデータベース**に対するリスニングを行うことができます。
また複数のアドレスを用意してデータベースのリスニングを行うことができます。

・リスナーとデータベースの関係は1対多が可能であるが**1つのインスタンスに対し複数のリスナーを接続することはできない**。
・リスナーは同時に複数構成できる（ただし一意の名前であること）。

●**ロードバランス**
　いずれかのアドレスをランダムに選択し、使用します
●**フェイルオーバー**
　選択したアドレスが使用できない場合に、別のアドレスを使用します

複数のアドレスがある場合、**デフォルトでは自動的にフェイルオーバー**が構成されます。
ロードバランスを有効酢にするときは「`LOAD_BALANCE = YES`」を指定します。

<font color="SlateGray">ロードバランサーに関する問題が出題されました。この表を抑えておけば大丈夫でしょう</font>

| 要素      |LOAD_BALANCE|FAILOVER|
|:-----------------|:------------------:|:------------------:|
|成功するまで順番に各アドレスを入力|OFF|ON|
|成功するまでランダムに各アドレスを入力|ON|ON|
|任意に選択したアドレスを1つ入力|ON|OFF|
|最初のアドレスのみ使用|OFF|OFF|
接続先に到達するまで各アドレスを順番に使用：Connection Managerに接続するときに使用する　SOURCE_ROUTE = YES

順番（最初）にアドレスを使用する場合はロードバランスをOFF（NO)
ランダム、任意（途中）の場合はロードバランスをON（YES）
成功するまで試す場合はフェイルオーバーをON

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###Oracle Net Services を構成及び管理するツール

####Oracle Net Configuration Assistant(NETCA)
NETCAはクライアント側の構成を行えるだけでなく、サーバー側のリスナー構成などを行うことも可能です。
ただし、ローカルコンピューターのファイルを編集するため、編集後サーバーに転送が必要です。
___

■接続テスト
　**TNSPING**ユーティリティを使用して、<FONT COLOR=red>ネットサービス名</FONT>で**リスナーまで接続**出来るかどうかをテストできます。<font color="Blue">リスナーまでなのでデータベースが起動しているかどうかは分かりません。</font>

構文：`tnsping ネットサービス名 [テスト回数]`
→このテスト方法は、簡易接続ネーミングにも使用可能です。

・Oracle Net Managerによる接続テスト
　　Oracle Net Managerでは、**ローカルネーミング**のネットサービス名が使用できるかどうかをテストできます。
　　Oracle Net Managerによる接続テストは実際のデータベースへの接続が行われます。

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

###専用サーバーと共有サーバー

■専用サーバー、共有サーバーとは
　クライアント（ユーザープロセス）からの接続要求はリスナーに渡され、リスナーは接続を処理するために新しいプロセス（サーバープロセス）を起動します。

ユーザープロセス：サーバープロセス　＝　1　対　1　の関係にある場合には**専用サーバープロセス**といいます
ユーザープロセス：サーバープロセス　＝　多　対　少の関係にある場合には**共有サーバープロセス**といいます

→専用サーバーの利点
　・メモリー余裕がある場合に処理が速い
　・バッチ処理のようにユーザープロセスから連続してSQL処理要求が送られてくる場合に適している
　・例：データウェアハウスにおけるパラレル処理、バッチ処理や、バルクロードによる一括操作

...利点を上手く利用できない場合
→複数のユーザープロセスの要求をディスパッチャを介して、共有サーバープロセスに処理させる。

#####専用サーバー構成と共有サーバー構成
　Oracleサーバーにおけるデフォルトは**専用サーバー構成**です。初期化パラメータを設定することで共有サーバー構成にすることもできます。

■構成の違い
　●ユーザープロセスとサーバープロセス
　　専用：1対1
　　共有：多対少
　
　●有効な接続方式
　　専用：ローカル接続時、Oracle Net使用時
　　共有：Oracle Net使用時

　●有効な接続タイプ
　　専用：専用サーバー接続
　　共有：専用サーバー接続、共有サーバー接続
　
　●Oracle Net使用時のデフォルトの接続タイプ
　　専用：専用サーバー接続
　　共有：共有サーバー接続

　●サーバープロセスの停止時期
　　専用：接続が確立したときにサーバープロセスが起動
　　共有：初期数が起動後、ユーザー接続とは無関係に必要に応じて共有サーバープロセスが起動
　
　●サーバープロセスの停止時期
　　専用：接続が切断された時にサーバープロセスが停止
　　共有：最小数より多いアイドル状態となった共有サーバープロセスが停止
　
　**●適した処理**
　　専用：バッチ処理。Oracle管理処理（Oracleサーバーの起動/停止/バックアップ/リカバリ９
　　共有：オンライントランザクション処理（多くの接続があるが、実際のSQL実行は少ない）

■共有サーバーのアーキテクチャ
　共有サーバー構成は、専用サーバー構成では起動しない**ディスパッチャプロセス**を起動し、実際のSQL処理を実行するサーバープロセスとして共有サーバープロセスを使用します。

**実際のSQL処理の実行は共有サーバープロセスがあ行います。クライアントとの接続を確立するのがディスパッチャです。**
※ディスパッチャに接続するためにはリスナーへの接続が必要です。

■SGAとPGA
　Oracleサーバーで仕様されるメモリーにはSGA、PGAがありますが、専用、共有サーバー接続ではそれぞれにセッションに関連したメモリの使い方が異なります。
セッションに関連したメモリはUGA（ユーザーグローバル領域）と呼ばれます。

●UGA
　カーソル領域：解析済のSQL文に関する情報と、処理に使用するその他のセッション固有の情報が保持されます。サーバー・プロセスでSQLまたはPL/SQLのコードが実行される場合、プロセスではプライベートSQL領域を使用してバインド変数値、問合せ実行状態情報、問合せ実行作業領域が格納されます。

　セッション情報：セッションに関連する権限情報とソートエリアなどの作業領域を含む。

<font color="Blue">ポイント：</font>
専用サーバー接続の場合：UGAはPGAに含まれる
共有サーバー接続の場合：UGAはSGAに含まれる（共有プール、またはラージプール）
スタック領域は、専用・共有、どちらもPGAに含まれる。
UGAがSGA内に保持されることにより、解析済SQLコードや実行計画が追い出されてしまい、パフォーマンスの低下につながる可能性があります。
**ラージプール**を構成すると、UGAはラージプールに保持され、パフォーマンス低下を防ぐことができます、


■共有サーバーの構成
　共有サーバーのための初期化パラメーター

DISPATCHERS：ディスパッチャの初期数。プロトコルごとにディスパッチャを構成する。
MAX_DISPATCHERS：ディスパッチャの最大数。プロトコルごとではなく、インスタンス全体の最大数。手動でディスパッチャを追加した時に影響する。
SHARED_SERVERS：共有サーバープロセスの初期数。ビジー状態になると自動的に最大数までは追加起動され自動停止も行われる
MAX_SHARED_SEREVERS：共有サーバープロセスの最大数。手動/自動で共有サーバープロセスが追加起動されるときに影響する
LOCAL_LISTENER：ディスパッチャを登録するリスナーアドレスを指定する。ディスパッチャを登録するリスナーが、ローカルマシンのポート1521で起動している時は不要。

■共有サーバー構成の考慮事項
　共有サーバーアーキテクチャは、リクエストキューが共通であり、多くのユーザーがディスパッチャレスポンスキューを共有できるため、ウェアハウスクエリーやバッチ処理などの大量のデータを処理する必要がある操作は正常に実行できません。
共有サーバーアーキテクチャは、プロセスおよびメモリーが効率的に使用されるモデルですが、すべての接続に適しているわけではありません。

次に挙げるような通常のDBAが実行する多くのタスクは専用サーバー接続を使用しましょう。
●Oracle REcover Manager を使用するバックアップセッションおよびリカバリセッション
●**インスタンスの起動および停止**
●表領域およびデータファイルの作成
●表および索引のメンテナンス
●統計分析

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###ほかのデータベースへの接続
　ほかのデータベースオブジェクトにSQL文を使用して直接アクセスするためには、tnsnames.oraファイルを構成し、データベースリンクを作成する必要があります。
**データベースリンク**とは、他のデータベース上のオブジェクトへのアクセスを可能にするスキーマオブジェクトのことです。
2つのリンクがあります。

**パブリックデータベースリンク**：すべてのユーザーがアクセスできる。
`CREATE PUBLIC DATABASELINK`システム権限が必要

**プライベートデータベースリンク**：作成したユーザーのみがアクセスできる。
`CREATE DATABASE LINK`システム権限が必要。

※現行のユーザーのデータベースリンクはOracle Advanced Securityオプションを介してのみ作成できる。
___
###出題例　
**出題例**：リスナーA、Bが起動中です。リスナーAを停止しました、リスナーBはどうなりますか？
他のリスナーおよび接続済みのセッションに影響はありません。

**出題例**：簡易接続ネーミングの特徴を選択しなさい
・TCP/IPをサポートする
・接続のロードバランスはできない
・Oracle Netクライアントの構成が不要（tnsnames.ora)

**出題例**：デフォルトと異なるディレクトリを指定する方法は？
tnsnames.oraファイルは環境変数TNS_ADMINを使用して別のディレクトリに配置する。ことも可能ですが、基本的にはデフォルトの場所、`($ORACLE_HOME/network/admin/)`を覚えておきましょう

**出題例**：リスナー（リスナー名：LSTNER1）を停止できるコマンドを選択しなさい
→lsnrctl stop LSTNER1
→LSNRCTL > set current_listner LSTNER1
 LSNRCTL > stop

**出題例**：共有サーバー接続の場合SGAに格納されるUGAの一部であるメモリ領域
→ユーザーセッションデータ、プライベートSQL領域（カーソル領域）
※複数のユーザーで共有する情報なのでSGAの中に格納される

**出題例**：LSNRCTL > RELOAD
既存の接続は切断されないが、リスナーがデータベースインスタンスとサービスハンドラの再登録を完了するまで既存の接続はいかなる操作もできない

**出題例**：リモートデータベース"HQ"内にある"SCOTT"スキーマ表のみにアクセスできるようにデータベースリンクを確立したい、
パスワードは"TIGER"サービス名は"HQ"
→CREATE DATABASE LINK HQ CONNECT TO SCOTT IDENTIFIED BY TIGER USING 'HQ';
※セミナーでもデータベースリンクは必ずといっていいほど出題されると言っていたので理解しよう