基于 SCN 闪回数据库
1) 创建测试环境并获取当前 SCN
SCOTT@ORA11GR2>create table fbdb_scn as select 1 as id,dbms_flashback.get_system_change_number as scn,sysdate as dd from dual;
Table created.
SCOTT@ORA11GR2>select * from fbdb_scn;
ID SCN DD
---------- ---------- -------------------
1 1873185 2016-10-01 07:17:06
--得到此时的 SCN,本次测试将数据库“倒带”到此处,也就是,最终的结果, fbdb_scn 表中只有一
条记录。
SCOTT@ORA11GR2>select dbms_flashback.get_system_change_number as scn from dual;
SCN
----------
1873323
(或者在sys用户select current_scn from v$database;)
SCOTT@ORA11GR2>insert into fbdb_scn select 2 as id,dbms_flashback.get_system_change_number as scn,sysdate as dd from dual;
1 row created.
SCOTT@ORA11GR2>commit;
Commit complete.
SCOTT@ORA11GR2>select * from fbdb_scn;
ID SCN DD
---------- ---------- -------------------
1 1873185 2016-10-01 07:17:06
2 1873381 2016-10-01 07:22:46
2) 删除 scott 用户
SCOTT@ORA11GR2>conn / as sysdba
Connected.
SYS@ORA11GR2>drop user scott cascade;
User dropped.
3) 数据库启动到 mount 模式,为闪回数据库做准备
SYS@ORA11GR2>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@ORA11GR2>
SYS@ORA11GR2>startup mount;
ORACLE instance started.
Total System Global Area 730714112 bytes
Fixed Size 2256832 bytes
Variable Size 452984896 bytes
Database Buffers 272629760 bytes
Redo Buffers 2842624 bytes
Database mounted.
正常关库,一致性状态保存。启动mount,利用控制文件找到闪回日志,并应用闪回日志。
4) 执行基于 SCN 闪回数据库操作
SYS@ORA11GR2>flashback database to scn 1873323;
Flashback complete.
5) 以 RESETLOGS 选项打开数据库
SYS@ORA11GR2>alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
(因为闪回数据库相当于倒带,无法应用日志恢复到闪回时刻,属于不完全恢复,为了保证日志信息和控制文件等一致性状态,必须resetlogs重置日志)
SYS@ORA11GR2>alter database open resetlogs;
Database altered.
6) 验证基于 SCN 闪回数据库
SYS@ORA11GR2>select username from dba_users where username='SCOTT';
USERNAME
------------------------------
SCOTT
SYS@ORA11GR2>select * from scott.fbdb_scn;
ID SCN DD
---------- ---------- ---------
1 1873185 01-OCT-16
Scott用户回来了,以及表fbdb_scn数据也只有一条。
7) 小结
- 成功的恢复了 scott 用户
- 测试表 fbdb_scn 中的数据也是我们验证的结果
- 因为是基于准确的 SCN 执行的闪回数据库,所以没有必要以 readonly 方式打开数据库来验证
结果