このトピックでは、PolarDB for PostgreSQL のフラッシュバックテーブル機能について説明します。
前提条件
この機能は、PostgreSQL 11 (リビジョンバージョン1.1.22以降) のバージョンを実行するPolarDB for PostgreSQL クラスターでサポートされています。
次のステートメントを実行して、PolarDB for PostgreSQL のリビジョンバージョンを照会できます。
show polar_version;
概要
Flashbackテーブル
フラッシュバックテーブル機能は、ページスナップショットをフラッシュバックログに定期的に保存し、トランザクション情報を高速復旧領域に保持します。 これにより、特定の時点のテーブルデータを新しいテーブルに復元できます。
構文
FLASHBACK TABLE
[ schema. ]table
TO TIMESTAMP expr;
パラメーター
パラメーター | Parameters |
[ schema. ]table | フラッシュバックされるテーブルの名前。 |
expr | テーブルがフラッシュバックされる時刻。 |
例
テスト用のデータを準備します。
test
テーブルを作成し、データを挿入します。CREATE TABLE test(id int); INSERT INTO test select * FROM generate_series(1, 10000);
test
テーブルの行の総数を照会します。SELECT count (1) FROM test;
サンプル結果:
count ------- 10000 (1 row)
id
値を合計します。SELECT sum(id) FROM test;
サンプル結果:
sum ---------- 50005000 (1 row)
10秒待ってから、
test
テーブルのデータを削除します。SELECT pg_sleep(10); DELETE FROM test;
削除された
test
テーブルを照会します。SELECT * FROM test;
サンプル結果:
id ---- (0 rows)
test
テーブルのデータを10秒前のデータにフラッシュバックします。FLASHBACK TABLE test TO TIMESTAMP now() - interval'10s';
サンプル結果:
NOTICE: Flashback the relation test to new relation polar_flashback_65566, please check the data FLASHBACK TABLE
フラッシュバック後にテーブルデータを照会します。
フラッシュバック後のテーブルの合計行数を照会します。
SELECT count (1) FROM polar_flashback_65566;
サンプル結果:
count ------- 10000 (1 row)
フラッシュバック後に
id
値を合計します。SELECT sum(id) FROM polar_flashback_65566;
サンプル結果:
sum ---------- 50005000 (1 row)
使用法
フラッシュバックテーブル機能を有効にする前に、polar_enable_flashback_log
パラメーターをONに設定してフラッシュバックロギング機能を有効にし、polar_enable_fast_recovery_area
パラメーターをONに設定して高速復旧エリア機能を有効にし、クラスターを再起動する必要があります。 また、ビジネス要件に基づいて他のパラメーターを変更する必要があります。 一度にパラメーターを変更し、オフピーク時にクラスターを再起動することを推奨します。 フラッシュバックテーブル機能を有効にすると、メモリとディスクの使用量が増加し、パフォーマンスが低下する可能性があります。 機能を使用する前に、ビジネスに対する機能の影響を徹底的に評価することをお勧めします。
メモリ使用量
フラッシュバックロギング機能を有効にすると、共有メモリの増加には以下が含まれます。
polar_flashback_log_buffers
* 8 KBpolar_flashback_logindex_mem_size
MBpolar_flashback_logindex_queue_buffers
MB
高速リカバリ領域を有効にすると、共有メモリのサイズは約32 KB増加します。 パラメーターを変更する前に、現在のクラスターステータスを確認してください。
ディスク使用率
テーブルデータを特定の時点にフラッシュバックするには、フラッシュバックログとWALログ、およびこれらのログに対応するLogIndexファイルを保持する必要があり、その結果、追加のディスクスペースが必要になります。 理論的には、polar_fast_recovery_area_rotation
の値が大きいほど、ディスクスペースが占有されます。 たとえば、polar_fast_recovery_area_rotation
を300
に設定すると、5時間の履歴データが保存されます。
フラッシュバックロギング機能を有効にすると、フラッシュバックポイントが定期的に作成されます。 フラッシュバックポイントはチェックポイントの一種です。 チェックポイントがトリガーされると、polar_flashback_point_segments
パラメーターとpolar_flashback_point_timeout
パラメーターがチェックされ、現在のチェックポイントがフラッシュバックポイントかどうかが判断されます。 次のパラメーターをこの方法で設定することを推奨します。
polar_flashback_point_segments
値をmax_wal_size
値の倍数に設定します。polar_flashback_point_timeout
値をcheckpoint_timeout
値の倍数に設定します。
たとえば、5時間で20 GBのWALログが生成され、フラッシュバックログとWALログの比率が約1:20の場合、約1 GBのフラッシュバックログが生成されます。 フラッシュバックログとWALログの比率は、次の要因によって異なります。
ビジネスモデルでは、書き込み操作の数はフラッシュバックログの数に比例します。
polar_flashback_point_segments
およびpolar_flashback_point_timeout
パラメーター値が大きいほど、生成されるフラッシュバックログは少なくなります。
パフォーマンス低下
フラッシュバックログ機能では、フラッシュバックログを使用するためにさらに2つのバックグラウンドプロセスが必要です。 これは必然的にCPUオーバーヘッドを増加させる。 CPUオーバーヘッドを削減するには、polar_flashback_log_bgwrite_delay
およびpolar_flashback_log_insert_list_delay
パラメーターを調整して、2つのバックグラウンドプロセスのアクティビティラウンド間のレイテンシを長く設定します。 しかし、これは性能を低下させる可能性がある。 2つのパラメーターのデフォルト値を使用することを推奨します。
フラッシュバックログ機能を有効にすると、フラッシュバックログの損失を防ぐために、ページのフラッシュの前にフラッシュバックログのフラッシュが行われます。 これは、性能低下を引き起こし得る。 ほとんどのシナリオでのパフォーマンス低下は5% 未満です。
テーブルがフラッシュバックされると、テーブルに関連するページが共有メモリプールにスワップインおよびスワップアウトされます。 これにより、他のデータベースのアクセスパフォーマンスにジッタが発生する可能性があります。
制限
フラッシュバックテーブル機能は、既存のテーブルのデータをpolar_flashback_Existing table OID
という名前の新しいテーブルに復元します。 FLASHBACK TABLE
ステートメントの実行後、次のNOTICE
が表示されます。
flashback table test to timestamp now() - interval '1h'; NOTICE: Flashback the relation test to new relation polar_flashback_54986, please check the data FLASHBACK TABLE
polar_flashback_54986
テーブルは、フラッシュバックによって作成される一時的なテーブルです。 指定された時点にテーブルデータのみが復元されます。フラッシュバックテーブル機能は、共通テーブルのみを復元できますが、次のデータベースオブジェクトは復元できません。
インデックス
トーストテーブル
具体化されたビュー
パーティション分割されたテーブル
子分割テーブル
システムテーブル
外国のテーブル
子トーストテーブルを含むテーブル
指定した時刻から現在の時刻まで、次のDDLステートメントを実行したテーブルをフラッシュバックすることはできません。
DROP TABLE
ALTER TABLE SET WITH OIDS
ALTER TABLE SET WITHOUT OIDS
TRUNCATE TABLE
列のデータ型を変更します。 変更前後の型は暗黙的に変換できず、
USING
句にはセキュリティで保護された強制変換用の他の値は含まれません。テーブルを
UNLOGGED
またはLOGGED
に変更します。IDENTITY
として列を追加します。限られたデータ型しか選択できない列を追加します。
デフォルト値の式にvolatile関数が含まれる列を追加します。
説明PolarDB for PostgreSQL のドロップフラッシュバック機能を使用して、
DROP TABLE
操作をフラッシュバックできます。
提案
テーブルデータを誤って削除した場合は、監査ログから操作時間をすばやく検出し、フラッシュバックログを使用して操作前の時点にテーブルデータを復元することをお勧めします。 テーブルフラッシュバック中、排他的ロックがテーブル上に保持される。 したがって、クエリできるのはテーブル内のデータのみです。 テーブルがフラッシュバックされると、テーブルに関連するページが共有メモリプールにスワップインおよびスワップアウトされます。 これにより、他のデータベースのアクセスパフォーマンスにジッタが発生する可能性があります。 そのため、オフピーク時にフラッシュバック操作を実行することを推奨します。
フラッシュバック速度は、テーブルのサイズに関連しています。 テーブルサイズが大きい場合は、polar_workers_per_flashback_table
パラメーターの値を大きくして、並列フラッシュバックのワーカーの数を増やすことができます。 これにより、フラッシュバック動作の速度が向上する。
テーブルフラッシュバック操作が完了したら、テーブルのデータを照会し、NOTICE
情報に基づいて元のテーブルとデータを比較できます。 フラッシュバック操作ではインデックスは作成されません。 クエリ要件に基づいてインデックスを作成できます。 2つのテーブルのデータの比較が完了した後、欠落しているデータを元のテーブルに送り返すことができます。
Parameters
パラメーター | 説明 |
polar_enable_flashback_log | フラッシュバックログを有効にするかどうかを指定します。 デフォルト値:off 有効な値:
説明 このパラメータに対する変更は、 |
polar_enable_fast_recovery_area | 高速リカバリエリアを有効にするかどうかを指定します。 デフォルト値:off 有効な値:
説明 このパラメータに対する変更は、 |
polar_flashback_log_keep_segments | フラッシュバックログに保持されているファイルの数。 有効値: 3 ~ 2147483647 デフォルト値: 8。 説明
|
polar_fast_recovery_area_rotation | トランザクション情報を高速リカバリエリアに保持できる期間。 単位は分です。 有効な値: 1 ~ 14400 デフォルト値: 180 説明 このパラメータに対する変更は、 |
polar_flashback_point_segments | 2つのフラッシュバック時点間のWALログの最小数。 各WALログのサイズは1 GBです。 有効な値: 1 ~ 2147483647 デフォルト値: 16。 説明 このパラメータに対する変更は、 |
polar_flashback_point_timeout | 2つのフラッシュバック間の最小時間間隔。 単位は秒です。 有効な値: 1 ~ 86400 既定値:300 説明 このパラメータに対する変更は、 |
polar_flashback_log_buffers | フラッシュバックログの共有メモリのサイズ。 (単位:KB) 有効値: 4 ~ 262144 デフォルト値:2048。 説明 このパラメーターの変更は、設定ファイルが変更され、クラスターが再起動された後に有効になります。 |
polar_flashback_logindex_mem_size | フラッシュバックログインデックスの共有メモリのサイズ。 単位:MB。 有効値: 3 ~ 1073741823 デフォルト値: 64。 説明 このパラメーターの変更は、設定ファイルが変更され、クラスターが再起動された後に有効になります。 |
polar_flashback_logindex_bloom_blocks | フラッシュバックログインデックスのBloomフィルターページの数。 有効値: 8 ~ 1073741823 デフォルト値: 512 説明 このパラメーターの変更は、設定ファイルが変更され、クラスターが再起動された後に有効になります。 |
polar_flashback_log_insert_locks | フラッシュバックログ挿入ロックの数。 有効な値: 1 ~ 2147483647 デフォルト値: 8。 説明 このパラメーターの変更は、設定ファイルが変更され、クラスターが再起動された後に有効になります。 |
polar_workers_per_flashback_table | 並列テーブルフラッシュバックに含まれるテーブルの数。 有効値: 0~1024。 デフォルト値:5 説明
|
polar_flashback_log_bgwrite_delay | bgwriterプロセスのアクティビティラウンド間のレイテンシ。 単位:ミリ秒。 有効な値: 1 ~ 10000 デフォルト値:100 説明 このパラメータに対する変更は、 |
polar_flashback_log_flush_max_size | bgwriterプロセスがログをディスクにフラッシュするたびに許可されるログサイズ。 (単位:KB) 有効な値: 0 ~ 2097152 デフォルト値: 5120 説明
|
polar_flashback_log_insert_list_delay | bginserterプロセスのアクティビティラウンド間のレイテンシ。 単位:ミリ秒。 有効な値: 1 ~ 10000 デフォルト値: 10 説明 このパラメータに対する変更は、 |
polar_flashback_log_size_limit | フラッシュバックログの最大サイズ。 有効な値: 0 ~ 2147483647 デフォルト値: 20480 フラッシュバックログのサイズが指定された値を超えると、フラッシュバックログのリサイクルがトリガーされます。 値0は、フラッシュバックログのサイズが無制限であることを示します。 |