Oracleエラー対応(ORA-02019): ORA-02019発生時の調査対応について

現役DBAが解説-Oracleエラー対応

データベースリンク経由のSELECT文を実行した際に発生する、ORA-02019「指定されたリモート・データベースは存在しません。」というエラーについて、対処法をご紹介します。

1.エラーメッセージ

ORA-02019: 指定されたリモート・データベースは存在しません。

2.事象・原因・対策

データベースリンクを以下のような形で作成します(PDBにて作成を実施)。

SQL> CREATE DATABASE LINK MYLINK.MYDOMAIN.COM
CONNECT TO USERNAME IDENTIFIED BY PASSWORD
USING 'CONNECT_STRING';

上記で作成したデータベースリンクに対してドメイン名を省略してSELECT文を発行しようとすると、ORA-02019が発生します。

SQL> SELECT INSTANCE_NAME,HOST_NAME,STATUS FROM V$INSTANCE@MYLINK;

SELECT INSTANCE_NAME,HOST_NAME,STATUS FROM V$INSTANCE@MYLINK;
                         *
行1でエラーが発生しました。:
ORA-02019: 指定されたリモート・データベースは存在しません

原因は global_name にドメイン名が含まれていないためです。

SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
--------------------------------------------------------------
MYPDB

対処法はglobal_nameにドメイン名を付加することです。
しかしPDBではglobal_nameの変更はできないため、CDBで実施します。

SQL> CONNECT / AS SYSDBA
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
--------------------------------------------------------------
MYCDB
SQL> ALTER DATABASE MYCDB RENAME GLOBAL_NAME TO MYCDB.MYDOMAIN.COM
データベースが変更されました。
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
--------------------------------------------------------------
MYCDB.MYDOMAIN.COM

CDBでglobal_name を変更したら、PDBを再起動します。

SQL> ALTER PLUGGABLE DATABASE MYPDB CLOSE;
プラガブル・データベースが変更されました。
SQL> ALTER PLUGGABLE DATABASE MYPDB OPEN;
プラガブル・データベースが変更されました。
SQL> ALTER SESSION SET CONTAINER=MYPDB;
セッションが変更されました。
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
--------------------------------------------------------------
MYPDB.MYDOMAIN.COM

PDBにもドメイン名が付加されました。
この状態でドメイン名を省略してSELECT文を発行した場合、正常に結果が表示されます。

SQL> SELECT INSTANCE_NAME,HOST_NAME,STATUS FROM V$INSTANCE@MYLINK;

INSTANCE_NAME    HOST_NAME                       STATUS
---------------- ------------------------------- ------------
MYINST           MYHOST                          OPEN

ORA-02019の解消方法は以上です。

3.最後に

global_nameを適切に設定することにより、DBLINKのドメイン名を省略することが可能になります。
必要に応じて設定・使用してください。