

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

# 在 與資料庫執行個體之間傳輸 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)。