Oracle DBLINKについて

DBLINK

1. DBLINKとは

DBLINK(データベースリンク)は、あるOracleデータベースから別のOracleデータベースに接続し、データを参照したり操作を行うためのリンクです。特に、異なるシステムやデータベースを連携させる必要がある際に便利な機能で、データのリアルタイム共有や一元管理を実現します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

DBLINKの主な用途

  • データの一元化:複数のシステムからデータを収集し、データの一元管理を実現。
  • 異なるシステム間のデータ参照:DBLINKを使って、複数のシステム間でデータを共有し、リアルタイムでの参照を可能にします。
  • データの分散処理:異なるデータベース間での効率的なデータ分散と利用が可能です。

以下は、テーブルを使用したDBLINKのテキスト形式イメージ図です。ローカルのSQLがリモートのテーブルにアクセスしている様子を表しています。

補足:

  • ローカル側のSQLから @remote_db をつけてリモートテーブル employees を参照。
  • DBLINKは tnsnames.ora に設定された remote_db を使って接続。
  • あくまでローカルから見た仮想的なアクセスであり、物理的なテーブルはリモート側に存在。

記事内でこの図を使えば、読者が「DBLINK経由でどこにアクセスしているのか」を視覚的に理解しやすくなります。必要であれば、INSERTやUPDATEを含むバージョンもご提供可能です。

この記事では以下で作成した環境(シングル/非CDB)を使用しています。
※既存で作成されている環境があれば基本的に問題ありません。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


2. DBLINKの作成手順

2.1 前提条件

1.TNS設定
リモートデータベースの接続情報が記載されたTNSエントリ(tnsnames.ora)を準備します。以下はtnsnames.oraの設定例です:

remote_db =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <remote_host>)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = <remote_database_service>)
)
)

↓↓tnsnames.oraについてはコチラ。↓↓

2.権限の確認
DBLINK作成には、CREATE DATABASE LINK権限が必要です。また、リモートデータベースのユーザーアカウントが、DBLINKを作成するデータベースのユーザーと連携する必要があります。

2.2 DBLINKの作成方法

DBLINK作成時に必要な構文は以下の通りです:

CREATE DATABASE LINK <dblink_name>
CONNECT TO <username> IDENTIFIED BY <password>
USING '<tns_alias>';
  • dblink_name:データベースリンクの名前
  • usernamepassword:接続先データベース(リモート側)のユーザー認証情報
  • tns_alias:接続先データベースのTNSエントリ名(tnsnames.ora)

2.3 DBLINKの作成例

たとえば、scottユーザーでリモートデータベースremote_dbに接続するDBLINKを作成します。

CREATE DATABASE LINK remote_db_link
CONNECT TO scott IDENTIFIED BY tiger
USING 'remote_db';

2.4 DBLINKの作成後の確認

DBLINKが正しく機能するかを確認するため、簡単なSELECT文を発行してみます。
構文: select <列名1>,<列名2>… from <テーブル名>@<DBLINK名>
※OracleNet 接続の <テーブル名>@<TNSエントリ名> では無い点に注意

SELECT * FROM employees@remote_db_link;

実機を使用した実行結果

実行結果を表示(ここをクリック)

●リモート側のデータベースでテーブル作成

[oracle@remote_server ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 5月 26 10:32:04 2025
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> @?/rdbms/admin/utlsampl.sql  ★SCOTT サンプルスキーマをインストール
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
[oracle@remote_server ~]$ sqlplus scott/tiger

SQL*Plus: Release 19.0.0.0.0 - Production on 月 5月 26 10:38:01 2025
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

最終正常ログイン時間: 月 5月  26 2025 10:32:19 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> CREATE TABLE employees (  ★テーブルを作成
  2    employee_id   NUMBER PRIMARY KEY,
  3    first_name    VARCHAR2(50),
  4    last_name     VARCHAR2(50),
  5    department    VARCHAR2(50),
  6    hire_date     DATE,
  7    salary        NUMBER(10, 2)
  8  );

表が作成されました。

SQL> INSERT INTO employees VALUES (1001, 'Taro', 'Yamada', 'Sales', TO_DATE('2020-04-01','YYYY-MM-DD'), 500000);

1行が作成されました。

SQL> INSERT INTO employees VALUES (1002, 'Hanako', 'Suzuki', 'HR', TO_DATE('2019-07-15','YYYY-MM-DD'), 420000);

1行が作成されました。

SQL> INSERT INTO employees VALUES (1003, 'Ichiro', 'Tanaka', 'IT', TO_DATE('2021-01-10','YYYY-MM-DD'), 550000);

1行が作成されました。

SQL> INSERT INTO employees VALUES (1004, 'Keiko', 'Kobayashi','Marketing', TO_DATE('2018-11-25','YYYY-MM-DD'), 470000);

1行が作成されました。

SQL> INSERT INTO employees VALUES (1005, 'Satoshi','Kato', 'Finance', TO_DATE('2017-03-30','YYYY-MM-DD'), 600000);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> set lin 1000 pages 1000
SQL> col first_name for a20
SQL> col last_name for a20
SQL> col department for a20
SQL> select * from employees;

EMPLOYEE_ID FIRST_NAME           LAST_NAME            DEPARTMENT           HIRE_DAT     SALARY
----------- -------------------- -------------------- -------------------- -------- ----------
       1001 Taro                 Yamada               Sales                20-04-01     500000
       1002 Hanako               Suzuki               HR                   19-07-15     420000
       1003 Ichiro               Tanaka               IT                   21-01-10     550000
       1004 Keiko                Kobayashi            Marketing            18-11-25     470000
       1005 Satoshi              Kato                 Finance              17-03-30     600000


●ローカル側のデータベースで DBLINK を作成

[oracle@v19single ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora  ★tnsnames.ora 作成
[oracle@v19single ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora
remote_db =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = remote_server)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = v19)
    )
  )
[oracle@v19single ~]$ sqlplus user1/user1

SQL*Plus: Release 19.0.0.0.0 - Production on 月 5月 26 10:57:55 2025
Version 19.3.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> CREATE DATABASE LINK remote_db_link  ★DBLINK 作成
  2  CONNECT TO scott IDENTIFIED BY tiger
  3  USING 'remote_db';

データベース・リンクが作成されました。

SQL> set lin 1000 pages 1000
SQL> col first_name for a20
SQL> col last_name for a20
SQL> col department for a20
SQL> SELECT * FROM employees@remote_db_link;  ★DBLINK を使用してテーブルを select

EMPLOYEE_ID FIRST_NAME           LAST_NAME            DEPARTMENT           HIRE_DAT     SALARY
----------- -------------------- -------------------- -------------------- -------- ----------
       1001 Taro                 Yamada               Sales                20-04-01     500000
       1002 Hanako               Suzuki               HR                   19-07-15     420000
       1003 Ichiro               Tanaka               IT                   21-01-10     550000
       1004 Keiko                Kobayashi            Marketing            18-11-25     470000
       1005 Satoshi              Kato                 Finance              17-03-30     600000
  
注釈(実機での実行結果について)

本記事に掲載の実機出力結果(コマンド結果・SQL実行結果・ファイル位置など)は、 DB のバージョン構成初期化パラメータOS/仮想化/ネットワーク設定、およびパッチ適用状況(例:RU/RUR 等)等によって 変わる場合があります。実際にお使いの検証環境でご確認ください。

本記事の検証環境
  • Oracle VM VirtualBox
  • Oracle Linux 7.9
  • Oracle Database 19c(シングル構成/非CDB)


【参考】
シノニムを使用することで @remote_db_link のようにせずにDBLINKを使用することもできます。

コマンド実行例

--シノニムを作成

CREATE SYNONYM employees_syn FOR employees@remote_db_link;

--作成したシノニムを使用してselect

SELECT * FROM employees_syn;

SELECT * FROM employees@remote_db_link; と同様

3. DBLINKの活用例

3.1 リモートデータの参照

リモートデータベースのテーブルをローカルのテーブルのように参照できます。

SELECT employee_id, first_name, last_name FROM employees@remote_db_link WHERE department = 'HR';

3.2 ローカルテーブルへのデータ挿入

リモートデータベースから取得したデータを、ローカルのテーブルに挿入します。

INSERT INTO local_employees (id, name, department)
SELECT employee_id, first_name, department FROM employees@remote_db_link;

3.3 データ更新

リモートデータベース上のデータを更新する場合もDBLINKを使用できますが、慎重に行う必要があります。

UPDATE employees@remote_db_link SET salary = salary * 1.05 WHERE department = 'IT';

4. DBLINK利用時のセキュリティ対策

DBLINKはリモートデータベースに直接アクセスするため、適切なセキュリティ対策が必要です。

4.1 アクセス権限の管理

DBLINKを作成するユーザーのアクセス権限を適切に管理し、最小限の権限で運用するようにします。

4.2 Oracle Walletの利用

Oracle Walletを利用して、DBLINKのパスワードを安全に管理します。これにより、パスワードがSQL文内に残らず、セキュリティが向上します。

4.3 DBLINKの監査とログ記録

DBLINKの利用状況を監査し、定期的にアクセスログを確認します。異常なアクセスがあれば即座に対応できるように監視体制を整備します。


5. DBLINKのエラーハンドリングとトラブルシューティング

DBLINK利用中に発生しやすいエラーとその対策を以下に示します。

  1. ORA-12154: TNSnot resolve the connect identifier specified
    • 原因:指定したTNSエイリアスが見つからない。
    • 対策tnsnames.ora設定を確認し、接続先のエントリが正しいか確認します。
  2. ORA-12541: TNSlistener
    • 原因:リモートデータベースのリスナーが起動していない。
    • 対策:リモートホストのリスナーが起動しているかを確認し、必要に応じて再起動します。
  3. ORA-01017: invalid username/password
    • 原因:DBLINK作成時に指定したユーザー名またはパスワードが誤っている。
    • 対策:DBLINKのユーザー認証情報を再確認し、修正します。
  4. ORA-28547: connection to server failed
    • 原因:ネットワーク障害やファイアウォール設定による通信エラー。
    • 対策:ファイアウォールやVPN設定、ネットワークの疎通を確認します。

6. DBLINKのメンテナンスと管理

DBLINKは長期にわたって運用されることが多いため、定期的なメンテナンスが必要です。

6.1 DBLINKの一覧確認

DBLINKの一覧を取得するには、以下のSQL文を使用します。

SELECT * FROM dba_db_links;

6.2 DBLINKの削除

DBLINKが不要になった場合は、以下のコマンドで削除します。

DROP DATABASE LINK remote_db_link;

6.3 パスワードの更新

リモートデータベースのパスワードを定期的に変更し、セキュリティリスクを低減します。Oracle Walletを使用している場合は、パスワードの更新が容易になります。


7. DBLINK利用のベストプラクティス

DBLINKの利用におけるベストプラクティスを紹介します。

7.1 必要なときだけ使用する

DBLINKはリモートデータベースに負荷をかけるため、必要なタイミングでのみ使用し、不要なときには削除するのが望ましいです。

7.2 簡潔なクエリの利用

DBLINKを介したクエリは、シンプルなSQL文に限定することでパフォーマンスを向上させます。JOIN操作や集計処理は可能な限りローカルで行い、リモートデータベースから必要なデータのみを取得します。

7.3 ネットワークのモニタリング

DBLINKを使用するとネットワーク経由での通信が発生するため、ネットワークの遅延が発生しないように定期的なモニタリングが推奨されます。


8. まとめと次のステップ

DBLINKは異なるデータベース間でのデータ共有やアクセスに非常に有用ですが、ネットワークやセキュリティに配慮する必要があります。DBLINKを適切に管理し、効率的なデータ連携を目指しましょう。

[参考]
SQL言語リファレンス – CREATE DATABASE LINK

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました