[OCI]Autonomous DatabaseからRDS for MySQLに対するデータベース・リンクを作成して直接データを参照してみた

# はじめに

Autonomous DatabaseではAmazon Redshift、MySQL、PostgreSQL、SnowflakeといったOracle以外のデータベースに対するデーターベース・リンクが作成できます。

https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5

現時点では、以下の前提条件があります。
・ターゲット・データベースがパブリック・インターネットからアクセスできること
・ターゲット・データベースがSSL/TLS接続を許可する設定になっていること

最近のアップデートで、MySQL Community Editionに対するデータベース・リンクの作成が可能になったので、今回はAutonomous DatabaseからMySQL Community Editionを使用しているRDS for MySQLに対してデータベース・リンクを作成し、Autonomous DatabaseからRDS for MySQL内のデータを参照してみました。

# 1.RDS for MySQLの準備
今回はAWSの東京リージョン（ap-northeast-1）にRDS for MySQLを作成し、Autonomous DatabaseのアウトバウンドIPアドレスからの接続を許可しました。
RDS for MySQLはデフォルトでSSL/TLS接続を許可する設定になっています。

mysqlクライアントからRDS for MySQLに接続します。

```
[opc@tools ~]$ mysql -h testdb.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.32 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
データベース testdb を作成します
```
mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.02 sec)

mysql> 
```
接続先を testdb に切り替えます。
```
mysql> use testdb;
Database changed
mysql> 
```
テーブル dept を作成し、データを追加します。
```
mysql> CREATE TABLE dept (
    -> deptno INT,
    -> dname VARCHAR(14),
    -> loc VARCHAR(13),
    -> PRIMARY KEY (deptno)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
Query OK, 1 row affected (0.03 sec)

mysql> 
mysql> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
Query OK, 1 row affected (0.01 sec)

mysql> 
mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
+--------+------------+----------+
2 rows in set (0.00 sec)

mysql> 
```
mysqlクライアントを終了します。

```
mysql> exit
Bye
[opc@tools ~]$ 
```
# 2. Autonomous Databaseへの接続

SQL*PlusからAutonomous Databaseに接続します。
```
[opc@tools ~]$ sqlplus admin/Demo#1Demo#1@testatp1_medium

SQL*Plus: Release 19.0.0.0.0 - Production on 月 5月 22 10:45:45 2023
Version 19.16.0.0.0

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

最終正常ログイン時間: 月 5月  22 2023 09:53:23 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.1.0
に接続されました。
SQL> 
```
# 3. Autonomous DatabaseからRDS for MySQLに接続するためのクレデンシャルの作成
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、Autonomous DatabaseからRDS for MySQLに接続するためのクレデンシャル RDS_MYSQL_CRED を作成します。
usernameにRDS for MySQLのユーザ名、passwordにそのユーザのパスワードを指定します。
```
SQL> BEGIN
  2    DBMS_CLOUD.CREATE_CREDENTIAL(
  3       credential_name => 'RDS_MYSQL_CRED',
  4       username => 'admin',
  5       password => 'Demo#1Demo#1');
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>
```
# 4. Autonomous DatabaseからRDS fir MySQLに接続するデータベース・リンクの作成
DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK プロシージャを使用して、Autonomous DatabaseからRDS for MySQLに接続するデータベース・リンクを作成します。
DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKの各パラメータは以下のように指定します。

|a  |b  |
|---|---|
|db_link_name|作成するデータベース・リンクの名前  |
|hostname|RDSマネジメントコンソールに表示されるRDS for MySQLのエンドポイント|
|port|RDSマネジメントコンソールに表示されるRDS for MySQLのポート|
|service_name|1.で作成したデータベース名|
|credential_name|3.で作成したRDS for MySQLに接続するためのクレデンシャルの名前|
|gateway_params|接続先DBに応じてdb_typeを設定、MySQL Community Editionを使用しているRDS for MySQLの場合は'MYSQL_COMMUNITY'。詳細は[こちら](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)を参照|
|directory_name|NULL|
|ssl_server_cert_dn|NULL|
```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
  3          db_link_name => 'RDS_MYSQL_LINK', 
  4          hostname => 'testdb.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com', 
  5          port => '3306',
  6          service_name => 'testdb',
  7          credential_name => 'RDS_MYSQL_CRED',
  8          gateway_params => JSON_OBJECT('db_type' value 'MYSQL_COMMUNITY'),
  9          ssl_server_cert_dn => NULL
 10      );
 11  END;
 12  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
# 5. Autonomous Databaseからデータベース・リンク経由でRDS for MySQL内のデータを参照
Autonomous DatabaseからRDS for MySQLへのデータベースリンクが作成できたので、Autonomous Databaseからデータベース・リンク経由でRDS for MySQL内のデータを参照してみます。

参照先のテーブルを指定する際は、"dept"のようにテーブル名を小文字で記述してダブルクウォートで囲む必要があります。
スキーマを指定してテーブルを参照する際は、同様に、"スキーマ名"."テーブル名"のように記述する必要があります。
```
SQL> col dname for a20
SQL> col loc for a20
SQL> SELECT * FROM "dept"@AURORA_MYSQL_LINK;

    deptno dname		        loc
---------- -------------------- --------------------
	    10 ACCOUNTING		    NEW YORK
	    20 RESEARCH		        DALLAS

SQL> 
```
Autonomous Databaseからデータベース・リンク経由でRDS for MySQL内のデータを参照することができました。
# 参考
[Create Database Links to Non-Oracle Databases with Oracle-Managed Heterogeneous Connectivity](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)
[CREATE_CREDENTIAL Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-742FC365-AA09-48A8-922C-1987795CF36A)
[CREATE_DATABASE_LINK Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-admin.html#GUID-8F1DEFF0-08ED-4BB7-825A-01FEE214A079)
[Access Amazon Redshift, Snowflake and Other Non-Oracle Databases from Your Autonomous Database](https://blogs.oracle.com/datawarehousing/post/access-amazon-redshift-snowflake-and-other-non-oracle-databases-from-your-autonomous-database)
[Step-by-Step guide to querying data in Snowflake using Autonomous Database](https://blogs.oracle.com/datawarehousing/post/querying-data-in-snowflake-using-autonomous-database)