12cよりRMANを利用して表単位でのリカバリを行なうことが出来るようになりました。
これで、特定の表をある指定した時点に戻すということが出来ます。

[oracle@DB01 ~]$ sqlplus test/password@pdb1

SQL*Plus: Release 12.1.0.2.0 Production on 月 7月 18 00:54:29 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

最終正常ログイン時間: 日 7月  17 2016 01:14:32 +09:00


Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics,
Real Application Testing and Unified Auditing options
に接続されました。

SQL> CREATE TABLE t1 (id NUMBER);

表が作成されました。

SQL> INSERT INTO t1 VALUES (1);

1行が作成されました。

SQL> COMMIT;

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


テスト用にt1という表を作成し、1件のデータを挿入しました。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> SELECT DBMS_FLASHBACK.get_system_change_number FROM dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 3163019


リカバリ前に現在のSCN番号を確認します。
この番号が重要です。

[oracle@DB01 ~]$ sqlplus test/password@pdb1

SQL> INSERT INTO t1 VALUES (2);

1行が作成されました。

SQL> COMMIT;

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

SQL> SELECT * FROM t1;

        ID
----------
         2
         1


もう1件データを挿入しました。
この表を先ほど確認したSCN番号の地点まで戻せば、ここで挿入したデータは消えるはずです。

RECOVER TABLE 'TEST'.'T1' OF PLUGGABLE DATABASE pdb1
UNTIL SCN 3163019
AUXILIARY DESTINATION '/u01/aux'
REMAP TABLE 'TEST'.'T1':'T1_PREV';

recoverが開始されました(開始時間: 16-07-18)



recoverが完了しました(完了時間: 16-07-18)

早速、リカバリ開始です。
rmanのRECOVERコマンドを利用します。
今回はPDB内の表をリカバリします。
作業用に/u01/auxを利用し、リカバリ後の表名はt1_prevとします。
相当な量のログが流れた後にリカバリが完了します。

[oracle@DB01 ~]$ sqlplus test/password@pdb1

SQL> SELECT * FROM t1;

        ID
----------
         2
         1

SQL> SELECT * FROM t1_prev;

        ID
----------
         1


早速、PDBに接続し、表を確認します。
本来の表には2件データが挿入されています。
一方で、リカバリ後の表には1件しかデータが挿入されていません。
2件目のデータが挿入される前のSCN番号に戻ったからです。