Oracle開発関連情報 | |||
|
Net8の役割など
Net8とは
Net8は、Oracleデータベースをネットワークで使用する時の基盤となるソフトウェアです。 Oracleデータベースにアクセスする為に必ず必要です。簡単に言ってしまえば、 作成したアプリケーションプログラムとOracleデータベースの中間層に位置するミドルウェアということになります。 Net8の主な役割は、接続したコンピュータ間でデータを転送することと、 オペレーティングシステムやプロトコルの違いを吸収することです。 また、OracleではMS-AccessのJETエンジン(MDBファイル)のように、オペレーティングシステムのファイル 共有の機能を利用する必要はありません。Net8自身がその役割を果たしたからです。 Net8は、データベースを起動しているサーバーと、データベースにアクセスするクライアントのそれぞれにインストールする必要があります。 これは、ODBCドライブを使用する時にも変わりません。例外としては、JDBC Thinドライブやサードパーティが提供している特殊なミドルウェアを使用する時です。 Web環境におけるNet8の役割:
Net8とプロトコルアダプタの関係:
次のコマンドにより、どのプロトコルアダプタ がインストールされているかは、知ることができます。 Windows NT/2000の場合 lsnrctl version UNIXの場合 adapters ネットワーク接続の仕組み サーバー上では、Oracleデータベースとネットワーク(NTの場合、この2つのサービス)が起動しています。ネットワークリスナーは、クライアントからの要求を受け付ける為、つねに特定のポート(デフォルト1521)を監視しています。 ユーザーは、ネットサービス名で接続先のデータベースを指定します。そうすると、ネットワークリスナーに接続要求が送信されます。 接続要求を受けたネットワークリスナーは、接続要求を受け入れられると判断した時には、今後Oracleデータベースと通信する為の接続先情報をクライアントに送信します。 これ以降クライアントは、受け取った接続先情報を使って、Oracleデータベースと直接通信します。 文字コードの自動変換 Net8は、コンピュータにあわせて自動的に文字コードを変換します。この時に重要になるのは、データベースのキャラクタセットとNLS_LANGパラメータです。 データベースのキャラクタセットとは、データベースに格納しているデータの文字コードのことです。データベース作成時に決定し、作成した後は原則として変更できません。Windowsプラットフォームでは、シフトJISの「JA16SJIS」が一般的ですが、その他にもEUCの「JA16EUC」、7ビットASCIIの「US7ASCII」などがあります。 一方、NLS_LANGとは、画面に表示する言語や文字コードのことです。「言語_地域.キャラクタ」の形式からなり、レジストリの値やコマンドプロンプトの環境変数として指定します。例えば、WindowsNT/2000のレジストリには「JAPANESE_JAPAN.JA16SJIS」という値が設定されています。レジストリと環境変数の両方に設定してある場合には、環境変数が優先されることになります。 Oracleは、データを要求したコンピュータのNSL_LANGのキャラクタセットに基づきデータを自動的に変換します。サーバー側のNLS_LANGではないことに注意して下さい。実際には次の順序で変換されます。 データベースに接続すると、データベースのキャラクタセットとクライアントコンピュータの NSL_LANGのキャラクタセットを比較します。 キャラクタセットが同じ時はには何もしません。 異なる時には、クライアント側のNLS_LANGで指定したキャラクタセットに変換します。この変換作業はクライアントで行います。 Point: NLS_LANGには、出力するデータのキャラクタセットを指定します。決してデータベースのキャラクタセットではありません。 Net8を設定する
ネットワークの設定に使用するファイル
使用するネーミングメソッドにあわせて、次のファイルが必要です。ローカルネーミングでは、各クライアントにtnsnames.oraとsqlnet.oraが必要です。 listener.ora サーバ上のすべてのリスナーアドレスやリスナーの為の制御パラメータなど、リスナーに関するパラメータを設定します。Oracleデータベースが稼動するサーバ上に必要です。 sqlnet.ora ネーミングメソッドやNet8の動作を設定します。サーバーとクライアント双方が必要です。 tnsnames.ora ネットサービス名の設定ファイルです。どのマシンの、どのデータベースに、どの通信プロトコルを使って接続する、といった接続先情報を記述します。データベースにアクセスするコンピュータで必要になります。 names.ora Oracle Nameの設定ファイルです。Oracle Namesが稼動するサーバー上に必要です。 ファイルの場所 Net8が使用するファイルの位置は、次のようになっています。Windows版ではバージョンによって異なりますが、UNIX版やLinux版ではバージョンにかかわらず同じです。 Net8 R8.1: %ORACLE_HOME%/NETWORK/ADMIN Net8 R8.0: %ORACLE_HOME%/NET80/ADMIN SQL*Net: %ORACLE_HOME%/NETWORK/ADMIN UNIX/Linux: $ORACLE_HOME/NETWORK/ADMIN 作業の手順 実際のインストールは、次の順序で行います。 手順@:TCP/IPでサーバーに接続できるかを確認する Net8は、TCP/IPなどの通信プロトコルの上位層で動きます。この為、TCP/IPレベルで通信ができなければ、Net8を使って通信することができません。そこで、はじめにTCP/IPレベルでの通信ができるかを確認します。 手順A:構成ファイルを作成する Net8 Configuration AssistantなどのGUIツール、もしくは手動でtnsnames.oraを作成します。慣れないうちはGUIツールを使うことをお勧めします。 Net8 Configuration Assistantの場合 Oracle | ----Network Administration | --------Net8 Configuration Assistant | ------------ローカル・ネット・サービス名構成 | ----------------作成・削除・変更・名前変更 手順B:作成した構成ファイルで接続できるかを確認する TNSPINGやSQL*Plusを使って、構成ファイルが正しく作成されていることを確認します。 手順C:作成した構成ファイルを配分する すべてのクライアントでNet8 Configuration Assistantを実行してもよいですが。通常は1つファイルを作って、それを他のクライアントに配分します。 TCP/IPで接続できることを確認する では、実際にTCP/IPから接続できるかを確認する手順を説明しましょう。 手順@:確認にはPINGコマンドを使用します。ここではOracleデータベースが稼動しているコンピュータ「comp1」に接続テストを行います。DOSコマンドプロンプトから、次のように入力します。 c:/>PING comp1 手順A:応答が返ってこないときには、ネットワークの設定に関して問題が発生しています。次の理由が考えられますので、それを解決してからNet8の設定を行ってください。
OSのネットワークの設定に誤りがある
DNSもしくはhostsファイルの設定に誤りがある ネットワークが物理的に正しく接続されていない。
GUIツールで構成ファイルを作成する Oracle7のころからOracleを使っている上級者ならば、GUIツールを使わずに直接エディタでtnsnames.oraやsqlnet.oraを作成するかもしれません。しかし多くのユーザーには難しいことだと思います。Oracleには、そのためのGUIツールが用意されています。 Net8 Configuration AssistantとNet8 Assistantがそれですが、操作も簡単なのでこちらを使うことをお勧めします。Net8 Easy ConfigはOracle8i R8.1.6で廃止され、現在ではNet8 Configuration Assistantに統合されています。なお、Net8 Configuration Assistantを使用する際の設定方法について関連資料を参照してください。 手動で構成ファイルを作成する 現在は、Net8 Configuration AssistantなどのGUIツールを使うのが一般的ですが、手動で作る方法を覚えておくとトラブルシュートの時に便利です。Oracle使いを目指すなら、ぜひ押さえておきたいところです。 手順@: %ORACLE_HOME%/NETWORK/ADMINディレクトリにtnsnames.oraという名前のファイルを作成します。また%ORACLE_HOME%/NETWORK/ADMIN/SAMPLEディレクトリには、設定ファイルのサンプルがあるので参照にしてみてください。ただしOracleのバージョンによっては、すべての文法が書いてあって、流用しづらいものもあります。 手順A: ネットサービス名が「COMP1」、ホスト名が「comp1」、データベースのサービス名が「COMP1.WANGXC.CO.JP」の場合には、LIST1のようになります。ホスト名のかわりにIPアドレスでも大丈夫です。インストール時の設定に応じて変更してください。LIST2はOracle8までの記述方法です。サービス名の代りにSIDを指定します。この方法でもOracle8iに接続できますが、新しい記述方法をお勧めします。 LIST1: ORacle8i R8.1以降のデータベースに接続する COMP1 = (DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCAL = TCP) (HOST = comp1) (PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = comp1.WANGXC.CO.JP) ) )
例: # D:\ORACLE\ORA81\NETWORK\ADMIN\TNSNAMES.ORA Configuration File:d:\Oracle\Ora81\NETWORK\ADMIN\tnsnames.ora # Generated by Oracle Net8 Assistant #これはローカルマシンではなく、データベースサーバーです。 WANG.WANGXC.CO.JP = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = wxc-dev)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = sbya) ) ) #これはローカルマシンです。つまり、ローカルマシンにもOracleをインストールしてあります。 O815.WANGXC.CO.JP = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(PORT = 1521)(HOST = wxc-51)) ) (CONNECT_DATA = (SERVICE_NAME = o815) ) ) # D:\ORACLE\ORA81\NETWORK\ADMIN\SQLNET.ORA Configuration File:d:\Oracle\Ora81\NETWORK\ADMIN\ sqlnet.ora # Generated by Oracle Net8 Assistant NAMES.DEFAULT_DOMAIN = WANGXC.CO.JP SQLNET.AUTHENTICATION_SERVICES= (NTS) SQLNET.EXPIRE_TIME = 0 NAMES.DIRECTORY_PATH= (TNSNAMES) LIST2:
ORacle8 R8.0以前のデータベースに接続する COMP1 = (DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCAL = TCP) (HOST = comp1) (PORT = 1521) ) (CONNECT_DATA = (SID = COMP1) ) ) 手順B: 同様にsqlnet.oraを作成します。LIST3がその内容です。NAMES.DIRECTORY_PATHの値は、ネーミングメソッドの優先順位を表します。順に、ローカルネーミング(TNSNAMES)、Oracle Names(ONAMES)、ホストネーミング(HOSTNAME)のようになっています。 手順C: 記述が正しいかどうかを、データベースに接続して確認します。コマンドプロンプトから「TNSPING ネットサービス名」と入力します。 c:/>TNSPING comp1
例: C:\>tnsping wang TNS Ping Utility for 32-bit Windows: Version 8.1.5.0.0 - Production on 05-JUN-01 09:37:22 (c) Copyright 1997 Oracle Corporation. All rights reserved. Attemptingtocontact(ADDRESS=(PROTOCOL=TCP)(HOST=wxc-dev)(PORT=1521)) OK (40ミリ秒) C:\>
手順D:
OKと表示されれば正しく構成ファイルが作成されます。 LIST3: sqlnet.oraの内容 SQLNET.AUTHENTICATION_SERVICES= (NTS) NAME.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) Tips Windows 95 OSR2でNet8 R8.1.5を使用しているときに、sqlnet.oraファイルに次の1行があるとデータベースに接続できないことがあります。そのときには次の行をコメントするか、削除してください。 SQLNET.AUTHENTICATION_SERVICES= (NTS) 構成ファイルを配布する Oracleデータベースにアクセスするコンピュータが複数あるときには、先ほど作成した2つのファイル(tnsnames.oraとsqlnet.ora)を他のコンピュータにも配布します。もちろん、それぞれのコンピュータで構成ファイルを作成してもよいのですが、クライアントがたくさんあるときにはコピーしたほうが簡単です。 また、新しいデータベースが追加されたり、ネットワークの構成が変わったたときには、tnsnames.oraだけ再配布します。sqlnet.oraは、Net8の動作を記述しているだけなので、基本的に再配布の必要はありません。 ネットワークサービス名の仕組み
Net8の基本的な仕組みや設定方法を説明してきました。ここで、もう一歩上級者になる為に、ローカルネーミング時のネットサービス名のメカニズムについて説明しましょう。この仕組みを理解することによって、「ORA-12154:TNS:サービス名を解決できません」というエラーを回避できるでしょう。 ドメイン名とは 先ずドメインについて説明します。Oracleは大規模なネットワークに対応する為に、ネットサービス名にもTCP/IPネットワークのようなドメインという考え方を取り入れています。OracleのドメインとTCP/IPネットワークのドメインは完全に独立です。WANG.WANGXC.CO.JPというネットワークサービス名があった時、最初のピリオド以下の「WANGXC.CO.JP」の部分がドメインです。 先ほどの説明では、ドメインは使いませんでしたが、今度はドメインを考慮した設定ファイルの仕組みについて説明します。 ネットサービス名を解決する LIST4とLIST5は、ドメインを利用したtnsnames.oraとsqlnet.oraです。このデータベースのドメインは「WANGXC.CO.JP」です。このドメインはTCP/IPネットワークのものと一致させてもさせなくてもよいのですが、一致させることをお勧めします。なぜなら、Oracle Universal Installerが、自動的にNMAES.DEFAULT_DOMAINにそのコンピュータのTCP/IPのドメイン名を設定することがあるからです。 LIST4:ドメインを利用したtnsnames.ora COMP1.WANGXC.CO.JP = (DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCAL = TCP) (HOST = comp1) (PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = comp1.WANGXC.CO.JP) ) ) LIST5:ドメインを利用したsqlnet.ora NAMES.DEFAULT_DOMAIN=WANGXC.CO.JP SQLNET.AUTHENTICATION_SERVICES= (NTS) NAME.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) さて、実際のネットサービス名の検索方法について説明します。 手順@: データベースに接続する為に、ネットサービス名を指定します。 手順A: この指定したネットサービス名にドメインが含まれているときは、そのまま使います。Oracleは、ネットサービス名に1つ以上のピリオドが含まれている時、ドメインが指定されていると判断します。 手順B: ドメイン名が含まれていない時には、sqlnet.oraファイルのNAMES.DEFAULT_DOMAINエントリを参照し、接続時に指定したネットサービス名にこの値を付加します。 手順C: この完成したネットサービス名と完全に一致するエントリをtnsnames.oraファイルから探します。 手順D: 整理すると次のようになります。どうしても接続できない時には、これらの理由を考えてtnsnames.oraとsqlnet.oraファイルを確認してください。 入力したネットサービス名:COMP1 NAMES.DEFAULT_DOMAINの値:WANGXC.CO.JP 完成したネットサービス名:COMP1.WANGXC.CO.JP |