OceanBaseデータベースは、レコードレベルのフラッシュバッククエリ(Flashback Query)機能を提供しており、ユーザーは特定の履歴バージョンのデータを取得できます。Oracleモードでは AS OF SCN と AS OF TIMESTAMP の2つの構文をサポートしています。MySQLモードでは AS OF SNAPSHOT 構文をサポートしています。
OceanBaseデータベースでは現在、テナントレベルのパラメータ undo_retention を設定することでフラッシュバッククエリを実行できます。ユーザーが undo_retention を設定すると、T - undo_retention から現在時刻 T までの時間範囲内の任意の複数バージョンのデータをフラッシュバッククエリ機能で照会できるようになります。テナントレベルのパラメータ undo_retention のデフォルト値は1800秒です。テナントレベルのパラメータ undo_retention の詳細については、undo_retentionを参照してください。
注意点
テナントレベル構成パラメータ undo_retention を使用してフラッシュバッククエリを実行する際には、以下の点に注意してください:
undo_retentionの設定時間を T0 と仮定します。設定後は T0 より前のデータには影響せず、T0 より後のデータにのみ影響します。クエリ対象のテーブルが既に削除されてゴミ箱に入っている場合は、まずそのテーブルをゴミ箱から復元する必要があります。
ゴミ箱オブジェクトの復元に関する操作については、ゴミ箱オブジェクトの復元を参照してください。
現在時刻を
Tと仮定します。undo_retentionを設定した後、T - undo_retentionの期間内に DDL 操作があった場合:列の追加操作について、フラッシュバッククエリ操作前のデータに対して実行する場合、新しく追加されたすべての列はデフォルト値となります。
テーブルの作成、削除、または列の削除などの操作について、フラッシュバッククエリ操作前のデータに対して実行する場合、システムはエラーを返します。
フラッシュバッククエリには、履歴データを保持するための追加のストレージ容量が必要です。
undo_retentionを大きく設定しすぎると、ストレージ容量が増加します。undo_retentionを大きく設定した後は、ストレージ容量の変化に注意してください。
前提条件
テナントレベル構成パラメータ undo_retention を使用してフラッシュバッククエリを実行する前に、まず undo_retention の値を変更する必要があります。undo_retention のデフォルト値は 1800 秒です。
テナント管理者がデータベースにログインします。
説明
MySQLテナントの管理者ユーザーは
rootユーザー、Oracleテナントの管理者ユーザーはSYSユーザーです。接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql#demo -p***** -Aデータベースへの接続操作の詳細については、データベース接続の概要(MySQLモード)およびデータベース接続の概要(Oracleモード)を参照してください。
以下のステートメントを実行して、テナントレベル構成パラメータ
undo_retentionの値を変更します。例:
obclient [(none)]> ALTER SYSTEM SET undo_retention=900;テナントレベル構成パラメータ
undo_retentionの詳細については、undo_retentionを参照してください。
MySQLモードにおけるフラッシュバッククエリ
MySQLテナントでデータベースにログインします。
接続例は以下のとおりですが、データベースへの接続時には実際の環境に合わせてください。
obclient -h10.xx.xx.xx -P2883 -uinfo@mysql#demo -p***** -Aデータベース接続操作の詳細については、データベースへの接続を参照してください。
テーブルに対してフラッシュバッククエリを実行します。
現在の
undo_retentionの設定値が900であると仮定します。ユーザーにはtable1というテーブルがあります。AS OF SNAPSHOTを使用して過去の時間を指定し、その時点での単一テーブルの状態のデータをフラッシュバックするクエリの例は以下のとおりです:obclient [(none)]> SELECT * FROM table1 AS OF SNAPSHOT 1597306800000000000;ここで、
1597306800000000000はナノ秒単位のタイムスタンプです。タイムスタンプの起点は北京時間1970年01月01日08時00分00秒です。必要に応じて、クエリ対象の時間をタイムスタンプ形式に変換できます。例えば、この例では、2020年08月13日16時20分00秒のテーブルデータをフラッシュバックする必要があります。時間を変換する方法は以下のとおりです:
obclient [(none)]> SELECT time_to_usec('2020-08-13 16:20:00') * 1000; +--------------------------------------------+ | time_to_usec('2022-01-01 00:00:00') * 1000 | +--------------------------------------------+ | 1597306800000000000 | +--------------------------------------------+ 1 row in set
Oracleモードにおけるフラッシュバッククエリ
Oracleテナントでデータベースにログインします。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uinfo@oracle#demo -p***** -Aデータベースへの接続操作の詳細については、データベースへの接続を参照してください。
テーブルに対してフラッシュバッククエリを実行します。
現在の
undo_retention設定値が900であり、ユーザーがtable1、table2、expr1の3つのテーブルを持っていると仮定します。フラッシュバッククエリの使用例は以下のとおりです:TIMESTAMPで指定された過去の時間に遡り、その時点での単一テーブルの状態のデータをフラッシュバックします。obclient [SYS]> SELECT * FROM table1 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');TIMESTAMPで指定された過去の時間に遡り、複数のテーブルの状態のデータをフラッシュバックします。obclient [SYS]> SELECT * FROM table1,table2 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');SCNで指定された過去の時間に遡り、その時点での単一テーブルの状態のデータをフラッシュバックします。obclient [SYS]> SELECT * FROM table1 AS OF SCN 1597306800000000000;ここで、
1597306800000000000はナノ秒単位のタイムスタンプです。タイムスタンプの起点は北京時間1970年01月01日08時00分00秒です。必要に応じて、クエリ対象の時間をタイムスタンプ形式に変換できます。例えば、この例では、2020年08月13日16時20分00秒のテーブルデータをフラッシュバックする必要があります。時間を変換する方法は以下のとおりです:
obclient [(none)]> SELECT (to_date('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss') - to_date('1970-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss')) * 86400 * 1000 * 1000 * 1000 AS unix_nsec_timestamp FROM DUAL; +---------------------+ | UNIX_NSEC_TIMESTAMP | +---------------------+ | 1597306800000000000 | +---------------------+ 1 row in set