-- 1. 版本及闪回区信息
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
-- 闪回区路径及最大大小
SQL> set linesize 1000
SQL> show parameter db_recover
NAME TYPE VALUE
------------------------------------ ---------------------- -----------------------------
db_recovery_file_dest string D:\oracle/flash_recovery_area
db_recovery_file_dest_size big integer 2G
-- 闪回区数据保持时间(分钟)
SQL> show parameter flash
NAME TYPE VALUE
------------------------------------ ---------------------- ------
db_flashback_retention_target integer 1440
SQL> select 1440/60 hours from dual;
HOURS
----------
24
SQL> shut
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 109052584 bytes
Database Buffers 176160768 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
-- 2. 开启数据库闪回(归档下才可开启数据库闪回)
SQL> alter database flashback on;
alter database flashback on
*
第 1 行出现错误:
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38707: 尚未启用介质恢复。
SQL> alter database flashback on;
alter database flashback on
*
第 1 行出现错误:
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38707: 尚未启用介质恢复。
SQL> archive log list
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 287
当前日志序列 289
SQL> alter database archivelog;
数据库已更改。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 287
下一个存档日志序列 289
当前日志序列 289
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
-- 最早恢复到的事件点
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select * from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
464604298 2008-03-11 16:51:50 1440 8192000 0
-- 3. 数据库闪回测试
-- 3.1 创建并损坏数据
SQL> create table t1 as select * from dba_objects;
表已创建。
SQL> create table t2 as select * from dba_objects;
表已创建。
SQL> create table t3 as select * from dba_objects;
表已创建。
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-03-11 16:58:23
SQL> drop table t2;
表已删除。
SQL> truncate table t3;
表被截断。
-- 3.2 闪回数据库
SQL> flashback database to timestamp(to_date('2008-03-11 16:58:23', 'yyyy-mm-dd hh24:mi:ss'));
flashback database to timestamp(to_date('2008-03-11 16:58:23', 'yyyy-mm-dd hh24:mi:ss'))
*
第 1 行出现错误:
ORA-38757: 要闪回数据库, 数据库必须已装载但不能打开。
SQL> shut
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 113246888 bytes
Database Buffers 171966464 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> flashback database to timestamp(to_date('2008-03-11 16:58:23', 'yyyy-mm-dd hh24:mi:ss'));
闪回完成。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
-- 4. 检查闪回结果
SQL> select count(*) from t1;
COUNT(*)
----------
50191
SQL> select count(*) from t2;
COUNT(*)
----------
50192
SQL> select count(*) from t3;
COUNT(*)
----------
50193
SQL>
-- 5. 关闭数据库闪回
SQL> shut
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 117441192 bytes
Database Buffers 167772160 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> alter database flashback off;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL>
参考《flashback database》 -- by piner