すべてのプロダクト
Search
ドキュメントセンター

PolarDB:フラッシュバックを落とす

最終更新日:Jun 21, 2024

PolarDB for PostgreSQLはアンドゥログを提供しません。 偶発的な操作により、データが失われる可能性があります。 たとえば、DROP TABLEステートメントの実行後にデータが失われる可能性があります。 PolarDB for PostgreSQLのフラッシュバック機能を使用すると、削除されたテーブルをすばやく復元し、ごみ箱を表示および消去して、データを復元できます。

前提条件

この機能は、次のエンジンを実行するPolarDB for PostgreSQLクラスターでサポートされています。

  • PostgreSQL 11 (バージョン1.1.30以降)

  • PostgreSQL 14 (バージョン14.9.15.0以降)

説明

次のいずれかのステートメントを実行して、PolarDB for PostgreSQLクラスターのリビジョンバージョンを照会できます。

  • PostgreSQL 11

    ショーpolar_version;
  • PostgreSQL 14

    select version();

注意事項

  • 重要なテーブルを削除するときは、ドロップフラッシュバック機能を有効にすることを推奨します。 日常的な操作にドロップフラッシュバック機能を使用する場合は注意が必要です。

  • ドロップフラッシュバック機能を有効にすると、削除されたテーブルはごみ箱モードで実行されるスペースに移動します。 テーブルは実際には削除されないため、テーブルが占有しているスペースは解放されません。 そのため、ごみ箱に大量のデータが蓄積されると、大量のディスク容量が占有される可能性がある。 定期的にごみ箱をクリアすることをお勧めします。

  • この場合、削除されたテーブルの依存関係を削除する試みは失敗する可能性があります。これは、テーブルが実際には削除されず、テーブルがこれらの依存関係を使用するためです。

  • 削除されたテーブルは、recyclebinモードで実行されるスペースに移動されます。 recyclebinという名前のモードは作成しないでください。recyclebinモードのテーブルはpurge recyclebinステートメントでクリアできます。

  • ドロップフラッシュバック機能が有効になっている場合、次の操作はサポートされません。

    • 削除されたパーティションテーブルと一時テーブルはフラッシュバックできません。 パーティションテーブルと一時テーブルは実際に削除され、復元できません。

    • sql_dropイベントトリガーはサポートされていません。

パラメーター

パラメーター

データ型

説明

polar_enable_flashback_drop

BOOL

ドロップフラッシュバック機能を有効にするかどうかを指定します。 デフォルト値: OFF。 有効な値:

  • ON

  • オフ

構文

ドロップフラッシュバック機能は、次のSQL文をサポートします。

  • テーブルの削除

    drop table table_name; # recyclebinモードで実行されるスペースにテーブルを移動します。 
    drop table table_name purge; # テーブルを削除します。 テーブルを復元できません。
  • 削除されたテーブルの復元

    フラッシュバックテーブルtable_nameをドロップ前に
    します。# 削除されたテーブルを復元します。 同じ名前のテーブルが存在する場合、最新のテーブルが復元されます。 
    フラッシュバックテーブルtable_nameをドロップ前にtable_name_1に変更します。# 削除されたテーブルを復元して名前を変更します。
  • ごみ箱からファイルを完全に削除

    パージテーブルtable_name;
    説明

    同じ名前のテーブルが存在する場合、最も古いテーブルが削除されます。

  • ごみ箱をクリアする

    パージrecyclebin;
    説明

    polar_super_user権限は、ごみ箱をクリアするときに必要です。

  • ごみ箱情報の表示

    ショーrecyclebin;

性能テスト

  • テスト用のデータを準備します。

    test1テーブルとテーブルtest2テーブルを作成し、それらにデータを挿入します。

    CREATE TABLE test1(id intプライマリキー、名前テキスト);
    
    CREATE TABLE test2(id intプライマリキー、名前テキスト);
    
    INSERT INTO test1 select t,repeat('test1',1024) from generate_series(1, 10000) as t;
    
    INSERT INTO test2を選択し、generate_series(1、10000) からtとして ('test2' 、1024) を繰り返します。\dt 

    サンプル結果:

    リレーションのリスト
     スキーマ | 名前 | タイプ | 所有者
    ------- ------ ---------- ----------------
     public | test1 | テーブル | postgres
     public | test2 | テーブル | postgres
    (2行) 
  • テーブルを削除し、ごみ箱を表示します。

    • test1およびtest2テーブルを削除します。

      ドロップテーブルtest1;
      
      ドロップテーブルtest2;
      
      \dt 

      サンプル結果:

      関係は見つかりませんでした。
    • ごみ箱を表示します。

      ショーrecyclebin;

      サンプル結果:

      table_catalog | table_name | table_type
      -------------- ----------------------------- ---------------
       postgres | public$test1$69461331094004 | ベーステーブル
       postgres | public$test2$69461332967609 | ベーステーブル
      (2行) 
  • 削除されたテーブルをフラッシュバックします。

    • 削除されたテーブルを復元します。

      ドロップ前にフラッシュバックテーブルtest1を
      します。ドロップ前のフラッシュバックテーブルtest2はtest3に名前を付けます。\dt 

      サンプル結果:

      リレーションのリスト
       スキーマ | 名前 | タイプ | 所有者
      ------- ------ ---------- ----------------
       public | test1 | テーブル | postgres
       public | test3 | テーブル | postgres
      (2行) 
      説明

      test2テーブルの名前がtest3に変更されました。

    • 復元されたデータを表示します。

      test1テーブルのデータを表示します。

      SELECT count(*) FROM test1;

      サンプル結果:

      カウント
      -------
       10000
      (1行) 

      test3テーブルのデータを表示します。

      SELECT count(*) FROM test3;

      サンプル結果:

      カウント
      -------
       10000
      (1行)