別のOracleデータベースにいるテーブルをSQLで直接参照したい——そんなときに使うのが「DBリンク(DATABASE LINK)」です。本記事ではDBリンクの作成から使い方・確認・削除まで現場目線で解説します。
目次
1. DBリンクとは {#about}
DBリンクとは、別のOracleデータベースに接続するための「橋渡し」オブジェクトです。
ローカルDB(接続元)
│ SELECT * FROM employees@REMOTE_DB
│
↓ DBリンク経由
リモートDB(接続先)
└── employees テーブルを参照DBリンクを使うと、リモートDBのテーブルをまるでローカルにあるかのようにSQLで操作できます。
主な用途:
- 複数DBをまたいだデータ集計・照合
- 本番DBから開発DBへのデータコピー
- マテリアライズドビューの元データ取得
2. DBリンクの作成(CREATE DATABASE LINK) {#create}
tnsnames.oraを使った作成(推奨)
-- tnsnames.oraに接続先の定義がある場合
CREATE DATABASE LINK REMOTE_DB
CONNECT TO remote_user IDENTIFIED BY "password"
USING 'REMOTE_ORCL'; -- tnsnames.oraのサービス名Easy Connect形式(tnsnames.ora不要)
-- ホスト・ポート・サービス名を直接記述
CREATE DATABASE LINK REMOTE_DB
CONNECT TO remote_user IDENTIFIED BY "password"
USING 'db-server.example.com:1521/ORCL';現在のユーザー情報で接続(CURRENT_USER)
-- DBリンクを使う側のユーザーで認証(グローバルユーザー向け)
CREATE DATABASE LINK REMOTE_DB
CONNECT TO CURRENT_USER
USING 'REMOTE_ORCL';パブリックDBリンク(DBA権限が必要)
-- 全ユーザーが使えるDBリンク
CREATE PUBLIC DATABASE LINK REMOTE_DB
CONNECT TO remote_user IDENTIFIED BY "password"
USING 'REMOTE_ORCL';3. DBリンクを使ったSQL {#usage}
DBリンク名を @ の後ろに付けて使います。
テーブルの参照
-- リモートDBのテーブルを参照
SELECT * FROM employees@REMOTE_DB;
-- WHERE句・JOIN・集計もそのまま使える
SELECT e.employee_id, e.last_name, d.department_name
FROM employees@REMOTE_DB e
JOIN departments@REMOTE_DB d ON e.department_id = d.department_id
WHERE e.hire_date >= DATE '2024-01-01';ローカルとリモートをJOINする
-- ローカルのテーブルとリモートのテーブルをJOIN
SELECT l.order_id, l.amount, r.customer_name
FROM local_orders l
JOIN customers@REMOTE_DB r ON l.customer_id = r.customer_id;リモートDBへのINSERT/UPDATE/DELETE
-- リモートDBのテーブルにINSERT
INSERT INTO employees@REMOTE_DB (employee_id, last_name, hire_date)
VALUES (9999, 'テスト', SYSDATE);
-- リモートDBのテーブルをUPDATE
UPDATE employees@REMOTE_DB
SET salary = salary * 1.1
WHERE department_id = 10;
-- 分散トランザクション:ローカルとリモートの両方にコミット
COMMIT; -- 2フェーズコミットが自動的に働くシノニムでDBリンクを隠す(使いやすくする)
-- DBリンクを意識させないシノニムを作成
CREATE SYNONYM remote_employees FOR employees@REMOTE_DB;
-- シノニム経由で使える(@が不要になる)
SELECT * FROM remote_employees;4. DBリンクの確認と管理 {#check}
作成済みDBリンクの一覧を確認
-- 自分のDBリンクを確認
SELECT DB_LINK, USERNAME, HOST, CREATED
FROM USER_DB_LINKS
ORDER BY CREATED DESC;
-- 全ユーザーのDBリンクを確認(DBA権限)
SELECT OWNER, DB_LINK, USERNAME, HOST, CREATED
FROM DBA_DB_LINKS
ORDER BY OWNER, DB_LINK;
-- パブリックDBリンクを確認
SELECT DB_LINK, USERNAME, HOST
FROM ALL_DB_LINKS
WHERE OWNER = 'PUBLIC';DBリンクの接続テスト
-- DBリンク経由でリモートDBの現在時刻を取得(接続確認)
SELECT SYSDATE FROM DUAL@REMOTE_DB;OKなら接続できています。
DBリンクの削除
-- プライベートDBリンクを削除
DROP DATABASE LINK REMOTE_DB;
-- パブリックDBリンクを削除(DBA権限が必要)
DROP PUBLIC DATABASE LINK REMOTE_DB;5. パブリックDBリンク vs プライベートDBリンク {#public-private}
| 種類 | スコープ | 作成権限 | 推奨場面 |
|---|---|---|---|
| プライベート(デフォルト) | 作成したユーザーのみ使用可能 | CREATE DATABASE LINK権限 | 特定ユーザーだけが使う場合 |
| パブリック | DBの全ユーザーが使用可能 | CREATE PUBLIC DATABASE LINK権限(DBA) | システム全体で共用する場合 |
セキュリティの観点から:パブリックDBリンクはパスワードが全ユーザーに共有される形になります。接続先DBへのアクセスを制限したい場合はプライベートDBリンクを使い、ユーザーごとに権限管理することを推奨します。
6. よくあるエラーと対処法 {#errors}
ORA-12154:接続識別子を解決できない
ORA-12154: TNS: 指定された接続識別子を解決できませんでしたDBリンクのUSING句に記述したサービス名が解決できません。
# サーバー上でtnspingが通るか確認
tnsping REMOTE_ORCLORA-01017:ユーザー名/パスワードが無効
接続先DBのユーザー名またはパスワードが間違っています。接続先DBで直接ログインして確認します。
ORA-02085:DBリンクがDBに接続
ORA-02085: データベース・リンクREMOTE_DBがORCLに接続します接続先DBのグローバル名(GLOBAL_NAME)とDBリンク名が一致しない場合に発生します。
-- 接続先DBのグローバル名を確認
SELECT * FROM GLOBAL_NAME@REMOTE_DB;
-- グローバル名チェックを無効化(一時的な対処)
ALTER SYSTEM SET GLOBAL_NAMES = FALSE;ORA-02063:先行する行がDBリンクからのエラー
ORA-02063: 先行する行 (1行) がREMOTE_DBからのエラーです。リモートDB側でエラーが発生しています。エラーの詳細は前行のエラーコードを確認します。
7. まとめ:DBリンクの注意点チェックリスト {#summary}
作成時
□ 接続先のtnsping が通ることを確認してから CREATE DATABASE LINK
□ パスワードに特殊文字を含む場合は "ダブルクォート" で囲む
□ 不特定多数が使う場合のみ PUBLIC、通常はプライベートDBリンクを使う
運用時
□ SELECT SYSDATE FROM DUAL@リンク名 で定期的に接続確認
□ 不要になったDBリンクは DROP DATABASE LINK で削除(パスワードが残り続けるため)
□ リモートDBのパスワード変更時は DROP → CREATE で再作成
パフォーマンス
□ ローカルとリモートのJOINは大量データで遅くなりがち
→ リモート側でWHEREを絞ってからJOINするか、マテリアライズドビューを活用
□ 分散トランザクション(ローカル+リモートの同時更新)は障害時の復旧が複雑
→ 可能ならETLやデータポンプでコピーする方法を検討関連記事:









コメント