【完全版】ORA-12154: TNS:could not resolve the connect identifier specified エラーの原因と対処法|Oracle接続識別子エラー全パターン徹底解説
- 作成日 2026.06.16
- 更新日 2026.06.17
- Oracle Database
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の悩みが全て解決します。
- 1. 結論:今すぐ試すべき3ステップ
- 2. まず押さえる:ORA-12154とORA-12541の違い
- 3. Oracle接続識別子の3つの解決方法
- 4. ORA-12154の原因カテゴリ
- 5. 【原因①】tnsnames.oraに該当エントリがない(最頻出)
- 6. 【原因②】tnsnames.oraの場所が間違っている(OracleClientが別ファイルを見ている)
- 7. 【原因③】tnsnames.oraの書式エラー
- 8. 【原因④】接続識別子(エイリアス名)のタイプミス
- 9. 【原因⑤】Easy Connect書式のミス
- 10. 【原因⑥】sqlnet.oraの設定問題
- 11. 【原因⑦】複数Oracle Home共存時の問題
- 12. 【原因⑧】Oracle Walletを使ったクラウド接続
- 13. SQL Developer での ORA-12154
- 14. プログラム言語別 ORA-12154 対処
- 15. デバッグ・ロギングを有効にする
- 16. トラブルシューティング・チェックリスト
- 17. よくある質問(FAQ)
- 17.1. Q1. sqlplusでは繋がるのに、SQL Developerでは ORA-12154 が出ます
- 17.2. Q2. tnsnames.oraに確かに書いたのに認識されません
- 17.3. Q3. Easy Connect書式(//host:1521/service)でも失敗します
- 17.4. Q4. TNS_ADMINを設定してもエラーが解消しません
- 17.5. Q5. Walletを使ったAutonomous Database接続でORA-12154
- 17.6. Q6. ORA-12154とORA-12541が交互に出ます
- 17.7. Q7. Linuxサーバーで Windowsから作ったtnsnames.oraが認識されません
- 17.8. Q8. tnsnames.oraを編集した後、Oracleを再起動する必要がありますか?
- 17.9. Q9. NAMES.DEFAULT_DOMAINを設定したら接続できなくなりました
- 17.10. Q10. Docker内のアプリケーションからホストのOracleに繋がりません
- 18. 参考リンク・関連資料
- 19. まとめ
結論:今すぐ試すべき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.oraのNAMES.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 ... @ORCLのORCLに該当 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の優先順位
- 環境変数
TNS_ADMINで指定されたパス %ORACLE_HOME%\network\admin\または$ORACLE_HOME/network/admin/- (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が参照されたか確実に分かります。
【原因④】接続識別子(エイリアス名)のタイプミス
シンプルですが意外に多いミスです。
よくあるパターン
| 入力 | 想定 | 原因 |
|---|---|---|
ORC1 | ORCL | 「L」と「1」の混同 |
prodb | proddb | スペル誤り |
orcl_db | ORCL_DB | 大文字小文字 |
ORCL.world | ORCL | ドメイン部分の有無 |
大小文字の扱い
tnsnames.oraのエントリ名は大文字小文字を区別しないのが標準です。ORCL、orcl、Orclは同じものとして扱われます。ただし、引用符で囲んだ場合は区別されるので注意:
# ダブルクォート付き:大小文字区別あり
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.oraでNAMES.DIRECTORY_PATHにEZCONNECTが含まれていない可能性:
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になります。
対処法
- tnsnames.oraのエントリ名にドメインを含める:
ORCL.example.com =
(DESCRIPTION = ...)
- NAMES.DEFAULT_DOMAINを削除またはコメントアウト
- 接続時に末尾ドット:
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の場所を設定できます:
- SQL Developer メニュー → ツール → 設定
- 左メニュー → データベース → 詳細
- 「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が出た時に上から順にチェックする手順です。
- 接続識別子のスペル確認: 大文字小文字含めてチェック
- Easy Connect書式で代替テスト:
//host:1521/service - tnsnames.oraの場所特定:
tnspingで表示されるUsed parameter filesを確認 - TNS_ADMIN環境変数: 設定値とファイル実在を確認
- tnsnames.oraの書式チェック: 括弧・改行・BOM
- sqlnet.ora の NAMES.DIRECTORY_PATH:
TNSNAMES, EZCONNECTが含まれるか - NAMES.DEFAULT_DOMAIN: 不要なドメイン補完がないか
- 複数Oracle Home: PATH・
which sqlplusの確認 - Wallet使用時:
WALLET_LOCATIONと実際のパス一致 - トレースログ有効化: 最終手段として詳細情報取得
よくある質問(FAQ)
Q1. sqlplusでは繋がるのに、SQL Developerでは ORA-12154 が出ます
SQL Developerが参照しているtnsnames.oraがsqlplusと異なる可能性があります。SQL Developerのメニュー「ツール → 設定 → データベース → 詳細」でTnsnamesディレクトリを明示的に設定してください。
Q2. tnsnames.oraに確かに書いたのに認識されません
最も多い原因は「Oracleが別のtnsnames.oraを見ている」です。tnsping ORCLを実行し、出力のUsed parameter filesに表示されるパスが、自分が編集したファイルと一致しているか確認してください。
Q3. Easy Connect書式(//host:1521/service)でも失敗します
sqlnet.oraのNAMES.DIRECTORY_PATHにEZCONNECTが含まれていない可能性があります:
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公式ドキュメント
- Oracle Database Error Messages – ORA-12154 – 公式エラー解説
- Oracle Database Net Services Administrator’s Guide – Net Services管理ガイド
- Connecting to Oracle Database Using Net Service Names – 接続識別子設定
- Easy Connect Plus Configuration – Easy Connect仕様
クラウド・Wallet
- Oracle Autonomous Database – Connect with Wallet – Wallet使用方法
- OCI Database – Wallet Files – Wallet全般
プログラム言語ドライバ
- python-oracledb – Connection Strings – Python接続詳細
- JDBC Developer’s Guide – Connection URLs – JDBC接続URL
- node-oracledb – Connection Strings – Node.js接続詳細
- ODP.NET – Connection String Attributes – .NET接続詳細
関連エラー記事(本サイト)
- ORA-01017: invalid username/password エラー対処 – 認証エラー
- ORA-12541: TNS no listener エラー対処 – リスナー接続エラー
- ORA-00942: 表またはビューが存在しません エラー対処(準備中)
関連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公式ドキュメントもあわせてご確認ください。
-
前の記事
【完全版】ORA-12541: TNS:no listener エラーの原因と対処法|全パターン徹底解説 2026.06.15
-
次の記事
【完全版】ORA-01555: snapshot too old エラーの原因と対処法 2026.06.16
コメントを書く