Oracle DBLINK接続エラー!ORA-12154/ORA-02019解決策

DBLINK

作成したはずの Oracle DBLINK(データベースリンク) がつながらないトラブルは、構築現場で最も頻発する問題の一つです。「ORA-12154」や「ORA-02019」といったエラーコードは、原因箇所(ネットワーク定義、権限、パラメータ設定)によって対処法が明確に分かれます。

本記事では、DBLINKがつながらない 代表的なエラーの原因を特定し、確実に接続を成功させるためのチェックリストと解決手順を解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

結論・最短手順(TL;DR)

DBLINK接続エラーが発生したら、まず以下の「どこで止まっているか」を確認します。

  1. ORA-12154: TNS定義 の問題。DBサーバー上の tnsnames.ora に宛先がない、または記述ミス。
  2. ORA-02019: リンク未作成 の問題。指定した名前のリンクが存在しない(Public/Privateの取り違え)。
  3. ORA-01017: 認証 の問題。接続先のユーザー名・パスワードが間違っている。
  4. ORA-02085: パラメータ の問題。GLOBAL_NAMES=TRUE により、リンク名と相手のDB名が不一致。

基礎:DBLINKがつながらない仕組み

DBLINKを使用する際、ソースDB(発信元)はクライアントとして動作し、ターゲットDB(着信先)へ接続しに行きます。

ここで初心者が最も陥りやすい罠が 「参照する設定ファイルの場所」 です。 PC(端末)からSQLを実行していても、DBLINKの接続元はあくまで 「ソースDBサーバー」 です。そのため、端末の tnsnames.ora ではなく、ソースDBサーバー内の tnsnames.ora が正しく設定されている必要があります。

前提:正しいDBLINK作成構文

トラブルシューティングを行う前に、基本となる作成構文を確認しましょう。特に PUBLIC の有無や USING 句の書き方は間違いやすいポイントです。

-- 基本構文
CREATE [PUBLIC] DATABASE LINK <リンク名>
  CONNECT TO <リモートユーザー> IDENTIFIED BY "<パスワード>"
  USING '<接続文字列>';
項目説明
PUBLIC指定すると全ユーザー共有のリンクになります。指定しないと作成ユーザー専用(PRIVATE)となります。
リンク名ローカルDBで使用する名前です。GLOBAL_NAMES=TRUE 環境では相手のDB名と一致させる必要があります。
CONNECT TO接続先(リモート)のユーザー名とパスワードです。パスワードは "(二重引用符)で囲むことで、大文字小文字の区別や記号エラーを回避できます。
USING接続先情報です。tnsnames.ora に定義した識別子、または IPアドレス:1521/サービス名 などの簡易接続文字列を指定します。

エラー別トラブルシューティング

1. ORA-12154: TNS: 指定された接続識別子を解決できませんでした

原因: ソースDBが、接続文字列(USING句の中身)を解釈できません。

対処法: ソースDBサーバーのOSにログインし、以下の順で確認します。

1.tnsnames.ora の確認 $ORACLE_HOME/network/admin/tnsnames.ora に、リンク作成時に指定したエイリアス(接続識別子)が記述されているか確認します。

# tnsnames.ora 記述例
REMOTE_DB_ALIAS =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <remote_host>)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = <remote_database_service>)
    )
  )

2.tnsping による疎通確認 ソースDBのOSユーザー(oracle)でコマンドを実行します。

# サーバー上で実行
tnsping <DBLINK作成時にUSINGに書いた識別子>

    2. ORA-02019: リモート・データベースの接続記述子が見つかりません

    原因: SQL文で指定した名前のDBLINK自体が存在しないか、権限により見えていません。

    対処法: 作成済みリンクの一覧を確認します。

    -- 現在のユーザーが使えるリンクを確認
    SELECT db_link, owner, host FROM all_db_links;
    
    -- (DBA権限がある場合) 全リンクを確認
    SELECT db_link, owner FROM dba_db_links;
    
    • Public/Privateの罠: 他人のスキーマに作った「Privateリンク」を、別のユーザーから呼んでいませんか?全ユーザーで共有したい場合は CREATE PUBLIC DATABASE LINK で作り直す必要があります。

    3. ORA-01017: ユーザー名/パスワードが無効です

    原因: リモートDBへのログイン情報が間違っています。

    対処法: パスワードの大文字・小文字、記号の有無を確認します。 特にパスワード作成時、二重引用符 " で囲ったかどうかで、大文字小文字の区別(Case Sensitivity)挙動が変わります。

    修正用SQL(リンク再作成):

    -- 既存のDBLINKを削除
    DROP DATABASE LINK remote_link;
    
    -- パスワードを " " で囲むことで正確に渡す
    CREATE DATABASE LINK remote_link
      CONNECT TO remote_user IDENTIFIED BY "CorrectPassword123"
      USING 'REMOTE_DB_ALIAS';
    

    4. ORA-02085: データベース・リンク XX は YY に接続します

    原因: 初期化パラメータ GLOBAL_NAMESTRUE に設定されています。 このモードではセキュリティ強化のため、「DBLINK名」と「接続先DBのグローバル名」を完全に一致させる 必要があります。

    確認と対処:

    -- 設定値の確認
    SHOW PARAMETER global_names
    
    -- (結果が TRUE の場合)
    -- 対処A: パラメータを FALSE に変更する(要ALTER SYSTEM権限・影響範囲注意)
    ALTER SYSTEM SET global_names = FALSE;
    
    -- 対処B: DBLINK名を相手のDB名(Global Name)に合わせて作り直す
    -- 相手側で確認: SELECT * FROM global_name;
    -- その名前でリンクを作成する。
    

    💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

    Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

    実行例:正しい接続確認フロー

    トラブル時に実行すべき、切り分け用の確認フローです。

    手順1. ソースDBサーバー上でのTNS確認

    OSコマンド(Linux例)で確認します。

    [oracle@source-server ~]$ tnsping remote_db_alias
    
    TNS Ping Utility for Linux: Version 19.0.0.0.0...
    Attempting to contact (DESCRIPTION = ...)
    OK (10 msec)  <-- これが出ればネットワーク設定はOK
    

    手順2. SQL*Plusでの直接接続テスト

    DBLINKを作る前に、SQL*Plus単体でつながるか試します。

    sqlplus remote_user/"password"@remote_db_alias
    

    ここで入れなければ、DBLINKでも絶対に入れません。

    手順3. DBLINK経由の単純クエリ

    まずは DUAL 表で確認します。

    SELECT * FROM DUAL@my_link;
    

    エラーが出る場合、前述のエラーコード別対処を実施します。

    運用・監視・セキュリティ上の注意

    1. パスワードに「@」が含まれる場合

    パスワードに @ が含まれていると、Oracleの接続文字列解析が誤作動する場合があります。 対処: パスワード全体を二重引用符 " で囲むか、接続文字列の解析を回避する記法を用います。

    2. tnsnames.ora を使わない方法(Easy Connect)

    ORA-12154tnsnames.ora の編集につまずく場合、簡易接続ネーミング(Easy Connect) を使うと解決が早いです。

    -- USING句に直接 ホスト:ポート/サービス名 を記述
    CREATE DATABASE LINK quick_link
      CONNECT TO user IDENTIFIED BY pass
      USING 'remote-host-ip:1521/service_name';
    

    ※ これなら tnsnames.ora の編集は不要です。

    3. リスクと戻し方

    ALTER SYSTEM SET global_names = FALSE の変更は、システム全体(他のDBLINK)に影響を与える可能性があります。変更前に必ず既存の設定を確認し、必要であれば TRUE に戻せるよう準備してください。

    FAQ:よくある質問

    Q1. DBLINKのパスワードを変更するには?

    A. DBLINK自体に ALTER コマンドでパスワードのみを変更する機能はありません。 一度 DROP DATABASE LINK <名> で削除し、新しいパスワードで CREATE し直す必要があります。

    Q2. クライアントPCのtnsnames.oraは関係ないのですか?

    A. はい、DBLINKの実行においては無関係です。 DBLINKは「DBサーバーからDBサーバーへ」の通信です。クライアントPCの設定ファイルは使用されません。必ずサーバー側のファイルを修正してください。

    Q3. ORA-12541: TNS: リスナーがありません と出ます。

    A. 接続先(リモート)のDBサーバーで、リスナーサービスが起動していないか、ポート(標準1521)がファイアウォールで塞がれています。接続先の管理者に確認してください。

    まとめ

    DBLINKがつながらない時は、焦らずエラーコードを確認しましょう。

    1. ORA-12154 なら サーバー側の tnsnames.ora を疑う。
    2. ORA-02085 なら GLOBAL_NAMES パラメータを疑う。
    3. ORA-01017 なら パスワード(大文字小文字・記号)を疑う。
    4. 面倒なら Easy Connect(IP直接指定)で試す。

    「どこの誰が通信主体なのか(クライアントPCではなくサーバー)」を意識するだけで、解決スピードは格段に上がります。

    [参考]
    SQL言語リファレンス – CREATE DATABASE LINK

    💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

    Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

    コメント

    タイトルとURLをコピーしました