Oracleフラッシュバックバージョン問い合わせとは?

Oracle Master Gold

Oracleのフラッシュバックバージョン問い合わせ(Flashback Version Query)は、ある行が過去にどのように変更されたのかを調べるための非常に強力な機能です。SCN(System Change Number)や時間を指定して、変更履歴を追跡できます。

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

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


テスト用テーブルの作成

まずは、フラッシュバックバージョン問い合わせを試すためのテーブルを作成し、いくつかの更新を加えて履歴を生成してみましょう。

CREATE文とINSERT文

-- テスト用表の作成
CREATE TABLE emp_flash (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(50),
salary NUMBER
);

-- 初期データの投入
INSERT INTO emp_flash VALUES (1, 'TARO', 300000);
COMMIT;

この時点のSCNを記録しておきましょう。

-- 現在のSCNの確認
SELECT CURRENT_SCN FROM V$DATABASE;

※このSCNを後で使用します。


データ更新と履歴生成

続けて、データをいくつか更新し、その都度コミットします。

-- 1回目の更新
UPDATE emp_flash SET salary = 320000 WHERE emp_id = 1;
COMMIT;

-- 2回目の更新
UPDATE emp_flash SET salary = 350000 WHERE emp_id = 1;
COMMIT;

-- 3回目の更新
UPDATE emp_flash SET salary = 400000 WHERE emp_id = 1;
COMMIT;

フラッシュバックバージョン問い合わせの構文と実行例(SCN指定)

履歴を確認するには、VERSIONS BETWEEN SCN を使います。

SELECT 
emp_id,
emp_name,
salary,
VERSIONS_STARTSCN,
VERSIONS_ENDSCN,
VERSIONS_XID,
VERSIONS_OPERATION
FROM
emp_flash VERSIONS BETWEEN SCN 1000000 AND 1100000
WHERE
emp_id = 1;

上記では、SCN 1000000〜1100000 の間で emp_id = 1 のデータがどのように変遷したかを表示します。

SQL> CREATE TABLE emp_flash (
2 emp_id NUMBER PRIMARY KEY,
3 emp_name VARCHAR2(50),
4 salary NUMBER
5 );

表が作成されました。

SQL> INSERT INTO emp_flash VALUES (1, 'TARO', 300000);

1行が作成されました。

SQL> col emp_name for a20
SQL> SELECT * FROM emp_flash;

EMP_ID EMP_NAME SALARY
---------- -------------------- ----------
1 TARO 300000

SQL> commit;

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

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
2284694

SQL> UPDATE emp_flash SET salary = 320000 WHERE emp_id = 1;

1行が更新されました。

SQL> SELECT * FROM emp_flash;

EMP_ID EMP_NAME SALARY
---------- -------------------- ----------
1 TARO 320000

SQL> commit;

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

SQL> UPDATE emp_flash SET salary = 350000 WHERE emp_id = 1;

1行が更新されました。

SQL> SELECT * FROM emp_flash;

EMP_ID EMP_NAME SALARY
---------- -------------------- ----------
1 TARO 350000

SQL> commit;

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

SQL> UPDATE emp_flash SET salary = 400000 WHERE emp_id = 1;

1行が更新されました。

SQL> SELECT * FROM emp_flash;

EMP_ID EMP_NAME SALARY
---------- -------------------- ----------
1 TARO 400000

SQL> commit;

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

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
-----------
2284735

SQL> SELECT
2 emp_id,
3 emp_name,
4 salary,
5 VERSIONS_STARTSCN,
6 VERSIONS_ENDSCN,
7 VERSIONS_XID,
8 VERSIONS_OPERATION
9 FROM
10 emp_flash VERSIONS BETWEEN SCN 2284694 AND 2284735
11 WHERE
12 emp_id = 1;

EMP_ID EMP_NAME SALARY VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID VER
---------- -------------------- ---------- ----------------- --------------- ---------------- ---
1 TARO 400000 2284723 09000700F1030000 U
1 TARO 350000 2284710 2284723 08000C000E040000 U
1 TARO 320000 2284702 2284710 0A001A00FE030000 U
1 TARO 300000 2284702

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

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


出力イメージ(テキスト図)

+--------+----------+--------+----------------+--------------+----------------+---------------------+
| EMP_ID | EMP_NAME | SALARY | START_SCN | END_SCN | XID | OPERATION |
+--------+----------+--------+----------------+--------------+----------------+---------------------+
| 1 | TARO | 300000 | 1000020 | 1000030 | 7.23.1234 | I (Insert) |
| 1 | TARO | 320000 | 1000030 | 1000040 | 8.17.2345 | U (Update) |
| 1 | TARO | 350000 | 1000040 | 1000050 | 9.11.3456 | U (Update) |
| 1 | TARO | 400000 | 1000050 | null | 10.7.4567 | U (Update) |
+--------+----------+--------+----------------+--------------+----------------+---------------------+

VERSIONS_OPERATION列は「I:挿入」「U:更新」「D:削除」を示します。


時間で指定する方法(補足)

SCNの代わりに日時で履歴を確認することも可能です。

SELECT 
emp_id,
emp_name,
salary,
VERSIONS_STARTTIME,
VERSIONS_ENDTIME,
VERSIONS_OPERATION
FROM
emp_flash VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP('2025-03-22 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND
TO_TIMESTAMP('2025-03-22 11:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE
emp_id = 1;

注意点と要件

  • UNDOデータが保持されている期間内でのみ有効です。
  • テーブルに対して行レベルのUNDOが有効である必要があります。
  • 表に対するフルテーブルスキャンや多量なDMLが多いとUNDO保持期間が短くなることがあります。

おわりに

フラッシュバックバージョン問い合わせは、アプリのトラブルシュートや監査、誤更新の調査などに非常に有効です。SCNベースの指定をマスターしておくことで、RMANなどの復旧と組み合わせた高度な対応も可能になります。

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

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

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

コメント

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