Oracle DatabaseのDBLINK自分用メモまとめページ

#■この記事で記載すること
Oracle DBLINKの基本接続構成の設定例と、Oracleを用いた以下のDBLINK構成自分用メモのまとめページを記載します。

- 基本接続
 - [TCP接続：OracleからOracleへのDBLINK接続（TCP接続）](https://qiita.com/TakuyaAma/items/c217a8445e99f3059214#-dblink%E5%9F%BA%E6%9C%AC%E6%8E%A5%E7%B6%9A%E6%A7%8B%E6%88%90tcp%E6%8E%A5%E7%B6%9A)
 - [TCPS接続：上記接続をTCPからTCPSに変更](https://qiita.com/TakuyaAma/items/c217a8445e99f3059214#-dblink%E5%9F%BA%E6%9C%AC%E6%8E%A5%E7%B6%9A%E6%A7%8B%E6%88%90tcps%E6%8E%A5%E7%B6%9A)
- Autonomous Database（ADB）を用いたDBLINK接続
 - [ADBからADBへのDBLINK接続](https://qiita.com/TakuyaAma/items/883344eb0916de0495b9)
 - [ADBからDBCSへのDBLINK接続](https://qiita.com/TakuyaAma/items/e7a8aee81c90274edca6)
- OracleからNon-OracleDBへのDatabase Gateway for ODBC（DG4ODBC）を用いたDBLINK接続
 - [DBCSからNon-OracleDB（MySQL）へのDBLINK接続](https://qiita.com/TakuyaAma/items/8ed9c079d2344b1bc611#-database-cloud-servicedbcs%E3%81%8B%E3%82%89non-oracledbmysql%E3%81%B8%E3%81%AEdblink%E6%8E%A5%E7%B6%9A)
 - [ADBからNon-OracleDB（MySQL）へのDBLINK接続（DG4ODBCとNon-OracleDBを同一ノードに配置）](https://qiita.com/TakuyaAma/items/8ed9c079d2344b1bc611#-autonomous-databaseadb%E3%81%8B%E3%82%89non-oracledbmysql%E3%81%B8%E3%81%AEdblink%E6%8E%A5%E7%B6%9Adg4odbc%E3%81%A8non-oracledb%E3%82%92%E5%90%8C%E4%B8%80%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AB%E9%85%8D%E7%BD%AE)
 - [ADBからNon-OracleDB（MySQL Database Service : MDS）へのDBLINK接続（DG4ODBCとNon-OracleDBを別ノードに配置）](https://qiita.com/TakuyaAma/items/8ed9c079d2344b1bc611#-adb%E3%81%8B%E3%82%89non-oracledbmysql-database-service--mds%E3%81%B8%E3%81%AEdblink%E6%8E%A5%E7%B6%9Adg4odbc%E3%81%A8non-oracledb%E3%82%92%E5%88%A5%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AB%E9%85%8D%E7%BD%AE)

#■Oracle DBLINKの概要説明

##● DBLINKとは

>データベース・リンクとは、他のデータベース上のオブジェクトにアクセスできる、データベース上のスキーマ・オブジェクトです。他のデータベースは、Oracle Databaseシステムである必要はありません。ただし、Oracle以外のシステムにアクセスする場合は、Oracle異機種間サービスを使用する必要があります。
>データベース・リンクを作成した後で、表名、ビュー名またはPL/SQLオブジェクト名に@dblinkを追加し、そのリンクをSQL文で利用して、他のデータベース上の表、ビューおよびPL/SQLオブジェクトを参照できます。SELECT文を使用して、他のデータベース上の表またはビューを問い合せることができます。INSERT文、UPDATE文、DELETE文またはLOCK TABLE文を使用してもリモート表およびビューにアクセスできます。`

[SQL言語リファレンス](https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-DATABASE-LINK.html#GUID-D966642A-B19E-449D-9968-1121AF06D793)から引用

#■ DBLINK基本接続構成（TCP接続）

##● システム構成イメージ

Oracle（ローカル） -- [Oracle Net : TCP] --> Oracle（リモート）

※システム構成図に変更予定

##● 主な構成要素と概要説明

| 構成要素 | 概要説明 |
|:-|:-|
| Oracle（ローカル） | リモートに接続するためのOracle Net(sqlnet/tnsnames)設定 |
| Oracle（リモート） | ローカルからの接続を受けるためのOracle Net(sqlnet/listener)設定  |

##● 設定例

- Oracle（リモート）のOracle Net設定
- Oracle（ローカル）のOracle Net設定
- DBLINKの作成

###- Oracle（リモート）のOracle Net設定

ネットワーク経由で接続を受け付けるためのノーマルなOracle Net設定
- sqlnet.ora
- listener.ora

###- Oracle（ローカル）のOracle Net設定

Oracle ClientとしてのノーマルなOracle Net設定
- sqlnet.ora
- tnsnames.ora

###- DBLINKの作成

DBLINKを作成

```sql
CREATE PUBLIC DATABASE LINK remote USING 'remote';
```

リモートのオブジェクトにアクセス

```sql
UPDATE employees@remote
   SET salary=salary*1.1
   WHERE last_name = 'Baer';
```

##● 留意事項

- global namesの利用要否
global namesを利用する場合、DBLNIKの名前をglobal namesのルールに沿って設定する必要がある。global namesを利用しない場合はglobal namesを無効化する

- ローカルとリモートのOracleのバージョン間の整合性
ローカルはClietnの位置づけ、リモートはServerの位置づけで以下のMatrixを参考にバージョン間の整合性を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38031/337d0c47-0775-f845-ad43-18a99a91ff45.png)

- ローカルとリモートの間の疎通（L3/L4レベル）
一般的なL4レベルで疎通がとれていることを確認する
→ 特に、DBCSを利用している場合は、OCIのFirewall設定（SecurityListやNetwork Security Group）やDBCSのOSレベルでのFirewall設定（firewall-cmdやiptables）の設定を確認する 

#■ DBLINK基本接続構成（TCPS接続）

##● システム構成イメージ

Oracle（ローカル）/w クライアントウォレットファイル -- [Oracle Net : TCPS] --> Oracle（リモート） /w サーバウォレットファイル

※システム構成図に変更予定

##● システム構成説明（TCP接続との差分）

「DBLINK基本接続構成（TCP接続）」を基本に、TCPをTPCSに変更するための構成が必要となる

- ウォレットファイルの作成、配置
- ウォレットファイルを利用するためのOracle Net設定

##● 設定例

- 環境
- ウォレットファイルの作成、配置
- Oracle（リモート）のOracle Net設定
- Oracle（ローカル）のOracle Net設定
- DBLINKの作成

###- 環境

この例では、Oracle(リモート）、Oracle（ローカル）ともにDBCS（Oracle Cloud Database Service）を利用

###- ウォレットファイルの作成、配置

[この記事](https://qiita.com/TakuyaAma/items/3b9f9a48b3b1ef9b2e8d#oracle%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)を参考にウォレットファイルを作成のうえ、以下に配置する。

・クライアントウォレットファイル
Oracle(ローカル)の`/u01/client/wallet/`に配置

・サーバウォレットファイル
Oracle(リモート)の`/u01/server/wallet/`に配置

###- Oracle（リモート）のOracle Net設定

・sqlnet.oraの編集

```bash
# sqlnet.ora Network Configuration File: /u01/app/19.0.0.0/grid/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

wallet_location =
 (SOURCE=
  (METHOD=File)
  (METHOD_DATA=
   (DIRECTORY=/u01/server/wallet)))
 
SSL_SERVER_DN_MATCH=(ON)
```

・lisener.oraの編集
ファイルの先頭に以下を追記

```bash
wallet_location =
 (SOURCE=
  (METHOD=File)
  (METHOD_DATA=
   (DIRECTORY=/u01/server/wallet)))
```

・TCPSエンドポイントの再構成

```bash
$ srvctl modify listener -p "TCP:1521/TCPS:1522"
$ srvctl stop listener
$ srvctl start listener
$ srvctl stop database -database dbcs0502_iad1fq #11gの場合は、-databaseの代わりに-dを用いる
$ srvctl start database -database dbcs0502_iad1fq
$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 17-APR-2021 02:59:33

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                17-APR-2021 01:06:13
Uptime                    0 days 1 hr. 53 min. 20 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/19.0.0.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/grid/diag/tnslsnr/dbcs0502/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=10.0.1.136)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.1.136)(PORT=1521)))
Services Summary...
Service "+APX" has 1 instance(s).
  Instance "+APX1", status READY, has 1 handler(s) for this service...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "+ASM_DATA" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "+ASM_RECO" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "dbcs0502XDB.subnet.vcn05.oraclevcn.com" has 1 instance(s).
  Instance "dbcs0502", status READY, has 1 handler(s) for this service...
Service "dbcs0502_iad1fq.subnet.vcn05.oraclevcn.com" has 1 instance(s).
  Instance "dbcs0502", status READY, has 2 handler(s) for this service...
The command completed successfully
```

###- Oracle（ローカル）のOracle Net設定

sqlnet.oraの編集

```bash
WALLET_LOCATION =
   (SOURCE =
     (METHOD = FILE)
     (METHOD_DATA =
       (DIRECTORY = /u01/client/wallet)
     )
   )
 
SSL_SERVER_DN_MATCH=(ON)
```

tnsnames.oraの編集

```bash
DBCS0502_IAD1FQ =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.136)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dbcs0502_iad1fq.subnet.vcn05.oraclevcn.com)
    )
  )

DBCS_TCPS =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.1.136)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dbcs0502_iad1fq.subnet.vcn05.oraclevcn.com)
    )
    (SECURITY= (SSL_SERVER_CERT_DN="CN=dbcs"))
  )
```

###- DBLINKの作成

```sql
SQL> CREATE PUBLIC DATABASE LINK DBLINK_DBCS_TCPS CONNECT TO "hoge" IDENTIFIED BY "WelCome123#123#" USING 'DBCS_TCPS';
```

#■参考情報

##● 参考リンク
- Documentation
 - [SQL言語リファレンス:create database link](https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-DATABASE-LINK.html#GUID-D966642A-B19E-449D-9968-1121AF06D793)
- MOS(My Oracle Support)
 - [Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=269932973950013&parent=EXTERNAL_SEARCH&sourceId=BULLETIN&id=207303.1&_afrWindowMode=0&_adf.ctrl-state=8l8abnpme_4)
 - [分散トランザクション (Doc ID 1773383.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=230365291158198&id=1773383.1&_afrWindowMode=0&_adf.ctrl-state=157sliamx1_4)
 - [How to view open dblink connections (Doc ID 387848.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=230555883269661&id=387848.1&displayIndex=1&_afrWindowMode=0&_adf.ctrl-state=157sliamx1_158)
- Blogs
 - [古いバージョンのOracleデータベースでデータベース・リンクを使用している場合はパッチ適用が必要な場合があります](https://blogs.oracle.com/supportjp/oldversion_dblink)