本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
搭配 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 的更多資訊,請參閱上的章節
注意
RDS for PostgreSQL 不支援 utl_file
套件,該套件屬於 Orafce 擴充功能的一部分。這是因為 utl_file
結構描述函式雖能夠在作業系統的文字檔上進行讀取及寫入操作,但必須擁有基礎主機的超級使用者存取權,才能執行此類操作。RDS for PostgreSQL 為受管服務,不提供主機存取權。
使用 Orafce 擴充功能
使用您用來建立資料庫執行個體的主要使用者名稱,來連線至資料庫執行個體。
如果您想要在相同的資料庫執行個體中為不同的資料庫開啟 Orafce,請使用
/c dbname
psql 命令。使用此命令,您可以在啟動連線後從主要資料庫進行變更。使用
CREATE EXTENSION
陳述式開啟 Orafce 擴充功能。CREATE EXTENSION orafce;
使用
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_replication
和 track_commit_timestamp
,並將 wal_level
的值設定為 logical
。
您必須具有做為 rds_superuser
角色的許可,才能執行這些任務。
您可以使用 AWS Management Console 或 AWS CLI 來建立所需的 RDS 資 PostgreSQL 執行個體。下列步驟假設您的 RDS for PostgreSQL 資料庫執行個體與自訂資料庫參數群組相關聯。如需建立自訂資料庫參數群組的相關資訊,請參閱 使用參數群組。
若要初始化 pgactive 延伸模組功能
登入 AWS Management Console 並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/
。 -
在導覽窗格中,選擇您的 RDS for PostgreSQL 資料庫執行個體。
-
針對您的 RDS for PostgreSQL 資料庫執行個體開啟組態索引標籤。在執行個體詳細資訊中,找到資料庫執行個體參數群組連結。
-
選擇連結以開啟與您的 RDS for PostgreSQL 資料庫執行個體相關聯的自訂參數。
找到
rds.enable_pgactive
參數,並將其設定為1
以初始化pgactive
功能。選擇儲存變更。
從 Amazon RDS 主控台的導覽窗格中,選擇資料庫。
選取您的 RDS for PostgreSQL 資料庫執行個體,然後從動作選單中選擇重新開機。
確認資料庫執行個體重新開機,以讓您的變更生效。
當資料庫執行個體可用時,您可以使用
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
若要驗證 pgactive 是否已初始化,請執行下列命令。
postgres=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
如果
pgactive
在shared_preload_libraries
中,則上述命令將傳回以下內容:?column? ---------- t
建立延伸模組,如下所示。
postgres=>
CREATE EXTENSION pgactive;
若要初始化 pgactive 延伸模組功能
若要pgactive
使用初始化 AWS CLI,請呼叫修改-db-參數群組作業來修改自訂參數群組中的某些參數,如下列程序所示。
使用下列 AWS CLI 命令將設定
rds.enable_pgactive
1
為初始化適用於 PostgreSQL 資料庫執行個體的pgactive
功能。postgres=>
aws rds modify-db-parameter-group \ --db-parameter-group-namecustom-param-group-name
\ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --regionaws-region
-
使用下列 AWS CLI 命令將 RDS for PostgreSQL 資料庫執行個體重新開機,以便初始化程式
pgactive
庫。aws rds reboot-db-instance \ --db-instance-identifier
your-instance
\ --regionaws-region
當執行個體可用時,請使用
psql
連線至 RDS for PostgreSQL 資料庫執行個體。。psql --host=
mydb.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master user
--password --dbname=postgres
建立延伸模組,如下所示。
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
延伸模組所需的其他步驟。
使用
psql
或其他用戶端工具連線至您的第一個 RDS for PostgreSQL 資料庫執行個體。psql --host=
firstinstance.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
使用下列命令在 RDS for PostgreSQL 執行個體上建立資料庫:
postgres=>
CREATE DATABASEapp
;使用下列命令將連線切換至新資料庫:
\c
app
若要檢查
shared_preload_libraries
參數是否包含pgactive
,請執行下列命令:app=>
SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';?column? ---------- t
-
使用下列 SQL 陳述式建立並填入範例資料表:
使用下列 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);使用下列 SQL 陳述式在資料表中填入一些範例資料。
app=>
INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');使用下列 SQL 陳述式,驗證資料是否存在於資料表中。
app=>
SELECT count(*) FROM inventory.products;count ------- 3
在現有資料庫上建立
pgactive
延伸模組。app=>
CREATE EXTENSION pgactive;使用下列命令建立並初始化 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
以將它開啟。若要檢查資料庫執行個體是否已就緒,請使用下列命令:
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 延伸模組功能。
使用
psql
來連線至您想要從發佈者接收更新的執行個體。psql --host=
secondinstance.111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=master username
--password --dbname=postgres
使用下列命令在第二個 RDS for PostgreSQL 資料庫執行個體上建立資料庫:
postgres=>
CREATE DATABASEapp
;使用下列命令將連線切換至新資料庫:
\c
app
在現有資料庫上建立
pgactive
延伸模組。app=>
CREATE EXTENSION pgactive;將 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
群組中的節點。若要檢查資料庫執行個體是否已就緒,請使用下列命令:
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
會在兩個資料庫執行個體之間同步資料。您可以使用下列命令來驗證第二個資料庫執行個體的資料庫是否有資料:
app=>
SELECT count(*) FROM inventory.products;如果資料已成功同步,您會看到下列輸出內容:
count ------- 3
執行下列命令以插入新值:
app=>
INSERT INTO inventory.products (id, product_name) VALUES ('lotion');連線至第一個資料庫執行個體的資料庫,然後執行下列查詢:
app=>
SELECT count(*) FROM inventory.products;如果主動-主動式複寫已初始化,則會輸出類似下列內容:
count ------- 4
從 pgactive
群組卸離並移除資料庫執行個體
您可以利用下列步驟將資料庫執行個體從 pgactive
群組卸離並移除:
您可以使用下列命令將第二個資料庫執行個體從第一個資料庫執行個體卸離:
app=>
SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app
']);使用下列命令從第二個資料庫執行個體移除
pgactive
延伸模組:app=>
SELECT * FROM pgactive.pgactive_remove();若要強制移除延伸模組:
app=>
SELECT * FROM pgactive.pgactive_remove(true);使用以下命令刪除延伸模組:
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
擴充功能
-
執行以下命令,在 RDS for PostgreSQL 資料庫執行個體上安裝
pg_repack
擴充功能。CREATE EXTENSION pg_repack;
-
執行下列命令,以授與寫入存取權給由建立的暫存記錄資料表
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;
使用用
pg_repack
戶端公用程式 Connect 至資料庫。使用具有rds_superuser
權限的帳戶。舉例來說,假設rds_test
角色具有rds_superuser
權限。下列語法會pg_repack
針對包含資料庫中所有資料表索引的完整postgres
資料表執行。pg_repack -h
db-instance-name
.111122223333.aws-region
.rds.amazonaws.com -Urds_test
-kpostgres
注意
您必須使用-k 選項進行連線。不支援 -a 選項。
pg_repack
用戶端的回應會提供重新封裝之資料庫執行個體上資料表的相關資訊。INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"
-
下面的語法重新包
orders
括postgres
數據庫中的索引的單個表。pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U
rds_test
--tableorders
-kpostgres
下列語法只會重新填寫
postgres
資料庫中資料orders
表的索引。pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U
rds_test
--tableorders
--only-indexes -kpostgres
在重新裝箱期間監控新表
數據庫的大小增加了表的總大小減去膨脹,直到重新包裝的 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
升級程序會捨棄您現有的所有 PLV8 函數。因此,我們建議您在升級之前建立 RDS for PostgreSQL 資料庫執行個體的快照。如需詳細資訊,請參閱 為單一可用區資料庫執行個體建立資料庫快照。
如何同步目錄中繼資料與新版 PLV8
-
確認您需要更新。若要執行此動作,請在已連接至執行個體的情況下,執行下列命令。
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)
如果您尚未建立 RDS for PostgreSQL 資料庫執行個體的快照,請建立一個。建立快照時,您可以繼續執行下列步驟。
-
取得資料庫執行個體中的 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');
-
使用 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
。 -
-
擷取傾印檔案中存在的「CREATE FUNCTION」DDL 陳述式。下列範例使用
grep
命令擷取用於建立函數並儲存到檔案中的 DDL 陳述式。您將於後續步驟中使用此 ddl 來重新建立函數。./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list/
如需有關 pg_restore 的詳細資訊,請參閱 PostgreSQL 文件中的 pg_restore
。 -
捨棄函數和擴充功能。下列範例會捨棄任何以 PLV8 為基礎的物件。cascade 選項可確保捨棄任何相依物件。
DROP EXTENSION plv8 CASCADE;
如果 PostgreSQL 執行個體包含以 plcoffee 或 plls 為基礎的物件,請對這些擴充功能重複此步驟。
-
建立擴充功能。下列範例會建立 plv8、plcoffee 和 plls 擴充功能。
CREATE EXTENSION plv8; CREATE EXTENSION plcoffee; CREATE EXTENSION plls;
-
使用傾印檔案和「驅動程式」檔案建立函數。
下列範例會重新建立您先前擷取的函數。
./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
-
使用以下查詢驗證是否已重新建立所有函數。
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
設定 PL/Rust
若要在資料庫執行個體上安裝 plrust 延伸模組,請將 plrust 新增至與資料庫執行個體相關聯之資料庫參數群組中的 shared_preload_libraries
參數。安裝 plrust 延伸模組後,您可以建立函數。
若要修改 shared_preload_libraries
參數,您的資料庫執行個體必須與自訂參數群組相關聯。如需建立自訂資料庫參數群組的相關資訊,請參閱 使用參數群組。
您可以使用 AWS Management Console 或安裝擴充套件。 AWS CLI
下列步驟假設您的資料庫執行個體與自訂資料庫參數群組相關聯。
在 shared_preload_libraries
參數中安裝 plrust 延伸模組
使用屬於 rds_superuser
群組 (角色) 成員的帳戶完成下列步驟。
登入 AWS Management Console 並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/
。 -
在導覽窗格中,選擇 Databases (資料庫)。
-
選擇資料庫執行個體的名稱以顯示其詳細資訊。
-
開啟資料庫執行個體的組態索引標籤,然後尋找資料庫執行個體參數群組連結。
-
選擇連結以開啟與資料庫執行個體相關聯的自訂參數。
-
在 Parameters (參數) 搜尋欄位中,輸入
shared_pre
以尋找shared_preload_libraries
參數。 -
選擇 Edit parameters (編輯參數) 以存取屬性值。
-
在值欄位中,將 plrust 新增至清單。使用逗號區隔值清單中的項目。
重新啟動資料庫執行個體,以便您對
shared_preload_libraries
參數的變更生效。初始重新啟動可能需要額外的時間才能完成。當執行個體可用時,請驗證 plrust 是否已初始化。使用
psql
連線至資料庫執行個體,然後執行下列命令。SHOW shared_preload_libraries;
您的輸出應該類似以下內容:
shared_preload_libraries -------------------------- rdsutils,plrust (1 row)
在 shared_preload_libraries 參數中安裝 plrust 延伸模組
使用屬於 rds_superuser
群組 (角色) 成員的帳戶完成下列步驟。
使用「修改-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" \ --regionaws-region
-
使用重新啟動 db-instance AWS CLI 指令重新啟動資料庫執行個體,並初始化 plrust 程式庫。初始重新啟動可能需要額外的時間才能完成。
aws rds reboot-db-instance \ --db-instance-identifier
your-instance
\ --regionaws-region
當執行個體可用時,您可以驗證 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
使用相依性
PL/Rust 限制
根據預設,資料庫使用者無法使用 PL/Rust。若要提供 PL/Rust 的存取權,請以具有 rds_superuser 權限的使用者身分連線,然後執行下列命令:
postgres=> GRANT USAGE ON LANGUAGE PLRUST TO
user
;