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年08月00日00時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