データベース
 Computer >> コンピューター >  >> プログラミング >> データベース

【Oracle】トータルリコール(Flashback Data Archive)徹底解説:履歴データ管理の実践ガイド

Flashback Data Archive(FDA)は、指定したデータベースオブジェクトに対するトランザクションによるデータ変更を自動的に追跡・アーカイブする機能です。

概要

フラッシュバックデータアーカイブは複数の表領域で構成され、追跡対象の表に対するすべてのトランザクションの履歴データを格納します。データは内部の履歴表に保存されます。

この機能によりUNDOデータを長期保存でき、UNDOベースのフラッシュバック操作を長期間にわたって実行することが可能になります。内部履歴表への厳格な保護を維持しながら短期・長期の履歴データを保持するため、Flashback Data Archiveは履歴バックアップをリストアすることなく過去データを呼び出せる非常に有用なオプションです。

実行に必要な権限

  • FLASHBACK ARCHIVE ADMINISTERシステム権限を持つスキーマは、PL/SQLプロシージャの関連付け解除(Disassociate)および再関連付け(Reassociate)を実行できます。
  • 表の関連付けを解除した後は、通常のユーザーもその表に対する必要な権限を持っていれば、DDL文やDML文を実行できます。
  • フラッシュバックデータアーカイブを作成するには、FLASHBACK ARCHIVE ADMINISTERシステム権限が必要です。
  • フラッシュバックデータアーカイブを作成するには、CREATE TABLESPACEシステム権限が必要です。
  • 履歴情報を格納する表領域に十分なクォータがあることを確認してください。

コンテキスト情報はトランザクションデータとともに保存されます。DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVELプロシージャを使用し、以下のいずれかのパラメータ値を渡します。

  • TYPICAL:USERENVコンテキストからの基本的な監査属性のみを保存します。
  • ALL:SYS_CONTEXT関数で利用可能なすべてのコンテキストを保存します。
  • NONE:コンテキスト情報を保存しません。

ここではUSERENVとカスタムコンテキスト値を取得するため、ALLを使用します。

CONN sys@surya AS SYSDBA
EXEC DBMS_FLASHBACK_ARCHIVE.set_context_level('ALL');

テストと実装

以下の例では、表領域レベルでFDAを有効化し、複数の表領域に対して特定の保持期間を設定します。また、保持期間内に削除されたデータをフラッシュバックデータアーカイブから取得します。目的はFDAを使って履歴データを簡単に取得することです。この機能を有効化していない場合、履歴データを取得するにはデータベース全体をリストアする必要があり、大規模なデータベースシステムでは作業の複雑さが大幅に増します。

例:FDAの作成と確認

■ 表領域の作成コマンド

SQL> CREATE TABLESPACE FBA DATAFILE SIZE 500M AUTOEXTEND ON NEXT 100M;

Tablespace created.

■ デフォルトのフラッシュバックデータアーカイブ(FDA)を作成するコマンド

SQL> CREATE FLASHBACK ARCHIVE DEFAULT FLA1 TABLESPACE FBA QUOTA 500M RETENTION 1 YEAR;

Flashback archive created.

■ 非デフォルトのFDAを作成する手順

SQL> CREATE FLASHBACK ARCHIVE FLA2 TABLESPACE users QUOTA 400M RETENTION 6 MONTH;

Flashback archive created.

■ 作成済みFDAの一覧を取得

SELECT owner_name,
       flashback_archive_name,
       flashback_archive#,
       retention_in_days,
       TO_CHAR(create_time, 'DD-MON-YYYY HH24:MI:SS') AS create_time,
       TO_CHAR(last_purge_time, 'DD-MON-YYYY HH24:MI:SS') AS last_purge_time,
       status
FROM   dba_flashback_archive
ORDER BY owner_name, flashback_archive_name;
OWNER_NAME FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME          LAST_PURGE_TIME      STATUS
SYS        FLA1                                    1               365 16-DEC-2021 19:28:53 16-DEC-2021 19:28:53 DEFAULT
SYS        FLA2                                    2               180 16-DEC-2021 19:29:14 16-DEC-2021 19:29:14

■ デフォルトFDAの設定と詳細確認

SQL> ALTER FLASHBACK ARCHIVE FLA1 SET DEFAULT;

Flashback archive altered.

SELECT flashback_archive_name,
       flashback_archive#,
       tablespace_name,
       quota_in_mb
FROM   dba_flashback_archive_ts
ORDER BY flashback_archive_name;
FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
FLA1                                    1 FBA             500
FLA2                                    2 USERS           400
SQL> SELECT *
FROM DBA_FLASHBACK_ARCHIVE_TABLES
WHERE TABLE_NAME='EMPLOYEES'
AND OWNER_NAME='HR';
TABLE_NAME     OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME      STATUS
EMPLOYEES      HR         FLA1                   SYS_FBA_HIST_92593      ENABLED

動作確認テストの実施

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';

Session altered.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2021/12/16 19:39:31

SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1964623

EMPLOYEES表でのレコード削除と更新

SQL> DELETE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=192;

1 row deleted.

SQL> COMMIT;

Commit complete.

SQL> UPDATE HR.EMPLOYEES SET SALARY=12000 WHERE EMPLOYEE_ID=168;
COMMIT;
SQL> UPDATE HR.EMPLOYEES SET SALARY=12500 WHERE EMPLOYEE_ID=168;
COMMIT;
SQL> UPDATE HR.EMPLOYEES SET SALARY=12550 WHERE EMPLOYEE_ID=168;
COMMIT;

FDAを使用したデータ比較の手順

SQL> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME
FROM HR.EMPLOYEES
AS OF TIMESTAMP TO_TIMESTAMP('2021/12/16 19:39:31','YYYY/MM/DD HH24:MI:SS')
MINUS
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME
FROM HR.EMPLOYEES;
EMPLOYEE_ID FIRST_NAME           LAST_NAME
----------- -------------------- -------------------------
        192 Sarah                Bell

ここで、FDAから削除された行を確認できます。また、VERSIONS_STARTSCN疑似列を使用してデータを取得することも可能です。

特定SCN時点のデータ取得

SQL> COL VERSIONS_STARTTIME FORMAT A40
SELECT VERSIONS_STARTTIME,
       VERSIONS_STARTSCN,
       FIRST_NAME,
       LAST_NAME,
       SALARY
FROM HR.EMPLOYEES VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP('2021/12/16 19:39:31','YYYY/MM/DD HH24:MI:SS') AND SYSTIMESTAMP
WHERE EMPLOYEE_ID=168;
VERSIONS_STARTTIME               VERSIONS_STARTSCN FIRST_NAME LAST_NAME     SALARY
-------------------------------- ----------------- ---------- ---------- ----------
16-DEC-21 07.40.08.000000000 PM            1964648 Lisa       Ozer             12500
16-DEC-21 07.40.08.000000000 PM            1964646 Lisa       Ozer             12000
                                                              Lisa       Ozer             11500
16-DEC-21 07.40.08.000000000 PM            1964650 Lisa       Ozer             12550

SALARY列に対して500ずつ異なる値でUPDATE文を実行したため、同じ行の給与列に複数のバージョンが記録されていることがわかります。

DDL文に対する制限と回避策(記録の変遷をキャプチャ)

Disassociate / Associate(関連付け解除/再関連付け)

より複雑なDDL操作(アップグレード、表の分割など)の場合、DisassociateおよびAssociate PL/SQLプロシージャを使用して、指定した表のFlashback Data Archiveを一時的に無効化できます。Associateプロシージャは関連付け後にスキーマ整合性を強制します。つまり、ベース表と履歴表のスキーマは同一である必要があります。DisassociateおよびAssociateプロシージャの実行にはFLASHBACK ARCHIVE ADMINISTER権限が必要です。

FDAが有効な表では、以下のようなDDL操作が制限されます。

  • 列の追加、削除、名前変更、編集
  • パーティションの削除または切捨て(TRUNCATE)
  • 表の名前変更または切捨て(FBA設定済みの表に対する削除はORA-55610エラーで失敗します)
  • 一部の変更(MOVE / SPLIT / CHANGE PARTITIONSなど)にはDBMS_FLASHBACK_ARCHIVEパッケージの使用が必要です。

FDA対象表に対してDDL操作を行う例

以下の例では、履歴データ用のFDA表に対してDDL操作を実行する方法を示します。デモ表EMPLOYEES_FBAを作成し、制約を追加します。

SQL> CREATE TABLE HR.EMPLOYEES_FBA AS SELECT * FROM HR.EMPLOYEES;

Table created.

SQL> ALTER TABLE HR.EMPLOYEES_FBA ADD CONSTRAINT employee_pk PRIMARY KEY (employee_id);

Table altered.

デモ表でFDAを有効化し、レコードを更新

SQL> ALTER TABLE HR.EMPLOYEES_FBA FLASHBACK ARCHIVE;

Table altered.

SQL> UPDATE HR.EMPLOYEES_FBA SET SALARY=10000 WHERE EMPLOYEE_ID=203;

1 row updated.

SQL> COMMIT;

Commit complete.

制約の無効化・有効化時にORA-55610エラーが発生

SQL> ALTER TABLE HR.EMPLOYEES_FBA DISABLE CONSTRAINT EMPLOYEE_PK;

Table altered.

SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;
ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table

制限に直面した場合の対処方法

注意:表に任意の制約(主キー、一意キー、外部キー、CHECK制約)を追加すると、基礎となるSYS_FBA_アーカイブ表に直接アクセスしない限り、履歴データを自動的に読み取ることができなくなります。制約管理と表の履歴トラッキングについては十分な注意が必要です。

SQL> SELECT * FROM DBA_FLASHBACK_ARCHIVE_TABLES WHERE TABLE_NAME='EMPLOYEES_FBA';

TABLE_NAME     OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME      STATUS
-------------- ---------- ---------------------- ------------------- --------
EMPLOYEES_FBA    HR         FLA1                   SYS_FBA_HIST_93946      ENABLED

DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBAによる解決

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('HR','EMPLOYEES_FBA');

PL/SQL procedure successfully completed.

再度制約を有効化

SQL> ALTER TABLE HR.EMPLOYEES_FBA ENABLE CONSTRAINT EMPLOYEE_PK;

Table altered.

DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBAでFDAを再有効化

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA('HR','EMPLOYEES_FBA');

PL/SQL procedure successfully completed.

特定時点より前の履歴データのパージ

SQL> ALTER FLASHBACK ARCHIVE FLA1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);

Flashback archive altered.

FDAの無効化

SQL> ALTER TABLE HR.EMPLOYEES NO FLASHBACK ARCHIVE;
SQL> ALTER TABLE HR.EMPLOYEES_FBA NO FLASHBACK ARCHIVE;

FDAの削除

SQL> DROP FLASHBACK ARCHIVE FLA1;

まとめ

Flashback Data Archive機能は、データ履歴を管理・保持するための一元的かつ統合されたインターフェースを提供し、ポリシーベースの自動管理を実現します。これにより、新規制への準拠や変化するビジネスニーズへの対応のために履歴データの追跡が求められるデータベース管理において、非常に効果的なソリューションとなります。

データベースに関する取り組みを、ぜひ私たちの専門家がサポートいたします。

フィードバックタブからコメントやご質問をお寄せください。私たちとの対話を始めることもできます。

  1. MongoDBのディスク使用量を理解する――領域割り当ての仕組みと最適化の判断基準

    はじめにMongoDBを使い始めたばかりの方にとって、そのディスク(スペース)使用量は一見すると分かりにくいものです。本記事では、MongoDBがどのようにディスク領域を割り当てるのか、そしてObjectRocketダッシュボードに表示される使用量情報をどう読み解けばよいのかを解説します。これにより、インスタンスのコンパクション(最適化)が必要なタイミングや、シャードを追加して利用可能領域を拡張すべきタイミングを適切に判断できるようになります。検証環境:5GBシングルシャードのMediumインスタンスまず、5GBのシャード1つで構成された真っさらなMediumインスタンスを用意します。このイン

  2. Microsoftアカウントのデータアーカイブをダウンロードする方法

    Microsoftでは、検索履歴、閲覧履歴、位置情報など、各サービスを利用して作成された自分のデータをまとめてアーカイブとしてダウンロードできます。この機能を使えば、Microsoft上での活動記録をバックアップして保管したり、自分がサービスをどのように利用しているのかを分析したり、他のサービスへ移行する際の参考にしたりすることが可能です。 Microsoftアカウントにサインインする まず、Microsoftアカウントページ(account.microsoft.com)にアクセスします。サインインを求められたら、パスワードを入力するか、スマートフォンでMicrosoft Authentica