Oracleのフラッシュバック問い合わせ(SCN指定編+日時指定)

Oracle Master Gold

Oracle Databaseには、過去のデータを参照する強力な機能「フラッシュバッククエリ(Flashback Query)」があります。
この記事では、SCNを使った方法に加え、日時を指定して過去のデータを参照する方法(AS OF TIMESTAMP)も補足として解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


◆ フラッシュバッククエリとは?

通常のSQLは、現在のデータに対して実行されますが、フラッシュバッククエリでは、指定した過去の時点のデータを参照できます。
「いつ」「どのように」データが変わったかを調査したいときにとても便利です。


◆ 使用する構文(SCN指定)

SELECT ... FROM テーブル名 AS OF SCN SCN番号;

たとえば、SCN「1234567」時点のEMP表の内容を確認したい場合は、以下のように記述します。

SELECT * FROM emp AS OF SCN 1234567;

◆ 実験:フラッシュバック問い合わせを試してみよう

以下のように、テスト用のテーブルを作成し、データ操作の前後でSCNを取得しながら実験してみましょう。


① テーブル作成・初期データ投入

CREATE TABLE emp_test (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(10)
);

INSERT INTO emp_test VALUES (1001, 'TARO');
INSERT INTO emp_test VALUES (1002, 'JIRO');
COMMIT;

② 現在のSCNと日時を取得

SELECT dbms_flashback.get_system_change_number AS current_scn,
SYSTIMESTAMP AS current_time
FROM dual;

例:

CURRENT_SCN | CURRENT_TIME
------------+------------------------------
1234567 | 2025-03-22 15:01:00.000000 +09:00

このSCNや時刻をメモしておきます。


③ データの更新

UPDATE emp_test SET ename = 'SABURO' WHERE empno = 1002;
COMMIT;

④ フラッシュバッククエリで変更前のデータを参照

SCNを指定する場合:

SELECT * FROM emp_test AS OF SCN 1234567;

【補足】日時を指定する場合:

SELECT * FROM emp_test AS OF TIMESTAMP TO_TIMESTAMP('2025-03-22 15:01:00', 'YYYY-MM-DD HH24:MI:SS');

結果:

EMPNO | ENAME
------+--------
1001 | TARO
1002 | JIRO

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


◆ テキスト図:SCNや時間を使った過去参照のイメージ

 時系列 ─────────────→
[SCN:1234567] [SCN:1234600]
[時:15:01:00] [時:15:02:00]
↓ ↓
+--------+ +--------+
| JIRO |更新後→| SABURO |
+--------+ +--------+

SELECT * FROM emp_test AS OF SCN 1234567;
SELECT * FROM emp_test AS OF TIMESTAMP '2025-03-22 15:01:00';
→ どちらも JIRO が見える!
SQL> CREATE TABLE emp_test (
2 empno NUMBER PRIMARY KEY,
3 ename VARCHAR2(10)
4 );

表が作成されました。

SQL> INSERT INTO emp_test VALUES (1001, 'TARO');

1行が作成されました。

SQL> INSERT INTO emp_test VALUES (1002, 'JIRO');

1行が作成されました。

SQL> SELECT * FROM emp_test;

EMPNO ENAME
---------- ------------------------------
1001 TARO
1002 JIRO

SQL> commit;

コミットが完了しました。

SQL> SELECT dbms_flashback.get_system_change_number AS current_scn FROM dual;

CURRENT_SCN
-----------
2283755 ★

SQL> UPDATE emp_test SET ename = 'SABURO' WHERE empno = 1002;

1行が更新されました。

SQL> SELECT * FROM emp_test;

EMPNO ENAME
---------- ------------------------------
1001 TARO
1002 SABURO

SQL> commit;

コミットが完了しました。

SQL> SELECT * FROM emp_test AS OF SCN 2283755; ★UPDATE前の時点のSCNを指定

EMPNO ENAME
---------- ------------------------------
1001 TARO
1002 JIRO

◆ 注意点

  • フラッシュバッククエリは「UNDOデータ」を利用します。
  • UNDO保持期間を過ぎると、SCNやTIMESTAMPを指定してもデータは取得できません(ORA-01555エラー)。
  • AS OF TIMESTAMP はタイムゾーンに注意してください(SYSTIMESTAMP の使用がおすすめ)。

◆ まとめ

項目内容
フラッシュバッククエリ過去のデータをSELECTで簡単に参照できる
AS OF SCN正確な変更時点を指定して調査できる
AS OF TIMESTAMP時刻ベースで人間に分かりやすく時点指定ができる
注意点UNDOが保持されていないと参照できない可能性がある


[参考]
バックアップおよびリカバリ・ユーザーズ・ガイド

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました