Oracleエラー対応(ORA-12537):「TNS: 接続がクローズされました」の対処方法について

現役DBAが解説-Oracleエラー対応

ORA-12537は、TNS(Transparent Network Substrate)接続がクローズされたことを示す情報メッセージです。
本記事では ORA-12537発生時の原因および対応方法を解説します。

1.エラーメッセージ

アラートログに下記のようなエラーが出力されます。

ORA-12537: TNS: 接続がクローズされました
ORA-12537: TNS:connection closed

アラートログに出力される「ORA-12537: TNS: 接続がクローズされました」は、さまざまな要因で発生する可能性があります。

2.原因・対応

本章ではORA-12537が発生する代表的なケースをご紹介します。

①DBの所有者が異なる場合

SCANリスナーとローカルリスナーがデータベースのローカルリスナーと異なる場合に発生する可能性があります。
SCANリスナーはtnsnames.oraのHOST =の部分に記載されています。

TESTPDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = test)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testpdb)
    )
  )

ローカルリスナーは下記のコマンドで確認できます。

lsnrctl status リスナー名

DBのローカルリスナーは下記のコマンドで確認できます。

sqlplus system/xxxxx@TESTPDB
SQL> Show parameter local_listener

--ローカルリスナーを変更する場合
SQL> alter system set local_listener=リスナー名 scope=BOTH

②データベースが起動していることを確認する

データベースが起動していないとORA-12537が発生する場合があります。
起動確認は下記のコマンドで確認できます。

sqlplus system/xxxxx@TESTPDB
--起動していない場合
アイドルインスタンスに接続されました
--起動コマンド
SQL> Startup
--起動している場合
接続されました
SQL> Show con_name
CON_NAME
-------------
TESTPDB

また、データベースの負荷が高い場合、データベースがリクエストを処理するための十分なリソースを持っていない可能性があるため、CPU、メモリ、I/Oの使用状況の監視も有用となります。

③同時に出力されているエラーがある場合

同時に出力されているエラーがある場合、そのエラーの対処方法を確認します。
関連性の高いエラー

・ORA-03113: 通信チャネルでファイルの終わりが検出されました。

クライアントとサーバプロセス間のTCPセッションが切断された場合に、ORA-03113エラーが発生します。
大きな要因として、サーバプロセスの異常終了、ネットワーク通信が挙げられます。
一般的な対処法:

  1. ネットワーク接続が正常であることを確認
  2. データベースの状態を確認
  3. クライアント側への影響を確認

<関連記事>
Oracleエラー対応(ORA-03113):ORA-03113発生時の調査方法について


・ORA-12535: TNS: 操作はタイムアウトしました。

接続時に発生するエラーで、ホスト名やポート番号など接続情報が異なっている、または接続先のサーバが起動していない場合などに発生することが多いエラーです。
一般的な対処法:

  1. ネットワーク接続が正常であることを確認
  2. リスナーの設定を調査、必要に応じて修正
  3. リソースの監視、必要に応じてリソースを増やす

・ORA-12571: TNS: パケット・ライターに障害が発生しました

ネットワークで接続しているパケットに問題があった場合に発生します。
ORA-03113と同様、クライアントとサーバプロセス間の接続が切断された場合にも発生します。
一般的な対処法:

  1. ネットワーク接続が正常であることを確認
  2. リスナーが過負荷になっていないか監視
  3. リスナーの設定を調査、必要に応じて修正

④sqlnet.oraの設定

sqlnet.oraにTCP.VALIDNODE_CHECKING=YES 、TCP.INVITEDNODES を設定している場合に発生する可能性があります。
これらのパラメータが本来あるべき姿と比べて正しいか確認、あるいは設定してある場合は設定を削除する必要があります。
Sqlnet.oraの設定例

SQLNET.AUTHENTICATION_SERVICES = (NTS)
NAMES.DIRECTORY_PATH = (TNSNAMES, HOSTNAME)
NAMES.DEFAULT_DOMAIN = winsrv

SQLNET.AUTHENTICATION_SERVICES:NONE/ALL/NTSのいずれかを指定します。
NAMES.DIRECTORY_PATH:ネーミングメソッドの優先順を指定します。
左から順に解決します。
NAMES.DEFAULT_DOMAIN:接続識別子にドメインが省略された場合のデフォルトドメインとなります。

⑤ネットワークに問題がある場合

クライアントとデータベースサーバ間の通信に問題がある場合に、接続リクエストがタイムアウトする可能性があります。
対処法として、クライアントとデータベースサーバ間の通信をpingコマンド等で、ネットワークのレイテンシやパケットロスを確認することが有用です。
また、ファイアウォールやネットワーク構成に変更があったかどうかも確認し、場合によってはそれらに関連している可能性があるかの調査も必要になります。

3.最後に

ORA-12537が発生する原因は本記事で紹介したもの以外にも多岐にわたるため、具体的な状況に応じた対処法を見つけるためには、詳細なログや状況分析が必要になります。
問題が継続的に発生する場合には、サポートへ相談することをお勧めします。