データベースにつなぐための設定とトラブルシューティングは、慣れていないとどこから手を付けていいのかすら分かりません。最終回となる第8回では、tnsnames.oraにまつわるトラブルの切り分けを詳細に解説します(編集部)
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
今回は、「ローカル・ネーミング(tnsnames.ora)を使用してクライアントからデータベースへ接続を行う際に発生するエラー」について紹介します。ここで紹介するエラーがすべてではありませんが、よく遭遇するエラーかと思います。
ここでは、エラーを以下4ケースに分けて説明します。
1.データベースサーバまで届いていないケース
2.リスナーまで届いていないケース
3.データベースまで届いていないケース
4.データベースまで届いたあとのケース
今回の例では、クライアントマシンのtnsnames.oraに記載したtest_nsnという名前のネット・サービス名を使用してデータベースに接続を行います(リスト1参照)。
この設定はtnsnames.oraの基本的な構成です。
1: test_nsn = 2: (DESCRIPTION= 3: (ADDRESS= 4: (PROTOCOL=TCP)(HOST=machine1)(PORT=1522) 5: ) 6: (CONNECT_DATA= 7: (SERVICE_NAME=testdb) 8: ) 9: )
リスト1のパラメータのうち、ポイントとなるものについて簡単に説明します。
test_nsn | ネットサービス名。リスト1の2行目から9行目の“ (description = ….<以下略> ) ”を「接続記述子」といいますが、その接続記述子に短い別名を付けたものです。今回はtest_nsnという名前を付けていますが、任意の名前を付けることが可能です。SQL*Plusなどでクライアントからデータベースに接続する際、@以降に記述します。 例:SQL> conn scott/tiger@test_nsn |
---|---|
HOST | リスナーが起動しているホスト(またはIPアドレス)を指定します。今回の例では、machine1という名前のデータベースサーバを指定します。 |
PORT | リスナーがリッスンしているポート番号を指定します。今回の例では、1522を指定します。 |
SERVICE_NAME | リスナーが認識している(リスナーに登録されている)データベースサービスを指定します。 |
それでは早速、エラーが発生するケースについて紹介しましょう。先に紹介したtest_nsnというネット・サービス名を使用して、データベースに接続します。また、以降ではデータベースサーバはUNIX環境であることを想定します。Windows環境について記載する際には、その旨を記載します。
接続を試みたところ、ORA-12545が発生しました。
%sqlplus /nolog SQL> conn scott/tiger@test_nsn ERROR: ORA-12545: ターゲット・ホストまたはオブジェクトが存在しないため、接続に失敗しました
SQL>
このメッセージが出力される場合、基本的にはtnsnames.oraのHOSTパラメータで指定したホスト名の名前解決ができていないことが原因であると考えられます。
そのため、まずはpingコマンドが成功するかどうかを確認します。今回の例では、ping machine1 の結果が unknown host となったので、クライアントのhosts ファイルにmachine1とそのIPアドレスを記入し、このエラーの対処を行いました。
補足となりますが、そのほかにデータベースサーバまで届かないケースとして、
ORA-12535: TNS: 操作はタイムアウトしました。
ORA-12170: TNS: 接続タイムアウトが発生しました。
といったメッセージが発生するケースもあります。これらのメッセージは、ネットワークやファイアウォールの問題であったり、データベースサーバが落ちていたり、hostsファイルやtnsnames.oraに設定されているIPアドレスが間違っていたりと発生要因はさまざまです。なお、これらエラーはマシンの負荷やネットワークの負荷でも発生する場合もあります。
Copyright © ITmedia, Inc. All Rights Reserved.