

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

# 將資料匯入 Amazon RDS 上的 PostgreSQL
<a name="PostgreSQL.Procedural.Importing"></a>

假設有要移動到 Amazon RDS 的現有 PostgreSQL 部署。任務的複雜性取決於資料庫大小以及要傳輸的資料庫物件類型。例如，假設一個資料庫包含大約數 GB 的資料集，以及預存程序和觸發條件。此類資料庫會比僅含少量 GB 測試資料且沒有觸發條件或預存程序的簡單資料庫更複雜。

在下列情況中，建議您使用原生 PostgreSQL 資料庫遷移工具：
+ 您準備進行同質遷移，亦即遷移的來源資料庫使用與目標資料庫相同的資料庫引擎。
+ 您想要遷移整個資料庫。
+ 原生工具可讓您以最短的停機時間來遷移系統。

在大多數其他情況下，使用 AWS Database Migration Service (AWS DMS) 執行資料庫遷移是最佳方法。 AWS DMS 可以在不停機的情況下遷移資料庫，而且對於許多資料庫引擎而言，會持續複寫，直到您準備好切換到目標資料庫為止。您可以使用 DMS AWS 遷移至相同的資料庫引擎或不同的資料庫引擎。如果您要遷移至與來源資料庫不同的資料庫引擎，您可以使用 AWS Schema Conversion Tool (AWS SCT)。您可以使用 AWS SCT 來遷移未由 遷移的結構描述物件 AWS DMS。如需 AWS DMS 的詳細資訊，請參閱[什麼是 AWS Database Migration Service？](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)

*僅針對您的匯入*，修改資料庫參數群組來包含下列設定。您應該測試參數設定，以根據資料庫執行個體大小找出最有效率的設定。匯入完成之後，您也需要將這些參數回復為生產值。

將資料庫執行個體設定修改為下列：
+ 停用資料庫執行個體備份 (將 backup\$1retention 設為 0)。
+ 停用多個可用區。

修改資料庫參數群組來包含下列設定。您應該僅在匯入資料時才使用這些設定。您應該測試參數設定，以根據資料庫執行個體大小找出最有效率的設定。匯入完成之後，您也需要將這些參數回復為生產值。


| 參數 | 匯入時的建議值 | 描述 | 
| --- | --- | --- | 
|  `maintenance_work_mem`  |  524288、1048576、2097152 或 4194304 (KB)。這些設定相當於 512 MB、1 GB、2 GB 和 4 GB。  |  此設定的值取決於主機大小。CREATE INDEX 陳述式期間會使用此參數，每個平行命令皆可使用這麼多的記憶體。計算最佳值，以免將此值設得太高而耗盡記憶體。  | 
|  `max_wal_size`  |  256 (適用於 9.6 版)、4096 (適用於 10 版及更新版本)  |  將尺寸提高至最大，讓 WAL 能在自動檢查點期間成長。增加此參數可增加損毀復原所需的時間。此參數會將 `checkpoint_segments` 取代為 PostgreSQL 9.6 及更新版本。 若為 PostgreSQL 9.6 版，此數值是以 16 MB 為單位。若為更新的版本，該數值是以 1 MB 為單位。例如，在 9.6 版中，128 表示 128 個達到 16 MB 的區塊。在 12.4 版中，2048 表示 2048 個尺寸各為 1 MB 的區塊。  | 
|  `checkpoint_timeout`  |  1800  |  此設定的值可減少 WAL 輪換次數。  | 
|  `synchronous_commit`  |  關閉  |  停用此設定可加速寫入。關閉此參數會在伺服器當機時增加資料遺失的風險 (請勿關閉 FSYNC)。  | 
|  `wal_buffers`  |   8192  |  此值以 8 KB 為單位。這同樣可加速產生 WAL  | 
|  `autovacuum`  |  0  |  載入資料時停用 PostgreSQL 自動清理參數，以免浪費資源  | 

使用 `pg_dump -Fc` (壓縮) 或 `pg_restore -j` (平行) 命令搭配這些設定。

**注意**  
PostgreSQL 命令 `pg_dumpall` 需要 super\$1user 許可，但建立資料庫執行個體時並未授予此許可，因此無法用來匯入資料。

**Topics**
+ [從 Amazon EC2 執行個體匯入 PostgreSQL 資料庫](PostgreSQL.Procedural.Importing.EC2.md)
+ [使用 \$1copy 命令將資料匯入 PostgreSQL 資料庫執行個體上的資料表](PostgreSQL.Procedural.Importing.Copy.md)
+ [將資料從 Amazon S3 匯入 RDS for PostgreSQL 資料庫執行個體](USER_PostgreSQL.S3Import.md)
+ [在 與資料庫執行個體之間傳輸 PostgreSQL 資料庫](PostgreSQL.TransportableDB.md)

# 從 Amazon EC2 執行個體匯入 PostgreSQL 資料庫
<a name="PostgreSQL.Procedural.Importing.EC2"></a>

如果您在 Amazon EC2 執行個體上的 PostgreSQL 伺服器中有資料，且想要將資料移至 PostgreSQL 資料庫執行個體，您可以依照下列程序來遷移資料。

1. 使用 pg\$1dump 建立檔案，其中包含要載入的資料

1. 建立目標資料庫執行個體

1. 使用 *psql* 在資料庫執行個體上建立資料庫並載入資料

1. 建立資料庫執行個體的資料庫快照

以下幾節提供上述各個步驟的詳細資訊。

## 步驟 1：使用 pg\$1dump 建立檔案，其中包含要載入的資料
<a name="PostgreSQL.Procedural.Importing.EC2.Step1"></a>

`pg_dump` 公用程式會使用 COPY 命令建立 PostgreSQL 資料庫的結構描述和資料傾印。`pg_dump` 產生的傾印指令碼會將資料載入相同名稱的資料庫中，並重新建立資料表、索引和外部索引鍵。您可以使用 `pg_restore` 命令和 `-d` 參數將資料還原至不同名稱的資料庫。

建立資料傾印之前，您應該查詢要傾印的資料表來取得資料列計數，以確認目標資料庫執行個體上的計數。

 下列命令為資料庫 mydb2 建立名為 mydb2dump.sql 的傾印檔案。

```
prompt>pg_dump dbname=mydb2 -f mydb2dump.sql 
```

## 步驟 2：建立目標資料庫執行個體
<a name="PostgreSQL.Procedural.Importing.EC2.Step2"></a>

您可以使用 Amazon RDS 主控台、 AWS CLI或 API 來建立目標 PostgreSQL 資料庫執行個體。建立將備份保留期設為 0 的執行個體，並停用多個可用區。這麼做可以加速匯入資料。您必須先在執行個體上建立資料庫，才能傾印資料。此資料庫與包含傾印資料的資料庫可以具有相同名稱。或者，您可以建立不同名稱的資料庫。在此情況下，您可以使用 `pg_restore` 命令和 `-d` 參數將資料還原至新命名的資料庫。

例如，下列命令可用來傾印、還原和重新命名資料庫。

```
pg_dump -Fc -v -h [endpoint of instance] -U [master username] [database] > [database].dump
createdb [new database name]
pg_restore -v -h [endpoint of instance] -U [master username] -d [new database name] [database].dump
```

## 步驟 3：使用 psql 在資料庫執行個體上建立資料庫並載入資料
<a name="PostgreSQL.Procedural.Importing.EC2.Step3"></a>

您可以使用原本用來執行 pg\$1dump 命令的相同連線，以連線至目標資料庫執行個體並重新建立資料庫。透過 *psql*，您可以使用主要使用者名稱和主要密碼在資料庫執行個體上建立資料庫

下列範例使用 *psql* 和名為 mydb2dump.sql 的傾印檔案，在稱為 mypginstance 的 PostgreSQL 資料庫執行個體上建立名為 mydb2 的資料庫：

針對 Linux、macOS 或 Unix：

```
psql \
   -f mydb2dump.sql \
   --host mypginstance.555555555555.aws-region.rds.amazonaws.com \
   --port 8199 \
   --username myawsuser \
   --password password \
   --dbname mydb2
```

在 Windows 中：

```
psql ^
   -f mydb2dump.sql ^
   --host mypginstance.555555555555.aws-region.rds.amazonaws.com ^
   --port 8199 ^
   --username myawsuser ^
   --password password ^
   --dbname mydb2
```

**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

## 步驟 4：建立資料庫執行個體的資料庫快照
<a name="PostgreSQL.Procedural.Importing.EC2.Step4"></a>

在確認資料已載入至資料庫執行個體後，建議您建立目標 PostgreSQL 資料庫執行個體的資料庫快照。資料庫快照是您資料庫執行個體的完整備份，可將您的資料庫執行個體還原至已知狀態。若能在載入後立即拍攝資料庫快照，萬一發生事故，就不必重新載入資料。您也可使用快照植入新的資料庫執行個體。如需有關建立資料庫快照的資訊，請參閱[為 Amazon RDS 的單一可用區域資料庫執行個體建立資料庫快照](USER_CreateSnapshot.md)。

# 使用 \$1copy 命令將資料匯入 PostgreSQL 資料庫執行個體上的資料表
<a name="PostgreSQL.Procedural.Importing.Copy"></a>

PostgreSQL `\copy` 命令是中繼命令，可從 `psql` 互動式用戶端工具使用。您可以使用 `\copy` 將資料匯入至 RDS for PostgreSQL 資料庫執行個體上的資料表。若要使用 `\copy` 命令，首先需在目標資料庫執行個體上建立資料表結構，讓 `\copy` 具有複製資料的目的地。

您可以使用 `\copy` 從逗點分隔值 (CSV) 檔案 (例如已匯出並儲存到用戶端工作站的檔案) 載入資料。

若要將 CSV 資料匯入至目標 RDS for PostgreSQL 資料庫執行個體，需先使用 `psql` 連線至目標資料庫執行個體。

```
psql --host=db-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=target-db
```

然後執行 `\copy` 命令搭配下列參數，以識別資料的目標及其格式。
+ `target_table` – 應接收從 CSV 檔案所複製資料的資料表之名稱。
+ `column_list` – 資料表的資料欄規格。
+ `'filename'` – 您本機工作站上 CSV 檔案的完整路徑。

```
 \copy target_table from '/path/to/local/filename.csv' WITH DELIMITER ',' CSV;
```

如果 CSV 檔案包含資料欄標題資訊，您可以使用此版本的命令和參數。

```
\copy target_table (column-1, column-2, column-3, ...)
    from '/path/to/local/filename.csv' WITH DELIMITER ',' CSV HEADER;
```

 如果 `\copy` 命令失敗，PostgreSQL 會輸出錯誤訊息。

使用 `\copy` 中繼命令，在資料庫預覽環境中使用 `psql` 命令建立新的資料庫執行個體，如下列範例所示。此範例使用 *source-table* 做為來源資料表名稱、*source-table.csv* 做為 .csv 檔案，而 *target-db* 做為目標資料庫：

針對 Linux、macOS 或 Unix：

```
$psql target-db \
    -U <admin user> \
    -p <port> \
    -h <DB instance name> \
    -c "\copy source-table from 'source-table.csv' with DELIMITER ','"
```

在 Windows 中：

```
$psql target-db ^
    -U <admin user> ^
    -p <port> ^
    -h <DB instance name> ^
    -c "\copy source-table from 'source-table.csv' with DELIMITER ','"
```

如需有關 `\copy` 命令的完整詳細資訊，請參閱 PostgreSQL說明文件裡*中繼命令*中區段的 [psql](http://www.postgresql.org/docs/current/static/app-psql.html) 頁面。

# 將資料從 Amazon S3 匯入 RDS for PostgreSQL 資料庫執行個體
<a name="USER_PostgreSQL.S3Import"></a>

您可以將使用 Amazon Simple Storage Service 儲存的資料匯入 RDS for PostgreSQL 資料庫執行個體。要執行此操作，您首先安裝 RDS for PostgreSQL `aws_s3` 擴充功能。此擴充功能提供可用於從 Amazon S3 儲存貯體匯入資料的函數。*儲存貯體*是物件或檔案的 Amazon S3 容器。資料可以是逗號分隔值 (CSV) 檔案、文字檔案或壓縮 (gzip) 檔案。從下文中，您可以了解如何安裝擴充功能，以及如何將資料從 Amazon S3 匯入資料表。

您的資料庫必須執行 PostgreSQL 10.7 版或更高版本，才能從 Simple Storage Service (Amazon S3) 匯入 RDS for PostgreSQL。

如果您沒有資料儲存於 Amazon S3 上，您需要先建立儲存貯體並儲存資料。如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的下列主題：
+ [建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#creating-bucket)
+ [將物件新增到儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#uploading-an-object-bucket) 

支援從 Amazon S3 匯入跨帳戶。如需更多詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[授予跨帳戶許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

從 S3 匯入資料時，您可以使用客戶受管金鑰進行加密。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [儲存在 AWS KMS 中的 KMS 金鑰](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

**Topics**
+ [安裝 aws\$1s3 擴充功能](USER_PostgreSQL.S3Import.InstallExtension.md)
+ [從 Amazon S3 資料匯入資料的概觀](USER_PostgreSQL.S3Import.Overview.md)
+ [設定對 Amazon S3 儲存貯體的存取權](USER_PostgreSQL.S3Import.AccessPermission.md)
+ [將資料從 Amazon S3 匯入 RDS for PostgreSQL 資料庫執行個體](USER_PostgreSQL.S3Import.FileFormats.md)
+ [函數參考](USER_PostgreSQL.S3Import.Reference.md)

# 安裝 aws\$1s3 擴充功能
<a name="USER_PostgreSQL.S3Import.InstallExtension"></a>

您需要先安裝 `aws_s3` 擴充功能，才能將 Amazon S3 與 RDS for PostgreSQL 資料庫執行個體搭配使用。此擴充功能提供從 Amazon S3 匯入資料的函數。它還提供了從 RDS for PostgreSQL 資料庫執行個體中匯出資料到 Amazon S3 儲存貯體的功能。如需更多詳細資訊，請參閱 [將資料從 RDS for PostgreSQL 資料庫執行個體匯出至 Amazon S3](postgresql-s3-export.md)。`aws_s3` 擴充功能取決於 `aws_commons` 擴充功能中的一些輔助函數，需要時會自動安裝。

**安裝 `aws_s3` 擴充功能**

1. 使用 psql (或 pgAdmin) 以具有 `rds_superuser` 權限的使用者身分連接到 RDS for PostgreSQL 資料庫執行個體。若您在安裝程序期間保留預設名稱，則連接為 `postgres`。

   ```
   psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. 若要安裝擴充功能，請執行下列命令。

   ```
   postgres=> CREATE EXTENSION aws_s3 CASCADE;
   NOTICE: installing required extension "aws_commons"
   CREATE EXTENSION
   ```

1. 若要驗證是否已經安裝擴充功能，可以使用 psql `\dx` 中繼命令。

   ```
   postgres=> \dx
          List of installed extensions
       Name     | Version |   Schema   |                 Description
   -------------+---------+------------+---------------------------------------------
    aws_commons | 1.2     | public     | Common data types across AWS services
    aws_s3      | 1.1     | public     | AWS S3 extension for importing data from S3
    plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
   (3 rows)
   ```

現在可以使用從 Amazon S3 匯入和匯出資料的功能。

# 從 Amazon S3 資料匯入資料的概觀
<a name="USER_PostgreSQL.S3Import.Overview"></a>

**將 S3 資料匯入 Amazon RDS**

首先，收集您需要提供給函數的詳細資訊。其中包括 RDS for PostgreSQL 資料庫執行個體，以及儲存貯體名稱、檔案路徑、檔案類型，以及 Amazon S3 資料的存放 AWS 區域 位置。如需詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[檢視物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/OpeningAnObject.html)。
**注意**  
目前不支援從 Amazon S3 匯入多重部分資料。

1. 取得 `aws_s3.table_import_from_s3` 函數要匯入資料的資料表名稱。舉例來說，下列命令建立的資料表 `t1`，可用於之後的步驟中。

   ```
   postgres=> CREATE TABLE t1 
       (col1 varchar(80), 
       col2 varchar(80), 
       col3 varchar(80));
   ```

1. 取得 Amazon S3 儲存貯體以及要匯入資料的詳細資料。要執行此操作，請在以下網址開啟 Amazon S3 主控台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)，然後選擇 **Buckets** (儲存貯體)。在清單中尋找包含您資料的儲存貯體。選擇儲存貯體，開啟其物件概觀頁面，然後選擇 Properties (屬性)。

   請記下儲存貯體名稱、路徑 AWS 區域、 和 檔案類型。您稍後需要 Amazon Resource Name (ARN)，以設定透過 IAM 角色對 Amazon S3 的存取權限。如需詳細資訊，請參閱 [設定對 Amazon S3 儲存貯體的存取權](USER_PostgreSQL.S3Import.AccessPermission.md)。下圖顯示範例。  
![\[Amazon S3 儲存貯體中檔案物件的影像。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/aws_s3_import-export_s3_bucket-info.png)

1. 您可以使用 AWS CLI 命令 來驗證 Amazon S3 儲存貯體上資料的路徑`aws s3 cp`。如果資訊正確，此命令會下載 Amazon S3 檔案的副本。

   ```
   aws s3 cp s3://amzn-s3-demo-bucket/sample_file_path ./ 
   ```

1. 設定 RDS for PostgreSQL 資料庫執行個體的許可，以允許存取 Amazon S3 儲存貯體上的檔案。若要這樣做，您可以使用 AWS Identity and Access Management (IAM) 角色或安全登入資料。如需詳細資訊，請參閱[設定對 Amazon S3 儲存貯體的存取權](USER_PostgreSQL.S3Import.AccessPermission.md)。

1. 將收集到的路徑和其他 Amazon S3 物件詳細資訊 (請參閱步驟 2) 提供給 `create_s3_uri` 函數，以建構 Amazon S3 URI 物件。若要進一步了解此函數，請參閱 [aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri)。以下是在 psql 工作階段中建構此物件的範例。

   ```
   postgres=> SELECT aws_commons.create_s3_uri(
      'docs-lab-store-for-rpg',
      'versions_and_jdks_listing.csv',
      'us-west-1'
   ) AS s3_uri \gset
   ```

   在下一個步驟中，您將此物件 (`aws_commons._s3_uri_1`) 傳遞到 `aws_s3.table_import_from_s3` 函數，將資料匯入資料表。

1. 調用 `aws_s3.table_import_from_s3` 函數，將資料從 Amazon S3 匯入資料表。如需參考資訊，請參閱 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)。如需範例，請參閱 [將資料從 Amazon S3 匯入 RDS for PostgreSQL 資料庫執行個體](USER_PostgreSQL.S3Import.FileFormats.md)。

# 設定對 Amazon S3 儲存貯體的存取權
<a name="USER_PostgreSQL.S3Import.AccessPermission"></a>

若要從 Amazon S3 檔案匯入資料，請為 RDS for PostgreSQL 資料庫執行個體提供許可，以便存取檔案所在的 Amazon S3 儲存貯體。您可以透過以下兩個方式中的一個提供存取給 Amazon S3 儲存貯體，如下列主題中所述。

**Topics**
+ [使用 IAM 角色存取 Amazon S3 儲存貯體](#USER_PostgreSQL.S3Import.ARNRole)
+ [使用安全登入資料存取 Amazon S3 儲存貯體](#USER_PostgreSQL.S3Import.Credentials)
+ [對 Amazon S3 的存取進行故障診斷](#USER_PostgreSQL.S3Import.troubleshooting)

## 使用 IAM 角色存取 Amazon S3 儲存貯體
<a name="USER_PostgreSQL.S3Import.ARNRole"></a>

在您由 Amazon S3 檔案載入資料之前，請為 RDS for PostgreSQL 資料庫執行個體提供許可，以便存取檔案所在的 Amazon S3 儲存貯體。這樣您就不必管理額外的登入資料資訊或在 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函數呼叫中提供它。

若要執行此動作，請建立可提供 Amazon S3 儲存貯體存取的 IAM 政策。建立 IAM 角色，並將政策連接到該角色。然後將 IAM 角色指派到您的資料庫執行個體。

**透過 IAM 角色將 RDS for PostgreSQL 資料庫執行個體的存取權授予 Amazon S3**

1. 建立 IAM 政策。

   此政策可提供儲存貯體及物件許可，讓 RDS for PostgreSQL 資料庫執行個體能夠存取 Amazon S3。

   在政策中納入下列必要動作，以允許由 Amazon S3 儲存貯體傳輸檔案至 Amazon RDS：
   + `s3:GetObject` 
   + `s3:ListBucket` 

   在政策中包含下列資源，以識別 Amazon S3 儲存貯體和儲存貯體中的物件。這會顯示用於存取 Amazon S3 的 Amazon Resource Name (ARN) 格式。
   + arn:aws:s3:::*amzn-s3-demo-bucket*
   + arn:aws:s3:::*amzn-s3-demo-bucket*/\$1

   如需建立 Amazon RDS for PostgreSQL IAM 政策的詳細資訊，請參閱 [建立並使用 IAM 政策進行 IAM 資料庫存取](UsingWithRDS.IAMDBAuth.IAMPolicy.md)。另請參閱《*IAM 使用者指南*》中的[教學：建立和連接您的第一個客戶受管原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)。

   下列 AWS CLI 命令會使用這些選項建立名為 `rds-s3-import-policy`的 IAM 政策。其將存取權授予名為 *amzn-s3-demo-bucket* 的儲存貯體。
**注意**  
請記下此命令所傳回政策的 Amazon Resource Name (ARN)。在後續步驟中將政策連接至 IAM 角色時，您會需要此 ARN。  
**Example**  

   針對 Linux、macOS 或 Unix：

   ```
   aws iam create-policy \
      --policy-name rds-s3-import-policy \
      --policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "s3import",
            "Action": [
              "s3:GetObject",
              "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-bucket", 
              "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ] 
          }
        ] 
      }'
   ```

   在 Windows 中：

   ```
   aws iam create-policy ^
      --policy-name rds-s3-import-policy ^
      --policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "s3import",
            "Action": [
              "s3:GetObject",
              "s3:ListBucket"
            ], 
            "Effect": "Allow",
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-bucket", 
              "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ] 
          }
        ] 
      }'
   ```

1. 建立 IAM 角色。

   這麼做是為了讓 Amazon RDS 擔任此 IAM 角色，以存取您的 Amazon S3 儲存貯體。如需詳細資訊，請參閱《IAM 使用者指南》**中的[建立角色以將許可委派給 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

   建議您在資源型政策中使用 `[aws:SourceArn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)` 和 `[aws:SourceAccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)` 全域條件內容金鑰，將服務的許可限定於特定資源。這是防止[混淆代理人問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方式。

   如果同時使用這兩個全域條件內容索引鍵，且 `aws:SourceArn` 值包含帳戶 ID，則在相同政策陳述式中使用 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的帳戶時，必須使用相同的帳戶 ID。
   + 如果您想要跨服務存取單一資源，請使用 `aws:SourceArn`。
   + 如果您想要允許該帳戶中的任何資源與跨服務使用相關聯，請使用 `aws:SourceAccount`。

   在政策中，請務必搭配資源的完整 ARN 來使用 `aws:SourceArn` 全域條件內容金鑰。下列範例示範如何使用 AWS CLI 命令來建立名為 的角色`rds-s3-import-role`。  
**Example**  

   針對 Linux、macOS 或 Unix：

   ```
   aws iam create-role \
      --role-name rds-s3-import-role \
      --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                   "aws:SourceAccount": "111122223333",
                   "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname"
                   }
                }
          }
        ] 
      }'
   ```

   在 Windows 中：

   ```
   aws iam create-role ^
      --role-name rds-s3-import-role ^
      --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                   "aws:SourceAccount": "111122223333",
                   "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname"
                   }
                }
          }
        ] 
      }'
   ```

1. 將您建立的 IAM 政策附加至您建立的 IAM 角色。

   下列 AWS CLI 命令會將上一個步驟中建立的政策連接至名為 `rds-s3-import-role` Replace `your-policy-arn` with the policy ARN 的角色，該角色是您在先前步驟中記下的政策 ARN。  
**Example**  

   針對 Linux、macOS 或 Unix：

   ```
   aws iam attach-role-policy \
      --policy-arn your-policy-arn \
      --role-name rds-s3-import-role
   ```

   在 Windows 中：

   ```
   aws iam attach-role-policy ^
      --policy-arn your-policy-arn ^
      --role-name rds-s3-import-role
   ```

1. 將 IAM 角色新增至資料庫執行個體。

   您可以使用 AWS 管理主控台 或 來執行此操作 AWS CLI，如下所述。

### 主控台
<a name="collapsible-section-1"></a>

**使用主控台為 PostgreSQL 資料庫執行個體新增 IAM 角色**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)：// 開啟 Amazon RDS 主控台。

1. 選擇 PostgreSQL 資料庫執行個體名稱以顯示其詳細資訊。

1. 在 **Connectivity & security (連線能力與安全)** 標籤上，在 **Manage IAM roles (管理 IAM 角色)** 區段中，在 **Add IAM roles to this instance (將 IAM 角色新增到此叢集執行個體)** 下方，選擇要新增的角色。

1. 請在 **Feature** (功能) 下，選擇 **s3Import**。

1. 選擇 **Add role (新增角色)**。

### AWS CLI
<a name="collapsible-section-2"></a>

**使用 CLI 為 PostgreSQL 資料庫執行個體新增 IAM 角色**
+ 使用下列命令將角色新增至名為 `my-db-instance` 的 PostgreSQL 資料庫執行個體。將 *`your-role-arn`* 替換為您前個步驟記下的角色 ARN。使用 `s3Import` 作為 `--feature-name` 選項的值。  
**Example**  

  針對 Linux、macOS 或 Unix：

  ```
  aws rds add-role-to-db-instance \
     --db-instance-identifier my-db-instance \
     --feature-name s3Import \
     --role-arn your-role-arn   \
     --region your-region
  ```

  在 Windows 中：

  ```
  aws rds add-role-to-db-instance ^
     --db-instance-identifier my-db-instance ^
     --feature-name s3Import ^
     --role-arn your-role-arn ^
     --region your-region
  ```

### RDS API
<a name="collapsible-section-3"></a>

若要使用 Amazon RDS API 為 PostgreSQL 資料庫執行個體新增 IAM 角色，請呼叫 [AddRoleToDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AddRoleToDBInstance.html) 操作。

## 使用安全登入資料存取 Amazon S3 儲存貯體
<a name="USER_PostgreSQL.S3Import.Credentials"></a>

如果想要，可以使用安全登入資料來提供 Amazon S3 儲存貯體的存取，而非使用 IAM 角色提供存取。要執行此操作，您可以指定 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函數呼叫中的 `credentials` 參數。

`credentials` 參數是類型 的結構`aws_commons._aws_credentials_1`，其中包含 AWS 登入資料。請使用 [aws\$1commons.create\$1aws\$1credentials](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_aws_credentials) 函數在 `aws_commons._aws_credentials_1` 結構設定存取金鑰及秘密金鑰，如下所示。

```
postgres=> SELECT aws_commons.create_aws_credentials(
   'sample_access_key', 'sample_secret_key', '')
AS creds \gset
```

建立 `aws_commons._aws_credentials_1 ` 結構之後，請使用 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函數搭配 `credentials` 參數來匯入資料，如下所示。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't', '', '(format csv)',
   :'s3_uri', 
   :'creds'
);
```

或是您可在 [aws\$1commons.create\$1aws\$1credentials](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_aws_credentials) 函數呼叫之中內嵌 `aws_s3.table_import_from_s3` 函數呼叫。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't', '', '(format csv)',
   :'s3_uri', 
   aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);
```

## 對 Amazon S3 的存取進行故障診斷
<a name="USER_PostgreSQL.S3Import.troubleshooting"></a>

如果您在嘗試從 Amazon S3 匯入資料時遇到問題，請參閱下文以取得建議：
+ [對 Amazon RDS 身分與存取進行故障診斷](security_iam_troubleshoot.md)
+ 《*Amazon Simple Storage Service 使用者指南*》中的[針對 Amazon S3 進行故障診斷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshooting.html)。
+ 《*IAM 使用者指南*》中的[針對 Amazon S3 和 IAM 進行故障診斷](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-s3.html)

# 將資料從 Amazon S3 匯入 RDS for PostgreSQL 資料庫執行個體
<a name="USER_PostgreSQL.S3Import.FileFormats"></a>

您可以使用 aws\$1s3 擴充功能的 `table_import_from_s3` 函數，由 Amazon S3 儲存貯體匯入資料。如需參考資訊，請參閱 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)。

**注意**  
下列範例使用 IAM 角色方法，允許對 Amazon S3 儲存貯體的存取。因此，`aws_s3.table_import_from_s3` 函數呼叫不包含登入資料參數。

以下顯示一個典型範例。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't1',
   '', 
   '(format csv)',
   :'s3_uri'
);
```

參數如下：
+ `t1` – PostgreSQL 資料庫執行個體的表格名稱，資料會複製到此表格。
+ `''` – 資料庫表格之中選用的欄清單。您可使用此參數指出哪些 S3 資料欄要置於哪些表格欄。如果沒有指定欄，所有欄都會複製到表格中。如需使用欄清單的範例，請參閱 [匯入使用自訂分隔符號的 Amazon S3 檔案](#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)。
+ `(format csv)` – PostgreSQL COPY 引數。複製程序使用 [PostgreSQL COPY](https://www.postgresql.org/docs/current/sql-copy.html) 命令的引數及格式匯入資料。格式的選擇包括逗號分隔值 (CSV)、文字和二進位。預設為文字。
+  `s3_uri` – 包含識別 Amazon S3 檔案資訊的結構。如需使用 [aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri) 函數來建立 `s3_uri` 結構的範例，請參閱 [從 Amazon S3 資料匯入資料的概觀](USER_PostgreSQL.S3Import.Overview.md)。

如需此函數狀態的詳細資訊，請參閱 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)。

`aws_s3.table_import_from_s3` 函數傳回文字。若要指定從 Amazon S3 儲存貯體匯入的其他檔案類型，請參閱下列其中一個範例。

**注意**  
匯入 0 位元組檔案將導致錯誤。

**Topics**
+ [匯入使用自訂分隔符號的 Amazon S3 檔案](#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)
+ [匯入 Amazon S3 壓縮 (gzip) 檔案](#USER_PostgreSQL.S3Import.FileFormats.gzip)
+ [匯入編碼的 Amazon S3 檔案](#USER_PostgreSQL.S3Import.FileFormats.Encoded)

## 匯入使用自訂分隔符號的 Amazon S3 檔案
<a name="USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter"></a>

下列範例顯示如何匯入使用自訂分隔符號的檔案。其中也顯示如何使用 `column_list` 函數的 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 參數，控制資料放置於資料庫表格的位置。

我們在此範例假設下列資訊整理至 Amazon S3 檔案之中的縱線分隔欄。

```
1|foo1|bar1|elephant1
2|foo2|bar2|elephant2
3|foo3|bar3|elephant3
4|foo4|bar4|elephant4
...
```

**匯入使用自訂分隔符號的檔案**

1. 在資料庫為匯入資料建立表格。

   ```
   postgres=> CREATE TABLE test (a text, b text, c text, d text, e text);
   ```

1. 使用以下的 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函數格式由 Amazon S3 檔案匯入資料。

   您可在 [aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri) 函數呼叫之中內嵌 `aws_s3.table_import_from_s3` 函數呼叫以指定檔案。

   ```
   postgres=> SELECT aws_s3.table_import_from_s3(
      'test',
      'a,b,d,e',
      'DELIMITER ''|''', 
      aws_commons.create_s3_uri('amzn-s3-demo-bucket', 'pipeDelimitedSampleFile', 'us-east-2')
   );
   ```

資料目前位於下列欄的表格中。

```
postgres=> SELECT * FROM test;
a | b | c | d | e 
---+------+---+---+------+-----------
1 | foo1 | | bar1 | elephant1
2 | foo2 | | bar2 | elephant2
3 | foo3 | | bar3 | elephant3
4 | foo4 | | bar4 | elephant4
```

## 匯入 Amazon S3 壓縮 (gzip) 檔案
<a name="USER_PostgreSQL.S3Import.FileFormats.gzip"></a>

下列範例顯示如何由以 gzip 壓縮的 Amazon S3 匯入檔案。匯入的檔案需具有以下 Amazon S3 中繼資料：
+ 索引鍵：`Content-Encoding`
+ 值：`gzip`

如果您使用 上傳檔案 AWS 管理主控台，系統通常會套用中繼資料。如需有關使用 AWS 管理主控台、 AWS CLI或 API 將檔案上傳至 Amazon S3 的資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[上傳物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

如需 Amazon S3 中繼資料的詳細資訊以及系統所提供中繼資料的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[在 Amazon S3 主控台中編輯物件中繼資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-object-metadata.html)。

請依據以下所示內容，將 gzip 檔案匯入 RDS for PostgreSQL 資料庫執行個體。

```
postgres=> CREATE TABLE test_gzip(id int, a text, b text, c text, d text);
postgres=> SELECT aws_s3.table_import_from_s3(
 'test_gzip', '', '(format csv)',
 'amzn-s3-demo-bucket', 'test-data.gz', 'us-east-2'
);
```

## 匯入編碼的 Amazon S3 檔案
<a name="USER_PostgreSQL.S3Import.FileFormats.Encoded"></a>

下列範例顯示如何由採用 Windows-1252 編碼的 Amazon S3 匯入檔案。

```
postgres=> SELECT aws_s3.table_import_from_s3(
 'test_table', '', 'encoding ''WIN1252''',
 aws_commons.create_s3_uri('amzn-s3-demo-bucket', 'SampleFile', 'us-east-2')
);
```

# 函數參考
<a name="USER_PostgreSQL.S3Import.Reference"></a>

**Topics**
+ [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3)
+ [aws\$1commons.create\$1s3\$1uri](#USER_PostgreSQL.S3Import.create_s3_uri)
+ [aws\$1commons.create\$1aws\$1credentials](#USER_PostgreSQL.S3Import.create_aws_credentials)

## aws\$1s3.table\$1import\$1from\$1s3
<a name="aws_s3.table_import_from_s3"></a>

將 Amazon S3 資料匯入 Amazon RDS 表。`aws_s3` 擴充功能提供 `aws_s3.table_import_from_s3` 函數。傳回值為文字。

### 語法
<a name="aws_s3.table_import_from_s3-syntax"></a>

必要的參數為 `table_name`、`column_list` 及 `options`。這些參數可識別資料庫表格，並指定資料要如何複製到表格中。

您也可以使用下列參數：
+ `s3_info` 參數指定要匯入的 Amazon S3 檔案。您使用此參數時，IAM 角色會將 Amazon S3 存取權提供給 PostgreSQL 資料庫執行個體。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     s3_info aws_commons._s3_uri_1
  )
  ```
+ `credentials` 參數指定登入資料以存取 Amazon S3。您使用此項參數時，不必使用 IAM 角色。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     s3_info aws_commons._s3_uri_1,
     credentials aws_commons._aws_credentials_1
  )
  ```

### Parameters
<a name="aws_s3.table_import_from_s3-parameters"></a>

 *table\$1name*   
必要的文字字串，其中含有要匯入資料的 PostgreSQL 資料庫表格名稱。

 *column\$1list*   
必要的文字字串，其中含有要複製資料的 PostgreSQL 資料庫表格欄選用清單。如果字串為空白，就會使用表格的所有欄。如需範例，請參閱 [匯入使用自訂分隔符號的 Amazon S3 檔案](USER_PostgreSQL.S3Import.FileFormats.md#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)。

 *options*   
必要的文字字串，含有 PostgreSQL `COPY` 命令引數。這些引數指定資料要如何複製到 PostgreSQL 表格中。詳細資訊請參閱 [PostgreSQL COPY 文件](https://www.postgresql.org/docs/current/sql-copy.html)。

 *s3\$1info*   
`aws_commons._s3_uri_1` 複合類型，含有下列 S3 物件相關資訊：  
+ `bucket` – 含有檔案的 Amazon S3 儲存貯體名稱。
+ `file_path` – 包括檔案路徑的 Amazon S3 檔案名稱。
+ `region` – 檔案所在的 AWS 區域。如需 AWS 區域名稱和相關值的清單，請參閱 [區域、可用區域和 Local Zones](Concepts.RegionsAndAvailabilityZones.md)。

 *登入資料*   
`aws_commons._aws_credentials_1` 複合類型，含有下列登入資料以用於匯入作業：  
+ 存取金鑰
+ 私密金鑰
+ 工作階段字符
如需建立 `aws_commons._aws_credentials_1` 複合結構的詳細資訊，請參閱 [aws\$1commons.create\$1aws\$1credentials](#USER_PostgreSQL.S3Import.create_aws_credentials)。

### 替代語法
<a name="aws_s3.table_import_from_s3-alternative-syntax"></a>

為了協助進行測試，您可使用一組更大的參數取代 `s3_info` 及 `credentials` 參數。以下是 `aws_s3.table_import_from_s3` 函數的額外語法變化：
+ 請不要使用 `s3_info` 參數識別 Amazon S3 檔案，而是使用 `bucket`、`file_path` 及 `region` 參數組合進行。使用這種形式的函數，Amazon S3 存取權會由 IAM 角色在 PostgreSQL 資料庫執行個體提供。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     bucket text, 
     file_path text, 
     region text 
  )
  ```
+ 請不要使用 `credentials` 參數識別 Amazon S3 存取，而是使用 `access_key`、`session_key` 及 `session_token` 參數組合進行。

  ```
  aws_s3.table_import_from_s3 (
     table_name text, 
     column_list text, 
     options text, 
     bucket text, 
     file_path text, 
     region text, 
     access_key text, 
     secret_key text, 
     session_token text 
  )
  ```

### 替代參數
<a name="aws_s3.table_import_from_s3-alternative-parameters"></a>

*bucket*  
文字字串，其中含有包含檔案的 Amazon S3 儲存貯體名稱。

*file\$1path*  
包含 Amazon S3 檔案名稱 (包括檔案路徑) 的文字字串。

*region*  
識別檔案 AWS 區域 位置的文字字串。如需 AWS 區域 名稱和相關值的清單，請參閱 [區域、可用區域和 Local Zones](Concepts.RegionsAndAvailabilityZones.md)。

*access\$1key*  
文字字串，其中含有用於匯入作業的存取金鑰。預設值為 NULL。

*secret\$1key*  
文字字串，其中含有用於匯入作業的秘密金鑰。預設值為 NULL。

*session\$1token*  
(選用) 文字字串，其中含有用於匯入作業的工作階段金鑰。預設值為 NULL。

## aws\$1commons.create\$1s3\$1uri
<a name="USER_PostgreSQL.S3Import.create_s3_uri"></a>

建立 `aws_commons._s3_uri_1` 結構以保留 Amazon S3 檔案資訊。使用 `aws_commons.create_s3_uri` 函數 `s3_info` 參數的 [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3) 函數結果。

### 語法
<a name="USER_PostgreSQL.S3Import.create_s3_uri-syntax"></a>

```
aws_commons.create_s3_uri(
   bucket text,
   file_path text,
   region text
)
```

### Parameters
<a name="USER_PostgreSQL.S3Import.create_s3_uri-parameters"></a>

*bucket*  
必要的文字字串，其中含有檔案的 Amazon S3 儲存貯體名稱。

*file\$1path*  
包含 Amazon S3 檔案名稱 (包括檔案路徑) 的必要文字字串。

*region*  
必要的文字字串 AWS 區域 ，其中包含 檔案所在的 。如需 AWS 區域 名稱和相關值的清單，請參閱 [區域、可用區域和 Local Zones](Concepts.RegionsAndAvailabilityZones.md)。

## aws\$1commons.create\$1aws\$1credentials
<a name="USER_PostgreSQL.S3Import.create_aws_credentials"></a>

在 `aws_commons._aws_credentials_1` 結構設定存取金鑰及秘密金鑰。使用 `aws_commons.create_aws_credentials` 函數 `credentials` 參數的 [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3) 函數結果。

### 語法
<a name="USER_PostgreSQL.S3Import.create_aws_credentials-syntax"></a>

```
aws_commons.create_aws_credentials(
   access_key text,
   secret_key text,
   session_token text
)
```

### Parameters
<a name="USER_PostgreSQL.S3Import.create_aws_credentials-parameters"></a>

*access\$1key*  
必要的文字字串，其中含有用於匯入 Amazon S3 檔案的存取金鑰。預設值為 NULL。

*secret\$1key*  
必要的文字字串，其中含有用於匯入 Amazon S3 檔案的秘密金鑰。預設值為 NULL。

*session\$1token*  
選用的文字字串，其中含有用於匯入 Amazon S3 檔案的工作階段字符。預設值為 NULL。如果您提供選用的 `session_token`，就可以使用臨時登入資料。

# 在 與資料庫執行個體之間傳輸 PostgreSQL 資料庫
<a name="PostgreSQL.TransportableDB"></a>

針對 Amazon RDS 使用 PostgreSQL 可傳輸資料庫，您可以在兩個資料庫執行個體之間移動 PostgreSQL 資料庫。這是在不同資料庫執行個體之間遷移大型資料庫的一種非常快速的方法。若要使用此方式，您的資料庫執行個體必須皆執行相同的 PostgreSQL 主要版本。

此功能要求您在來源資料庫執行個體和目的地資料庫執行個體上都安裝 `pg_transport` 擴充功能。`pg_transport` 擴充功能提供實體傳輸機制，使用最少的方式移動資料庫檔案。此機制移動資料的速度比傳統的傾印和載入程序更快，而且停機時間更短。

**注意**  
RDS for PostgreSQL 11.5 版和更高版本、RDS for PostgreSQL 10.10 版和更高版本中提供 PostgreSQL 可傳輸資料庫。

若要將 PostgreSQL 資料庫執行個體從一個 RDS for PostgreSQL 資料庫執行個體傳輸到另一個執行個體，請先設定來源和目的地執行個體，如 [ 設定用於傳輸的資料庫執行個體](PostgreSQL.TransportableDB.Setup.md) 中所述。然後，您可以使用 [ 傳輸 PostgreSQL 資料庫](PostgreSQL.TransportableDB.Transporting.md) 中描述的函數傳輸資料庫。

**Topics**
+ [資料庫傳輸期間發生的事](#PostgreSQL.TransportableDB.DuringTransport)
+ [使用 PostgreSQL 可傳輸資料庫的限制](#PostgreSQL.TransportableDB.Limits)
+ [設定傳輸 PostgreSQL 資料庫](PostgreSQL.TransportableDB.Setup.md)
+ [將 PostgreSQL 資料庫從來源傳輸至目的地](PostgreSQL.TransportableDB.Transporting.md)
+ [可傳輸資料庫函數參考](PostgreSQL.TransportableDB.transport.import_from_server.md)
+ [可傳輸資料庫參數參考](PostgreSQL.TransportableDB.Parameters.md)

## 資料庫傳輸期間發生的事
<a name="PostgreSQL.TransportableDB.DuringTransport"></a>

PostgreSQL 可傳輸資料庫功能使用提取模式將資料庫從來源匯入目的地資料庫執行個體。`transport.import_from_server` 功能在目的地資料庫執行個體上建立傳輸中資料庫。無法存取傳輸進行期間目的地資料庫執行個體上的傳輸中資料庫。

當傳輸開始時，所有目前來源資料庫上的工作階段皆會終止。任何其他不在來源資料庫執行個體上的資料庫，不會受到傳輸的影響。

來源資料庫會變成特定的唯讀模式。當進入此模式時，您可以連接來源資料庫且執行唯獨模式查詢。然而，會封鎖寫入啟用查詢和其他類型的命令。只有開始進行傳輸的特定來源資料庫會受到此限制的影響。

傳輸期間，您不能重新恢復目的地資料庫執行個體的還原時間點。這是因為傳輸並非交易，且不會使用 PostgreSQL 預寫紀錄來紀錄變更。如果目的地資料庫執行個體有啟用自動備份，會在傳輸完成後自動進行備份。還原時間點會在備份完成*後*可用。

如果傳輸失敗，`pg_transport` 擴充套件會試圖對來源和目的地資料庫執行個體重做所有變更。這包含移除目的地已經部分傳輸的資料庫。根據錯誤的類型，來源資料庫可能會持續拒絕寫入啟用查詢。若發生這種情況，請使用下列命令以允許寫入啟用查詢。

```
ALTER DATABASE db-name SET default_transaction_read_only = false;
```

## 使用 PostgreSQL 可傳輸資料庫的限制
<a name="PostgreSQL.TransportableDB.Limits"></a>

可傳輸的資料庫有以下限制：
+ **僅供讀取複本** – 您無法使用傳送僅供讀取複本或僅供讀取複本的上層執行個體資料庫。
+ **不支援的欄位類型** – 您無法在任何計畫使用此方法傳輸的資料庫表格中使用 `reg` 資料類型。這些類型取決於系統上目錄物件 ID (OIDs)，通常會在傳輸時變更。
+ **資料表空間** – 所有來源資料庫物件必須在預設 `pg_default` 資料表空間中。
+ **相容性** – 來源與目的地資料庫執行個體都必須執行相同的 PostgreSQL 主要版本。
+ **擴充功能**：來源資料庫執行個體只能安裝 `pg_transport`。
+ **角色和 ACL** – 來源資料庫的存取權和擁有者資訊，不會一併傳輸至目的地資料庫。所有資料庫物件會由傳輸目的地的使用者建立和擁有。
+ **並行傳輸**：如果工作者程序設定正確，單個資料庫執行個體最多可支援 32 個並行傳輸，包括匯入和匯出。
+ **僅限 RDS for PostgreSQL 資料庫執行個體**：僅 RDS for PostgreSQL 資料庫執行個體上支援 PostgreSQL 可傳輸資料庫。您無法將其與內部部署資料庫或在 Amazon EC2 上執行的資料庫搭配使用。

# 設定傳輸 PostgreSQL 資料庫
<a name="PostgreSQL.TransportableDB.Setup"></a>

開始之前，請確定 RDS for PostgreSQL 資料庫執行個體符合下列要求：
+ 來源與目的地的 RDS for PostgreSQL 資料庫執行個體都必須執行相同的 PostgreSQL 版本。
+ 目的地資料庫不能具有與要傳輸的來源資料庫名稱相同的資料庫。
+ 用於執行傳輸作業的帳戶在來源資料庫和目的地資料庫上均需要 `rds_superuser` 權限。
+ 來源資料庫執行個體的安全群組必須允許來自目的地資料庫執行個體的傳入存取。如果來源和目的地資料庫執行個體位於 VPC 中，則可能已經存在這種情況。如需安全群組的詳細資訊，請參閱[使用安全群組控制存取](Overview.RDSSecurityGroups.md)。

將資料庫從來源資料庫執行個體傳輸至目的地資料庫執行個體，需要對與每個執行個體相關聯的資料庫參數群組進行多次變更。這意味著您必須為來源資料庫執行個體建立自訂資料庫參數群組，並為目的地資料庫執行個體建立自訂資料庫參數群組。

**注意**  
如果您的資料庫執行個體已使用自訂資料庫參數群組進行設定，則可從下列程序中的步驟 2 開始。

**設定用於傳輸資料庫的自訂資料庫群組參數**

若要執行以下步驟，請使用具有 `rds_superuser` 權限的帳戶。

1. 如果來源和目的地資料庫執行個體使用預設的資料庫參數群組，則需要使用執行個體的適當版本來建立自訂資料庫參數群組。您可以執行此操作，以便變更數個參數的值。如需詳細資訊，請參閱 [Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

1. 在自訂資料庫參數群組中，變更下列參數的值：
   + `shared_preload_libraries`：將 `pg_transport` 新增至程式庫清單中。
   + `pg_transport.num_workers`：預設值為 3。根據資料庫的需要增加或減少此值。對於 200 GB 的資料庫，建議此值不大於 8。請記住，如果增加此參數的預設值，還應同時增加 `max_worker_processes` 的值。
   + `pg_transport.work_mem`：預設值為 128 MB 或 256 MB，具體取決於 PostgreSQL 版本。預設設定通常可保持不變。
   + `max_worker_processes` – 需要使用以下計算設定此參數值：

     ```
     (3 * pg_transport.num_workers) + 9
     ```

     目的地需要此值來處理傳輸中涉及的各種後台工作程序。如要進一步了解 `max_worker_processes,`，請參閱 PostgreSQL 文件中的[資源耗用](https://www.postgresql.org/docs/current/runtime-config-resource.html)。

   如需 `pg_transport` 參數的詳細資訊，請參閱 [可傳輸資料庫參數參考](PostgreSQL.TransportableDB.Parameters.md)。

1. 重新啟動來源 RDS for PostgreSQL 資料庫執行個體和目的地執行個體，以便讓參數的設定生效。

1. 連接至 RDS for PostgreSQL 來源資料庫執行個體。

   ```
   psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. 從資料庫執行個體的公有架構中移除無關的擴充功能。在實際傳輸操作期間僅允許 `pg_transport` 擴充功能。

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

   ```
   postgres=> CREATE EXTENSION pg_transport;
   CREATE EXTENSION
   ```

1. 連接至 RDS for PostgreSQL 目的地資料庫執行個體。刪除任何無關的擴充功能，然後安裝 `pg_transport` 擴充功能。

   ```
   postgres=> CREATE EXTENSION pg_transport;
   CREATE EXTENSION
   ```

# 將 PostgreSQL 資料庫從來源傳輸至目的地
<a name="PostgreSQL.TransportableDB.Transporting"></a>

在您完成 [設定傳輸 PostgreSQL 資料庫](PostgreSQL.TransportableDB.Setup.md) 中的描述程序，您可以開始進行傳輸。若要這麼做，請執行目的地資料庫執行個體上的 `transport.import_from_server` 功能。您可以在下列語法中找到函數參數。

```
SELECT transport.import_from_server( 
   'source-db-instance-endpoint', 
    source-db-instance-port, 
   'source-db-instance-user', 
   'source-user-password', 
   'source-database-name', 
   'destination-user-password', 
   false);
```

範例中顯示的 `false` 值告訴函數這並非試轉。若要測試傳輸設定，您可以在呼叫函數時為 `dry_run` 選項指定 `true`，如下所示：

```
postgres=> SELECT transport.import_from_server(
    'docs-lab-source-db.666666666666aws-region.rds.amazonaws.com', 5432,
    'postgres', '********', 'labdb', '******', true);
INFO:  Starting dry-run of import of database "labdb".
INFO:  Created connections to remote database        (took 0.03 seconds).
INFO:  Checked remote cluster compatibility          (took 0.05 seconds).
INFO:  Dry-run complete                         (took 0.08 seconds total).
 import_from_server
--------------------

(1 row)
```

輸出 INFO 行是因為 `pg_transport.timing` 參數設定為其預設值 `true`。在執行命令時將 `dry_run` 設定為 `false`，來源資料庫即會匯入目的地，如下所示：

```
INFO:  Starting import of database "labdb".
INFO:  Created connections to remote database        (took 0.02 seconds).
INFO:  Marked remote database as read only           (took 0.13 seconds).
INFO:  Checked remote cluster compatibility          (took 0.03 seconds).
INFO:  Signaled creation of PITR blackout window     (took 2.01 seconds).
INFO:  Applied remote database schema pre-data       (took 0.50 seconds).
INFO:  Created connections to local cluster          (took 0.01 seconds).
INFO:  Locked down destination database              (took 0.00 seconds).
INFO:  Completed transfer of database files          (took 0.24 seconds).
INFO:  Completed clean up                            (took 1.02 seconds).
INFO:  Physical transport complete              (took 3.97 seconds total).
import_from_server
--------------------
(1 row)
```

此功能需要提供資料庫使用者密碼。因此，我們建議您在傳輸完成之後變更您所使用的使用者密碼。或者，您可以使用 SQL 繫結變數建立暫時的使用者角色。使用暫時的角色進行傳輸，並在之後捨棄該角色。

如果傳輸失敗，您可能會看到類似以下內容的錯誤訊息：

```
pg_transport.num_workers=8 25% of files transported failed to download file data
```

"Failed to download file data" (下載檔案資料失敗) 錯誤訊息表示工作者程序的數量未正確設定為資料庫的大小。您可能需要增加或減少為 `pg_transport.num_workers` 設定的值。每次失敗都會報告完成的百分比，以便您可以查看變更的影響。例如，在一種情況下，將設定從 8 變更為 4 會導致以下結果：

```
pg_transport.num_workers=4 75% of files transported failed to download file data
```

請記住，在傳輸過程中也會考慮 `max_worker_processes` 參數。換言之，您可能需要修改 `pg_transport.num_workers` 和 `max_worker_processes` 才能成功傳輸資料庫。當 `pg_transport.num_workers` 設定為 2 時，顯示的範例最終可運作：

```
pg_transport.num_workers=2 100% of files transported
```

如需有關 `transport.import_from_server` 功能及其參數的詳細資訊，請參閱 [可傳輸資料庫函數參考](PostgreSQL.TransportableDB.transport.import_from_server.md)。

# 可傳輸資料庫函數參考
<a name="PostgreSQL.TransportableDB.transport.import_from_server"></a>

`transport.import_from_server` 函數透過輸入來源資料庫執行個體至目的地資料庫執行個體，來傳輸 PostgreSQL 資料庫。藉由實體資料庫連接傳輸機制做到此功能。

在開始傳輸之前，此函數將驗證來源和目的地資料庫執行個體的版本是否相同，並且是否與遷移相容。同時還會確認目的地資料庫執行個體有足夠的空間供來源資料庫執行個體使用。

**語法**

```
transport.import_from_server(
   host text,
   port int,
   username text,
   password text,
   database text,
   local_password text,
   dry_run bool
)
```

**傳回值**

無。

**參數**

您可以在下表尋找 `transport.import_from_server` 功能參數的說明。


****  

| 參數 | 描述 | 
| --- | --- | 
| host |  來源資料庫執行個體的端點。  | 
| port | 整數代表來源資料庫執行個體的連接埠。PostgreSQL 資料庫執行個體通常使用 5432 連接埠。 | 
| username |  來源資料庫執行個體的使用者。該使用者必須為 `rds_superuser` 角色的成員。  | 
| password |  來源資料庫執行個體的使用者密碼。  | 
| database |  來源資料庫執行個體中要傳輸的資料庫名稱。  | 
| local\$1password |  目的地資料庫執行個體目前使用者的本地密碼。該使用者必須為 `rds_superuser` 角色的成員。  | 
| dry\$1run | 選用的布林值指定是否試執行。預設為 `false`，代表傳輸繼續。若要確認來源與目的地資料庫執行個體間的相容性，而不執行實際傳輸，請設定 dry\$1run 為 true。 | 

**範例**

如需範例，請參閱[將 PostgreSQL 資料庫從來源傳輸至目的地](PostgreSQL.TransportableDB.Transporting.md)。

# 可傳輸資料庫參數參考
<a name="PostgreSQL.TransportableDB.Parameters"></a>

有幾個參數控制 `pg_transport` 擴充功能的行為。您可以在下面找到這些參數的說明。

**`pg_transport.num_workers`**  
用於傳輸流程的工作者數量。預設為 3。有效值為 1–32。最大的資料庫傳輸通常會用到的工作者也少於 8 個。傳輸期間，目的地資料庫執行個體上的此設定值會由目的地和來源使用。

**`pg_transport.timing` **  
指定是否在傳輸期間回報時間資訊。預設為 `true`，表示報告計時資訊。建議將此參數保留為設定的 `true`，以便您監控進度。如需了解輸出範例，請參閱 [將 PostgreSQL 資料庫從來源傳輸至目的地](PostgreSQL.TransportableDB.Transporting.md)。

**`pg_transport.work_mem`**  
配置給每個工作者最大的記憶體數量。預設值為 131,072 KB 或 262,144 KB (256 MB)，具體取決於 PostgreSQL 版本。最小值為 64 MB (65,536 KB)。有效的值以 kb (KB) 為單位，且為二進位制，即 1 KB = 1024 位元組。  
傳輸可能使用比此參數指定的記憶體更少。即使是大型資料庫傳輸，每個工作者會用到的記憶體通常少於 256 MB (262,144 KB)。