【Oracle】データベースリンクの確認方法|DBA/ALL/USER_DB_LINKS・作成・削除・トラブル対処まで実務解説

【Oracle】データベースリンクの確認方法|DBA/ALL/USER_DB_LINKS・作成・削除・トラブル対処まで実務解説 Oracle

Oracleのデータベースリンク(DB Link)は、あるデータベースから別のリモートデータベースのオブジェクトに透過的にアクセスできる仕組みです。複数システム間のデータ連携や移行作業で頻繁に使われます。

この記事では、データベースリンクの確認方法を中心に、3つのデータディクショナリビューの使い分けから、作成・使い方・削除・トラブルシューティングまで、実務で必要な知識を体系的に解説します。

💡 この記事でわかること

  • DBA_DB_LINKS / ALL_DB_LINKS / USER_DB_LINKS違いと使い分け
  • リンクの詳細情報(接続先・作成者・パスワード有無)を確認するSQL
  • CREATE DATABASE LINK による作成方法(プライベート/パブリック)
  • リモートテーブルへのSELECT / INSERT / UPDATE / DELETE
  • DROP DATABASE LINK による削除方法と注意点
  • シノニムとの連携でリンク名を隠蔽するテクニック
  • ORA-12154 / ORA-02019 など頻出エラーの原因と対処法
  • パフォーマンスの注意点とマテリアライズドビューによる改善策
スポンサーリンク

データベースリンクとは

データベースリンクは、ローカルのOracleデータベースからリモートのOracleデータベース(または異種データベース)に接続するためのスキーマオブジェクトです。リンクを作成すると、リモートのテーブルやビューに対して、通常のSQLと同じ構文でアクセスできます。

DB Linkの基本構造

— ローカルDB → リモートDB へのアクセス
ローカルDB ───( DB Link )───> リモートDB

— テーブル名@リンク名 でアクセス
SELECT * FROM employees@remote_link;

プライベートリンクとパブリックリンクの違い

種類 スコープ 作成に必要な権限 用途
プライベート 作成したユーザーのみ使用可 CREATE DATABASE LINK 個人の開発・テスト用途
パブリック 全ユーザーが使用可 CREATE PUBLIC DATABASE LINK チーム共有・システム間連携

データベースリンクを確認する3つのビュー

Oracleには、データベースリンクを確認するための3つのデータディクショナリビューが用意されています。権限と用途に応じて使い分けます。

ビュー名 表示範囲 必要権限 主な使用場面
USER_DB_LINKS 自分が作成したリンクのみ 不要(自スキーマ) 開発者が自分のリンクを確認
ALL_DB_LINKS アクセス可能な全リンク 不要 使えるリンクを一覧で確認
DBA_DB_LINKS データベース上の全リンク SELECT ANY DICTIONARY DBAの管理作業・棚卸し

ℹ️ ポイント: この3ビューの関係は、テーブル一覧を確認する USER_TABLES / ALL_TABLES / DBA_TABLES と同じ命名規則です(テーブル一覧を確認するSQL解説)。

USER_DB_LINKS — 自分のリンクを確認

-- 自分が所有するデータベースリンクの一覧
SELECT
    db_link,      -- リンク名
    username,     -- 接続先ユーザー名
    host,         -- 接続先ホスト(TNS名 or 接続文字列)
    created       -- 作成日時
FROM
    user_db_links
ORDER BY
    db_link;

USER_DB_LINKS は特別な権限なしで参照できるため、開発者が最もよく使うビューです。OWNER カラムは存在せず、すべて自スキーマのリンクが返ります。

ALL_DB_LINKS — アクセス可能な全リンクを確認

-- アクセス可能な全てのデータベースリンク(自分 + パブリック)
SELECT
    owner,        -- 所有者(PUBLIC or ユーザー名)
    db_link,      -- リンク名
    username,     -- 接続先ユーザー名
    host,         -- 接続先ホスト
    created       -- 作成日時
FROM
    all_db_links
ORDER BY
    owner, db_link;

ALL_DB_LINKS は自分のプライベートリンクに加えて、パブリックリンクも表示されます。OWNER カラムが PUBLIC のものがパブリックリンクです。

DBA_DB_LINKS — 全ユーザーの全リンクを確認(DBA向け)

-- データベース上のすべてのデータベースリンク(DBA権限が必要)
SELECT
    owner,
    db_link,
    username,
    host,
    created
FROM
    dba_db_links
ORDER BY
    owner, db_link;

DBA_DB_LINKS はデータベース上の全リンクが表示されます。定期的な棚卸しや、不要なリンクの洗い出しに使用します。権限がない場合は ORA-00942: table or view does not exist エラーが返ります(ユーザ権限の確認方法)。

各ビューの主なカラム一覧

カラム名 データ型 説明
OWNER VARCHAR2(128) リンクの所有者(USER_DB_LINKS には存在しない)
DB_LINK VARCHAR2(128) データベースリンク名
USERNAME VARCHAR2(128) 接続先のユーザー名
PASSWORD VARCHAR2(128) パスワード(Oracle 12c以降は通常NULLが返る。11g以前では暗号化表示される場合あり)
HOST VARCHAR2(2000) 接続先のTNS名 or 接続文字列
CREATED DATE リンクが作成された日時

実務で使える確認SQLパターン集

特定のリンク名で検索する

-- リンク名にキーワードを含むものを検索
SELECT owner, db_link, username, host, created
FROM   dba_db_links
WHERE  db_link LIKE '%PROD%'
ORDER BY db_link;

リンクの接続テストを行う

-- リモートDBのDUAL表にアクセスして接続テスト
SELECT 1 FROM dual@my_remote_link;

-- リモートDBのバージョンを確認
SELECT banner FROM v$version@my_remote_link WHERE ROWNUM = 1;

-- リモートDBの現在時刻を確認(接続確認+時刻同期チェック)
SELECT SYSDATE FROM dual@my_remote_link;

✅ ベストプラクティス: リンクを作成したら、まず SELECT 1 FROM dual@リンク名 で接続テストを行う習慣をつけましょう。問題があればこの時点でエラーが返ります。

リンクの使用状況を確認する(V$DBLINK)

-- 現在のセッションでオープンしているデータベースリンクを確認
SELECT
    db_link,
    owner_id,
    logged_on    -- YES = 接続中,
    heterogeneous -- YES = 異種データベース,
    protocol
FROM
    v$dblink;

V$DBLINK は動的パフォーマンスビューで、現在アクティブなDB Link接続を確認できます。トランザクション中にどのリンクが使われているかを調べるのに便利です。

-- オープン中のDB Linkセッションを明示的に閉じる
ALTER SESSION CLOSE DATABASE LINK my_remote_link;

パブリックリンクだけを一覧表示する

-- パブリックリンクのみ抽出
SELECT db_link, username, host, created
FROM   dba_db_links
WHERE  owner = 'PUBLIC'
ORDER BY db_link;

データベースリンクの作成方法

データベースリンクの作成には CREATE DATABASE LINK 文を使用します(DBリンク作成方法の詳細解説)。

基本構文

-- プライベートデータベースリンクの作成
CREATE DATABASE LINK my_remote_link
CONNECT TO remote_user
IDENTIFIED BY "remote_password"
USING 'remote_tns_name';

-- パブリックデータベースリンクの作成
CREATE PUBLIC DATABASE LINK shared_remote_link
CONNECT TO remote_user
IDENTIFIED BY "remote_password"
USING 'remote_tns_name';

TNS名の代わりに接続文字列を直接指定する

-- tnsnames.ora に登録せず、接続文字列で直接指定
CREATE DATABASE LINK my_remote_link
CONNECT TO remote_user
IDENTIFIED BY "remote_password"
USING '(DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=ORCL)))';

⚠ 注意: USING句の接続文字列はシングルクォーテーションで囲む必要があります。ダブルクォーテーションを使うとエラーになります。

現在のユーザー認証でリンクを作成する

-- CONNECT TO / IDENTIFIED BY を省略すると、
-- 現在のユーザー名・パスワードでリモートDBに接続
CREATE DATABASE LINK my_remote_link
USING 'remote_tns_name';

ローカルとリモートで同じユーザー名・パスワードが存在する場合に使えるパターンです。開発環境間の接続で便利です。

データベースリンクの使い方

作成したデータベースリンクを使って、リモートのテーブルに対してSQLを実行する方法です。

SELECT(参照)

-- リモートテーブルの全件取得
SELECT * FROM employees@my_remote_link;

-- ローカルテーブルとリモートテーブルをJOIN
SELECT
    l.order_id,
    l.product_name,
    r.stock_quantity
FROM
    local_orders l
INNER JOIN
    inventory@warehouse_link r ON l.product_id = r.product_id;

INSERT / UPDATE / DELETE(更新系)

-- リモートテーブルにINSERT
INSERT INTO audit_log@logging_link (log_id, message, created_at)
VALUES (seq_log.NEXTVAL, 'Batch completed', SYSDATE);

-- ローカルのデータをリモートへ一括コピー
INSERT INTO backup_table@backup_link
SELECT * FROM local_table WHERE status = 'ACTIVE';

-- リモートテーブルのUPDATE
UPDATE config@remote_link
SET    value = 'new_value'
WHERE  key = 'setting_name';

-- リモートテーブルのDELETE
DELETE FROM temp_data@remote_link
WHERE created_at < SYSDATE - 30;

⚠ 注意: DB Linkを介したDML(INSERT/UPDATE/DELETE)は分散トランザクションになります。ローカルとリモートの両方にCOMMIT/ROLLBACKが必要です。失敗時は ORA-02050: transaction X rolled back, some remote DBs may be in-doubt エラーが発生する場合があります。

シノニムとの連携

毎回 テーブル名@リンク名 と書くのは冗長です。シノニムを作成すると、あたかもローカルテーブルのようにアクセスできます(シノニムの確認方法の解説)。

-- DB Link先のテーブルにシノニムを作成
CREATE SYNONYM remote_employees
FOR employees@my_remote_link;

-- シノニム経由でアクセス(@リンク名が不要に)
SELECT * FROM remote_employees;

-- パブリックシノニムを作成(全ユーザーで共有)
CREATE PUBLIC SYNONYM remote_employees
FOR employees@my_remote_link;

💡 シノニムを使うメリット

  • SQL文から @リンク名 が消え、コードの可読性が向上
  • 接続先を変更する際、シノニムの再作成だけで済む(SQL文の修正不要)
  • エンドユーザーに実テーブル名やリンク名を隠蔽できる

データベースリンクの削除方法

-- プライベートリンクの削除(自分のスキーマ内のもの)
DROP DATABASE LINK my_remote_link;

-- パブリックリンクの削除(DROP PUBLIC DATABASE LINK権限が必要)
DROP PUBLIC DATABASE LINK shared_remote_link;
注意点 詳細
他ユーザーのリンクは削除不可 プライベートリンクは所有者本人しか削除できない。スキーマ名での修飾も不可
シノニムは自動削除されない リンクを削除しても、そのリンクを参照するシノニムは残る。シノニムも個別に削除が必要
オープン中のリンクは即座に切断 アクティブなセッションがリンクを使用中でも、DROP は即座に実行される

トラブルシューティング

データベースリンクで発生しやすいエラーと、その原因・対処法を一覧にまとめます。

エラーコード メッセージ 主な原因 対処法
ORA-12154 TNS: could not resolve the connect identifier TNS名が tnsnames.ora に未登録 tnsnames.ora を確認し、TNS名を追加。または接続文字列を直接指定
ORA-02019 connection description for remote database not found DB Linkの接続情報が無効 リンクを再作成するか、HOST情報を確認
ORA-01017 invalid username/password; logon denied リモートDBのユーザー名/パスワードが不正 CONNECT TO / IDENTIFIED BY の値を確認。パスワード変更後は再作成が必要
ORA-02085 database link connects to itself リンク先が自分自身のDB USING句のTNS名/接続先を確認。GLOBAL_NAME が同一でないか確認
ORA-00942 table or view does not exist リモートDBに対象テーブルが存在しない or 権限不足 リモートDBにログインしてテーブルの存在と権限を確認
ORA-02050 transaction rolled back, some remote DBs may be in-doubt 分散トランザクションの障害 DBA_2PC_PENDING ビューで未解決トランザクションを確認し、手動で解決

リンクが繋がらないときの確認チェックリスト

🚨 接続できないときの確認手順

  1. ネットワーク疎通: リモートDBのホスト・ポートに tnsping または telnet で接続できるか
  2. リスナー起動: リモートDBのリスナーが起動しているか(lsnrctl status
  3. TNS名: tnsnames.ora にリモートDBの接続情報が正しく記載されているか
  4. 認証情報: CONNECT TO のユーザー名/パスワードが正しいか(リモートDBに直接ログインして確認)
  5. 権限: リモートDBの接続先ユーザーに対象テーブルの SELECT / DML 権限があるか
  6. GLOBAL_NAME: DB Link名にドメイン名が付与される設定になっていないか確認

パフォーマンスの注意点

データベースリンクを使用したSQLは、ネットワークを経由するため注意が必要です。

注意点 詳細 改善策
大量データの転送 リモートの大テーブルをフルスキャンすると遅い WHERE句で絞り込む。リモート側のインデックスを活用
ローカル×リモートのJOIN データがネットワーク越しに転送されボトルネックに ドライビングテーブルの選択を最適化。ヒント句で制御
頻繁な参照 毎回ネットワーク接続が発生するためオーバーヘッド マテリアライズドビューでローカルにキャッシュ
文字コードの差異 ローカルとリモートの文字コードが異なると文字化け NLS_CHARACTERSET を統一。または CONVERT 関数で変換

マテリアライズドビューでDB Linkの負荷を軽減

-- リモートテーブルのマテリアライズドビューを作成
-- データをローカルにキャッシュし、定期的にリフレッシュ
CREATE MATERIALIZED VIEW mv_remote_master
REFRESH COMPLETE ON DEMAND
AS
SELECT * FROM master_table@my_remote_link;

-- 手動リフレッシュ
BEGIN
    DBMS_MVIEW.REFRESH('MV_REMOTE_MASTER', 'C');
END;
/

マスタデータのようにほとんど変更されないデータは、マテリアライズドビューでローカルにキャッシュすることで、DB Linkのネットワーク負荷を大幅に削減できます(ビューの使い方の解説)。

セキュリティに関する注意点

リスク 詳細 対策
パスワードの平文保存 11g以前では DBA_DB_LINKS の PASSWORD カラムから確認可能だった(12c以降はNULL) DBA権限の付与を最小限に。監査ログを有効化。12c以降もSYS.LINK$で確認可能なため注意
パブリックリンクの乱用 全ユーザーがリモートDBにアクセス可能になる 原則プライベートリンクを使用。パブリックは管理者が管理
不要なリンクの放置 退役したシステムへのリンクが残り続ける 定期的に DBA_DB_LINKS で棚卸しを実施。不要なリンクは削除

関連する記事

記事 内容
DBリンクの作成方法 CREATE DATABASE LINK の詳細な構文とオプション
シノニムを確認する方法 シノニムの一覧取得と管理方法
ユーザ権限を確認する方法 DBAビューへのアクセスに必要な権限の確認
テーブル一覧を確認するSQL USER/ALL/DBA_TABLES の使い分け
ビューの使い方 ビュー・マテリアライズドビューの基本と活用
別サーバーへデータベースを移行する方法 Data PumpとDB Linkを使ったリモート移行
表領域の作成・削除・変更・確認方法 Oracle表領域の管理全般

まとめ

操作 SQL / ビュー
自分のリンクを確認 SELECT * FROM USER_DB_LINKS
使えるリンクを全て確認 SELECT * FROM ALL_DB_LINKS
全リンクを管理者が確認 SELECT * FROM DBA_DB_LINKS
接続テスト SELECT 1 FROM dual@リンク名
リンクの作成 CREATE [PUBLIC] DATABASE LINK ... USING 'TNS名'
リモートテーブルへのアクセス SELECT * FROM テーブル名@リンク名
シノニムでリンク名を隠蔽 CREATE SYNONYM 別名 FOR テーブル名@リンク名
リンクの削除 DROP [PUBLIC] DATABASE LINK リンク名

データベースリンクはOracleの分散データベース機能の要です。まずは USER_DB_LINKS / ALL_DB_LINKS / DBA_DB_LINKS の3ビューの違いを理解し、接続テスト → シノニム連携 → セキュリティ管理の流れで実務に活用してください。