使用 pg_transport RDS 在兩個 Amazon 資料庫執行個體之間傳輸 PostgreSQL 資料庫 - AWS 方案指引

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

使用 pg_transport RDS 在兩個 Amazon 資料庫執行個體之間傳輸 PostgreSQL 資料庫

由 Raunak Rishabh (AWS) 和 Jitender Kumar (AWS) 建立

環境:PoC 或試行

來源:資料庫:關聯性

目標:Amazon RDS for PostgreSQL

R 類型:重新定位

工作負載:開放原始碼

技術:遷移;資料庫

AWS 服務:Amazon RDS

Summary

此模式描述了使用 pg_transport 擴充功能,在 PostgreSQL 資料庫執行個體的兩個 Amazon Relational Database Service (Amazon RDS) 之間遷移超大型資料庫的步驟。此擴充套件提供實體的傳輸機制來移動每個資料庫。透過以最少的處理方式串流資料庫檔案,它提供了在資料庫執行個體之間遷移大型資料庫的極快速方法,且停機時間最短。此延伸模組使用提取模型,目標資料庫執行個體會從來源資料庫執行個體匯入資料庫。

先決條件和限制

先決條件

  • 兩個資料庫執行個體都必須執行相同的 Postgre 主要版本SQL。

  • 資料庫不得存在於目標上。否則,傳輸會失敗。

  • 來源資料庫中除了 pg_transport 之外,不得啟用任何延伸。

  • 所有來源資料庫物件都必須位於預設 pg_default tablespace 中。

  • 來源資料庫執行個體的安全群組應允許來自目標資料庫執行個體的流量。

  • 安裝 PostgreSQL 用戶端PgAdmin,例如 psql 或使用 Amazon RDS PostgreSQL 資料庫執行個體。您可以在本機系統中安裝用戶端,或使用 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。在此模式中,我們在EC2執行個體上使用 psql。

限制

  • 您無法在 Amazon RDS for Postgre 的不同主要版本之間傳輸資料庫SQL。

  • 來源資料庫的存取權限和擁有權不會傳輸至目標資料庫。

  • 您無法在僅供讀取複本或僅供讀取複本的父執行個體上傳輸資料庫。

  • 您無法在計劃使用此方法傳輸的任何資料庫資料表中使用 reg 資料類型。

  • 您可以在資料庫執行個體上同時執行最多 32 個傳輸 (包括匯入和匯出)。

  • 您無法重新命名或包含/排除資料表。所有項目都會像原樣遷移。

注意

  • 在移除延伸模組之前進行備份,因為移除延伸模組也會移除相依物件和一些對資料庫操作至關重要的資料。

  • 當您判斷 pg_transport 的工作者數量和work_mem值時,請考慮在來源執行個體的其他資料庫上執行的執行個體類別和程序。

  • 傳輸開始時,來源資料庫上的所有連線都會結束,且資料庫會進入唯讀模式。

注意:當傳輸在某個資料庫上執行時,不會影響相同伺服器上的其他資料庫。

產品版本

架構

在 Amazon RDS 資料庫執行個體之間傳輸 PostgreSQL 資料庫

工具

  • pg_transport 提供實體傳輸機制來移動每個資料庫。透過以最少的處理方式串流資料庫檔案,實體傳輸會比傳統傾印和載入程序更快地移動資料,並且需要最少的停機時間。PostgreSQL 可傳輸資料庫使用提取模型,其中目的地資料庫執行個體會從來源資料庫執行個體匯入資料庫。當您準備來源和目標環境時,您可以在資料庫執行個體上安裝此延伸模組,如此模式所述。

  • psql 可讓您連線至 PostgreSQL 資料庫執行個體,並使用這些執行個體。若要在您的系統上安裝 psql,請參閱 PostgreSQL Downloads 頁面。

史詩

任務描述所需的技能

建立目標系統的參數群組。

指定可識別為目標參數群組的群組名稱;例如 pgtarget-param-group。如需指示,請參閱 Amazon RDS 文件

DBA

修改參數群組的參數。

設定下列參數:

  1. pg_transport 新增至 shared_preload_libraries 參數。

    shared_preload_libraries = pg_stat_statements, pg_transport
  2. 設定 pg_transport.num_workers 參數。選擇您要執行傳輸的工作者數量。您設定的值決定將在來源中建立的transport.send_file工作者數量。

  3. 將 的值增加max_worker_processes到 值的三倍以上pg_transport.num_workers。例如,如果您將值設定為 pg_transport.num_workers 4,則max_worker_processes值至少應為 13。如果失敗,pg_transport 建議最小值。 

  4. pg_transport.timing 設定為 1。此設定可啟用傳輸期間的時間資訊報告。

  5. 設定 pg_transport.work_mem 參數。此參數指定要分配給每個工作者的最大記憶體。預設值為 128 MB。

如需這些參數的詳細資訊,請參閱 Amazon RDS 文件

DBA
任務描述所需的技能

建立來源系統的參數群組。

指定可識別為來源參數群組的群組名稱;例如 pgsource-param-group。如需指示,請參閱 Amazon RDS 文件

DBA

修改參數群組的參數。

設定下列參數:

  1. pg_transport 新增至 shared_preload_libraries 參數。

    shared_preload_libraries = pg_stat_statements, pg_transport
  2. 設定 pg_transport.num_workers 參數。目標中定義的此參數值決定要使用的transport.send_file工作者數量。如果您的匯入在此執行個體上執行,請增加此值,但請考慮已執行的工作者數量。

  3. 將 的值增加max_worker_processes到目標pg_transport.num_workers上 的值的三倍以上。例如,如果您在目標上pg_transport.num_workers將 值設定為 4,來源上的max_worker_processes值應至少為 13。如果失敗,pg_transport 建議最小值。 

  4. 設定 pg_transport.work_mem 參數。此參數指定要分配給每個工作者的最大記憶體。預設值為 128 MB。

如需這些參數的詳細資訊,請參閱 Amazon RDS 文件

DBA
任務描述所需的技能

建立新的 Amazon RDS for PostgreSQL 資料庫執行個體,以傳輸來源資料庫。

根據您的業務需求,決定執行個體類別和 PostgreSQL 版本。

DBA、系統管理員、資料庫架構師

修改目標的安全群組,以允許來自EC2執行個體的資料庫執行個體連接埠連線。

依預設,PostgreSQL 執行個體的連接埠為 5432。如果您使用的是另一個連接埠,該連接埠的連線必須為EC2執行個體開啟。

DBA,系統管理員

修改執行個體,並指派新的目標參數群組。

例如:pgtarget-param-group

DBA

重新啟動目標 Amazon RDS 資料庫執行個體。

參數 shared_preload_librariesmax_worker_processes是靜態參數,需要重新啟動執行個體。

DBA,系統管理員

使用 psql 從EC2執行個體連線至資料庫。

使用 命令: 

psql -h <rds_end_point> -p PORT -U username -d database -W
DBA

建立 pg_transport 延伸模組。

以具有 rds_superuser角色的使用者身分執行下列查詢:

create extension pg_transport;
DBA
任務描述所需的技能

修改來源的安全群組,以允許來自 Amazon 執行個體和目標資料庫執行個體的資料庫EC2執行個體連接埠連線

根據預設,PostgreSQL 執行個體的連接埠為 5432。如果您使用的是另一個連接埠,該連接埠的連線必須為EC2執行個體開啟。

DBA,系統管理員

修改執行個體並指派新的來源參數群組。

例如:pgsource-param-group

DBA

重新啟動來源 Amazon RDS 資料庫執行個體。

參數 shared_preload_librariesmax_worker_processes是靜態參數,需要重新啟動執行個體。

DBA

使用 psql 從EC2執行個體連線至資料庫。

使用 命令: 

psql -h <rds_end_point> -p PORT -U username -d database -W
DBA

建立 pg_transport 擴充功能,並從要傳輸的資料庫移除所有其他擴充功能。

如果來源資料庫上安裝了 pg_transport 以外的任何延伸模組,則傳輸會失敗。此命令必須由具有 rds_superuser角色的使用者執行。

DBA
任務描述所需的技能

執行乾執行。

使用 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', 'true');

此函數的最後一個參數 (設定為 true) 會定義乾執行。

此函數會顯示您在執行主要傳輸時看到的任何錯誤。在執行主要傳輸之前解決錯誤。

DBA

如果乾執行成功,請啟動資料庫傳輸。

執行 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) 表示這不是乾執行。

DBA

執行傳輸後步驟。

資料庫傳輸完成後:

  • 驗證目標環境中的資料。

  • 將所有角色和許可新增至目標。

  • 如有需要,請啟用目標和來源中所有必要的延伸模組。

  • 還原 max_worker_processes 參數的值。

DBA

相關資源