

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 mysql\$1fdw 擴充功能處理 MySQL 資料庫
<a name="postgresql-mysql-fdw"></a>

若要從 RDS for PostgreSQL 資料庫執行個體存取相容於 MySQL 的資料庫，您可以安裝並使用 `mysql_fdw` 擴充功能。此外部資料包裝函數可讓您使用 MySQL、Aurora MySQL、MariaDB 和其他相容於 MySQL 的資料庫的 RDS。從 RDS for PostgreSQL 資料庫執行個體到 MySQL 資料庫的連線是在最大努力的基礎上加密的，具體取決於用戶端和伺服器的組態。但是，如有需要，您可以強制執行加密。如需詳細資訊，請參閱[搭配此擴充功能使用傳輸中加密](#postgresql-mysql-fdw.encryption-in-transit)。

Amazon RDS for PostgreSQL 版本 14.2、13.6 及更高版本支援 `mysql_fdw` 擴充功能。它支援從 RDS for PostgreSQL DB 對相容於 MySQL 的資料庫執行個體上的資料表進行選擇、插入、更新和刪除。

**Topics**
+ [設定 RDS for PostgreSQL 資料庫以使用 mysql\$1fdw 擴充功能](#postgresql-mysql-fdw.setting-up)
+ [範例：使用 RDS for PostgreSQL 中的 RDS for MySQL 資料庫](#postgresql-mysql-fdw.using-mysql_fdw)
+ [搭配此擴充功能使用傳輸中加密](#postgresql-mysql-fdw.encryption-in-transit)

## 設定 RDS for PostgreSQL 資料庫以使用 mysql\$1fdw 擴充功能
<a name="postgresql-mysql-fdw.setting-up"></a>

在您的 RDS for PostgreSQL 資料庫執行個體上設定 `mysql_fdw` 擴充功能包括在資料庫執行個體中載入擴充功能，然後建立與 MySQL資料庫執行個體的連線點。針對此任務，您必須有以下關於 MySQL 資料庫執行個體的詳細內容：
+ 主機名稱或端點。如果是 RDS for PostgreSQL 資料庫執行個體，您可以使用主控台尋找端點。選擇 Connectivity & security (連線和安全) 索引標籤，然後查看「端點和連線埠」區段。
+ 連線埠號碼。MySQL 的預設連線埠號為 3306。
+ 資料庫的名稱。資料庫識別符。

您也必須提供 MySQL 連線埠 3306 的安全群組或存取控制清單 (ACL) 的存取權限。 RDS for PostgreSQL 資料庫執行個體和 RDS for MySQL 資料庫執行個體都需要存取連接埠 3306。如果未正確設定存取權限，當您嘗試連線至相容於 MySQL 的資料表時，會看到類似以下的錯誤訊息：

```
ERROR: failed to connect to MySQL: Can't connect to MySQL server on 'hostname.aws-region.rds.amazonaws.com:3306' (110)
```

在以下程序中，您 (作為 `rds_superuser` 帳戶) 建立外部伺服器。然後，您將外部伺服器的存取權限授予特定使用者。然後，這些使用者建立自己的映射到適合的 MySQL 使用者帳戶以使用 MySQL 資料庫執行個體。

**使用 mysql\$1fdw 存取 MySQL 資料庫伺服器**

1. 使用有 `rds_superuser` 角色的帳戶連線到您的 PostgreSQL 資料庫執行個體。如果您在建立 RDS for PostgreSQL 資料庫執行個體時接受了預設值，則使用者名稱為 `postgres`，而且您可以使用 `psql` 命令列工具進行連線，如下所示：

   ```
   psql --host=your-DB-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres –-password
   ```

1. 安裝 `mysql_fdw` 擴充功能，如下所示：

   ```
   postgres=> CREATE EXTENSION mysql_fdw;
   CREATE EXTENSION
   ```

在 RDS for PostgreSQL 資料庫執行個體上安裝擴充功能後，您可以設定提供連線至 MySQL 資料庫的外部伺服器。

**建立外部伺服器**

在 RDS for PostgreSQL 資料庫執行個體上執行這些任務。這些步驟假設您以具有 `rds_superuser` 權限 (例如 `postgres`) 的使用者進行連線。

1. 在 RDS for PostgreSQL 資料庫執行個體中建立外部伺服器：

   ```
   postgres=> CREATE SERVER mysql-db FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host 'db-name.111122223333.aws-region.rds.amazonaws.com', port '3306');
   CREATE SERVER
   ```

1. 將適當的使用者存取權限授予外部伺服器。這些使用者應該是非管理員使用者，亦即沒有 `rds_superuser` 角色。

   ```
   postgres=> GRANT USAGE ON FOREIGN SERVER mysql-db to user1;
   GRANT
   ```

PostgreSQL 使用者透過外部伺服器建立和管理自己的 MySQL 資料庫連線。

## 範例：使用 RDS for PostgreSQL 中的 RDS for MySQL 資料庫
<a name="postgresql-mysql-fdw.using-mysql_fdw"></a>

假設您在 RDS for PostgreSQL 資料庫執行個體上有一個簡單資料表。您的 RDS for PostgreSQL 使用者想要查詢 (`SELECT`)、`INSERT`、`UPDATE` 和 `DELETE` 該資料表上的項目。假設 `mysql_fdw` 擴充功能已在 RDS for PostgreSQL 資料庫執行個體上建立，詳情如上述程序所述。作為具有 `rds_superuser` 權限的使用者，在您連線到 RDS 的 PostgreSQL 資料庫執行個體後，可繼續執行以下步驟。

1. 在 RDS for PostgreSQL 資料庫執行個體中建立外部伺服器：

   ```
   test=> CREATE SERVER mysqldb FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host 'your-DB.aws-region.rds.amazonaws.com', port '3306');
   CREATE SERVER
   ```

1. 授與使用量給沒有 `rds_superuser` 許可的使用者，例如 `user1`：

   ```
   test=> GRANT USAGE ON FOREIGN SERVER mysqldb TO user1;
   GRANT
   ```

1. 以 *user1* 身分連線，然後建立一個 MySQL 使用者的映射：

   ```
   test=> CREATE USER MAPPING FOR user1 SERVER mysqldb OPTIONS (username 'myuser', password 'mypassword');
   CREATE USER MAPPING
   ```

1. 建立 MySQL 資料表的外部資料表連結。

   ```
   test=> CREATE FOREIGN TABLE mytab (a int, b text) SERVER mysqldb OPTIONS (dbname 'test', table_name '');
   CREATE FOREIGN TABLE
   ```

1. 對外部資料表執行簡單查詢：

   ```
   test=> SELECT * FROM mytab;
   a |   b
   ---+-------
   1 | apple
   (1 row)
   ```

1. 您可以從 MySQL 資料表新增、變更和移除資料。例如：

   ```
   test=> INSERT INTO mytab values (2, 'mango');
   INSERT 0 1
   ```

   再次執行 `SELECT` 查詢以查看結果：

   ```
   test=> SELECT * FROM mytab ORDER BY 1;
    a |   b
   ---+-------
   1 | apple
   2 | mango
   (2 rows)
   ```

## 搭配此擴充功能使用傳輸中加密
<a name="postgresql-mysql-fdw.encryption-in-transit"></a>

預設情況下，從 RDS for PostgreSQL 到 MySQL 的連線會使用傳輸中加密 (TLS/SSL)。但是，當用戶端和伺服器組態不同時，連線會回退到未加密。您可以在 RDS for MySQL 使用者帳戶上指定 `REQUIRE SSL` 選項，強制加密所有的對外連線。此方法也適用於 MariaDB 和 Aurora MySQL 使用者帳戶。

當 MySQL 使用者帳戶設定為 `REQUIRE SSL`，如果無法建立安全連線，連線嘗試將會失敗。

若要強制加密現有 MySQL 資料庫使用者帳戶，可使用 `ALTER USER` 命令。語法依據 MySQL 版本而異，如下表所示。如需詳細資訊，請參閱《*MySQL 參考手冊*》中的 [ALTER USER](https://dev.mysql.com/doc/refman/8.0/en/alter-user.html)。


| MySQL 5.7、MySQL 8.0 | MySQL 5.6 | 
| --- | --- | 
|  `ALTER USER 'user'@'%' REQUIRE SSL;`  |  `GRANT USAGE ON *.* to 'user'@'%' REQUIRE SSL;`  | 

如需 `mysql_fdw` 擴充功能的詳細資訊，請參閱 [mysql\$1fdw](https://github.com/EnterpriseDB/mysql_fdw) 文件。