使用 Amazon RDS for PostgreSQL 支援的 PostgreSQL 功能 - Amazon Relational Database Service

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

使用 Amazon RDS for PostgreSQL 支援的 PostgreSQL 功能

Amazon RDS for PostgreSQL 支援許多最常用的 PostgreSQL 功能。例如,PostgreSQL 的自動資料清理功能可對資料庫執行例行維護。根據預設,會使用自動真空功能。雖然您可以關閉此功能,但我們強烈建議保持開啟。了解此功能以及您可以做些什麼來確保它能夠正常工作是任何 DBA 的基本任務。如需有關自動資料清理的詳細資訊,請參閱 在 Amazon RDS for PostgreSQL 上使用 PostgreSQL 自動資料清理。若要進一步了解其他常見 DBA 任務,請參閱 Amazon RDS for PostgreSQL 的常用 DBA 任務

RDS for PostgreSQL 也支援為資料庫執行個體新增重要功能的擴充功能。例如,您可以使用 PostGIS 擴充功能來處理空間資料,或者使用 pg_cron 擴充功能在執行個體內進行維護排程。如需 PostgreSQL 擴充功能的詳細資訊,請參閱 搭配 Amazon RDS for PostgreSQL 使用 PostgreSQL 擴充功能

外部資料包裝函式是一種特定類型的擴充功能,旨在讓您的 RDS for PostgreSQL 資料庫執行個體與其他商業資料庫或資料類型搭配使用。如需 RDS PostgreSQL 支援的外部資料包裝函式的詳細資訊,請參閱 使用 Amazon RDS for PostgreSQL 支援的外部資料包裝函式

在下文中,您可以了解 RDS for PostgreSQL 支援其他功能的資訊。

使用 RDS for PostgreSQL 的自訂資料類型和列舉

PostgreSQL 支援建立自訂資料類型和使用列舉。如需如何建立並使用列舉及其他資料類型的詳細資訊,請參閱 PostgreSQL 文件中的列舉類型

以下範例示範將類型建立為列舉,然後將值插入到資料表。

CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); CREATE TYPE CREATE TABLE t1 (colors rainbow); CREATE TABLE INSERT INTO t1 VALUES ('red'), ( 'orange'); INSERT 0 2 SELECT * from t1; colors -------- red orange (2 rows) postgres=> ALTER TYPE rainbow RENAME VALUE 'red' TO 'crimson'; ALTER TYPE postgres=> SELECT * from t1; colors --------- crimson orange (2 rows)

RDS for PostgreSQL 適用的事件觸發程序

所有目前的 PostgreSQL 版本都支援事件觸發程序,所有 RDS for PostgreSQL 版本也支援事件觸發程序。您可以使用主要使用者帳戶 (預設 postgres) 來建立、修改、重新命名和刪除事件觸發程序。事件觸發是在資料庫執行個體層級上運作,可套用至執行個體上的所有資料庫。

例如,下列程式碼建立的事件觸發程序會在每個資料定義語言 (DDL) 命令結束時列印目前使用者。

CREATE OR REPLACE FUNCTION raise_notice_func() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'In trigger function: %', current_user; END; $$; CREATE EVENT TRIGGER event_trigger_1 ON ddl_command_end EXECUTE PROCEDURE raise_notice_func();

如需 PostgreSQL 事件觸發的詳細資訊,請參閱 PostgreSQL 文件中的事件觸發

在 Amazon RDS 上使用 PostgreSQL 事件觸發時有幾項限制。所需資訊包括下列項目:

  • 您無法在僅供讀取複本上建立事件觸發程序。不過,您可以在僅供讀取複本來源建立事件觸發。然後,事件觸發會複製到僅供讀取複本。從來源推送變更時,僅供讀取複本上的事件觸發不會在僅供讀取複本上發動。不過,如果提升僅供讀取複本,則資料庫操作發生時,現有的事件觸發會啟動。

  • 若要對使用事件觸發程序的 PostgreSQL 資料庫執行個體執行主要版本升級,就必須在升級執行個體之前刪除事件觸發程序。

RDS for PostgreSQL 的巨型分頁

巨型分頁是一項記憶體管理功能,可減少資料庫執行個體處理大型連續記憶體區塊 (如共用緩衝區使用的記憶體區塊) 時的額外負荷。所有目前可用的 RDS for PostgreSQL 版本都支援此 PostgreSQL 功能。您可以呼叫 mmapSYSV 共用記憶體,以分配巨型分頁給您的應用程式。RDS for PostgreSQL 同時支援 4 KB 和 2 MB 分頁大小。

您可以開啟或關閉巨型分頁功能,方法是變更 huge_pages 參數的值。除了微型、小型和中型資料庫執行個體類之外,所有資料庫執行個體類都預設開啟該功能。

RDS for PostgreSQL 會根據可用的共用記憶體使用巨型分頁。如果資料庫執行個體因為共用記憶體限制而無法使用巨型分頁,Amazon RDS 會阻止資料庫執行個體啟動。在此情況下,Amazon RDS 會將資料庫執行個體的狀態設為不相容的參數狀態。如果發生這種情況,您可以將 huge_pages 參數設為「off」,以允許 Amazon RDS 啟動資料庫執行個體。

shared_buffers 參數是為了使用巨型分頁而設定所需之共用記憶體集區的關鍵。shared_buffers 參數的預設值會使用資料庫參數巨集。此巨集會設定可用於資料庫執行個體記憶體的總計 8 KB 分頁的百分比。當您使用巨型分頁時,這些頁面會與巨型分頁放在一起。如果共用記憶體參數設為需要 90% 以上的資料庫執行個體記憶體,Amazon RDS 會將資料庫執行個體設為不相容的參數狀態。

若要進一步了解 PostgreSQL 記憶體管理,請參閱 PostgreSQL 說明文件中的資源耗用

為 Amazon RDS for PostgreSQL 執行邏輯複寫

從 10.4 版開始,RDS for PostgreSQL 支援 PostgreSQL 10 中引進的發佈與訂閱 SQL 語法。如需進一步了解,請參閱 PostgreSQL 文件中的邏輯複寫

注意

除了在 PostgreSQL 10 中引進的原生 PostgreSQL 邏輯複寫功能之外,RDS for PostgreSQL 也支援 pglogical 延伸模組。如需更多詳細資訊,請參閱 使用 pglogical 跨執行個體同步資料

在下文中,您可以了解如何設定 RDS for PostgreSQL 資料庫執行個體邏輯複寫的資訊。

了解邏輯複寫和邏輯解碼

RDS for PostgreSQL 支援使用 PostgreSQL 的邏輯複寫槽來串流預寫日誌 (WAL) 變更。它也支援使用邏輯解碼。您可以在執行個體上設定邏輯複寫槽,然後透過這些槽將資料庫變更串流至用戶端,例如 pg_recvlogical。邏輯複寫插槽在資料庫層級建立,且支援對單一資料庫的多個複寫連線。

PostgreSQL 邏輯複寫最常見的用戶端是 Amazon EC2 執行個體上的 AWS Database Migration Service 或自訂管理的主機。邏輯複寫插槽沒有關於串流接收者的資訊。此外,不要求目標必須是複本資料庫。如果您設定邏輯複寫槽,但未讀取這個槽,則資料會寫入並快速填滿資料庫執行個體的儲存體。

Amazon RDS 的 PostgreSQL 邏輯複寫與邏輯解碼是以參數、複寫連線類型和安全角色來開啟。任何用戶端只要能夠在 PostgreSQL 資料庫執行個體上的資料庫建立複寫連線,都可以當作邏輯解碼的用戶端。

開啟 RDS for PostgreSQL 資料庫執行個體的邏輯解碼
  1. 確保您正在使用的使用者帳戶具有以下角色:

    • 可讓您開啟邏輯複寫的 rds_superuser 角色

    • 授權來管理邏輯槽和利用邏輯槽來串流資料的 rds_replication 角色

  2. rds.logical_replication 靜態參數設為 1。套用此參數時,也會設定 wal_levelmax_wal_sendersmax_replication_slotsmax_connections 參數。這些參數變更會產生更多 WAL,因此請僅在使用邏輯槽時才設定 rds.logical_replication 參數。

  3. 為了讓靜態 rds.logical_replication 參數生效,請重新啟動資料庫執行個體。

  4. 建立邏輯複寫槽將在下一章節中說明。此程序要求您指定解碼外掛程式。目前,RDS for PostgreSQL 支援隨附於 PostgreSQL 的 test_decoding 和 wal2json 輸出外掛程式。

如需有關 PostgreSQL 邏輯解碼的詳細資訊,請參閱 PostgreSQL 文件

使用邏輯複寫槽

您可以利用 SQL 命令來使用邏輯槽。例如,下列命令使用預設 PostgreSQL 輸出外掛程式 test_slot,建立一個名為 test_decoding 的邏輯槽。

SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding'); slot_name | xlog_position -----------------+--------------- regression_slot | 0/16B1970 (1 row)

若要列出邏輯槽,請使用下列命令。

SELECT * FROM pg_replication_slots;

若要捨棄邏輯槽,請使用下列命令。

SELECT pg_drop_replication_slot('test_slot'); pg_drop_replication_slot ----------------------- (1 row)

如需有關使用邏輯複寫槽的其他範例,請參閱 PostgreSQL 文件中的邏輯解碼範例

建立邏輯複寫槽之後,即可開始串流。下列範例顯示如何透過串流複寫協定來控制邏輯解碼。此範例會使用包含在 PostgreSQL 發行版中的 pg_recvlogical 程式。這會需要將用戶端身分驗證設為允許複寫連線。

pg_recvlogical -d postgres --slot test_slot -U postgres --host -instance-name.111122223333.aws-region.rds.amazonaws.com -f - --start

若要查看檢視 pg_replication_origin_status 的內容,請查詢 pg_show_replication_origin_status 函式。

SELECT * FROM pg_show_replication_origin_status(); local_id | external_id | remote_lsn | local_lsn ----------+-------------+------------+----------- (0 rows)

stats_temp_directory 的 RAM 磁碟

您可以使用 RDS for PostgreSQL 參數 rds.pg_stat_ramdisk_size 指定組態給 RAM 磁碟的系統記憶體,以存放 PostgreSQL stats_temp_directory。RAM 磁碟參數適用於 Amazon RDS 上的所有 PostgreSQL 版本。

在某些工作負載下,設定此參數可以提高效能和降低輸入/輸出需求。如需 stats_temp_directory 的詳細資訊,請參閱 PostgreSQL 文件

如要設定 stats_temp_directory 的 RAM 磁碟,請於資料庫執行個體所使用的參數群組中,將 rds.pg_stat_ramdisk_size 參數設為整數常值。此參數表示 MB,因此您必須使用整數值。表達式、公式和函數對 rds.pg_stat_ramdisk_size 參數無效。請務必重新啟動資料庫執行個體,變更才會生效。如需有關設定參數的詳細資訊,請參閱 使用參數群組

例如,下列 AWS CLI 命令將 RAM 磁碟參數設為 256 MB。

aws rds modify-db-parameter-group \ --db-parameter-group-name pg-95-ramdisk-testing \ --parameters "ParameterName=rds.pg_stat_ramdisk_size, ParameterValue=256, ApplyMethod=pending-reboot"

重新啟動之後,執行以下命令來查看 stats_temp_directory 的狀態。

postgres=> SHOW stats_temp_directory;

此命令應該會傳回下列結果。

stats_temp_directory --------------------------- /rdsdbramdisk/pg_stat_tmp (1 row)

RDS for PostgreSQL 的資料表空間

RDS for PostgreSQL 支援資料表空間以實現相容性。因為所有儲存區都位於單一邏輯磁碟區上,所以您無法使用資料表空間進行輸入/輸出分割或隔離。我們的基準和經驗指出,單一邏輯磁碟區是多數使用案例的最佳設定。

若要建立資料表空間並搭配 RDS for PostgreSQL 資料庫執行個體一起使用,需要 rds_superuser 角色。RDS for PostgreSQL 資料庫執行個體的主使用者帳戶 (預設名稱 postgres) 是此角色的成員。如需更多詳細資訊,請參閱 了解 PostgreSQL 角色和許可

如果您在建立資料表空間時指定檔案名稱,路徑前綴為 /rdsdbdata/db/base/tablespace。以下範例會將資料表空間檔案置於 /rdsdbdata/db/base/tablespace/data 中。此範例假設 dbadmin 使用者 (角色) 存在,且已獲派處理資料表空間所需的 rds_superuser 角色。

postgres=> CREATE TABLESPACE act_data OWNER dbadmin LOCATION '/data'; CREATE TABLESPACE

若要進一步了解 PostgreSQL 資料表空間,請參閱 PostgreSQL 說明文件中的資料表空間

適用於 EBCDIC 和其他大型機遷移的 RDS for PostgreSQL 定序

RDS for PostgreSQL 10 版及更高版本包括基於 Unicode 10.0 的 ICU 版本 60.2,其中包含來自 Unicode 通用語言環境資料儲存庫 (CLDR 32) 的定序。這些軟體國際化程式庫可確保字元編碼以一致的方式呈現,不論作業系統或平台為何。如需 Unicode CLDR-32 的詳細資訊,請參閱 Unicode CLDR 網站上的 CLDR 32 版本備註。您可以在 ICU Technical Committee (ICU-TC) 網站了解有關 Unicode (ICU) 的國際化元件的更多資訊。如需有關 ICU-60 的資訊,請參閱下載 ICU 60

從 14.3 版開始,RDS for PostgreSQL 也包含有助於從 EBCDC 系統進行資料整合和轉換的定序。擴展的二進制編碼十進制交換碼或 EBCDIC 編碼通常由大型機作業系統使用。這些 Amazon RDS 提供的定序定義很小,只能夠直接對應至 EBCDIC 字碼頁的 Unicode 字元。這些字元按 EBCDIC 代碼點順序進行排序,以便在轉換後進行資料驗證。這些定序不包含部正常的格式,也不包含未直接對應至來源 EBCDIC 字碼頁的 Unicode 字元。

EBCDIC 字碼頁與 Unicode 字碼點之間的字元對應是以 IBM 發佈的表格為基礎。完整的設定可從 IBM 的壓縮檔案下載。RDS for PostgreSQL 會將這些對應與 ICU 提供的工具搭配使用,以建立本節中表格中列出的定序。定序名稱包括 ICU 要求的語言和國家/地區。但是,EBCDIC 字碼頁不會指定語言,有些 EBCDIC 字碼頁涵蓋多個國家/地區。這表示資料表中定序名稱的語言和國家/地區部分是任意的,而且不需要與目前的地區設定相符。換句話說,字碼頁編號是此表格中定序名稱最重要的部分。您可以在任何 RDS for PostgreSQL 資料庫中使用下列表格中列出的任何定序。

  • Unicode to EBCDIC collations table - 部分大型主機資料移轉工具在內部使用 LATIN1 或 LATIN9 來編碼及處理資料。這類工具使用往返結構描述來保留資料完整性並支援反向轉換。此資料表中的定序可以由使用 LATIN1 編碼來處理資料的工具使用,這不需要特殊處理。

  • Unicode to LATIN9 collations table - 您可以在任何 RDS for PostgreSQL 資料庫中使用這些定序。

在下表中,您會發現 RDS 版 PostgreSQL 中可用的定序,這些定序會將 EBCDIC 字碼頁對應至 Unicode 字碼點。我們建議您使用此表格中的定序來進行應用程式開發,這些應用程式開發需要根據 IBM 字碼頁的順序進行排序。

PostgreSQL 定序名稱 字碼頁對應和排序順序的說明

da-DK-cp277-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 277 (每個轉換表) 按照 IMB CP 277 字碼點順序排序

de-DE-cp273-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 273 (每個轉換表) 按照 IMB CP 273 字碼點順序排序

en-GB-cp285-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 285 (每個轉換表) 按照 IMB CP 285 字碼點順序排序

en-US-cp037-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 037 (每個轉換表) 按照 IMB CP 37 字碼點順序排序

es-ES-cp284-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 284 (每個轉換表) 按照 IMB CP 284 字碼點順序排序

fi-FI-cp278-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 278 (每個轉換表) 按照 IMB CP 278 字碼點順序排序

fr-FR-cp297-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 297 (每個轉換表) 按照 IMB CP 297 字碼點順序排序

it-IT-cp280-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 280 (每個轉換表) 按照 IMB CP 280 字碼點順序排序

nl-BE-cp500-x-icu

Unicode 字元直接對應至 IBM EBCDIC 字碼頁 500 (每個轉換表) 按照 IMB CP 500 字碼點順序排序

Amazon RDS 提供一組額外的定序,可根據來源資料的 EBCDIC 字碼頁,使用 IBM 發佈的表格,依原始程式碼點的順序,對應至 LATIN9 字元的 Unicode 程式碼點進行排序。

PostgreSQL 定序名稱 字碼頁對應排序順序的說明

da-DK-cp1142m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1142 (每個轉換表) 按照 IMB CP 1142 字碼點順序排序

de-DE-cp1141m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1141 (每個轉換表) 按照 IMB CP 1141 字碼點順序排序

en-GB-cp1146m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1146 (每個轉換表) 按照 IMB CP 1146 字碼點順序排序

en-US-cp1140m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1140 (每個轉換表) 按照 IMB CP 1140 字碼點順序排序

es-ES-cp1145m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1145 (每個轉換表) 按照 IMB CP 1145 字碼點順序排序

fi-FI-cp1143m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1143 (每個轉換表) 按照 IMB CP 1143 字碼點順序排序

fr-FR-cp1147m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1147 (每個轉換表) 按照 IMB CP 1147 字碼點順序排序

it-IT-cp1144m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1144 (每個轉換表) 按照 IMB CP 1144 字碼點順序排序

nl-BE-cp1148m-x-icu

Unicode 字元對應至 LATIN9 字元,原始轉換自 IBM EBCDIC 字碼頁 1148 (每個轉換表) 按照 IMB CP 1148 字碼點順序排序

在下列各項中,您可以找到使用 RDS for PostgreSQL 定序的範例。

db1=> SELECT pg_import_system_collations('pg_catalog'); pg_import_system_collations ----------------------------- 36 db1=> SELECT '¤' < 'a' col1; col1 ------ t db1=> SELECT '¤' < 'a' COLLATE "da-DK-cp277-x-icu" col1; col1 ------ f

我們建議您使用 Unicode to EBCDIC collations table 中的定序並在 Unicode to LATIN9 collations table 中用於需要根據 IBM 字碼頁排序進行排序的應用程式開發。下列定序 (後綴為字母「b」) 也可以在 pg_collation 中看見,但適用於以下位置的大型主機資料整合和移轉工具,AWS 對應具有特定字碼點位移的字碼頁,並且需要在定序中進行特殊處理。換言之,不建議使用下列定序。

  • da-DK-277b-x-icu

  • da-DK-1142b-x-icu

  • de-DE-cp273b-x-icu

  • de-DE-cp1141b-x-icu

  • en-GB-cp1146b-x-icu

  • en-GB-cp285b-x-icu

  • en-US-cp037b-x-icu

  • en-US-cp1140b-x-icu

  • es-ES-cp1145b-x-icu

  • es-ES-cp284b-x-icu

  • fi-FI-cp1143b-x-icu

  • fr-FR-cp1147b-x-icu

  • fr-FR-cp297b-x-icu

  • it-IT-cp1144b-x-icu

  • it-IT-cp280b-x-icu

  • nl-BE-cp1148b-x-icu

  • nl-BE-cp500b-x-icu

若要深入了解如何將應用程式從大型主機環境移轉至 AWS,請參閱什麼是 AWS 大型機現代化?

若要進一步了解管理 PostgreSQL 中的定序,請參閱 PostgreSQL 文件中的定序支援