📣
TiDB Cloud Premium はパブリックプレビュー中です。エンタープライズワークロード向けの無制限のスケーリング、即時の弾力性、高度なセキュリティを提供します。このページは自動翻訳されたものです。原文はこちらからご覧ください。

AS OF TIMESTAMP句を使用して履歴データを読み取る



このドキュメントでは、 AS OF TIMESTAMP句を使用してステイル読み取り機能を実行し、TiDB 内の履歴データを読み取る方法について説明します。具体的な使用例と履歴データを保存するための戦略も説明します。

TiDBは、特別なクライアントやドライバーを必要とせず、標準SQLインターフェース( AS OF TIMESTAMP SQL句)を介して履歴データの読み取りをサポートします。データが更新または削除された後でも、このSQLインターフェースを使用して更新または削除前の履歴データを読み取ることができます。

構文

AS OF TIMESTAMP句は次の 3 つの方法で使用できます。

正確な時刻を指定したい場合は、 AS OF TIMESTAMP句に datetime 値を設定するか、time 関数を使用します。datetime の形式は「2016-10-08 16:45:26.999」のように、最小の時間単位はミリ秒ですが、ほとんどの場合、datetime を指定するには「2016-10-08 16:45:26」のように秒単位で十分です。3 関数を使用して、現在時刻をNOW(3)秒単位で取得することもできます。数秒前のデータを読み取りたい場合は、 NOW() - INTERVAL 10 SECONDのような式を使用することをお勧めします

時間範囲を指定する場合は、句内でTIDB_BOUNDED_STALENESS()関数を使用できます。この関数を使用すると、TiDB は指定された時間範囲内で適切なタイムスタンプを選択します。「適切」とは、このタイムスタンプより前に開始され、アクセス先のレプリカにコミットされていないトランザクションがないことを意味します。つまり、TiDB はアクセス先のレプリカに対して読み取り操作を実行でき、読み取り操作がブロックされていないことを意味します。この関数を呼び出すにはTIDB_BOUNDED_STALENESS(t1, t2)を使用する必要があります。t1t2は範囲の両端であり、datetime 値または時間関数を使用して指定できます。

AS OF TIMESTAMP句の例をいくつか示します。

  • AS OF TIMESTAMP '2016-10-08 16:45:26' : 2016 年 10 月 8 日 16:45:26 に保存された最新のデータを読み取るように TiDB に指示します。
  • AS OF TIMESTAMP NOW() - INTERVAL 10 SECOND : TiDB に 10 秒前に保存された最新のデータを読み取るように指示します。
  • AS OF TIMESTAMP TIDB_BOUNDED_STALENESS('2016-10-08 16:45:26', '2016-10-08 16:45:29') : 2016 年 10 月 8 日の 16:45:26 から 16:45:29 までの範囲内でできるだけ新しいデータを読み取るように TiDB に指示します。
  • AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(NOW() - INTERVAL 20 SECOND, NOW()) : 20 秒前から現在までの時間範囲内で可能な限り新しいデータを読み取るように TiDB に指示します。

使用例

このセクションでは、いくつかの例を用いて、 AS OF TIMESTAMP句の様々な使用方法を説明します。まず、リカバリ用のデータの準備方法を紹介し、次にSELECTSTART TRANSACTION READ ONLY AS OF TIMESTAMPSET TRANSACTION READ ONLY AS OF TIMESTAMPでそれぞれAS OF TIMESTAMPを使用する方法を示します。

データサンプルを準備する

リカバリ用のデータを準備するには、まずテーブルを作成し、いくつかの行のデータを挿入します。

create table t (c int);
Query OK, 0 rows affected (0.01 sec)
insert into t values (1), (2), (3);
Query OK, 3 rows affected (0.00 sec)

表内のデータを表示する。

select * from t;
+------+ | c | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec)

現在の時刻を表示する:

select now();
+---------------------+ | now() | +---------------------+ | 2021-05-26 16:45:26 | +---------------------+ 1 row in set (0.00 sec)

行内のデータを更新します。

update t set c=22 where c=2;
Query OK, 1 row affected (0.00 sec)

行のデータが更新されていることを確認します。

select * from t;
+------+ | c | +------+ | 1 | | 22 | | 3 | +------+ 3 rows in set (0.00 sec)

SELECT文を使用して履歴データを読み取る

SELECT ... FROM ... AS OF TIMESTAMPステートメントを使用すると、過去の時点からデータを読み取ることができます。

select * from t as of timestamp '2021-05-26 16:45:26';
+------+ | c | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec)

START TRANSACTION READ ONLY AS OF TIMESTAMPステートメントを使用して履歴データを読み取る

START TRANSACTION READ ONLY AS OF TIMESTAMPステートメントを使用すると、過去の特定の時点に基づいて読み取り専用トランザクションを開始できます。このトランザクションは、指定された時点の履歴データを読み取ります。

start transaction read only as of timestamp '2021-05-26 16:45:26';
Query OK, 0 rows affected (0.00 sec)
select * from t;
+------+ | c | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec)
commit;
Query OK, 0 rows affected (0.00 sec)

トランザクションがコミットされた後、最新のデータを読み取ることができます。

select * from t;
+------+ | c | +------+ | 1 | | 22 | | 3 | +------+ 3 rows in set (0.00 sec)

SET TRANSACTION READ ONLY AS OF TIMESTAMPステートメントを使用して履歴データを読み取る

SET TRANSACTION READ ONLY AS OF TIMESTAMPステートメントを使用すると、次のトランザクションを過去の特定の時点に基づく読み取り専用トランザクションとして設定できます。このトランザクションは、指定された時点の履歴データを読み取ります。

set transaction read only as of timestamp '2021-05-26 16:45:26';
Query OK, 0 rows affected (0.00 sec)
begin;
Query OK, 0 rows affected (0.00 sec)
select * from t;
+------+ | c | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec)
commit;
Query OK, 0 rows affected (0.00 sec)

トランザクションがコミットされた後、最新のデータを読み取ることができます。

select * from t;
+------+ | c | +------+ | 1 | | 22 | | 3 | +------+ 3 rows in set (0.00 sec)

このページは役に立ちましたか?