【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機能は、データ履歴を管理・保持するための一元的かつ統合されたインターフェースを提供し、ポリシーベースの自動管理を実現します。これにより、新規制への準拠や変化するビジネスニーズへの対応のために履歴データの追跡が求められるデータベース管理において、非常に効果的なソリューションとなります。
データベースに関する取り組みを、ぜひ私たちの専門家がサポートいたします。
フィードバックタブからコメントやご質問をお寄せください。私たちとの対話を始めることもできます。
-
MongoDBのディスク使用量を理解する――領域割り当ての仕組みと最適化の判断基準
はじめにMongoDBを使い始めたばかりの方にとって、そのディスク(スペース)使用量は一見すると分かりにくいものです。本記事では、MongoDBがどのようにディスク領域を割り当てるのか、そしてObjectRocketダッシュボードに表示される使用量情報をどう読み解けばよいのかを解説します。これにより、インスタンスのコンパクション(最適化)が必要なタイミングや、シャードを追加して利用可能領域を拡張すべきタイミングを適切に判断できるようになります。検証環境:5GBシングルシャードのMediumインスタンスまず、5GBのシャード1つで構成された真っさらなMediumインスタンスを用意します。このイン
-
Microsoftアカウントのデータアーカイブをダウンロードする方法
Microsoftでは、検索履歴、閲覧履歴、位置情報など、各サービスを利用して作成された自分のデータをまとめてアーカイブとしてダウンロードできます。この機能を使えば、Microsoft上での活動記録をバックアップして保管したり、自分がサービスをどのように利用しているのかを分析したり、他のサービスへ移行する際の参考にしたりすることが可能です。 Microsoftアカウントにサインインする まず、Microsoftアカウントページ(account.microsoft.com)にアクセスします。サインインを求められたら、パスワードを入力するか、スマートフォンでMicrosoft Authentica