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;
プライベートリンクとパブリックリンクの違い
データベースリンクを確認する3つのビュー
Oracleには、データベースリンクを確認するための3つのデータディクショナリビューが用意されています。権限と用途に応じて使い分けます。
ℹ️ ポイント: この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 エラーが返ります(ユーザ権限の確認方法)。
各ビューの主なカラム一覧
実務で使える確認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;
トラブルシューティング
データベースリンクで発生しやすいエラーと、その原因・対処法を一覧にまとめます。
リンクが繋がらないときの確認チェックリスト
🚨 接続できないときの確認手順
- ネットワーク疎通: リモートDBのホスト・ポートに
tnspingまたはtelnetで接続できるか - リスナー起動: リモートDBのリスナーが起動しているか(
lsnrctl status) - TNS名:
tnsnames.oraにリモートDBの接続情報が正しく記載されているか - 認証情報: CONNECT TO のユーザー名/パスワードが正しいか(リモートDBに直接ログインして確認)
- 権限: リモートDBの接続先ユーザーに対象テーブルの SELECT / DML 権限があるか
- GLOBAL_NAME: DB Link名にドメイン名が付与される設定になっていないか確認
パフォーマンスの注意点
データベースリンクを使用したSQLは、ネットワークを経由するため注意が必要です。
マテリアライズドビューで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のネットワーク負荷を大幅に削減できます(ビューの使い方の解説)。
セキュリティに関する注意点
関連する記事
まとめ
データベースリンクはOracleの分散データベース機能の要です。まずは USER_DB_LINKS / ALL_DB_LINKS / DBA_DB_LINKS の3ビューの違いを理解し、接続テスト → シノニム連携 → セキュリティ管理の流れで実務に活用してください。
