【完全版】ORA-12154: TNS:could not resolve the connect identifier specified エラーの原因と対処法|Oracle接続識別子エラー全パターン徹底解説

【完全版】ORA-12154: TNS:could not resolve the connect identifier specified エラーの原因と対処法|Oracle接続識別子エラー全パターン徹底解説

Oracle Databaseに接続しようとして、以下のエラーで失敗した経験はありませんか?

ORA-12154: TNS:could not resolve the connect identifier specified

「指定された接続識別子を解決できません」というメッセージで、ORA-12541と並んで頻出する接続エラーです。しかし、両者は原因も対処法も全く違うため、混同すると無駄なトラブルシューティングを繰り返すことになります。

  • SQL*Plusでは繋がるのにSQL Developerでは失敗する
  • 別のPCでは成功するのに自分のPCでは失敗する
  • tnsnames.oraに書いたはずなのに認識されない
  • Easy Connect書式(//host:port/service)で何度試しても失敗する
  • ODBC、JDBCで設定したのに接続できない

本記事では、ORA-12154エラーのすべての原因と対処法を、現場で即使えるトラブルシューティング手順として整理します。tnsnames.oraの仕組みから、TNS_ADMIN環境変数、sqlnet.oraの役割、Easy Connectの正しい書式、SQL Developer/JDBC/Python設定、クラウド環境のWallet利用まで完全網羅。この1本でORA-12154の悩みが全て解決します。


目次

結論:今すぐ試すべき3ステップ

時間がない方向けに、まず試すべき手順を示します。

ステップ1:Easy Connect書式で接続を試す

tnsnames.oraを使わず直接ホスト・ポート・サービス名を指定:

sqlplus user/password@//hostname:1521/service_name

これで成功すれば、原因はtnsnames.oraの問題に絞り込めます。

ステップ2:tnsnames.oraの場所を確認

# Linux
echo $TNS_ADMIN
echo $ORACLE_HOME/network/admin/tnsnames.ora

# Windows  
echo %TNS_ADMIN%
echo %ORACLE_HOME%\network\admin\tnsnames.ora

ステップ3:tnspingで名前解決をテスト

tnsping ORCL

TNS-03505: 名前を解決できませんが出たら、tnsnames.oraに該当エントリがありません。

それでも解決しない場合は、以下の詳細な原因分析へ進んでください。


まず押さえる:ORA-12154とORA-12541の違い

トラブル切り分けで最も重要な区別です。

エラー意味失敗フェーズ
ORA-12154接続識別子を名前解決できないtnsnames.oraやsqlnet.oraでの名前解決段階
ORA-12541名前解決はできたがリスナーに到達不可ネットワーク到達段階

具体例で比較

# 正しい接続文字列
sqlplus user/pw@PRODDB

# PRODDBがtnsnames.oraに無い → ORA-12154
# PRODDBは存在するがリスナーが落ちている → ORA-12541

**ORA-12154は「住所が分からない」、ORA-12541は「住所はあるが行ったら誰もいない」**と覚えるとイメージしやすいです。


Oracle接続識別子の3つの解決方法

ORA-12154を理解するには、接続識別子の名前解決の仕組みを知る必要があります。

名前解決の3方式

方式概要用途
Easy Connect//host:port/service の直接記述最も簡単。tnsnames.ora不要
Local Naming(TNS)tnsnames.oraでエイリアス定義標準的な方式
Directory Naming(LDAP)OIDなどLDAPサーバーで集中管理大規模環境

どの方式を使うかはsqlnet.oraNAMES.DIRECTORY_PATHパラメータで決まります:

NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, LDAP)

リスト順に試行されます。TNSNAMESがリストに無い場合、tnsnames.oraに書いても解決されません。


ORA-12154の原因カテゴリ

カテゴリ原因例頻度
エントリ不在tnsnames.oraに該当TNSエイリアスがない最多
ファイル位置TNS_ADMIN設定ミス、Oracleが別のtnsnames.oraを見ている
書式エラー括弧の対応ミス、空白文字混入、改行コード問題
入力ミスエイリアス名のタイプミス
設定不整合sqlnet.oraのNAMES.DIRECTORY_PATH設定
複数Oracle Home複数バージョン共存時の参照ミス
クラウド固有Wallet設定不備、tnsnames.ora位置

これらを順番に切り分けるのが効率的です。


【原因①】tnsnames.oraに該当エントリがない(最頻出)

最も多いケースです。設定追加を忘れている、または別環境のtnsnames.oraを参照しています。

tnsnames.oraの内容を確認

cat $ORACLE_HOME/network/admin/tnsnames.ora

Windowsの場合:

type %ORACLE_HOME%\network\admin\tnsnames.ora

正しい記述例

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )

PRODDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = prod-db.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PROD)
    )
  )

tnsnames.oraの記述ルール

  • ファイル冒頭のエイリアス名sqlplus ... @ORCLORCLに該当
  • HOSTはサーバーのホスト名またはIPアドレス
  • PORTはリスナーのポート(標準1521)
  • SERVICE_NAMEはDBサービス名(SIDより推奨)
  • 複数エントリは空行で区切る

エントリ追加

エディタでtnsnames.oraを開いて末尾に追加:

NEWDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = newhost)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = NEWDB))
  )

ファイル保存後、即座に有効になります(再起動不要)。


【原因②】tnsnames.oraの場所が間違っている(OracleClientが別ファイルを見ている)

最も混乱を生む原因です。「tnsnames.oraに書いたのに認識されない」と訴える方の多くがこのケースです。

Oracleが参照するtnsnames.oraの優先順位

  1. 環境変数 TNS_ADMIN で指定されたパス
  2. %ORACLE_HOME%\network\admin\ または $ORACLE_HOME/network/admin/
  3. (Windowsの場合)レジストリTNS_ADMIN

複数のtnsnames.oraがマシン上に存在し、意図しないファイルを見ていることが原因です。

TNS_ADMIN 環境変数を確認・設定

現在の値を確認

# Linux/Mac
echo $TNS_ADMIN

# Windows コマンドプロンプト
echo %TNS_ADMIN%

# Windows PowerShell  
echo $env:TNS_ADMIN

設定例

# Linux/Mac (.bashrc などに追加)
export TNS_ADMIN=/u01/app/oracle/product/21c/dbhome_1/network/admin
export ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# Windows コマンドプロンプト(一時的)
set TNS_ADMIN=C:\app\oracle\product\21c\client_1\network\admin

# Windows PowerShell(永続化)
[Environment]::SetEnvironmentVariable("TNS_ADMIN", "C:\app\oracle\client\network\admin", "User")

マシン内のtnsnames.oraを全て探す

# Linux/Mac
sudo find / -name "tnsnames.ora" 2>/dev/null

# Windows  
dir C:\ /s /b | findstr "tnsnames.ora"

複数見つかった場合、それぞれの場所と内容を確認してください。実際に使われているのは1つだけで、他は無視されています。

Instant Client使用時の典型的な罠

Oracle Instant Clientを使う場合、ORACLE_HOMEは不要ですがTNS_ADMINの設定が必須です。

# Instant Client 例
export TNS_ADMIN=/opt/oracle/instantclient_21_13/network/admin
export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_13
export PATH=/opt/oracle/instantclient_21_13:$PATH

そして、その場所にtnsnames.oraを配置します:

mkdir -p /opt/oracle/instantclient_21_13/network/admin
vi /opt/oracle/instantclient_21_13/network/admin/tnsnames.ora

【原因③】tnsnames.oraの書式エラー

ファイルは正しい場所にあり、エントリも存在するのに認識されない場合、構文エラーが原因です。

よくある構文エラー

エラー例1:括弧の対応ミス

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521)
    (CONNECT_DATA = (SERVICE_NAME = ORCL))
  )

(ADDRESS = ...)の閉じ括弧が抜けています。

エラー例2:余計な空白文字・タブ

エイリアス名と=の間にも厳密なルールがあります。手で打ち直すか、別環境からコピーするのが安全です。

エラー例3:改行コード問題(Windows ⇔ Linux)

Windows(CRLF)で作成したtnsnames.oraをLinuxにコピーすると、文末の^Mが悪さをすることがあります:

# 変換
dos2unix tnsnames.ora

# または
sed -i 's/\r$//' tnsnames.ora

エラー例4:BOM付きUTF-8

Windows のメモ帳で保存すると、ファイル先頭にBOMが付くことがあります。Notepad++VS Codeで「BOMなしUTF-8」または「ANSI」で保存し直してください。

書式が正しいかを検証

tnspingで名前解決を試行できます:

tnsping ORCL

成功例:

TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production

Used parameter files:
/u01/app/oracle/product/21c/dbhome_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = ORCL)))
OK (10 msec)

失敗例(書式エラー):

TNS-03505: Failed to resolve name

Used parameter filesの項目に実際に使われたファイルパスが表示されるので、これでどのtnsnames.oraが参照されたか確実に分かります。


【原因④】接続識別子(エイリアス名)のタイプミス

シンプルですが意外に多いミスです。

よくあるパターン

入力想定原因
ORC1ORCL「L」と「1」の混同
prodbproddbスペル誤り
orcl_dbORCL_DB大文字小文字
ORCL.worldORCLドメイン部分の有無

大小文字の扱い

tnsnames.oraのエントリ名は大文字小文字を区別しないのが標準です。ORCLorclOrclは同じものとして扱われます。ただし、引用符で囲んだ場合は区別されるので注意:

# ダブルクォート付き:大小文字区別あり
sqlplus 'user/password@"OrCl"'

【原因⑤】Easy Connect書式のミス

tnsnames.oraを使わずEasy Connect書式で接続する場合の書式エラーです。

標準書式

# 基本形
sqlplus user/password@//hostname:port/service_name

# ポート省略(1521がデフォルト)
sqlplus user/password@//hostname/service_name

# 完全修飾
sqlplus user/password@//hostname.domain.com:1521/service_name

よくあるミス

# ❌ スラッシュが1個(古いSID形式と混同)
sqlplus user/password@hostname:1521/service_name

# ❌ コロンが@とhostの間(誤)
sqlplus user/password@:hostname:1521/service_name

# ❌ サービス名の前のスラッシュ忘れ
sqlplus user/password@//hostname:1521 service_name

Easy Connect Plus(12c以降の拡張)

12c以降では拡張書式がサポートされ、追加パラメータを指定できます:

# SSL接続
sqlplus user/pw@//hostname:2484/service?ssl_server_cert_dn="cn=oracle.example.com"

# 接続タイムアウト指定
sqlplus user/pw@//hostname:1521/service?connect_timeout=10

Easy Connectが使えない場合

sqlnet.oraNAMES.DIRECTORY_PATHEZCONNECTが含まれていない可能性:

NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)

EZCONNECTを含めて保存してください。


【原因⑥】sqlnet.oraの設定問題

sqlnet.oraはOracle Netの全般的な設定を担います。

sqlnet.oraの場所

tnsnames.oraと同じディレクトリです:

$ORACLE_HOME/network/admin/sqlnet.ora

主要パラメータ

# 名前解決の順序
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)

# デフォルトドメイン(不要な場合は削除推奨)
NAMES.DEFAULT_DOMAIN = example.com

# 認証サービス
SQLNET.AUTHENTICATION_SERVICES = (NTS)

# 接続タイムアウト
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 10

NAMES.DEFAULT_DOMAIN の罠

このパラメータが設定されていると、接続識別子に自動的にドメインが付加されます:

sqlplus user/pw@ORCL
↓ 内部的に
sqlplus user/pw@ORCL.example.com

tnsnames.oraにORCLしか書いていないと、ORCL.example.comでは見つからずORA-12154になります。

対処法

  1. tnsnames.oraのエントリ名にドメインを含める:
ORCL.example.com =
  (DESCRIPTION = ...)
  1. NAMES.DEFAULT_DOMAINを削除またはコメントアウト
  2. 接続時に末尾ドット: sqlplus user/pw@ORCL.(末尾のドットでドメイン補完を無効化)

NAMES.DIRECTORY_PATH の確認

# 推奨設定
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)

(LDAP, ONAMES) だけが指定されていると、tnsnames.oraもEasy Connectも使えません。


【原因⑦】複数Oracle Home共存時の問題

開発マシンに複数のOracleクライアント・サーバーがインストールされていると、どのインストールが使われているか混乱します。

現在使われているOracle Homeを確認

# Linux/Mac
which sqlplus
echo $ORACLE_HOME

# Windows
where sqlplus
echo %ORACLE_HOME%

Windowsの場合:Oracle Home Selector

WindowsではOracle Universal Installerでデフォルトホームを設定できます。 コマンドプロンプトから:

opho selectall

または、レジストリ HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE を確認します。

PATHの順序を確認

# Linux
echo $PATH | tr ':' '\n'

複数のoracle/binがPATHにある場合、最初に登場するものが使われます。意図したバージョンが先に来ているか確認してください。


【原因⑧】Oracle Walletを使ったクラウド接続

Oracle Autonomous DatabaseやOCIのDBaaSではWalletを使った接続が標準です。

Walletの場所と設定

ダウンロードしたWalletを展開し、その場所をTNS_ADMINに指定します:

# Wallet解凍
mkdir -p /opt/oracle/wallet
unzip Wallet_MYDB.zip -d /opt/oracle/wallet

# TNS_ADMIN設定
export TNS_ADMIN=/opt/oracle/wallet

Walletには tnsnames.ora が含まれている

/opt/oracle/wallet/
├── README
├── cwallet.sso
├── ewallet.p12
├── keystore.jks
├── ojdbc.properties
├── sqlnet.ora       ← Wallet用
├── tnsnames.ora     ← Autonomous用のエイリアス定義
├── truststore.jks

tnsnames.oraを開くと、Autonomous Databaseの5つのサービス(high、medium、low、tp、tpurgent)が定義されています:

mydb_high = (description=...
mydb_medium = ...
mydb_low = ...

接続

sqlplus admin/password@mydb_high

よくあるミス

  • Walletを解凍した場所とTNS_ADMINが一致していない
  • 古いWallet(IPアドレスが変わったなど)を使っている
  • sqlnet.ora内のWALLET_LOCATIONパスが解凍場所と異なる

ダウンロード後のsqlnet.oraを確認:

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
SSL_SERVER_DN_MATCH=yes

?/network/admin$TNS_ADMINを意味します。TNS_ADMINが正しいパスを指していれば動作します。


SQL Developer での ORA-12154

GUIツール特有の設定問題があります。

接続タイプの選択

「接続」ダイアログで:

  • Basic: ホスト名・ポート・サービス名を直接入力(tnsnames.ora不要)
  • TNS: tnsnames.oraのエイリアスを選択
  • Advanced: 任意のJDBC URL指定

ORA-12154が出る場合、Basicモードに切り替えて接続テストしてみてください。成功すればtnsnames.ora側の問題と切り分けられます。

TNSの参照先

SQL Developerでは「TNSモード」選択時に参照するtnsnames.oraの場所を設定できます:

  1. SQL Developer メニュー → ツール設定
  2. 左メニュー → データベース詳細
  3. Tnsnamesディレクトリ」を入力

ここで指定したディレクトリ内のtnsnames.oraが使われます。

JDBC内部ロジックの影響

SQL DeveloperはJDBC Thinドライバを使うため、ORACLE_HOME/TNS_ADMINの解釈がsqlplusと微妙に異なる場合があります。意図したファイルを見ているかは「TNSモード」の接続別名プルダウンに該当エイリアスが表示されるかで確認できます。


プログラム言語別 ORA-12154 対処

Python(python-oracledb)

Thin Mode(デフォルト・推奨)

Thin ModeではOracle Clientが不要で、tnsnames.oraも特別な手順で利用します:

import oracledb

# Easy Connect(推奨)
conn = oracledb.connect(
    user="scott",
    password="tiger",
    dsn="hostname:1521/service_name"
)

# tnsnames.ora を使う場合は TNS_ADMIN または config_dir 指定
oracledb.defaults.config_dir = "/path/to/tns_admin"
conn = oracledb.connect(
    user="scott",
    password="tiger",
    dsn="ORCL"
)

# Walletを使う場合
conn = oracledb.connect(
    user="admin",
    password="password",
    dsn="mydb_high",
    config_dir="/opt/oracle/wallet",
    wallet_location="/opt/oracle/wallet",
    wallet_password="walletpass"
)

Thick Mode

oracledb.init_oracle_client()でThick Modeに切り替えると、Instant Clientの設定が活用されます:

import oracledb

oracledb.init_oracle_client(
    lib_dir="/opt/oracle/instantclient_21_13",
    config_dir="/opt/oracle/wallet"  # tnsnames.oraの場所
)

conn = oracledb.connect(user="scott", password="tiger", dsn="ORCL")

Java(JDBC)

// Easy Connect(最も確実)
String url = "jdbc:oracle:thin:@//hostname:1521/service_name";

// TNS方式(tnsnames.oraを使う)
// 環境変数TNS_ADMINで場所を指定 or システムプロパティ
System.setProperty("oracle.net.tns_admin", "/path/to/tns_admin");
String url = "jdbc:oracle:thin:@ORCL";

// Walletを使う場合
String url = "jdbc:oracle:thin:@mydb_high?TNS_ADMIN=/opt/oracle/wallet";

Node.js(node-oracledb)

const oracledb = require('oracledb');

// Easy Connect
const conn = await oracledb.getConnection({
    user: 'scott',
    password: 'tiger',
    connectString: 'hostname:1521/service_name'
});

// tnsnames.oraを使う場合
oracledb.initOracleClient({ configDir: '/path/to/tns_admin' });
const conn = await oracledb.getConnection({
    user: 'scott',
    password: 'tiger',
    connectString: 'ORCL'
});

.NET(ODP.NET)

// Easy Connect
string connStr = "User Id=scott;Password=tiger;Data Source=//hostname:1521/service_name";

// TNS方式
string connStr = "User Id=scott;Password=tiger;Data Source=ORCL";
// %TNS_ADMIN% または ORACLE_HOME\network\admin が参照される

// Walletを使う場合(ODP.NET Managed の場合)
OracleConfiguration.WalletLocation = "/opt/oracle/wallet";
OracleConfiguration.TnsAdmin = "/opt/oracle/wallet";
string connStr = "User Id=admin;Password=password;Data Source=mydb_high";

デバッグ・ロギングを有効にする

原因が特定できない場合、Oracle Netのトレースログを有効化すると詳細情報が得られます。

sqlnet.ora に追加

# トレース有効化
TRACE_LEVEL_CLIENT = 16
TRACE_DIRECTORY_CLIENT = /tmp/oracle_trace
TRACE_FILE_CLIENT = client_trace
TRACE_UNIQUE_CLIENT = ON

# ログ
LOG_DIRECTORY_CLIENT = /tmp/oracle_log
LOG_FILE_CLIENT = client_log

接続を試行すると指定ディレクトリにログが生成され、名前解決の試行内容が記録されます。

TRACE_LEVEL_CLIENTの値

出力量
OFF (0)無効
USER (4)最小限
ADMIN (10)管理者向け
SUPPORT (16)サポート向け(最大)

ログは大量に出力されるので、デバッグ後は無効化してください。


トラブルシューティング・チェックリスト

ORA-12154が出た時に上から順にチェックする手順です。

  1. 接続識別子のスペル確認: 大文字小文字含めてチェック
  2. Easy Connect書式で代替テスト: //host:1521/service
  3. tnsnames.oraの場所特定: tnspingで表示されるUsed parameter filesを確認
  4. TNS_ADMIN環境変数: 設定値とファイル実在を確認
  5. tnsnames.oraの書式チェック: 括弧・改行・BOM
  6. sqlnet.ora の NAMES.DIRECTORY_PATH: TNSNAMES, EZCONNECTが含まれるか
  7. NAMES.DEFAULT_DOMAIN: 不要なドメイン補完がないか
  8. 複数Oracle Home: PATH・which sqlplusの確認
  9. Wallet使用時: WALLET_LOCATIONと実際のパス一致
  10. トレースログ有効化: 最終手段として詳細情報取得

よくある質問(FAQ)

Q1. sqlplusでは繋がるのに、SQL Developerでは ORA-12154 が出ます

SQL Developerが参照しているtnsnames.orasqlplusと異なる可能性があります。SQL Developerのメニュー「ツール → 設定 → データベース → 詳細」でTnsnamesディレクトリを明示的に設定してください。

Q2. tnsnames.oraに確かに書いたのに認識されません

最も多い原因は「Oracleが別のtnsnames.oraを見ている」です。tnsping ORCLを実行し、出力のUsed parameter filesに表示されるパスが、自分が編集したファイルと一致しているか確認してください。

Q3. Easy Connect書式(//host:1521/service)でも失敗します

sqlnet.oraNAMES.DIRECTORY_PATHEZCONNECTが含まれていない可能性があります:

NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)

または、サービス名でなくSID指定が必要な古いDBに対しては:

sqlplus user/pw@//host:1521/SID形式は使えない
# SID指定はこの書式
sqlplus user/pw@host:1521:SID

Q4. TNS_ADMINを設定してもエラーが解消しません

設定が永続化されていない可能性があります。.bashrc.profile、Windowsのシステム環境変数で恒久的に設定してください。また、設定後にシェルやアプリケーションを再起動しないと反映されません。

Q5. Walletを使ったAutonomous Database接続でORA-12154

最頻出原因:

  • 解凍したフォルダとTNS_ADMINが不一致
  • 古いWalletを使っている(接続情報が変更されている)
  • 解凍時にディレクトリ構造が崩れている(zipのまま使っているなど)

新しいWalletをダウンロード → 完全解凍 → TNS_ADMINを解凍先に設定、で再試行してください。

Q6. ORA-12154とORA-12541が交互に出ます

接続文字列によって異なるエラーが出る場合、複数の問題が同時に発生している可能性があります:

  • ある時はtnsnames.oraに無いエイリアスを指定(12154)
  • ある時はリスナーダウン中のサーバー指定(12541)

それぞれの接続文字列ごとに切り分けが必要です。

Q7. Linuxサーバーで Windowsから作ったtnsnames.oraが認識されません

改行コードがCRLFの可能性。LinuxはLFが標準のため:

dos2unix tnsnames.ora
# または
sed -i 's/\r$//' tnsnames.ora

または、Linux上で新規にviで作り直すのが確実です。

Q8. tnsnames.oraを編集した後、Oracleを再起動する必要がありますか?

不要です。tnsnames.oraはクライアントが接続のたびに読み込むので、編集後すぐに有効になります。ただし、長時間動作しているアプリケーションサーバー等で接続プールを使っている場合は、新しいエントリの反映に再起動が必要なこともあります。

Q9. NAMES.DEFAULT_DOMAINを設定したら接続できなくなりました

NAMES.DEFAULT_DOMAIN = example.com を設定すると、すべての接続識別子に自動でドメインが付加されます。tnsnames.oraの全エントリ名にドメインを付けるか、NAMES.DEFAULT_DOMAINをコメントアウトしてください:

# NAMES.DEFAULT_DOMAIN = example.com  ← コメントアウト

Q10. Docker内のアプリケーションからホストのOracleに繋がりません

Dockerコンテナから見たホスト名が正しく解決される必要があります:

  • Linux: host.docker.internal(バージョン依存)または --add-host で対応
  • Mac/Windows Docker Desktop: host.docker.internal が使える

接続文字列:

sqlplus user/pw@//host.docker.internal:1521/service

または明示的にホストのIPを指定:

docker run --add-host=dbserver:192.168.1.100 ...

参考リンク・関連資料

Oracle公式ドキュメント

クラウド・Wallet

プログラム言語ドライバ

関連エラー記事(本サイト)

関連Oracle記事(本サイト)

  • [Oracleバージョン確認の方法]
  • [Oracleユーザー一覧の取得方法]
  • [Oracleテーブル一覧の取得方法]
  • [Oracle directoryの確認方法]

まとめ

ORA-12154は「接続識別子の名前解決ができない」エラーで、原因のほとんどは設定ファイルの位置・内容にあります。要点を再整理します。

  • ORA-12541との違い: 12154は「住所不明」、12541は「住所はあるが応答なし」
  • 最頻出原因: tnsnames.oraのエントリ不在、または別ファイルを参照している
  • TNS_ADMIN環境変数の確認は必須: どのtnsnames.oraが使われているかを把握
  • tnspingで切り分け: Used parameter filesの表示で実際の参照先を確認
  • Easy Connect で回避: //host:1521/service 形式でtnsnames.ora不要
  • sqlnet.oraのNAMES.DIRECTORY_PATH: TNSNAMES, EZCONNECTが含まれること
  • NAMES.DEFAULT_DOMAINの罠: 不要なドメイン補完で見つからなくなる
  • クラウドWallet: 解凍場所とTNS_ADMINの一致を確認

これらの知識は、Oracle接続トラブル全般に応用できます。本記事をブックマークしておけば、ORA-12154に遭遇した時の対応が大幅に効率化されます。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c / 21c / 23ai / 26ai および Oracle Instant Client 21cでの動作確認・公式ドキュメントに基づき作成しています。バージョンやプラットフォームによって設定方法が異なる場合があるため、最新の情報はOracle公式ドキュメントもあわせてご確認ください。