Aurora PostgreSQL でログに記録されないテーブルを使用する - Amazon Aurora

Aurora PostgreSQL でログに記録されないテーブルを使用する

Amazon Aurora PostgreSQL は、クラッシュセーフで、ライターインスタンスの障害やフェイルオーバーの後でもデータの整合性を維持する、ログに記録されないテーブルをサポートしています。標準の PostgreSQL では、ログに記録されないテーブルは書き込みオペレーション中に先行書き込みログ (WAL) をバイパスするため、書き込み速度が向上します。ただし、これには耐久性の低下というコストが伴います。ログに記録されないテーブルはクラッシュセーフではなく、システム障害やクリーンでないシャットダウンの後にデータが失われる可能性があるためです。このようなログに記録されないテーブルは、クラッシュやクリーンでないシャットダウンの後に自動的に切り捨てられます。その内容とインデックスもスタンバイサーバーにレプリケートされません。

一方、Aurora PostgreSQL は、分散ストレージアーキテクチャにより、ログに記録されないテーブルを異なる方法で処理します。Aurora のストレージシステムは、耐久性を確保するために、従来の PostgreSQL WAL に依存していないことがその理由です。ただし、ログに記録されないテーブルに関連して標準の PostgreSQL で通常得られるパフォーマンス上の利点は、Aurora ではそれほど大きくない場合もあります。これは、Aurora の分散ストレージアーキテクチャが原因です。分散ストレージアーキテクチャでは、標準の PostgreSQL で使用されるローカルストレージと比較して、オーバーヘッドが大きくなる可能性があります。

Aurora PostgreSQL でログに記録されないテーブルを使用する際には、次の点を考慮してください。

  • ログに記録されないテーブルには、Aurora DB クラスターのライターノードからのみアクセスできます。

  • リーダーノードは、ライターステータスに昇格された場合にのみ、ログに記録されないテーブルにアクセスできます。

  • ログに記録されないテーブルにリーダーノードからアクセスしようとすると、次のエラーが発生します。

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

ログに記録されないテーブルと論理レプリケーション

論理レプリケーションでは 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 (オフ) にデフォルトで設定されます。