搭配 Amazon RDS for PostgreSQL 使用 PostgreSQL 擴充功能 - Amazon Relational Database Service

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

搭配 Amazon RDS for PostgreSQL 使用 PostgreSQL 擴充功能

您可安裝各種擴充功能和模組來擴展 PostgreSQL 的功能。例如,若要使用空間資料,您可以安裝和使用 PostGIS 擴充功能。如需詳細資訊,請參閱 使用 PostGIS 擴充功能管理空間資料。另一個例子是,如果要改進極大型資料表的資料輸入,則可以考慮使用 pg_partman 擴充功能對資料進行分區。如需進一步了解,請參閱使用 pg_partman 擴充功能來管理 PostgreSQL 分割區

注意

從 RDS for PostgreSQL 14.5 開始,RDS for PostgreSQL 支援適用於 PostgreSQL 的受信任語言延伸模組。此功能會實作為延伸模組 pg_tle,您可以將其新增至 RDS for PostgreSQL 資料庫執行個體。透過使用此延伸模組,開發人員可以在安全環境中建立自己的 PostgreSQL 延伸模組,這會簡化設定和組態需求。如需詳細資訊,請參閱 使用適用於 PostgreSQL 的受信任語言延伸模組

在某些情況下,您可以將特定模組新增至 RDS for PostgreSQL 資料庫叢集的自訂資料庫叢集參數群組中的 shared_preload_libraries 清單,而不是安裝延伸模組。一般而言,預設資料庫叢集參數群組只會載入 pg_stat_statements,但有數個其他模組可供新增至清單。例如,您可以新增 pg_cron 模組來新增排程功能,如使用 PostgreSQL pg_cron 擴充功能排程維護中所詳述。另一個範例是,您可以載入 auto_explain 模組來記錄查詢執行計劃。若要深入了解,請參閱 AWS 知識中心中的記錄查詢執行計畫

根據 RDS for PostgreSQL 版本,安裝擴充功能可能需要 rds_superuser 許可權限,如下:

  • 若為 RDS for PostgreSQL 第 12 版和更早版本,安裝擴充功能需要 rds_superuser 權限。

  • 若為 RDS for PostgreSQL 第 13 版和更新版本,在給定資料庫執行個體上具建立許可權限的使用者 (角色) 可以安裝並使用任何信任擴充功能。如需信任擴充功能的清單,請參閱 PostgreSQL 可信任延伸

您還可在 rds.allowed_extensions 參數中列出擴充功能,精確指定可在 RDS for PostgreSQL 資料庫執行個體上安裝的擴充功能。如需詳細資訊,請參閱 限制安裝 PostgreSQL 擴充功能

若要進一步了解 rds_superuser 角色,請參閱 了解 PostgreSQL 角色和許可

使用 Orafce 擴充功能中的函數

Orafce 擴充功能提供的函數和運算子,可以模擬來自 Oracle 資料庫的函數和軟體套件的子集合。Orafce 擴充功能可讓您更輕易地將 Oracle 應用程式移植到 PostgreSQL。RDS for PostgreSQL 9.6.6 版及更高版本支援此擴充功能。如需有關 orafce 的更多資訊,請參閱上的章。 GitHub

注意

RDS for PostgreSQL 不支援 utl_file 套件,該套件屬於 Orafce 擴充功能的一部分。這是因為 utl_file 結構描述函式雖能夠在作業系統的文字檔上進行讀取及寫入操作,但必須擁有基礎主機的超級使用者存取權,才能執行此類操作。RDS for PostgreSQL 為受管服務,不提供主機存取權。

使用 Orafce 擴充功能
  1. 使用您用來建立資料庫執行個體的主要使用者名稱,來連線至資料庫執行個體。

    如果您想要在相同的資料庫執行個體中為不同的資料庫開啟 Orafce,請使用 /c dbname psql 命令。使用此命令,您可以在啟動連線後從主要資料庫進行變更。

  2. 使用 CREATE EXTENSION 陳述式開啟 Orafce 擴充功能。

    CREATE EXTENSION orafce;
  3. 使用 ALTER SCHEMA 陳述式將 oracle 結構描述的擁有權移轉至 rds_superuser 角色。

    ALTER SCHEMA oracle OWNER TO rds_superuser;

    如果您想要查看 oracle 結構描述的擁有者清單,請使用 \dn psql 命令。

使用 pgactive 來支援主動-主動式複寫

pgactive 延伸模組使用主動-主動式複寫來支援和協調多個 RDS for PostgreSQL 資料庫上的寫入操作。Amazon RDS for PostgreSQL 下版本的pgactive擴充功能:

  • 適用於 PostgreSQL 更高版本的 RDS

  • 適用 PostgreSQL 及更高版本的 RDS

  • RDS 適用於 PostgreSQL 14.10 及更高版本

  • 適用於 PostgreSQL 及更高版本的 RDS

  • RDS 適用於 PostgreSQL 12.17 及更高版本

  • 適用於 PostgreSQL 的 RDS

注意

當複寫組態中的多個資料庫上有寫入操作時,可能會發生衝突。如需更多資訊,請參閱處理主動-主動式複寫中的衝突

初始化 pgactive 延伸模組功能

若要在 RDS for PostgreSQL 資料庫執行個體上初始化 pgactive 延伸模組,請將 rds.enable_pgactive 參數值設定為 1,然後在資料庫中建立延伸模組。這樣做就會自動開啟參數 rds.logical_replicationtrack_commit_timestamp,並將 wal_level 的值設定為 logical

您必須具有做為 rds_superuser 角色的許可,才能執行這些任務。

您可以使用 AWS Management Console 或 AWS CLI 來建立所需的 RDS 資 PostgreSQL 執行個體。下列步驟假設您的 RDS for PostgreSQL 資料庫執行個體與自訂資料庫參數群組相關聯。如需建立自訂資料庫參數群組的相關資訊,請參閱 使用參數群組

若要初始化 pgactive 延伸模組功能
  1. 登入 AWS Management Console 並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 在導覽窗格中,選擇您的 RDS for PostgreSQL 資料庫執行個體。

  3. 針對您的 RDS for PostgreSQL 資料庫執行個體開啟組態索引標籤。在執行個體詳細資訊中,找到資料庫執行個體參數群組連結。

  4. 選擇連結以開啟與您的 RDS for PostgreSQL 資料庫執行個體相關聯的自訂參數。

  5. 找到 rds.enable_pgactive 參數,並將其設定為 1 以初始化 pgactive 功能。

  6. 選擇儲存變更

  7. 從 Amazon RDS 主控台的導覽窗格中,選擇資料庫

  8. 選取您的 RDS for PostgreSQL 資料庫執行個體,然後從動作選單中選擇重新開機

  9. 確認資料庫執行個體重新開機,以讓您的變更生效。

  10. 當資料庫執行個體可用時,您可以使用 psql 或任何其他 PostgreSQL 用戶端連線至 RDS for PostgreSQL 資料庫執行個體。

    下列範例假設您的 RDS for PostgreSQL 資料庫執行個體擁有名為 postgres 的預設資料庫。

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  11. 若要驗證 pgactive 是否已初始化,請執行下列命令。

    postgres=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';

    如果 pgactiveshared_preload_libraries 中,則上述命令將傳回以下內容:

    ?column? ---------- t
  12. 建立延伸模組,如下所示。

    postgres=> CREATE EXTENSION pgactive;
若要初始化 pgactive 延伸模組功能

若要pgactive使用初始化 AWS CLI,請呼叫修改-db-參數群組作業來修改自訂參數群組中的某些參數,如下列程序所示。

  1. 使用下列 AWS CLI 命令將設定rds.enable_pgactive1為初始化適用於 PostgreSQL 資料庫執行個體的pgactive功能。

    postgres=>aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  2. 使用下列 AWS CLI 命令將 RDS for PostgreSQL 資料庫執行個體重新開機,以便初始化程式pgactive庫。

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. 當執行個體可用時,請使用 psql 連線至 RDS for PostgreSQL 資料庫執行個體。

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master user --password --dbname=postgres
  4. 建立延伸模組,如下所示。

    postgres=> CREATE EXTENSION pgactive;

針對 RDS for PostgreSQL 資料庫執行個體設定主動-主動式複寫

下列程序說明如何在相同區域中,於兩個執行 PostgreSQL 15.4 或更新版本的 RDS for PostgreSQL 資料庫執行個體之間啟動主動-主動式複寫。若要執行多區域高可用性範例,您需要在兩個不同的區域部署 Amazon RDS for PostgreSQL 執行個體,並設定 VPC 對等互連。如需詳細資訊,請參閱 VPC 對等互連

注意

在多個地區之間傳送流量可能會產生額外費用。

這些步驟假設 RDS for PostgreSQL 資料庫執行個體已使用 pgactive 延伸模組設定完成。如需詳細資訊,請參閱 初始化 pgactive 延伸模組功能

若要設定第一個具有 pgactive 延伸模組的 RDS for PostgreSQL 資料庫執行個體

下列範例說明如何建立 pgactive 群組,以及在 RDS for PostgreSQL 資料庫執行個體上建立 pgactive 延伸模組所需的其他步驟。

  1. 使用 psql 或其他用戶端工具連線至您的第一個 RDS for PostgreSQL 資料庫執行個體。

    psql --host=firstinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. 使用下列命令在 RDS for PostgreSQL 執行個體上建立資料庫:

    postgres=> CREATE DATABASE app;
  3. 使用下列命令將連線切換至新資料庫:

    \c app
  4. 若要檢查 shared_preload_libraries 參數是否包含 pgactive,請執行下列命令:

    app=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
    ?column? ---------- t
  5. 使用下列 SQL 陳述式建立並填入範例資料表:

    1. 使用下列 SQL 陳述式建立範例資料表。

      app=> CREATE SCHEMA inventory; CREATE TABLE inventory.products ( id int PRIMARY KEY, product_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP);
    2. 使用下列 SQL 陳述式在資料表中填入一些範例資料。

      app=> INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');
    3. 使用下列 SQL 陳述式,驗證資料是否存在於資料表中。

      app=>SELECT count(*) FROM inventory.products; count ------- 3
  6. 在現有資料庫上建立 pgactive 延伸模組。

    app=> CREATE EXTENSION pgactive;
  7. 使用下列命令建立並初始化 pgactive 群組:

    app=> SELECT pgactive.pgactive_create_group( node_name := 'node1-app', node_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD');

    node1-app 是您指派的名稱,用於單獨識別 pgactive 群組中的節點。

    注意

    若要在可公開存取的資料庫執行個體上成功執行此步驟,您必須將 rds.custom_dns_resolution 參數設定為 1 以將它開啟。

  8. 若要檢查資料庫執行個體是否已就緒,請使用下列命令:

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    如果命令成功,您會看到以下輸出內容:

    pgactive_wait_for_node_ready ------------------------------ (1 row)
若要設定第二個 RDS for PostgreSQL 執行個體,並將其加入 pgactive 群組

下列範例說明如何建立將 RDS for PostgreSQL 資料庫執行個體加入 pgactive 群組,以及在資料庫執行個體上建立 pgactive 延伸模組所需的其他步驟。

這些步驟假設已有另一個 RDS for PostgreSQL 資料庫執行個體使用 pgactive 延伸模組設定完成。如需詳細資訊,請參閱 初始化 pgactive 延伸模組功能

  1. 使用 psql 來連線至您想要從發佈者接收更新的執行個體。

    psql --host=secondinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. 使用下列命令在第二個 RDS for PostgreSQL 資料庫執行個體上建立資料庫:

    postgres=> CREATE DATABASE app;
  3. 使用下列命令將連線切換至新資料庫:

    \c app
  4. 在現有資料庫上建立 pgactive 延伸模組。

    app=> CREATE EXTENSION pgactive;
  5. RDS for PostgreSQL 第二個資料庫執行個體加入 pgactive 群組,如下所示。

    app=> SELECT pgactive.pgactive_join_group( node_name := 'node2-app', node_dsn := 'dbname=app host=secondinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD', join_using_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD');

    node2-app 是您指派的名稱,用於單獨識別 pgactive 群組中的節點。

  6. 若要檢查資料庫執行個體是否已就緒,請使用下列命令:

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    如果命令成功,您會看到以下輸出內容:

    pgactive_wait_for_node_ready ------------------------------ (1 row)

    如果第一個 RDS for PostgreSQL 資料庫相對較大,您會看到 pgactive.pgactive_wait_for_node_ready() 發出還原操作的進度報告。輸出結果類似如下:

    NOTICE: restoring database 'app', 6% of 7483 MB complete NOTICE: restoring database 'app', 42% of 7483 MB complete NOTICE: restoring database 'app', 77% of 7483 MB complete NOTICE: restoring database 'app', 98% of 7483 MB complete NOTICE: successfully restored database 'app' from node node1-app in 00:04:12.274956 pgactive_wait_for_node_ready ------------------------------ (1 row)

    從這裡開始,pgactive 會在兩個資料庫執行個體之間同步資料。

  7. 您可以使用下列命令來驗證第二個資料庫執行個體的資料庫是否有資料:

    app=> SELECT count(*) FROM inventory.products;

    如果資料已成功同步,您會看到下列輸出內容:

    count ------- 3
  8. 執行下列命令以插入新值:

    app=> INSERT INTO inventory.products (id, product_name) VALUES ('lotion');
  9. 連線至第一個資料庫執行個體的資料庫,然後執行下列查詢:

    app=> SELECT count(*) FROM inventory.products;

    如果主動-主動式複寫已初始化,則會輸出類似下列內容:

    count ------- 4
pgactive 群組卸離並移除資料庫執行個體

您可以利用下列步驟將資料庫執行個體從 pgactive 群組卸離並移除:

  1. 您可以使用下列命令將第二個資料庫執行個體從第一個資料庫執行個體卸離:

    app=> SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app']);
  2. 使用下列命令從第二個資料庫執行個體移除 pgactive 延伸模組:

    app=> SELECT * FROM pgactive.pgactive_remove();

    若要強制移除延伸模組:

    app=> SELECT * FROM pgactive.pgactive_remove(true);
  3. 使用以下命令刪除延伸模組:

    app=> DROP EXTENSION pgactive;

處理主動-主動式複寫中的衝突

pgactive 延伸模組是在每個資料庫上運作,而不是每個叢集。使用 pgactive 的每個資料庫執行個體都是獨立的執行個體,可接受任何來源的資料變更。將變更傳送至資料庫執行個體時,PostgreSQL 會在本機上遞交該變更,然後使用 pgactive 以非同步方式將變更複寫到其他資料庫執行個體。當兩個 PostgreSQL 資料庫執行個體幾乎同時更新相同的記錄時,可能會發生衝突。

pgactive 延伸模組提供了衝突偵測和自動解決的機制。它會追蹤交易在兩個資料庫執行個體上得到認可的時間戳記,並自動套用具有最新時間戳記的變更。pgactive 延伸模組也會記錄 pgactive.pgactive_conflict_history 資料表中發生的衝突。

pgactive.pgactive_conflict_history將繼續增長。您可能想要定義清除原則。這可以通過刪除一些記錄定期或定義此關係的分區方案(以及後來分離,刪除,截斷感興趣的分區)來完成。若要定期實作清除原則,其中一個選項是使用pg_cron擴充功能。請參閱下列pg_cron歷史記錄資料表範例的資訊,使用 PostgreSQL pg_cron 擴充功能排程維護

處理主動-主動式複寫中的序列

具有 pgactive 延伸模組的 RDS for PostgreSQL 資料庫執行個體使用兩種不同的序列機制來產生唯一值。

全域序列

若要使用全域序列,請使用 CREATE SEQUENCE 陳述式建立本機序列。不要使用 usingnextval(seqname),而是使用 pgactive.pgactive_snowflake_id_nextval(seqname) 來取得序列中的下一個唯一值。

下列範例會建立全域序列:

postgres=> CREATE TABLE gstest ( id bigint primary key, parrot text );
postgres=>CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
postgres=> ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
分割序列

在拆分步驟或分割序列中,每個節點上會使用標準 PostgreSQL 序列。每個序列會以相同的量遞增,並從不同的偏移量開始。例如,若是步進 100,節點 1 會產生序列為 101、201、301,依此類推,而節點 2 會產生序列為 102、202、302,依此類推。即使節點無法長時間通訊,此結構仍能正常運作,但是設計人員必須在建立結構描述時指定最大節點數,並且需要每個節點的組態。若發生錯誤,便容易導致序列重疊。

透過在節點上建立所需的序列來對 pgactive 設定此方法相對較為簡單,如下所示:

CREATE TABLE some_table (generated_value bigint primary key);
postgres=> CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
postgres=> ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');

然後在每個節點上呼叫,以提供不同的偏移量起始值,如下所示。

postgres=> -- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);

pgactive 延伸模組的參數參考

您可以使用下列查詢來檢視與 pgactive 延伸模組相關聯的所有參數。

postgres=> SELECT * FROM pg_settings WHERE name LIKE 'pgactive.%';

測量 pgactive 成員之間的複製延遲

您可以使用下列查詢來檢視成pgactive員之間的複寫延遲。在每個pgactive節點上執行此查詢以取得完整圖片。

postgres=# SELECT *, (last_applied_xact_at - last_applied_xact_committs) AS lag FROM pgactive.pgactive_node_slots; -{ RECORD 1 ]----------------+----------------------------------------------------------------- node_name | node2-app slot_name | pgactive_5_7332551165694385385_0_5__ slot_restart_lsn | 0/1A898A8 slot_confirmed_lsn | 0/1A898E0 walsender_active | t walsender_pid | 69022 sent_lsn | 0/1A898E0 write_lsn | 0/1A898E0 flush_lsn | 0/1A898E0 replay_lsn | 0/1A898E0 last_sent_xact_id | 746 last_sent_xact_committs | 2024-02-06 18:04:22.430376+00 last_sent_xact_at | 2024-02-06 18:04:22.431359+00 last_applied_xact_id | 746 last_applied_xact_committs | 2024-02-06 18:04:22.430376+00 last_applied_xact_at | 2024-02-06 18:04:52.452465+00 lag | 00:00:30.022089

pgactive 延伸模組的現制

  • 所有資料表都需有主索引鍵,否則不允許更新和刪除操作。主索引鍵欄中的值不應更新。

  • 序列可能有間隙,有時可能不按順序。序列未複寫。如需詳細資訊,請參閱 處理主動-主動式複寫中的序列

  • DDL 和大型物件未複寫。

  • 次要唯一索引可能會導致資料差異。

  • 群組中所有節點的定序都必須相同。

  • 節點之間的負載平衡是一種反模式。

  • 大型交易可能造成複寫延遲。

使用 pg_repack 擴充功能減少資料表和索引膨脹

您可以使用pg_repack擴充功能從資料表和索引中移除膨脹,做為的替代方VACUUM FULL案。RDS for PostgreSQL 9.6.3 及更新版本支援此擴充功能。如需有關pg_repack擴充功能和完整表格重新封裝的詳細資訊,請參閱GitHub 專案文件

與此不同的是VACUUM FULL,在下列情況下,pg_repack擴充功能只需要在資料表重新建置作業期間短時間內執行獨佔AccessExclusive鎖定 (鎖定):

  • 記錄表格的初始建立 — 建立記錄表格來記錄資料初始複製期間發生的變更,如下列範例所示:

    postgres=>\dt+ repack.log_* List of relations -[ RECORD 1 ]-+---------- Schema | repack Name | log_16490 Type | table Owner | postgres Persistence | permanent Access method | heap Size | 65 MB Description |
  • 最後 swap-and-drop 階段。

對於其餘的重建作業,它只需要ACCESS SHARE鎖定原始資料表,即可將資料列從其複製到新資料表。這有助於插入,更新和刪除操作像往常一樣進行。

建議

當您使用pg_repack擴充功能從資料表和索引中移除膨脹時,下列建議適用:

  • 在非上班時間執行重新封裝,或透過維護時段執行重新封裝,將其對其他資料庫活動的效能影響降到最低。

  • 密切監控重建活動期間的封鎖工作階段,並確保原始資料表上沒有可能封鎖的活動pg_repack,特別是在需要原始資料表獨佔鎖定的最後 swap-and-drop 階段時。如需詳細資訊,請參閱識別封鎖查詢的內容

    當您看到阻塞會話時,您可以在仔細考慮後使用以下命令終止它。這有助於繼pg_repack續完成重建:

    SELECT pg_terminate_backend(pid);
  • 在交易速率非常高的系統上套用pg_repack's日誌表格中的應計變更時,套用處理作業可能無法跟上變更率。在這種情況下,pg_repack將無法完成套用處理作業。如需詳細資訊,請參閱 在重新裝箱期間監控新表。如果索引嚴重膨脹,另一種解決方案是僅執行索引重新包裝。這也有助於 VACUUM 的索引清理週期更快地完成。

    您可以使用 PostgreSQL 第 12 版的手動真空來跳過索引清理階段,並且在 PostgreSQL 第 14 版的緊急自動真空期間會自動跳過索引清理階段。這有助於真空更快地完成,而不會消除指數膨脹,並且僅適用於緊急情況,例如防止環繞式真空。如需詳細資訊,請參閱 Amazon Aurora 使用者指南中的避免索引膨脹

先決條件

  • 該表必須有主鍵或非空唯一約束。

  • 用戶端和伺服器的延伸版本必須相同。

  • 確保 RDS 執行個體的大小FreeStorageSpace超過資料表的總大小,而不會膨脹。作為一個例子,考慮包括 TOAST 和索引在內的表的總大小為 2TB,並在表中的總膨脹為 1TB。FreeStorageSpace必要的值必須大於以下計算所傳回的值:

    2TB (Table size) - 1TB (Table bloat) = 1TB

    您可以使用下面的查詢來檢查表的總大小,並使用pgstattuple來導出膨脹。如需詳細資訊,請參閱 Amazon Aurora 使用者指南中的診斷表格和索引膨脹

    SELECT pg_size_pretty(pg_total_relation_size('table_name')) AS total_table_size;

    這個空間是活動完成後回收的。

  • 確定 RDS 執行個體具有足夠的運算和 IO 容量來處理重新封裝作業。您可以考慮擴展實例類別以獲得最佳性能平衡。

若要使用pg_repack擴充功能
  1. 執行以下命令,在 RDS for PostgreSQL 資料庫執行個體上安裝 pg_repack 擴充功能。

    CREATE EXTENSION pg_repack;
  2. 執行下列命令,以授與寫入存取權給由建立的暫存記錄資料表pg_repack

    ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT INSERT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT USAGE, SELECT ON SEQUENCES TO PUBLIC;
  3. 使用用pg_repack戶端公用程式 Connect 至資料庫。使用具有 rds_superuser 權限的帳戶。舉例來說,假設 rds_test 角色具有 rds_superuser 權限。下列語法會pg_repack針對包含資料庫中所有資料表索引的完整postgres資料表執行。

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test -k postgres
    注意

    您必須使用-k 選項進行連線。不支援 -a 選項。

    pg_repack用戶端的回應會提供重新封裝之資料庫執行個體上資料表的相關資訊。

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"
  4. 下面的語法重新包orderspostgres數據庫中的索引的單個表。

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders -k postgres

    下列語法只會重新填寫postgres資料庫中資料orders表的索引。

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders --only-indexes -k postgres

在重新裝箱期間監控新表

  • 數據庫的大小增加了表的總大小減去膨脹,直到重新包裝的 swap-and-drop 階段。您可以監視資料庫大小的成長率、計算重新封裝的速度,並大致估計完成初始資料傳輸所需的時間。

    作為一個例子,考慮表的總大小為 2TB,數據庫的大小為 4TB,並在表中的總膨脹為 1TB。重新封裝作業結束時計算所傳回的資料庫總大小值如下:

    2TB (Table size) + 4 TB (Database size) - 1TB (Table bloat) = 5TB

    您可以透過取樣兩個時間點之間的成長率 (以位元組為單位),大致估計重新封裝作業的速度。如果成長率是每分鐘 1GB,則大約需要 1000 分鐘或 16.6 小時才能完成初始資料表建置作業。除了初始表構建之外,pg_repack還需要應用累積的更改。所花費的時間取決於套用持續變更的速率以及累積變更。

    注意

    您可以使用pgstattuple擴展來計算表中的膨脹。如需更多詳細資訊,請參閱 pgstattuple

  • 重新封裝結構描述下的pg_repack's記錄資料表中的資料列數目代表初始載入後要套用至新資料表的擱置變更數量。

    您可以簽入pg_repack's記錄表格,pg_stat_all_tables以監視套用至新表格的變更。 pg_stat_all_tables.n_live_tup指示等待套用至新資料表的記錄數目。如需詳細資訊,請參閱資料表。

    postgres=>SELECT relname,n_live_tup FROM pg_stat_all_tables WHERE schemaname = 'repack' AND relname ILIKE '%log%'; -[ RECORD 1 ]--------- relname | log_16490 n_live_tup | 2000000
  • 您可以使用pg_stat_statements擴充功能來找出重新封裝作業中每個步驟所花費的時間。這有助於準備在生產環境中套用相同的重新裝箱作業。您可以調整LIMIT條款以進一步擴展輸出。

    postgres=>SELECT SUBSTR(query, 1, 100) query, round((round(total_exec_time::numeric, 6) / 1000 / 60),4) total_exec_time_in_minutes FROM pg_stat_statements WHERE query ILIKE '%repack%' ORDER BY total_exec_time DESC LIMIT 5; query | total_exec_time_in_minutes -----------------------------------------------------------------------+---------------------------- CREATE UNIQUE INDEX index_16493 ON repack.table_16490 USING btree (a) | 6.8627 INSERT INTO repack.table_16490 SELECT a FROM ONLY public.t1 | 6.4150 SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) | 0.5395 SELECT repack.repack_drop($1, $2) | 0.0004 SELECT repack.repack_swap($1) | 0.0004 (5 rows)

重新包裝完全是一項 out-of-place 操作,因此原始資料表不會受到影響,而且我們預計不會有任何需要復原原始資料表的未預期挑戰。如果重新裝箱意外失敗,您必須檢查錯誤的原因並加以解決。

解決問題之後,請在資料表所在的資料庫中卸除並重新建立pg_repack擴充功能,然後重試該pg_repack步驟。此外,計算資源的可用性和表格的並行存取性在重新封裝作業的及時完成中扮演著至關重要的角色。

升級和使用 PLV8 擴充功能

PLV8 是值得信賴的 JavaScript 語言擴充功能,適用於 PostgreSQL。您可用於存放的程序、觸發程序和可從 SQL 呼叫的其他程序性程式碼。所有目前版本的 PostgreSQL 都支援此語言擴充功能。

如果您使用 PLV8 並將 PostgreSQL 升級至新的 PLV8 版本,即可立即利用新的擴充功能套件。執行下列步驟,同步目錄中繼資料與新版的 PLV8。這些步驟為選用,但強烈建議您完成步驟以避免中繼資料不符的警告。

升級程序會捨棄您現有的所有 PLV8 函數。因此,我們建議您在升級之前建立 RDS for PostgreSQL 資料庫執行個體的快照。如需詳細資訊,請參閱 為單一可用區資料庫執行個體建立資料庫快照

如何同步目錄中繼資料與新版 PLV8
  1. 確認您需要更新。若要執行此動作,請在已連接至執行個體的情況下,執行下列命令。

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    如果結果包含一個已安裝之版本的值,而此版本的編號小於預設版本,則請繼續此程序來更新擴充功能套件。例如,下列結果集表示您應該更新。

    name | default_version | installed_version | comment --------+-----------------+-------------------+-------------------------------------------------- plls | 2.1.0 | 1.5.3 | PL/LiveScript (v8) trusted procedural language plcoffee| 2.1.0 | 1.5.3 | PL/CoffeeScript (v8) trusted procedural language plv8 | 2.1.0 | 1.5.3 | PL/JavaScript (v8) trusted procedural language (3 rows)
  2. 如果您尚未建立 RDS for PostgreSQL 資料庫執行個體的快照,請建立一個。建立快照時,您可以繼續執行下列步驟。

  3. 取得資料庫執行個體中的 PLV8 函數計數,以驗證升級之後函數全部存在。例如,下列 SQL 查詢會傳回 PLV8、plcoffee 和 plls 中寫入的函數數目。

    SELECT proname, nspname, lanname FROM pg_proc p, pg_language l, pg_namespace n WHERE p.prolang = l.oid AND n.oid = p.pronamespace AND lanname IN ('plv8','plcoffee','plls');
  4. 使用 pg_dump 建立只含結構描述的傾印檔案。例如,在 /tmp 目錄中建立用戶端機器上的檔案。

    ./pg_dump -Fc --schema-only -U master postgres >/tmp/test.dmp

    此範例使用下列選項:

    • -Fc – 自訂格式

    • --schema-only – 僅傾印建立結構描述所需的命令 (我們案例中的函數)

    • -U – RDS 主要使用者名稱

    • database – 資料庫執行個體上的資料庫名稱

    如需有關 pg_dump 的詳細資訊,請參閱 PostgreSQL 文件中的 pg_dump

  5. 擷取傾印檔案中存在的「CREATE FUNCTION」DDL 陳述式。下列範例使用 grep 命令擷取用於建立函數並儲存到檔案中的 DDL 陳述式。您將於後續步驟中使用此 ddl 來重新建立函數。

    ./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list/

    如需有關 pg_restore 的詳細資訊,請參閱 PostgreSQL 文件中的 pg_restore

  6. 捨棄函數和擴充功能。下列範例會捨棄任何以 PLV8 為基礎的物件。cascade 選項可確保捨棄任何相依物件。

    DROP EXTENSION plv8 CASCADE;

    如果 PostgreSQL 執行個體包含以 plcoffee 或 plls 為基礎的物件,請對這些擴充功能重複此步驟。

  7. 建立擴充功能。下列範例會建立 plv8、plcoffee 和 plls 擴充功能。

    CREATE EXTENSION plv8; CREATE EXTENSION plcoffee; CREATE EXTENSION plls;
  8. 使用傾印檔案和「驅動程式」檔案建立函數。

    下列範例會重新建立您先前擷取的函數。

    ./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
  9. 使用以下查詢驗證是否已重新建立所有函數。

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    PLV8 第 2 版會將以下額外的資料列新增至結果集:

    proname | nspname | lanname ---------------+------------+---------- plv8_version | pg_catalog | plv8

使用 PL/Rust 以 Rust 語言撰寫 PostgreSQL 函數

PL/Rust 是 PostgreSQL 的受信任 Rust 語言延伸模組。您可以將其用於預存程序、函數,以及可從 SQL 呼叫的其他程序性程式碼。下列版本提供 PL/Rust 語言延伸模組:

  • 適用於 PostgreSQL 更高版本的 RDS

  • RDS for PostgreSQL 15.2-R2 及更高的 15 版本

  • RDS for PostgreSQL 14.9 及更高的 14 版本

  • RDS for PostgreSQL 13.12 及更高的 13 版本

如需詳細資訊,請參閱上的 PL/Rust。 GitHub

設定 PL/Rust

若要在資料庫執行個體上安裝 plrust 延伸模組,請將 plrust 新增至與資料庫執行個體相關聯之資料庫參數群組中的 shared_preload_libraries 參數。安裝 plrust 延伸模組後,您可以建立函數。

若要修改 shared_preload_libraries 參數,您的資料庫執行個體必須與自訂參數群組相關聯。如需建立自訂資料庫參數群組的相關資訊,請參閱 使用參數群組

您可以使用 AWS Management Console 或安裝擴充套件。 AWS CLI

下列步驟假設您的資料庫執行個體與自訂資料庫參數群組相關聯。

shared_preload_libraries 參數中安裝 plrust 延伸模組

使用屬於 rds_superuser 群組 (角色) 成員的帳戶完成下列步驟。

  1. 登入 AWS Management Console 並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 在導覽窗格中,選擇 Databases (資料庫)。

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

  4. 開啟資料庫執行個體的組態索引標籤,然後尋找資料庫執行個體參數群組連結。

  5. 選擇連結以開啟與資料庫執行個體相關聯的自訂參數。

  6. Parameters (參數) 搜尋欄位中,輸入 shared_pre 以尋找 shared_preload_libraries 參數。

  7. 選擇 Edit parameters (編輯參數) 以存取屬性值。

  8. 欄位中,將 plrust 新增至清單。使用逗號區隔值清單中的項目。

  9. 重新啟動資料庫執行個體,以便您對 shared_preload_libraries 參數的變更生效。初始重新啟動可能需要額外的時間才能完成。

  10. 當執行個體可用時,請驗證 plrust 是否已初始化。使用 psql 連線至資料庫執行個體,然後執行下列命令。

    SHOW shared_preload_libraries;

    您的輸出應該類似以下內容:

    shared_preload_libraries -------------------------- rdsutils,plrust (1 row)
在 shared_preload_libraries 參數中安裝 plrust 延伸模組

使用屬於 rds_superuser 群組 (角色) 成員的帳戶完成下列步驟。

  1. 使用「修改-db-參數群組」 AWS CLI 指令將 plrust 加入至參數shared_preload_libraries

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=plrust,ApplyMethod=pending-reboot" \ --region aws-region
  2. 使用重新啟動 db-instance AWS CLI 指令重新啟動資料庫執行個體,並初始化 plrust 程式。初始重新啟動可能需要額外的時間才能完成。

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. 當執行個體可用時,您可以驗證 plrust 是否已初始化。使用 psql 連線至資料庫執行個體,然後執行下列命令。

    SHOW shared_preload_libraries;

    您的輸出應該類似以下內容:

    shared_preload_libraries -------------------------- rdsutils,plrust (1 row)

使用 PL/Rust 建立函數

PL/Rust 會將函數編譯為動態程式庫、載入它,然後執行它。

以下 Rust 函數會從陣列中篩選出倍數。

postgres=> CREATE LANGUAGE plrust; CREATE EXTENSION
CREATE OR REPLACE FUNCTION filter_multiples(a BIGINT[], multiple BIGINT) RETURNS BIGINT[] IMMUTABLE STRICT LANGUAGE PLRUST AS $$ Ok(Some(a.into_iter().filter(|x| x.unwrap() % multiple != 0).collect())) $$; WITH gen_values AS ( SELECT ARRAY(SELECT * FROM generate_series(1,100)) as arr) SELECT filter_multiples(arr, 3) from gen_values;

使用套件搭配 PL/Rust

在適用於 PostgreSQL 的 RDS 版本 16.3-R2 及更高版本、15.7-R2 及更高版本 15 個版本、14.12-R2 及更高版本 14 版本,以及 13 版及更高版本中,PL/RUST 支援額外的包裝箱:

  • url

  • regex

  • serde

  • serde_json

在適用於 PostgreSQL 的 RDS 版本 15.5-R2 及更高版本、14.10-R2 及更高版本 14 個版本,以及 13 版和更高版本中,PL/RUST 支援兩個額外的包裝箱:

  • croaring-rs

  • num-bigint

從 Amazon RDS for PostgreSQL 版本 15.4、14.9 和 13.12 版開始,PL/ 鐵鏽支援下列包裝箱:

  • aes

  • ctr

  • rand

這些套件僅支援預設功能。新的 RDS for PostgreSQL 版本可能包含更新的套件版本,而且可能不再支援較舊的套件版本。

請遵循執行主要版本升級的最佳實務來進行測試,了解您的 PL/Rust 函數是否與新的主要版本相容。如需詳細資訊,請參閱部落格 Best practices for upgrading Amazon RDS to major and minor versions of PostgreSQL (將 Amazon RDS 升級至 PostgreSQL 的主要和次要版本的最佳實務),以及《Amazon RDS 使用者指南》中的升級 Amazon RDS 的 PostgreSQL 資料庫引擎

使用相依性中提供了建立 PL/Rust 函數時使用相依性的範例。

PL/Rust 限制

根據預設,資料庫使用者無法使用 PL/Rust。若要提供 PL/Rust 的存取權,請以具有 rds_superuser 權限的使用者身分連線,然後執行下列命令:

postgres=> GRANT USAGE ON LANGUAGE PLRUST TO user;