14章 フラッシュバックデータベース
フラッシュバック機能を利用することでリカバリ作業をより簡単にできるようになります。
本章ではフラッシュバックデータベースについて学んでいきます。
フラッシュバックデータベースとは
本章ではフラッシュバックデータベースについてご紹介です。
フラッシュバック機能はOracle Database10gからの新機能となりますが、この機能を使用してデータベースのリカバリなどを行うことが出来ます。
・フラッシュバッククエリ
・フラッシュバックバージョンクエリ
・フラッシュバックトランザクションクエリ
・フラッシュバックトランザクション
・フラッシュバックテーブル
・フラッシュバックドロップ
・フラッシュバックデータベース
上記のようにフラッシュバックは色々な機能がありますが、本章ではフラッシュバックデータベースをご紹介いたします。
フラッシュバックデータベースとはデータベースを過去の状態に戻す機能であり、不完全リカバリと同じ機能を提供します。
不完全リカバリとはDBのバックアップをリストアし、アーカイブログを適用し、データベースを現在より過去の時点に戻します。
フラッシュバックも同様の機能を提供します。フラッシュバックはフラッシュバックログを使用し、データベースをリストアせずに、過去の状態に戻すことが出来ます。その為、不完全リカバリと比較するとリストア作業が不要である為、リカバリ時間が短くてすみます。
フラッシュバックデータベースはフラッシュバックログを使用して、データベースを過去の状態に戻します。
ただしデータベース構成ファイルの物理的な破損や変更に関わるような状況の場合、フラッシュバックデータベースは使用できません。
・表領域を削除する前に戻す
・データファイル縮小する前に戻す
・データファイルを削除する前に戻す
etc
その他の制約事項は以下マニュアルを参照ください。
「フラッシュバック・データベースの制約」
Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド
フラッシュバックデータベースの設定
フラッシュバックデータベースはフラッシュバックログを使用します。このログはREDOログやアーカイブログでもないまったく別のログです。
以下の設定を行います。
1. ARCHIVELOGモードの有効化
2. フラッシュバックログの格納先と使用領域の最大サイズを指定
3. フラッシュバックデータベースの有効化
ARCHIVELOGモードは前回の章で紹介しているので省略します。
フラッシュバックログの格納先と領域サイズの設定は以下のパラメータを指定します。
DB_RECOVERY_FILE_DEST='/u01/app/oracle/flash_recovery_area'
DB_RECOVERY_FILE_DEST_SIZE=10G
DB_FLASHBACK_RETENTION_TARGET=1440
「DB_FLASHBACK_RETENTION_TARGET」はフラッシュバックログの最低保持期間です。
フラッシュバックデータベースの有効化は以下で実施します。
SQL> SELECT status FROM v$instance;
STATUS
------------
MOUNTED
SQL> ALTER DATABASE FLASHBACK ON;
Database altered.
SQL> SELECT flashback_on FROM v$database;
FLASHBACK_ON
------------------
YES
上記を設定したらこれで設定は完了です。
では実際にフラッシュバックデータベースを実行してみましょう。
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/oradata/orcl/arch
Oldest online log sequence 27
Next log sequence to archive 29
Current log sequence 29
アーカイブログモードは既に有効となっています。
ではDB_RECOVERY_FILE_DEST,DB_RECOVERY_FILE_DEST_SIZEを設定していきましょう。
SQL> alter system set db_recovery_file_dest_size = 10G;
System altered.
SQL> alter system set
2 db_recovery_file_dest = '/u01/app/oracle/oradata/orcl/recovery';
alter system set db_recovery_file_dest = '/u01/app/oracle/oradata/orcl/recovery'
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16019: cannot use db_recovery_file_dest with LOG_ARCHIVE_DEST or
LOG_ARCHIVE_DUPLEX_DEST
db_recovery_file_destの設定はエラーとなってしましました。db_recovery_file_destを設定するためにはLOG_ARCHIVE_DESTを設定していてはだめなようです。
一度、LOG_ARCHIVE_DESTの設定を解除し、LOG_ARCHIVE_DEST_1に設定を行います。
SQL> alter system reset log_archive_dest scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2926320 bytes
Variable Size 390072592 bytes
Database Buffers 125829120 bytes
Redo Buffers 5459968 bytes
Database mounted.
Database opened.
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
SQL> alter system set
2 log_archive_dest_1 = 'LOCATION=/u01/app/oracle/oradata/orcl/arch';
System altered.
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string LOCATION=/u01/app/oracle/orada
ta/orcl/arch
log_archive_dest_1に設定が完了しました。それでは再度db_recovery_file_destを設定します。
SQL> alter system set
2 db_recovery_file_dest = '/u01/app/oracle/oradata/orcl/recovery';
System altered.
SQL> show parameter DB_RECOVERY_FILE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/oradata/orcl/r
ecovery
db_recovery_file_dest_size big integer 10G
次はフラッシュバックデータベースの有効化を行います。
SQL> SELECT flashback_on FROM v$database;
FLASHBACK_ON
------------------
NO
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2926320 bytes
Variable Size 390072592 bytes
Database Buffers 125829120 bytes
Redo Buffers 5459968 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> SELECT flashback_on FROM v$database;
FLASHBACK_ON
------------------
YES
フラッシュバックデータベースの実行
それではフラッシュバックデータベースを実行する環境が整ったので実際に試してみましょう。
[構文] フラッシュバックデータベース
RMAN> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);
上記コマンドをMOUNT状態で実施しデータベースを過去の時間帯に戻します。その後はデータベースを読み取り専用でオープンし、問題なければ、リセットログを実施し起動します。
SQL> select * from emp;
EMP_ID NAME DEPT_ID
---------- ---------- ----------
1 Tom 10
2 Son 20
3 Jon 30
SQL> select * from dept;
DEPT_ID DEPT_NAME
---------- ----------
10 IT
20 Consulting
30 HR
では上記のテーブルを誤ってTRUNCATEしてしまったとします。
フラッシュバックデータベースで時間指定で戻してみます。
SQL> truncate table emp;
Table truncated.
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
17-03-28 17:26:47.441250 +09:00
SQL> truncate table dept;
Table truncated.
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
17-03-28 17:43:42.216017 +09:00
SQL> select * from emp;
no rows selected
SQL> select * from dept;
no rows selected
ではemp,dept表をTRUNCATEしたのでフラッシュバックデータベースで過去のデータに戻してみましょう。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2926320 bytes
Variable Size 390072592 bytes
Database Buffers 125829120 bytes
Redo Buffers 5459968 bytes
Database mounted.
SQL> FLASHBACK DATABASE
2 TO TIMESTAMP(to_timestamp('17-03-28 17:40:00','yy-mm-dd hh24:mi:ss'));
Flashback complete.
SQL> alter database open read only;
Database altered.
SQL> select * from emp;
no rows selected
SQL> select * from dept;
DEPT_ID DEPT_NAME
---------- ----------
10 IT
20 Consulting
30 HR
dept表をTRUNCATEする前に戻しました。
一度RESETLOGSオプションを使用してデータベースを起動してみます。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2926320 bytes
Variable Size 390072592 bytes
Database Buffers 125829120 bytes
Redo Buffers 5459968 bytes
Database mounted.
SQL> alter database open resetlogs;
Database altered.
では次にemp表もTRUNCATE前に戻してみましょう。
一度リセットログを行ってしまうと再度フラッシュバックデータベースで過去の状態に戻せませんでしたが、戻すことが可能となっています。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2926320 bytes
Variable Size 390072592 bytes
Database Buffers 125829120 bytes
Redo Buffers 5459968 bytes
Database mounted.
SQL> FLASHBACK DATABASE
2 TO TIMESTAMP(to_timestamp('17-03-28 17:25:00','yy-mm-dd hh24:mi:ss'));
Flashback complete.
Elapsed: 00:00:00.72
SQL> alter database open read only;
Database altered.
SQL> select * from emp;
EMP_ID NAME DEPT_ID
---------- ---------- ----------
1 Tom 10
2 Son 20
3 Jon 30
SQL> select * from dept;
DEPT_ID DEPT_NAME
---------- ----------
10 IT
20 Consulting
30 HR
emp,dept表ともにTRUNCATEを実施する前に戻すことができました。
今までTRUNCATEで消えてしまったデータを復旧する場合、不完全リカバリを実施していましたが、フラッシュバックデータベースを使用すれば、何時間もかかっていたリカバリ処理が数分で完了することが可能です。
以上がフラッシュバックデータベースについてのご紹介となります。