flashback database是10g推出的一个重大改进,它可以让我们不用做不完全恢复的情况下把数据库
"回滚"到过去的某一个时间点。
你可以在创建数据库时设定flashback database,如果当时没有设置,可以按下面的步骤进行设置
:
1、设置flashback
--首先要把数据库置于归档模式
在pfile中增加以下参数,重启数据库
log_archive_max_processes=3
log_archive_dest_1='location=D:oracleproduct10.2.0oradataorclarchived'
log_archive_format="%T%S%r.ARC"
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup mount pfile='D:oracleproduct10.2.0adminorclpfileinit.ora';
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1292036 bytes
Variable Size 171968764 bytes
Database Buffers 432013312 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
--打开归档
SQL> alter database archivelog;
数据库已更改。
--打开数据库的闪回功能
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
--重建SPFILE
SQL> create spfile from pfile='D:oracleproduct10.2.0adminorclpfileinit.ora';
文件已创建。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 D:oracleproduct10.2.0oradataorclarchived
最早的联机日志序列 28
下一个存档日志序列 30
当前日志序列 30
--设置闪回区大小
SQL> alter system set db_recovery_file_dest_size=2g;
系统已更改。
--最后验证
SQL> select FLASHBACK_ON from v$database;
FLASHBACK_ON
------------------
YES
2、测试flashback
--首先做一些破坏性工作
SQL> drop user scott cascade;
用户已删除。
--通过V$FLASHBACK_DATABASE_LOG得到我们可以闪回的最早时间和最小scn
SQL> alter session set nls_date_format='MM-DD-YYYY HH24:MI:SS';
会话已更改。
SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1634603 01-07-2008 12:04:10
--重启数据库到mount
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1292036 bytes
Variable Size 180357372 bytes
Database Buffers 423624704 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
--根据scn闪回数据库
SQL> flashback database to scn 1634603;
闪回完成。
--对数据库执行闪回操作后必须用resetlogs方式打开
SQL> alter database open resetlogs;
数据库已更改。
--检验数据
SQL> select username from dba_users where username='SCOTT';
USERNAME
------------------------------
SCOTT
--再次查看可以闪回的最早时间和最小scn
SQL> alter session set nls_date_format='MM-DD-YYYY HH24:MI:SS';
会话已更改。
SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
1634603 01-07-2008 12:04:10
发现结果与open resetlogs是一样的,说明可以闪回到什么时间点与open resetlogs无关,实际上
,它是由db_flashback_retention_target参数决定的。