このトピックでは、列ストアのスナップショットポイントから履歴データをクエリする方法について説明します。
前提条件
インスタンスは5.4.20以降で、エンジンはMySQL 5.7またはMySQL 8.0である必要があります。
インスタンスのバージョン番号の詳細については、「リリースノート」をご参照ください。
インスタンスのバージョンを表示する方法の詳細については、「インスタンスのバージョンの表示と更新」をご参照ください。
注意事項
列ストアスナップショットクエリは、テーブル構造の変更前にスナップショットポイントが作成されているかどうかに関係なく、最新のテーブル構造に基づいて結果を返します。 たとえば、テーブルに列を追加し、その列が追加される前に列ストアのスナップショットデータを照会した後、その列が追加された後のテーブル構造が結果に取得されます。
INSERT SELECTステートメントを使用して、データベースの自動コミットが有効になっている場合 (自動コミット=true) にのみ、トランザクション内のデータを復元できます。INSERT SELECTステートメントを使用する場合は、SELECT句で複雑なクエリを実行しないことをお勧めします。
スナップショットポイントから履歴データを照会する
スナップショットから履歴データをクエリするには、SELECTステートメントのテーブル名の後にAS OF TSO <TSO> 句を追加します。 列ストアスナップショットの履歴データをクエリするには、FORCE INDEX句も含めて、列ストアスナップショットの名前を指定する必要があります。 構文:
SELECT * FROM <table_name> AS OF TSO <TSO> FORCE INDEX(<snapshot_name>);TSO値を取得するには、CALL polardbx.columnar_flush() コードを実行します。 詳細については、「スナップショットポイントの生成」をご参照ください。
例:
-- Place the FORCE INDEX clause after the AS OF TSO clause.
SELECT * FROM tb1 AS OF TSO 7206138458723582016 FORCE INDEX(cci);列ストアのスナップショットから履歴データを復元することもできます。 構文:
INSERT INTO <target_table> SELECT * FROM <source_table> AS OF TSO <TSO> FORCE INDEX(<snapshot_name>);例:
INSERT INTO tmp SELECT * FROM tb1 AS OF TSO 7206138458723582016 FORCE INDEX(cci);例
次のステートメントを実行してデータベース
test_columnanomer_snapshotを作成し、データベースにテーブルtb1を作成します。CREATE DATABASE test_columnar_snapshot MODE=AUTO;USE test_columnar_snapshot; 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);tb1テーブルのcciという名前の列ストアスナップショットを作成します。CREATE CLUSTERED COLUMNAR INDEX cci ON tb1(a) PARTITION BY KEY(id) columnar_options='{ "type":"snapshot", "snapshot_retention_days":"7", "auto_gen_columnar_snapshot_interval":"30" }';テーブルにデータを挿入し、スナップショットポイントを生成します。
INSERT INTO tb1 (id, a) VALUES (0, 0); CALL polardbx.columnar_flush (test_columnar_snapshot, 'tb1', 'cci'); -- Generate a CCI-level snapshot point and record it as TSO1 INSERT INTO tb1 (id, a) VALUES (1, 1); CALL polardbx.columnar_flush(); -- Generate an instance-level snapshot point and record it as TSO2. INSERT INTO tb1 (id, a) VALUES (2, 2);スナップショットポイントに基づいて列ストアのスナップショットを照会します。
SELECT * FROM tb1 AS OF TSO {TSO1} FORCE INDEX(cci) ORDER BY id; -- Expected result: (0, 0). SELECT * FROM tb1 AS OF TSO {TSO2} FORCE INDEX(cci) ORDER BY id; -- Expected result: (0, 0), (1, 1). SELECT * FROM tb1 FORCE INDEX(cci) ORDER BY id; -- Expected result: (0, 0), (1, 1), (2, 2).INSERT SELECTステートメントを使用して、データを復元します。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 the column-store snapshot to restore data. INSERT INTO tb1_tmp SELECT * FROM tb1 AS OF TSO {TSO1} FORCE INDEX(cci); SELECT * FROM tb1_tmp ORDER BY id; -- Expected result: (0, 0).