【完全ガイド】ORA-12514: TNS:listener does not currently know of service の原因と解決方法|SERVICE_NAME・CDB/PDB・LOCAL_LISTENER 徹底解説

【完全ガイド】ORA-12514: TNS:listener does not currently know of service の原因と解決方法|SERVICE_NAME・CDB/PDB・LOCAL_LISTENER 徹底解説

Oracle 開発者・DBA が接続時に頻繁に遭遇する典型的エラー:

$ sqlplus scott/tiger@ORCL
ERROR:
ORA-12514: TNS:listener does not currently know of service 
           requested in connect descriptor

**「Listener がリクエストされた service を知らない」**というシンプルなメッセージ。Listener は動いているが SERVICE_NAME が登録されていない状況を意味します:

  • ORA-12541 (Listener 未起動) とは違う
  • Listener は起動している
  • 接続要求は Listener に届いた
  • その service が Listener の管理下にない

このエラーの本質は、Oracle 公式ドキュメントが明確に述べています:

「The listener received a request to establish a connection to a database 
  or other service. The connect descriptor received by the listener 
  specified a service name for a service (usually a database service) 
  that either has not yet dynamically registered with the listener or 
  has not been statically configured for the listener.」

受付は動いているが、要求された名前が名簿にない状態

目次

接続系エラー 6 種の完全比較

Oracle 接続系エラーの全体像:

ORA-12541: TNS:no listener
  → Listener 自体が起動していない

ORA-12154: TNS:could not resolve the connect identifier
  → クライアント側 tnsnames.ora で名前解決失敗

ORA-12514: TNS:listener does not currently know of service  ← 本記事
  → Listener 起動、但し service 未登録

ORA-12170: TNS:Connect timeout occurred
  → ネットワーク遅延でタイムアウト

ORA-01034: ORACLE not available
  → DB インスタンスが起動していない

ORA-01017: invalid username/password
  → 認証失敗

CDB/PDB アーキテクチャの罠(12c+)

Oracle 12c 以降のマルチテナントが新たな混乱源:

CDB (Container Database)
├── CDB$ROOT
├── PDB$SEED
├── PDB1 (Pluggable Database)
├── PDB2
└── PDB3

CDB service name: orclcdb
PDB service name: pdb1, pdb2, pdb3

sqlplus sys/pass@localhost/orclcdb    ← CDB 接続 OK
sqlplus sys/pass@localhost/pdb1       ← PDB 接続、状態次第

PDB が MOUNT 状態(未 OPEN)ではservice 未公開、ORA-12514 発生。

現場で最も典型的なパターン:

  • SERVICE_NAME のスペルミス(最頻出)
  • CDB/PDB 混同(12c+ の典型的問題)
  • PMON がまだ登録していない(DB 起動直後)
  • PDB が MOUNTED(OPEN されていない)
  • LOCAL_LISTENER パラメータが listener と不整合
  • Multi-listener 環境で登録先が違う
  • 手動で service 停止
  • 大文字小文字(case sensitivity)
  • DBMS_SERVICE.START_SERVICE で service 未起動
  • Oracle EBS クローン後の service 未起動(実例)

多くの日本語記事が「tnsnames.ora を確認せよ」で終わりますが、実務では:

  • 接続系エラー6種の厳密な区別
  • lsnrctl services による登録済み service 一覧確認
  • ALTER SYSTEM REGISTER による手動登録
  • PDB の状態確認v$pdbs
  • LOCAL_LISTENER パラメータの正しい設定
  • ALTER PLUGGABLE DATABASE OPEN による PDB 起動
  • DBMS_SERVICE.START_SERVICE による service 手動起動
  • Multi-listener 環境での確認
  • Oracle EBS / SAP 固有の問題
  • AWS RDS Oracle での対応

さらに、PDB 対応は現代 Oracle の必須知識:

-- CDB 内から PDB 状態確認
SELECT name, open_mode FROM v$pdbs;

-- PDB 起動
ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- 自動起動設定
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

本記事では、ORA-12514: TNS:listener does not currently know of service完全な原因と解決方法を、リファレンスとして実用的に整理します。10大発生パターン、CDB/PDB 対応、6つの解決策、Rails/Java/Python 対応、実践シナリオ、FAQまで完全網羅。この1本で ORA-12514 に冷静に的確に対処できるようになります。


結論:lsnrctl services で登録確認

時間がない方向けに、最速の対処を先に示します。

エラーメッセージの読み方

ORA-12514: TNS:listener does not currently know of service 
           requested in connect descriptor
                    ↑
             要求された SERVICE_NAME

= Listener は起動している
  但し要求された service が登録されていない

最速の診断

# STEP 1: 登録済み service 一覧
$ lsnrctl services

# STEP 2: 接続文字列の SERVICE_NAME 確認
$ cat tnsnames.ora | grep -A 5 SERVICE_NAME

# STEP 3: DB 側の service 名確認
sqlplus / as sysdba
SQL> SHOW PARAMETER service_names
SQL> SELECT name FROM v$active_services;

# STEP 4: PDB 状態確認(12c+)
SQL> SELECT name, open_mode FROM v$pdbs;

6つの解決策

#手法使う場面
SERVICE_NAME 修正スペルミス
ALTER SYSTEM REGISTERPMON 未登録
PDB OPENPDB 未起動
LOCAL_LISTENER 設定Listener 不整合
DBMS_SERVICE.START_SERVICEService 停止
Listener 再起動最終手段

接続系エラー 6 種

エラー意味
ORA-12541Listener 未起動
ORA-12154TNS 名前解決失敗
ORA-12514Service 未登録 ← 本記事
ORA-12170接続タイムアウト
ORA-01034DB 未起動
ORA-01017認証失敗

詳細は以下で解説します。


Oracle 接続の仕組み

SID vs SERVICE_NAME

古い方式 (SID):

SID = System Identifier
Oracle インスタンスを識別
1 DB = 1 SID

接続文字列: dbserver:1521:ORCL

新方式 (SERVICE_NAME):

SERVICE_NAME = 論理的なサービス名
1 DB に複数 service 可能
RAC / Data Guard 対応

接続文字列: dbserver:1521/ORCL

現代の推奨: SERVICE_NAME 使用(RAC/DG 対応)。

CDB/PDB アーキテクチャ

12c 以降のマルチテナント:

CDB (Container Database)
│
├── CDB$ROOT      ← システム DB
│   Service: orclcdb
│
├── PDB1          ← アプリ用 DB
│   Service: pdb1
│
└── PDB2
    Service: pdb2

接続先の選択:

sqlplus sys/pass@dbserver:1521/orclcdb   → CDB$ROOT
sqlplus scott/pass@dbserver:1521/pdb1    → PDB1

Service の動的 vs 静的登録

動的登録(推奨):

  • DB 起動時に PMON が Listener に自動登録
  • SERVICE_NAMES パラメータ
  • Listener 再起動不要

静的登録(レガシー):

  • listener.oraSID_LIST_LISTENER で明示
  • Listener 再起動が必要
  • Multi-tenant では制約多い

【原因①】SERVICE_NAME スペルミス(最頻出)

症状

$ sqlplus scott/tiger@localhost:1521/PDB11M
ORA-12514

tnsnames.ora:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = pdb11m))   ← 実際は違う?
  )

診断

# 登録済み service 確認
$ lsnrctl services

Services Summary...
Service "orclb" has 1 instance(s).
Service "pdb1" has 1 instance(s).      ← 実際は pdb1 !

解決

A. tnsnames.ora の修正:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = pdb1))   ← 正しい名前
  )

B. Easy Connect で試行:

$ sqlplus scott/tiger@localhost:1521/pdb1
# 正しい service で接続

TNS 関連は ORA-12154: TNS could not resolve の記事も参照してください。


【原因②】CDB/PDB 混同(12c+ の典型)

症状(実例)

# CDB は成功
$ sqlplus sys/pass@localhost/orclcdb AS SYSDBA
Connected.

# PDB は失敗
$ sqlplus sys/pass@localhost/pdb1 AS SYSDBA
ORA-12514

診断

-- CDB 内から
SQL> CONNECT / AS SYSDBA
SQL> SELECT name, open_mode FROM v$pdbs;
NAME       OPEN_MODE
---------- ----------
PDB$SEED   READ ONLY
PDB1       MOUNTED     ← MOUNTED (未 OPEN)!
PDB2       READ WRITE  ← OPEN 済み

PDB が MOUNTED 状態 → service 未公開

解決

PDB を OPEN:

ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- 全 PDB OPEN
ALTER PLUGGABLE DATABASE ALL OPEN;

-- 自動起動設定(推奨)
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

【原因③】PMON が未登録(起動直後)

シナリオ

1. DB 起動直後
2. PMON がまだ Listener に登録していない
3. アプリ接続試行 → ORA-12514
4. 数秒〜数分待つ
5. PMON 自動登録
6. 接続成功

解決

A. 数秒待つ(Oracle 公式推奨):

# 1分後にリトライ
sleep 60
sqlplus scott/tiger@ORCL

B. 手動登録:

ALTER SYSTEM REGISTER;

-- 確認
$ lsnrctl services

【原因④】LOCAL_LISTENER 不整合

シナリオ

-- DB の LOCAL_LISTENER
SHOW PARAMETER local_listener;
VALUE
------
LISTENER_ORCL

-- tnsnames.ora の LISTENER_ORCL 定義
LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1522))

-- Listener は port 1521 で稼働
-- → PMON は 1522 に登録試行 → 失敗
-- → 1521 の Listener には未登録
-- → ORA-12514

解決

A. LOCAL_LISTENER 修正:

ALTER SYSTEM SET LOCAL_LISTENER = 
  '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))';

-- 手動登録
ALTER SYSTEM REGISTER;

B. Listener 側修正:

# listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

【原因⑤】Service 手動停止

シナリオ

-- 何らかの理由で service 停止
BEGIN
  DBMS_SERVICE.STOP_SERVICE('MY_SERVICE');
END;
/

-- アプリから MY_SERVICE 接続 → ORA-12514

診断

SELECT name, network_name, enabled 
FROM dba_services;

解決

BEGIN
  DBMS_SERVICE.START_SERVICE('MY_SERVICE');
END;
/

【原因⑥】Oracle EBS クローン後(実例)

シナリオ(実例)

EBS 12.2.12 クローン後:

$ sqlplus apps/pw
ORA-12514: TNS:listener does not currently know of service

原因: EBS 用 service が起動していない。

診断

CONNECT / AS SYSDBA
SELECT name FROM v$active_services;

-- ebs_<PDB_SID> が missing

解決

BEGIN
  DBMS_SERVICE.START_SERVICE(service_name => 'ebs_clone');
END;
/

-- 確認
SELECT name FROM v$active_services;

-- 接続テスト
$ sqlplus apps/pw
Connected.

【原因⑦】Multi-Listener 環境

シナリオ

Listener A (port 1521): Service ORCL 登録
Listener B (port 1522): Service PDB1 登録

クライアントが port 1521 で PDB1 要求 → ORA-12514

解決

A. 正しい port で接続:

tnsnames.ora:
PDB1 =
  (ADDRESS = (HOST=dbserver)(PORT=1522))
  (CONNECT_DATA = (SERVICE_NAME=pdb1))

B. 両方のリスナに登録(可能なら)。


【原因⑧】大文字小文字(Case Sensitivity)

症状

-- DB
SHOW PARAMETER service_names;
VALUE
------
orcl

-- Client
tnsnames.ora:
(SERVICE_NAME = ORCL)   ← 大文字

-- 通常 case-insensitive だが、環境依存で発生

解決

両方統一 or Easy Connect 使用:

$ sqlplus scott/tiger@localhost:1521/orcl

【原因⑨】DBMS_SERVICE 未起動

シナリオ

-- Service 作成
BEGIN
  DBMS_SERVICE.CREATE_SERVICE(
    service_name => 'app_svc',
    network_name => 'app_svc'
  );
END;
/

-- しかし START_SERVICE 忘れ
-- → 接続不可

解決

BEGIN
  DBMS_SERVICE.START_SERVICE('app_svc');
END;
/

【原因⑩】listener.ora の static 登録漏れ

シナリオ

listener.ora:
SID_LIST_LISTENER = (SID_LIST =
  (SID_DESC = (SID_NAME = CLRExtProc) ...)
)
# PDB1 の SID_DESC がない

# クライアントから PDB1 要求 → ORA-12514

解決

static 登録追加(or 動的登録依存):

SID_LIST_LISTENER = (SID_LIST =
  (SID_DESC =
    (GLOBAL_DBNAME = PDB1)
    (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
    (SID_NAME = PDB1)
  )
)

Listener 再起動:

$ lsnrctl reload

診断ツール完全リファレンス

lsnrctl services(最重要)

$ lsnrctl services

Services Summary...
Service "orclcdb" has 1 instance(s).
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
Service "pdb1" has 1 instance(s).
  Instance "orclcdb", status READY, has 1 handler(s) for this service...

# ここに載っている service だけ接続可能

lsnrctl status

$ lsnrctl status

STATUS of the LISTENER
-----------------------
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname)(PORT=1521)))

Services Summary...
Service "orclcdb" has 1 instance(s).

SHOW PARAMETER

SQL> SHOW PARAMETER service_names
SQL> SHOW PARAMETER local_listener
SQL> SHOW PARAMETER remote_listener

V$ACTIVE_SERVICES

SELECT name, network_name, enabled 
FROM v$active_services
WHERE enabled = 'YES';

V$PDBS (12c+)

SELECT name, open_mode, restricted 
FROM v$pdbs;

DBA_SERVICES

SELECT name, network_name, enabled
FROM dba_services;

listener.log

$ tail -100 $ORACLE_BASE/diag/tnslsnr/*/listener/trace/listener.log

# service_update, service_register 履歴確認

6つの解決策 完全リファレンス

解決策① SERVICE_NAME 修正

tnsnames.ora 修正:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = orcl))   ← 正しい名前
  )

Easy Connect で試行:

$ sqlplus scott/tiger@dbserver:1521/orcl

解決策② ALTER SYSTEM REGISTER

-- PMON に手動登録依頼
ALTER SYSTEM REGISTER;

-- 確認
$ lsnrctl services

解決策③ PDB OPEN

-- PDB 状態確認
SELECT name, open_mode FROM v$pdbs;

-- OPEN
ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- 全 PDB OPEN
ALTER PLUGGABLE DATABASE ALL OPEN;

-- 自動起動設定(推奨)
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

解決策④ LOCAL_LISTENER 設定

-- 現状確認
SHOW PARAMETER local_listener;

-- 修正
ALTER SYSTEM SET LOCAL_LISTENER = 
  '(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))'
  SCOPE=BOTH;

-- 再登録
ALTER SYSTEM REGISTER;

解決策⑤ DBMS_SERVICE.START_SERVICE

-- Service 起動
BEGIN
  DBMS_SERVICE.START_SERVICE('my_service');
END;
/

-- 全 service 確認
SELECT name FROM v$active_services;

解決策⑥ Listener 再起動

$ lsnrctl reload

# または
$ lsnrctl stop
$ lsnrctl start

# DB 側で再登録
sqlplus / as sysdba
SQL> ALTER SYSTEM REGISTER;

Rails / Java / Python 対応

Rails ActiveRecord

database.yml で SERVICE_NAME 明示:

production:
  adapter: oracle_enhanced
  host: dbserver
  port: 1521
  database: orcl              # SERVICE_NAME
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>

Easy Connect 形式:

production:
  adapter: oracle_enhanced
  url: "//dbserver:1521/pdb1"
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>

エラーハンドリング:

begin
  ActiveRecord::Base.establish_connection
rescue OCIError => e
  if e.message.include?("ORA-12514")
    Rails.logger.error "Service name not registered"
    # 正しい service 名で再試行 or アラート
  end
end

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事も参照してください。

Java (JDBC)

Thin Driver + SERVICE_NAME:

// Easy Connect
String url = "jdbc:oracle:thin:@dbserver:1521/pdb1";

// または TNS
String url = "jdbc:oracle:thin:@(DESCRIPTION=" +
             "(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))" +
             "(CONNECT_DATA=(SERVICE_NAME=pdb1)))";

try {
    Connection conn = DriverManager.getConnection(url, "scott", "tiger");
} catch (SQLException e) {
    if (e.getErrorCode() == 12514) {
        logger.error("Service not registered: " + e.getMessage());
    }
}

Python (oracledb)

import oracledb

# Easy Connect
conn = oracledb.connect(
    user="scott",
    password="tiger",
    dsn="dbserver:1521/pdb1"   # SERVICE_NAME 明示
)

# エラーハンドリング
try:
    conn = oracledb.connect(dsn="dbserver:1521/pdb1", ...)
except oracledb.DatabaseError as e:
    error_obj, = e.args
    if error_obj.code == 12514:
        print(f"Service not registered: {error_obj.message}")
        # lsnrctl services で確認するようログ出力

実践シナリオ

シナリオ1:初回接続確認

# 1. 登録済み service 確認
$ lsnrctl services

# 2. tnsnames.ora の SERVICE_NAME 確認
$ cat $TNS_ADMIN/tnsnames.ora

# 3. Easy Connect で試行
$ sqlplus scott/tiger@dbserver:1521/orcl

# 4. 成功なら tnsnames.ora 修正

シナリオ2:PDB 接続(12c+)

-- 1. CDB 接続
$ sqlplus sys/pass@localhost/orclcdb AS SYSDBA

-- 2. PDB 状態確認
SQL> SELECT name, open_mode FROM v$pdbs;

-- 3. PDB OPEN(必要なら)
SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- 4. 自動起動設定
SQL> ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

-- 5. アプリから接続
$ sqlplus scott/tiger@localhost:1521/pdb1

シナリオ3:Oracle EBS クローン後対応

# 1. CDB env source
$ source /u01/app/oracle/CDB_env.sh

# 2. PDB SID 設定
$ export ORACLE_PDB_SID=clone

# 3. SYSDBA 接続
$ sqlplus / as sysdba

# 4. Service 起動
SQL> BEGIN
       DBMS_SERVICE.START_SERVICE(service_name => 'ebs_clone');
     END;
     /

# 5. 確認
SQL> SELECT name FROM v$active_services;

# 6. EBS アプリ接続
$ sqlplus apps/pw
Connected.

シナリオ4:本番デプロイでの確認

#!/bin/bash
# pre_deploy_check.sh

# service 登録確認
if lsnrctl services | grep -q "$SERVICE_NAME"; then
  echo "Service $SERVICE_NAME registered"
else
  echo "ERROR: Service $SERVICE_NAME not registered"
  exit 1
fi

# 接続テスト
if echo "SELECT 1 FROM DUAL;" | sqlplus -s scott/tiger@$DB_HOST:$DB_PORT/$SERVICE_NAME | grep -q "SELECTED"; then
  echo "Connection OK"
else
  echo "Connection FAILED"
  exit 1
fi

Kamal 2 デプロイの詳細は Kamal 2 デプロイの記事を参照してください。

シナリオ5:Rails ヘルスチェック

class DatabaseHealthController < ApplicationController
  def check
    begin
      ActiveRecord::Base.connection.execute("SELECT 1 FROM DUAL")
      render json: { status: 'OK' }
    rescue ActiveRecord::StatementInvalid => e
      if e.message.include?("ORA-12514")
        render json: { 
          status: 'ERROR',
          message: 'Service name not registered'
        }, status: 503
      end
    end
  end
end

シナリオ6:Docker Oracle でのテスト

# コンテナ内で登録済み service 確認
docker exec -it oracle-xe lsnrctl services

# アプリコンテナから接続
docker exec -it app-container bash
$ sqlplus scott/tiger@oracle-xe:1521/XEPDB1

Docker 関連は docker daemon 接続エラーの記事、Docker no space left on device の記事も参照してください。

シナリオ7:AWS RDS Oracle

AWS RDS Oracle:
- SERVICE_NAME はデフォルト "ORCL"
- Multi-tenant 対応 PDB は個別に指定
- 接続文字列例:
  myrds.abc123.us-east-1.rds.amazonaws.com:1521/ORCL

シナリオ8:Python 監視スクリプト

import oracledb
import subprocess

def check_service_registration(service_name):
    # lsnrctl services 実行
    result = subprocess.run(
        ['lsnrctl', 'services'],
        capture_output=True, text=True
    )
    return f'Service "{service_name}"' in result.stdout

def test_connection(dsn):
    try:
        conn = oracledb.connect(user='monitor', password=pw, dsn=dsn)
        conn.close()
        return True
    except oracledb.DatabaseError as e:
        error_obj, = e.args
        if error_obj.code == 12514:
            service = dsn.split('/')[-1]
            registered = check_service_registration(service)
            if not registered:
                print(f"Service {service} not registered!")
        return False

シナリオ9:CI/CD 統合

- name: Verify Oracle Service
  run: |
    # Service 登録確認
    LSNR_OUTPUT=$(sqlplus -s /nolog <<EOF
    CONNECT / AS SYSDBA
    SELECT name FROM v\$active_services;
    EXIT
EOF
    )
    
    if echo "$LSNR_OUTPUT" | grep -q "$SERVICE_NAME"; then
      echo "Service registered"
    else
      echo "ERROR: Service not registered"
      exit 1
    fi

シナリオ10:Autonomous DB

Autonomous DB では:
- Service Name は Wallet に含まれる
- TCPS (SSL) で接続
- 通常 ORA-12514 発生しない(Wallet で自動)
- 発生時は Wallet 更新

トラブルシューティング

lsnrctl services で service なし

DB 起動待ち(PMON 未登録)or PDB 未 OPEN確認。

CDB は接続可、PDB 不可

PDB を OPEN:

ALTER PLUGGABLE DATABASE pdb1 OPEN;

断続的な失敗

PMON 登録タイミング、リトライロジック実装。

Multi-listener 環境

LOCAL_LISTENER / REMOTE_LISTENER 確認、lsnrctl services -c LISTENER_NAME

アプリからのみ失敗

接続文字列の SERVICE_NAME 確認、Easy Connect で試行。

PostgreSQL からの移行

PG は database 名で識別、Oracle は SERVICE_NAME 使用。


よくある質問(FAQ)

Q1. ORA-12514 と ORA-12541 の違い

  • 12514: Listener 起動、service 未登録
  • 12541: Listener 自体が未起動

Q2. SID と SERVICE_NAME の違い

  • SID: インスタンス識別子(古い)
  • SERVICE_NAME: 論理サービス名(推奨)

Q3. CDB/PDB 対応

PDB を OPEN、正しい PDB 名で接続。

Q4. PMON の役割

動的登録、Listener に service を自動通知。

Q5. LOCAL_LISTENER

DB が Listener を指定、正しい HOST:PORT が必要。

Q6. DBMS_SERVICE の使い所

カスタム service の作成・起動・停止。

Q7. Rails での対応

database: に SERVICE_NAME、Easy Connect も可。

Q8. Java での対応

Thin Driver Easy Connect or TNS 形式。

Q9. Python での対応

oracledb dsn パラメータ、SERVICE_NAME 明示。

Q10. static vs dynamic 登録

現代は動的(PMON 自動)、static は特殊用途のみ。

Q11. Autonomous DB での挙動

Wallet 認証、通常発生しない。

Q12. 予防策

  • lsnrctl services で定期確認
  • PDB 自動起動設定
  • 接続テストを CI/CD に組み込み
  • リトライロジック実装

参考リンク

Oracle 公式


まとめ

ORA-12514: TNS:listener does not currently know of service の要点を再整理します。

エラーの本質

Listener は起動している
但し要求された SERVICE_NAME が登録されていない
→ SERVICE_NAME スペルミス / PDB 未 OPEN / PMON 未登録 等
→ アプリ接続不能

エラーメッセージの読み方

ORA-12514: TNS:listener does not currently know of service 
           requested in connect descriptor
                    ↑
             要求された SERVICE_NAME 未登録

接続系エラー 6 種

エラー意味
ORA-12541Listener 未起動
ORA-12154TNS 名前解決失敗
ORA-12514Service 未登録
ORA-12170接続タイムアウト
ORA-01034DB 未起動
ORA-01017認証失敗

診断の 4 ステップ

# STEP 1: 登録 service 一覧
lsnrctl services

# STEP 2: SERVICE_NAME 確認
cat tnsnames.ora

# STEP 3: DB の service 名
SHOW PARAMETER service_names;
SELECT name FROM v$active_services;

# STEP 4: PDB 状態(12c+)
SELECT name, open_mode FROM v$pdbs;

10大原因

#原因対処
SERVICE_NAME スペルミス修正
CDB/PDB 混同正しい service
PMON 未登録待機 or REGISTER
LOCAL_LISTENER 不整合設定修正
Service 手動停止START_SERVICE
Oracle EBS クローンebs_service 起動
Multi-listener正しい port
Case sensitivity統一
DBMS_SERVICE 未起動START_SERVICE
static 登録漏れ追加 or 動的化

6つの解決策

# ① SERVICE_NAME 修正
# tnsnames.ora の SERVICE_NAME を lsnrctl services 出力と一致
-- ② ALTER SYSTEM REGISTER
ALTER SYSTEM REGISTER;

-- ③ PDB OPEN
ALTER PLUGGABLE DATABASE pdb1 OPEN;
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

-- ④ LOCAL_LISTENER 設定
ALTER SYSTEM SET LOCAL_LISTENER = 
  '(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=1521))';

-- ⑤ DBMS_SERVICE.START_SERVICE
BEGIN
  DBMS_SERVICE.START_SERVICE('my_service');
END;
-- ⑥ Listener 再起動
lsnrctl reload

CDB/PDB 対応(12c+)

-- PDB 状態確認
SELECT name, open_mode FROM v$pdbs;

-- OPEN
ALTER PLUGGABLE DATABASE pdb1 OPEN;

-- 自動起動
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

-- 接続
sqlplus scott/pass@host:1521/pdb1

診断コマンド Top 5

lsnrctl services                   # 最重要
lsnrctl status                     # Listener 状態
SHOW PARAMETER service_names       # DB の service
SELECT name FROM v$active_services # active service
SELECT name, open_mode FROM v$pdbs # PDB (12c+)

予防のポイント

1. lsnrctl services で登録確認
2. PDB は SAVE STATE で自動起動
3. 接続文字列は Easy Connect で明示的に
4. CI/CD に接続テスト組み込み
5. リトライロジック(PMON 遅延対応)
6. LOCAL_LISTENER 適切設定
7. Multi-listener 環境は文書化
8. Rails/Java/Python で SERVICE_NAME 明示
9. Docker/Cloud での接続文字列注意
10. Autonomous DB は Wallet 更新

これらの知識は、Oracle DBA の本番運用・障害対応・CDB/PDB 管理・Rails / Java / Python アプリ運用・AWS RDS / Autonomous DB 運用・Oracle EBS 管理・監視設計・CI/CD パイプラインなど、あらゆる場面で活用できます。本記事をブックマークしておけば、ORA-12514 に出会っても冷静に的確に対処できるようになります。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜26ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。