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