DB Link(データベースリンク)とは
あるDBから、別のDB上のオブジェクトをあたかも自分のオブジェクトのようにSQLで参照できる仕組み。
用語は製品により異なる
- Oracle: DATABASE LINK
- PostgreSQL: postgres_fdw, dblink
- SQL Server: Linked Server
- Db2: Federated / Nickname
本質は同じで「リモートDBへのプロキシ接続」。
-- DB A (ローカル) から DB B (リモート) のcustomersを参照
SELECT *
FROM orders o
JOIN customers@DB_B c
ON o.cust_id = c.id;
DB Linkの作成と利用(例)
-- 1) DB Link の作成 (Oracle 例)
CREATE DATABASE LINK link_to_b
CONNECT TO remote_user IDENTIFIED BY ****
USING 'DB_B_TNS_NAME';
-- 2) 利用例 (テーブル参照は @name 付与)
SELECT *
FROM orders o
JOIN customers@link_to_b c
ON o.cust_id = c.id
WHERE o.created_at >= :d;
-- 3) PostgreSQL (FDW) の場合
CREATE EXTENSION postgres_fdw;
CREATE SERVER svr_b ... ;
CREATE USER MAPPING FOR app SERVER svr_b ... ;
IMPORT FOREIGN SCHEMA public FROM SERVER svr_b INTO remote_b;
性質
- 接続は呼び出し時に確立
- パスワードはDBに保持
- SELECT/DML/JOIN可能
- 結果はネットワーク経由
- COMMITは分散2PCになることがある
- シノニムで隠蔽するとアプリ側は意識せず使える
分散SQLの内部動作
- App ⇒ DB A(Coordinator)にクエリ送信
- DB A ⇒ DB B(Remote)にサブクエリ送信
- DB B ⇒ DB A に行をネットワーク経由で返却
- DB A で結合し、最終結果をAppに返却
- コーディネータ側(= DB Link元)が分散実行計画を立てる。
- どこまでをリモート側で絞り込み(述語プッシュダウン)できるかが性能を決める。
- WHEREが先に効けば数件しか転送されないが、効かないと全件転送になる。
- 更新が絡むと2フェーズコミット(2PC)になり、片方が落ちるとCOMMITがぶら下がる。
DB Link利用時の注意点
- パフォーマンス: ネットワーク往復がボトルネック化しやすい。リモート側でWHERE/集約を済ませる設計が必須。
- セキュリティ: 認証情報がDB内部に保存される。権限は最小限で。SSL/暗号化の検討。
- 可用性: リンク先が停止すると、コーディネータ側のセッションも待たされる。タイムアウト設定が重要。
- 分散トランザクション: 更新を伴うと2PC、コミットが2倍の往復になる。読み取り専用にできるならその方が圧倒的に楽。
- バージョン互換: リンク元・先のDBバージョン差で挙動が変わる。テスト環境でバージョン一致を確認。
- 運用: リンク自体の存在・依存関係を文書化する。本番DBの「隠れ依存」になりがち。