本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Aurora PostgreSQL 中使用未記錄的資料表
Amazon Aurora PostgreSQL 支援當機保護的未記錄資料表,即使在寫入器執行個體故障或容錯移轉之後也能維持資料完整性。在標準 PostgreSQL 中,未記錄的資料表會在寫入操作期間略過預寫日誌 (WAL),進而加快寫入速度。不過,這會導致耐久性降低,因為未記錄的資料表不防當機,而且可能會在系統故障或不正常的關機後遺失資料。這些未記錄的資料表會在當機或不正常的關機後自動截斷。它們的內容和索引也不會複寫到待命伺服器。
相反地,由於 Aurora PostgreSQL 的分散式儲存架構,因此會以不同的方式處理未記錄的資料表。這是因為 Aurora 的儲存系統不依賴傳統的 PostgreSQL WAL 來提供耐久性。不過,在標準 PostgreSQL 中,通常與未記錄資料表相關的效能優勢在 Aurora 中可能不那麼重要。這是因為 Aurora 的分散式儲存架構,相較於標準 PostgreSQL 中使用的本機儲存,可能會帶來額外的額外負荷。
在 Aurora PostgreSQL 中使用未記錄的資料表時,請考慮下列事項:
-
您只能從 Aurora 資料庫叢集中的寫入器節點存取未記錄的資料表。
-
只有在提升為寫入器狀態時,讀取器節點才能存取未記錄的資料表。
-
當您嘗試從讀取器節點存取未記錄的資料表時,將導致下列錯誤:
cannot access temporary or unlogged relations during recovery.
建立未記錄的資料表
若要在 Aurora PostgreSQL 中建立未記錄的資料表,請在 CREATE TABLE 陳述式中新增 UNLOGGED 關鍵字:
CREATE UNLOGGED TABLE staging_sales_data ( transaction_id bigint, customer_id bigint, product_id bigint, transaction_date date, amount NUMERIC );
在遷移期間處理未記錄的資料表
準備將資料遷移至 Aurora PostgreSQL 時,請務必適當地識別和處理未記錄的資料表。未記錄的資料表不會進行 WAL 記錄,而且會從複寫串流中排除,這表示它們不會複寫至 Aurora 僅供讀取複本。
在建立 Aurora 僅供讀取複本之前,如果尚未使用,請將未記錄的資料表轉換為已記錄的資料表或捨棄它們。
若要確認執行個體內每個資料庫中是否存在未記錄的資料表,請使用下列命令:
SELECT oid, relfilenode, relname, relpersistence, relkind FROM pg_class WHERE relpersistence ='u';
若要將未記錄的資料表轉換回記錄的資料表,請使用下列命令:
ALTER TABLEtable_nameSET LOGGED;
此操作會重寫整個資料表,並在其上放置獨佔鎖定,直到完成為止。對於大型資料表,這可能會導致大量停機時間。
將未記錄的資料表轉換為已記錄的資料表
當您需要將未記錄的資料表轉換回記錄的資料表時,您可以使用下列命令:
ALTER TABLEtable_nameSET LOGGED;
此操作會重寫整個資料表,並在其上放置獨佔鎖定,直到操作完成為止。對於大型資料表,這可能會導致大量的停機時間。
未記錄的資料表和邏輯複寫
邏輯複寫通常不包含未記錄的資料表,因為邏輯複寫依賴 WAL 來擷取和傳輸變更。根據預設,未記錄資料表的變更不會進行 WAL 記錄,且會從複寫串流中排除,因此不適合需要邏輯複寫的使用案例。不過,Aurora PostgreSQL 提供名為 rds.logically_replicate_unlogged_tables 的參數,可讓您控制此行為:
-
當
rds.logically_replicate_unlogged_tables設為 0 (關閉) 時,未記錄的資料表會從邏輯複寫中排除。 -
當
rds.logically_replicate_unlogged_tables設為 1 (開啟) 時,未記錄的資料表會包含在邏輯複寫中。
注意
在 Aurora PostgreSQL 中,rds.logically_replicate_unlogged_tables 參數預設為版本 14 和更早版本中的 1 (開啟),以及版本 15 和更新版本中的 0 (關閉)。