オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【Oracle Database】「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」。SQL*PlusでDBにログインできない場合の原因と解決方法、調査方法

「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」表示で、SQL*PlusからOracleデータベースに接続ができない事象の原因と解決方法、調査方法を紹介します。いろいろな原因がありますが、本記事では私が経験したケースと、よくあるケースを記載しています。



<目次>

環境

Windows11のパソコンにOracle Database、Oracle Clientをインストール。
コマンドプロンプトからSQL*PlusでOracleデータベース(12c)に接続を試みました。

  • 自宅パソコンのOS:Windows11
  • Oracle Database Version:Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
  • Oracle Client:Release 12.2.0.1.0 Production

事象 (「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」が発生)

自宅パソコン(Windows11)Oracle DB(12c)に、SQL*Plusで接続しようとしたところ「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」MsgでDBにログインができない事象が発生。

背景としては、かなり久しぶりにOracle DBに接続を試みたが、パスワードの期限切れ(ORA-28001)の状態。SQL*Plusから「sqlplus / as sysdba」でログインして、パスワードの変更、ロックの解除をしようとしたのですが、「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」で、そもそもOracle DBに接続ができない状況でした。

ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました

「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」の原因

今回の私のケース (Oracle16cのクライアント側のSQL*Plusが起動していた)

システム環境変数の並び順で、Oracle12cではなく、Oracle19c 側のSql*Plusが起動していたことが原因でした。

(Oracle DBA Bronzeの試験勉強用にOracle19cをインストールして、不完全なに放置していたのを忘れてました......)

コマンドプロンプトをよくよく見ると、Release 19.0.0.0.0・・・Version 19.3.0.0.0と表示されてました。

ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました

よくある別のケース (Client側のSLQ*Plusが起動していた)

Oracleデータベースをインストール後に、Oracle Clientをインストールしたことで、システム環境変数にOracle Clientが追加され、Oracle Client側のSQL* Plusが起動することが原因で発生することがあるようです。

Oracle Clientのパスが追加されている

公式ドキュメントに記載の原因・処置

公式ドキュメントには以下のように書かれていますが、「ORA-12560」は環境変数関連の原因により発生することが多いように思います。
(インターネットでも環境変数関連の事象が散見されました。)

ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました
原因: 一般的なプロトコル・アダプタ・エラーが発生しました。
処置: 使用しているアドレスを調べて、正しいプロトコルが指定されているかどうかを確認してください。このエラーを報告する前に、エラー・スタックを調べて下位レベルの通信エラーを確認してください。詳細を調べるには、トレースをオンにして操作を再実行してください。操作が完了したら、トレースをオフにしてください。

引用元:11gリリース2
ORA-12500からORA-12699

ORA-12560 TNS: 接続を失いました。
原因: OracleServiceSIDサービス、OracleHOMENAMETNSListenerサービス、またはその両方が実行されていません。このエラーは、SQL*PlusのようなOracle Databaseユーティリティを使用しようとした場合に発生します。このエラーは次のOracle7エラーに類似しています。ORA-09352: Windows 32ビットの2タスク・ドライバは新規のORACLEタスクを起動できません
処置: 両方のサービスが起動していることを確認します。

引用元:18c for Microsoft Windows
データベース接続の問題




ORA-12560の解決方法 (システム環境変数(PATH)の順番を編集する)

今回の私のケースの解決方法(Oracle16cのクライアント側のSQL*Plusが起動していた)

以下の手順でシステム環境変数の順番を編集しました。

システム環境変数の編集方法

1.[Windows]キーを押し、検索ボックスに「システム環境変数」と入力。「システム環境変数の編集」を選択する

2.「環境変数」を選択する

システムのプロパティ画面 環境変数

3.下側の「システム環境変数」「Path」の行を選択し、「編集」を選択する

環境変数画面 システム環境変数

4.19cのClient(D:\app\client\***\product\19.0.0\client_1\bin)を選択し、画面右側の「下へ」を何度か押して、「D:\app\ora\product\12.2.0\dbhome_1\bin」「D:\app\ora\product\12.2.0\client_1\bin」の下側まで移動させて、「OK」を選択する

※Pathのフォルダ名やバージョンなどは、ご自身の環境により異なります

環境変数の編集


5.環境変数画面で「OK」、システムのプロパティ画面で「OK」を選択し、設定画面を閉じる

6.新たにコマンドプロンプトを起動し、「path」と入力し、環境変数の順番が設定したとおりであることを確認する
※設定前にコマンドプロンプトを開いている場合は閉じて、新たにコマンドプロンプトを開いてください。(コマンドプロンプトを再起動しないと環境変数が反映されないので注意)

path


7.新たに開いたコマンドプロンプトにて、「sqlplus / as sysdba」を入力し、データベースに接続できることを確認する

コマンドプロンプト SQL*Plus


上記手順でデータベースに接続ができれば、解決です。
私の場合は、パスワードの期限切れ、アカウントロックの状態でしたので、sysdbaの状態で以下のSQLを実行してアカウントのロック解除、パスワードの変更を実行しました。

アカウントロックの解除

alter user ユーザ名 account unlock;

パスワードの変更

ALTER USER ユーザ名 IDENTIFIED BY 新パスワード

よくある別のケースの解決方法(Client側のSLQ*Plusが起動していた)

システム環境変数の順番を「D:\app\ora\product\12.2.0\dbhome_1\bin;」、「D:\app\ora\product\12.2.0\client_1\bin;」に変更します。
手順は上記の「今回の私のケースの解決方法」と同じです。

システム環境変数の編集方法

1.[Windows]キーを押し、検索ボックスに「システム環境変数」と入力。「システム環境変数の編集」を選択する

2.「環境変数」を選択する

システムのプロパティ画面 環境変数

3.下側の「システム環境変数」「Path」の行を選択し、「編集」を選択する

環境変数画面 システム環境変数

4.Client(D:\app\ora\product\12.2.0\client_1\bin;)を選択し、画面右側の「下へ」を押して、「D:\app\ora\product\12.2.0\dbhome_1\bin」の下側まで移動させて、「OK」を選択する
※Pathのフォルダ名やバージョンなどは環境により異なります
※SQL*Plusは上側のPathのものが起動するようなので、「D:\app\ora\product\12.2.0\dbhome_1\bin」の下まで移動させます。

システム環境変数

5.環境変数画面で「OK」、システムのプロパティ画面で「OK」を選択し、設定画面を閉じる

6.新たにコマンドプロンプトを起動し、「path」を入力し、環境変数の順番が設定したとおりであることを確認する
※設定前にコマンドプロンプトを開いている場合は閉じて、新たにコマンドプロンプトを開いてください。(コマンドプロンプトを再起動しないと環境変数が反映されないので注意)

path


7.新たに開いたコマンドプロンプトにて、「sqlplus / as sysdba」を入力し、データベースに接続できることを確認する

コマンドプロンプト SQL*Plus

上記手順でデータベースに接続ができれば、解決です。



システム環境変数の順番を変えない解決方法 (暫定対応)

構成上、システム環境変数の順番を変更できない場合は、コマンドプロンプトに以下のようにフルパスで「sqlplus / as sysdba」を指定して起動する方法があります。

D:\app\ora\product\12.2.0\dbhome_1\bin\sqlplus / as sysdba
コマンドプロンプトで、フルパス指定でSQLPlusを起動

SQL*Plusでデータベースに接続する際に「ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました」が発生した時の調査方法

以下の項目を調査してみると良いと思います。

  • 複数のOracelデータベース、Oracleクライアントをインストールしている場合は、どのバージョンのSQL*Plusが起動しているかどうか

sqlplus / as sysdbaで接続を試した際に画面に表示される情報を確認してみると良いと思います。

sysdbaでSQL*Plusに接続
  • システム環境変数に設定されているPathに指定されているフォルダ内のSQL*Plusが起動できるかどうか

システム環境変数のPathが以下の順番で指定されている場合

  • D:\app\ora\product\12.2.0\client_1\bin
  • D:\app\ora\product\12.2.0\dbhome_1\bin

まず、それぞれのフォルダに移動して、SQL*Plusの実行ファイル「sqlplus.exe」をダブルクリックで実行してみます。


client_1側のSQL*Plusは起動しない。

client_1側のsqlplus.exe

dbhome_1側のSQL*Plusは正常に起動する。

dbhome_1側のsqlplus.exe

上記の場合はシステム環境変数の順番を変更(dbhome_1のパスをclient1のパスの上に移動)すれば解決すると思います。



以上、お読みいただきありがとうございました。