Flashback Database闪回数据库
使用闪回数据库可以将数据库快速的闪回到过去某个时间点。在启用闪回数据时,会将修改过的块的前映像作为闪回数据库日志保存在闪回恢复区中,如出现逻辑坏块或用户错误操作需要恢复到过去的时间点,闪回数据库将还原数据库的前映像,然后使用归档日志和redo前滚到期望恢复的时间点,因为无需还原数据库的数据文件,所有此过程速度比较传统的还原恢复通常快很多。
启动闪回数据库时,会将前映像数据保存在“闪回缓冲区”中,然后由恢复写入器(Recovery Writer,RVWR)后台进程,将闪回缓冲区的前映像数据保存在闪回恢复区的闪回数据库日志中。
配置闪回数据库相关参数:
db_recovery_file_dest 决定闪回恢复区路径
db_recovery_file_dest_size 决定闪回恢复区大小
db_flashback_retention_target 保留恢复最近多长时间的数据,单位为分钟。
闪回数据库必须在归档模式下
开启归档
1、SQL> alter system set log_archive_dest_1='location=+oradg/b1/recovery/' scope=both;
2、SQL> shutdown immediate
3、SQL> startup mount
4、SQL> alter database archivelog;5、SQL> alter database open;
6、SQL> archive log list
设置闪回区大小,路径,闪回保留时间
SQL> alter system set db_recovery_file_dest_size=5G;
System altered.
SQL> alter system set db_recovery_file_dest='+ORADG';
System altered.
SQL> alter system set db_flashback_retention_target=2880;
System altered.
开启闪回功能
SQL> startup mount exclusive
SQL> alter database flashback on;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
关闭闪回功能
SQL> startup mount exclusive
ORACLE instance started.Total System Global Area 839282688 bytes
Fixed Size 2217992 bytes
Variable Size 557844472 bytes
Database Buffers 276824064 bytes
Redo Buffers 2396160 bytes
Database mounted.
SQL> alter database flashback off;Database altered.
SQL> alter database open ;
Database altered.
SQL> alter system set db_recovery_file_dest='';
System altered.
闪回数据库的步骤
1、关闭数据库
2、启动数据库到mount状态[exclusive模式]
3、闪回至某个时间点,SCN或还原点
4、使用resetlogs打开数据库
闪回数据库的方法
1、sqlplus下基于SCN闪回
FLASHBACK DATABASE [<database_name>] TO SCN <system_change_number>
2、sqlplus下基于时间戳闪回
FLASHBACK DATABASE [<database_name>] TO TIMESTMP <system_timestamp_value>
3、sqlplus下基于还原点闪回
FLASHBACK DATABASE [<database_name>] TO RESTORE POINT <restore_point_name>
4、RMAN下基于时间戳闪回
RMAN> FLASHBACK DATABASE TO TIME = "TO_DATE('2013-10-10 19:25:21','YYYY-MM-DD HH24:MI:SS')";
5、RMAN下基于SCN闪回
RMAN> FLASHBACK DATABASE TO SCN=1121679;
6、RMAN下基于:归档序号
RMAN> FLASHBACK DATABASE TO SEQUENCE=56 THREAD=1;
运用闪回功能示例:
示例1:删除表的部分数据后,使用闪回数据库的方法恢复
SQL> create table test_flashback as select * from emp; --创建表
Table created.
SQL> select dbms_flashback.get_system_change_number from dual; --记录删除数据前scn
GET_SYSTEM_CHANGE_NUMBER
------------------------
1069396SQL> delete from test_flashback where deptno=20; --删除数据
5 rows deleted.
SQL> commit;
Commit complete.
SQL> startup mount exclusive --启动到mount exclusive状态
ORACLE instance started.Total System Global Area 839282688 bytes
Fixed Size 2217992 bytes
Variable Size 557844472 bytes
Database Buffers 276824064 bytes
Redo Buffers 2396160 bytes
Database mounted.SQL> flashback database to scn 1069396; --闪回到删除数据之前,还可以用时间戳闪回如:
Flashback complete. --flashback database to to_timestamp('2013-10-8 18:02:34','YYYY-MM-DD HH24:MI:SS')
SQL> alter database open read only; --以read only 方式打开检查数据库是否闪回成功,如不成功考虑其他形式的闪回
Database altered.
SQL> select * from scott.test_flashback where deptno=20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
SQL> startup
ORACLE instance started.Total System Global Area 839282688 bytes
Fixed Size 2217992 bytes
Variable Size 557844472 bytes
Database Buffers 276824064 bytes
Redo Buffers 2396160 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open SQL> alter database open resetlogs;
Database altered.
--闪回数据库之后,最后做一次全备