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

在遷移期間處理未記錄的資料表

準備將資料遷移至 Aurora PostgreSQL 時,請務必適當地識別和處理未記錄的資料表。未記錄的資料表不會進行 WAL 記錄,而且會從複寫串流中排除,這表示它們不會複寫至 Aurora 僅供讀取複本。

在建立 Aurora 僅供讀取複本之前,如果尚未使用,請將未記錄的資料表轉換為已記錄的資料表或捨棄它們。

若要確認執行個體內每個資料庫中是否存在未記錄的資料表,請使用下列命令:

SELECT oid, relfilenode, relname, relpersistence, relkind FROM pg_class WHERE relpersistence ='u';

若要將未記錄的資料表轉換回記錄的資料表,請使用下列命令:

ALTER TABLE table_name SET LOGGED;

此操作會重寫整個資料表,並在其上放置獨佔鎖定,直到完成為止。對於大型資料表,這可能會導致大量停機時間。

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

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

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 (關閉)。