OracleのDBリンク(DATABASE LINK)の作成と使い方【リモートDB操作完全ガイド】

当ページのリンクには広告が含まれています。

別の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_ORCL

ORA-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やデータポンプでコピーする方法を検討

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次