論理的な破損に耐えるためにフラッシュバック表、ドロップ、問い合わせ系を区別しておこう

覚えるべきキーワード
・フラッシュバック
・論理的な破損
・フラッシュバック問合せ
・フラッシュバックバージョン問合せ
・フラッシュバックトランザクション問合せ
・フラッシュバック表
・フラッシュバックドロップ
・フラッシュバックデータベース

フラッシュバック機能はユーザーの誤操作によって発生する障害に対してリカバリを行います。例えば、必要なデータの削除や表の削除などです。データファイル破損と違って、限られた範囲の障害(論理的な破損)なので、比較的軽い障害と言えます。
フラッシュバックには代表的な6つの方法があります。

フラッシュバック問合せ

フラッシュバック問い合わせは、自分で時刻を指定してデータベースに問合わせを行い、指定した時点の問合わせ結果を参照する方法です。
5分前にデータを削除して、コミットした後にやはりそのデータを元に戻したい時には5分前時点のデータをデータベースから取得して、その結果をもとに自分でINSERT文を発行し、データを挿入します。
フラッシュバック問い合わせではあくまで、特定時点のデータを取得できるだけです。

5分前に削除したdeptテーブルのデータをフラッシュバックしたい場合は以下のSQLを実行します。

フラッシュバック問合せ

select * from dept as of timestamp (systimestamp – interval ‘5’ minute );

これを実行すると5分前に削除した行データが表示されます。

フラッシュバックバージョン問合せ

フラッシュバックバージョン問い合わせは、ある時点からある時点間の変更履歴を表示します。ある時点はSCN番号を設定します。(SCN番号とはシステム変更番号を意味します。トランザクション内で行われる変更1つずつに対して付与される番号です。)
2017年10月1日12時から10月5日18時までに変更されたdeptテーブルのidとnameを表示したい場合は以下のように書きます。

フラッシュバックバージョン問合せ

SELECT versions_xid, versions_operation,id,name FROM dept VERSIONS BETWEEN TO_TIMESTAMP(‘2017-10-01 12:00:00’, ‘YYYY-MM-DD HH24:MI:SS’) AND TO_TIMESTAMP(‘2017-10-05 18:00:00’, ‘YYYY-MM-DD HH24:MI:SS’);

フラッシュバックトランザクション問合せ

指定した期間内のすべてのトランザクションで行われた変更結果を表示します。フラッシュバック問合せ、フラッシュバックバージョン問合せは特定テーブルを対象にデータ取得しますが、フラッシュバックトランザクション問合せは、表の制限はありません。そのため、対象表さえ分からない状態でフラッシュバックをするときに使います。もちろん、対象範囲が広くなるため、自ずと取得するデータは多くなると思います。

これはテーブル所有者が’oracle’でタイムスタンプが201710月10日12時以降のトランザクションデータを表示しています。
from句がテーブルではなく、flashback_transaction_queryである点が注目ポイントです。

フラッシュバックバージョン問合せ

SELECT xid, start_scn, commit_scn, operation, table_name, table_owner FROM flashback_transaction_query WHERE table_owner = ‘oracle’ AND start_timestamp >=TO_TIMESTAMP (‘2017-10-10 12:00:00′,’YYYY-MM-DD HH:MI:SS’);

フラッシュバック表

トランザクションの結果関係なく、指定した時間の表に戻します。「なんか細かい変更は覚えてないけど、昨日時点の表に戻っていればいい」というような大雑把なフラッシュバックがフラッシュバック表です。
フラッシュバック表を実行するには2ステップがいります。(事前事後のデータ取得などは除く)
例えば、本日が2018年10月2日でdept表の100個のデータを2018年10月1日18:00に変更しましたが、本日間違えに気付いたので、2018年10月1日17:00の状態に戻すとしましょう。
フラッシュバック表実行には、まず対象の表に対する行移動を有効にしておく必要があります。そのためにSQLを一本流します。

フラッシュバック表①行移動の有効化

ALTER TABLE dept ENABLE ROW MOVEMENT;

これで行移動が有効になりました。
次にフラッシュバック表を実行します。

フラッシュバック表②フラッシュバック表の実行

FLASHBACK TABLE dept TO TIMESTAMP TO_TIMESTAMP(‘2018-10-01 17:00:00’, ‘YYYY-MM-DD HH24:MI:SS’’);

このSQL実行により、deptテーブルが2018年10月1日17:00の状態に戻ります。

フラッシュバックドロップ

削除してしまった表に対して、削除処理を無効にして、削除した表をもとに戻します。つまり、一度削除した表を復活させるのがフラッシュバックドロップです。
誤って削除してしまったdept表を復活させるSQLです。

フラッシュバックドロップ

FLASHBACK TABLE dept TO BEFORE DROP;

これでdept表は復活します。ちなみにフラッシュバックドロップはUNDOデータを使いません。
フラッシュバックドロップでは、表とともにすべての索引、すべてのトリガー、外部キー制約以外の制約が一緒に復活します。

フラッシュバックデータべース

Point-in-Timeリカバリを行うために前準備として行うフラッシュバックがフラッシュバックデータベースです。データベースをある特定時点の状態に戻して、Point-in-Timeリカバリが実行できる環境を整えます。データベースを2018年10月1日17:00の状態に戻すSQLです。

フラッシュバックデータベース

FLASHBACK DATABASE TO TIMESTAMP(to_timestamp(‘2018-10-01 17:-0:00′,’yy-mm-dd hh24:mi:ss’));

ちなみにフラッシュバックデータベースもUNDOデータを使いません。

フラッシュバックのまとめ

似たような機能があるので、意図的に区別しないと混同してしまいます。リカバリをするときは失敗が許されません。慎重にかつ正確にリカバリするために正確な知識を身に付けましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です