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

PolarDB:行ストアのスナップショット

最終更新日:Dec 17, 2024

このトピックでは、行ストアスナップショット機能と、行ストアスナップショットを使用して履歴データを照会する方法について説明します。

サポートされているバージョン

計算ノードのバージョンは5.4.20-20240716以降である必要があります。 データノードのバージョンはxcluster8.4.19-20240630以降である必要があります。 データベースエンジンのバージョンはMySQL 8.0である必要があります。

説明

メリット

ローストアスナップショット機能を使用すると、ローストアスナップショットの保持期間内の履歴データをクエリできます。 行ストアスナップショット機能を使用して、次の操作を実行できます。

  • 以前の時点からデータを復元します。

  • 重要な時点でデータをバックアップします。

  • 早い時点でデータの計算分析を実行します。

行ストアスナップショット機能は、元に戻すログに基づいて実装されます。 アンドゥログに割り当てられるストレージサイズは限られています。 したがって、ローストアスナップショットの保持期間は比較的短い。

説明
  • スナップショットを長期間保持する場合は、カラムストアのスナップショット機能を使用することを推奨します。 カラムストアのスナップショット機能は、最大1年間スナップショットを保持できます。 詳細については、「列ストアスナップショット」をご参照ください。

  • 行ストアスナップショット機能と列ストアスナップショット機能を同時に使用できます。

課金

ローストアスナップショット機能は無料です。 ただし、この機能により、アンドゥログが増え、ストレージ使用量が増加します。 事前に十分なストレージ容量を計画することをお勧めします。

使用上の注意

  • ローストアスナップショット機能が有効になっているテーブルでDDLステートメントを実行した後は、DDLステートメントの実行前に作成されたローストアスナップショットを照会することはできません。

  • 保持期間が経過した行ストアスナップショットを照会することはできません。

準備

行ストアスナップショット機能を使用する前に、次の操作を実行します。

  • PolarDBコンソールで、ストレージレイヤーパラメーターloose_opt_flashback_areatrueに変更します。 詳細については、「パラメーター設定」をご参照ください。

    説明
    • 行ストアスナップショット機能を使用するテーブルを作成する前に、このパラメーターを変更する必要があります。

    • テーブルの作成後にこのパラメーターをtrueに変更した場合、行ストアスナップショット機能を有効にするためにテーブルを再構築する必要があります。 たとえば、テーブルに対してOPTIMIZE TABLEステートメントを実行できます。

  • ストレージ層パラメーターloose_innodb_txn_retentionを秒単位で期待値に変更します。 このパラメータは、ローストアスナップショットの保持期間を指定します。

    説明

    最大保持期間は4,294,967、295秒です。 デフォルトの保持期間は1,800秒です。 保持期間を259、200秒 (3日) 以下に設定することを推奨します。

タイムスタンプをスナップショットポイントに変換するtimestamp Oracle (TSO) 値

各時点は、行ストアのスナップショットポイントとすることができる。 次のステートメントを使用して、タイムスタンプをスナップショットポイントTSO値に変換できます。

SELECT TIME_TO_TSO("2024-07-24 10:00:00"); -- Convert 2024-07-24 10:00:00 to a snapshot point TSO value. By default, the time zone of the current session is used.
SELECT TIME_TO_TSO(NOW()); -- Convert the current timestamp to a snapshot point TSO value. By default, the time zone of the current session is used.
説明

TIME_TO_TSO() 関数を使用すると、その時点がローストアスナップショット保持期間内であるかどうかに関係なく、各時点をスナップショットポイントTSO値に変換できます。

次のステートメントを実行して、変換関数に使用するタイムゾーンを指定できます。

-- The second parameter specifies the time zone.
SELECT TIME_TO_TSO("2024-07-24 10:00:00", "+8:00");

行ストアのスナップショットから履歴データを照会する

テーブルの行ストアスナップショットの履歴データをクエリするには、SELECTステートメントのテーブル名の後にAS of TSO {TSO} 句を追加します。 例:

SELECT * FROM tb1 AS OF TSO 7206138458723582016;
説明

この例では、TIME_TO_TSO() 関数を使用して取得できるスナップショットポイントTSO値が7206138458723582016ます。 詳細については、このトピックの「タイムスタンプをスナップショットポイントTSO値に変換する」をご参照ください。

行ストアスナップショットを使用して、以前の時点のテーブルのデータを一時テーブルに復元するには、INSERT/REPLACE SELECTステートメントのテーブル名の後にAS of TSO {TSO} 句を追加します。 例:

CREATE TABLE tmp (
  -- The temporary table has the same schema as the original table.
);

INSERT INTO tmp SELECT * FROM tb1 AS OF TSO 7206138458723582016;

例:

  1. データベースパラメーターを変更します。 詳細については、このトピックの「準備」セクションを参照してください。

  2. tb1という名前のテーブルを作成します。

    CREATE TABLE tb1 (
      id INT PRIMARY KEY,
      a INT,
      gmt_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      gmt_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ) PARTITION BY KEY(id);
  3. テーブルにデータを挿入し、スナップショットポイントTSO値を取得します。

    INSERT INTO tb1 (id, a) VALUES (0, 0);
    
    -- Wait for 1 second.
    SELECT TIME_TO_TSO(NOW()); -- Convert the current timestamp to a snapshot point TSO value. In this example, the TSO value is labeled as TSO1.
    
    INSERT INTO tb1 (id, a) VALUES (1, 1);
    
    -- Wait for 1 second.
    SELECT TIME_TO_TSO(NOW()); -- Convert the current timestamp to a snapshot point TSO value. In this example, the TSO value is labeled as TSO2.
    
    INSERT INTO tb1 (id, a) VALUES (2, 2);
  4. 行ストアのスナップショットから履歴データを照会します。

    SELECT * FROM tb1 AS OF TSO {TSO1} ORDER BY id; - (0, 0) is returned.
    SELECT * FROM tb1 AS OF TSO {TSO2} ORDER BY id; - (0, 0), (1, 1) is returned.
    SELECT * FROM tb1 ORDER BY id; - (0, 0), (1, 1), (2, 2) is returned.
  5. INSERT SELECT AS OF TSOステートメントを実行して、以前の時点からデータを復元します。

    CREATE TABLE tb1_tmp (
      id INT PRIMARY KEY,
      a INT,
      gmt_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      gmt_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ) PARTITION BY KEY(id);
    
    -- Use a row-store snapshot to restore data.
    INSERT INTO tb1_tmp SELECT * FROM tb1 AS OF TSO {TSO} FORCE INDEX(PRIMARY);