在 Aurora PostgreSQL 中使用未記錄的資料表 - Amazon Aurora

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

在 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 );

將未記錄的資料表轉換為已記錄的資料表

當您需要將未記錄的資料表轉換為已記錄的資料表時,您可以使用下列命令:

ALTER TABLE table_name SET 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 (關閉)。