1. 检查归档和闪回是否已开启(sysdba 身份)
SQL> select name, log_mode, flashback_on from v$database;
NAME LOG_MODE FLASHBACK_ON
--------- ------------ ------------------
ORCL NOARCHIVELOG NO
SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 8
当前日志序列 10
SQL> show parameter db_recovery_file_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\oracle\product\10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 1G
SQL>
2. 如果归档和闪回没有开启,则需要开启(sysdba 身份)
SQL> select name, log_mode, flashback_on from v$database;
NAME LOG_MODE FLASHBACK_ON
--------- ------------ ------------------
ORCL NOARCHIVELOG NO
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 452984832 bytes
Fixed Size 1249512 bytes
Variable Size 130027288 bytes
Database Buffers 314572800 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database flashback on;
数据库已更改。
SQL> alter system set db_recovery_file_dest='D:/Oracle/flash_recovery_area' scope=both;
系统已更改。
SQL> alter system set db_recovery_file_dest_size=2G scope=both;
系统已更改。
SQL> alter system set db_flashback_retention_target=2880 scope=both;
系统已更改。
SQL> select name, log_mode, flashback_on from v$database;
NAME LOG_MODE FLASHBACK_ON
--------- ------------ ------------------
ORCL ARCHIVELOG YES
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 9
下一个存档日志序列 11
当前日志序列 11
SQL> show parameter db_recovery_file_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:/Oracle/flash_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> show parameter db_flashback;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 2880
SQL> alter database open;
数据库已更改。
SQL>
# 备注
db_recovery_file_dest : 指定闪回恢复区的位置,需要提前手动创建好目录
db_recovery_file_dest_size : 指定闪回恢复区的可用空间大小
db_flashback_retention_target : 指定数据库可以回退的时间,单位为分钟,默认1天(1440分钟),配合db_recovery_file_dest_size一起使用,也就是说闪回恢复区要能够放得下在这段时间内所产生的需要回退的数据
3. 添加测试数据
SQL> conn scott/tiger
已连接。
SQL> create table t1(id int, name varchar2(10));
表已创建。
SQL> create table t2(id int, name varchar2(10));
表已创建。
SQL> insert into t1(id, name) values(1, 'a');
已创建 1 行。
SQL> insert into t2(id, name) values(2, 'b');
已创建 1 行。
SQL> commit;
提交完成。
SQL> create or replace procedure p1
2 is
3 begin
4 dbms_output.put_line('======= p1 =======');
5 end;
6 /
过程已创建。
SQL> select * from t1;
ID NAME
---------- ----------
1 a
SQL> select * from t2;
ID NAME
---------- ----------
2 b
SQL> set serveroutput on;
SQL> execute p1;
======= p1 =======
PL/SQL 过程已成功完成。
SQL>
4. 修改测试数据
SQL> conn scott/tiger
已连接。
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time from dual;
TIME
-------------------
2014-09-06 12:17:26
SQL> delete from t1;
已删除 1 行。
SQL> alter table t2 add age int default 20;
表已更改。
SQL> drop procedure p1;
过程已删除。
SQL> commit;
提交完成。
SQL> select * from t1;
未选定行
SQL> select * from t2;
ID NAME AGE
---------- ---------- ----------
2 b 20
SQL> set serveroutput on;
SQL> execute p1;
BEGIN p1; END;
*
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'P1'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL>
5. 恢复数据库到修改之前
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 452984832 bytes
Fixed Size 1249512 bytes
Variable Size 134221592 bytes
Database Buffers 310378496 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> select sum(percent_space_used)/100 from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)/100
---------------------------
.0131
SQL> flashback database to timestamp to_timestamp('2014-09-06 12:17:26', 'yyyy-mm-dd hh24:mi:ss');
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> conn scott/tiger
已连接。
SQL> select * from t1;
ID NAME
---------- ----------
1 a
SQL> select * from t2;
ID NAME
---------- ----------
2 b
SQL> set serveroutput on;
SQL> execute p1;
======= p1 =======
PL/SQL 过程已成功完成。
SQL>
6. 关闭闪回和归档
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 452984832 bytes
Fixed Size 1249512 bytes
Variable Size 134221592 bytes
Database Buffers 310378496 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> alter database flashback off;
数据库已更改。
SQL> alter database noarchivelog;
数据库已更改。
SQL> select name, log_mode, flashback_on from v$database;
NAME LOG_MODE FLASHBACK_ON
--------- ------------ ------------------
ORCL NOARCHIVELOG NO
SQL> alter database open;
数据库已更改。
SQL>
# 参考
Oracle Flashback 技术 总结
ORA-00265: 要求实例恢复, 无法设置 ARCHIVELOG 模式