本文主要是介绍oracle闪回数据库flashback database的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在传统的数据库恢复中,如果为了应对用户错误,通常需要进行基于时间点的不完全恢复,恢复的过程需要恢复数据文件,归档日志、再通过日志应用恢复到指定的时间点,这种恢复可能需要更长的时间,而flashback database可以避免文件恢复过程,从而缩短恢复时间。
flashback database的原理:要使用flashback database,必须先启用此功能 。当启用flashback database后,数据库会定期将发生变化的数据块的前镜像写入闪回日志的日志文件中,在数据库闪回时,这些数据块可以直接被复制过来以满足数据库的恢复需求,同时redo log可以被应用以辅助恢复到理精确的时间点,从而极有的缩小恢复时间。不过使用flashback database有一些限制:
1)、flashback database 不能解决media failue,对于这种错误只能是rman恢复;
2)如果删除了数据文件或者利用shrink技术缩小数据文件大小,这时是不能用flashback database技术回退到改变之前的状态,这时间就必须利用RMAN把删除之前或者缩小之前的文件备份restore出来,然后利用flashback database执行剩下的恢复;
3)如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用flashback database;
4)使用flashback database 所能恢复到的最早的scn,取决于flashback log中的记录的最早的scn.
下面通过scott用户下的表作为测试:
步骤1:查看rvwr进程:
flashback database 的日志文件不是由传统的lgwr进程写入,而是由recovery writer (RVWR)的进程写入(这是由oracle 10g新增的一个进程):
[oracle@localhost ~]$ ps -ef|grep rvwr
步骤2:启用flashback database的功能
SQL> startup mount;
ORACLE instance started.
Total System Global Area 2405122048 bytes
Fixed Size 2255592 bytes
Variable Size 603981080 bytes
Database Buffers 1778384896 bytes
Redo Buffers 20500480 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select dbid,name,flashback_on,current_scn from v$database;
DBID NAME FLASHBACK_ON CURRENT_SCN
---------- --------- ------------------ -----------
1821627089 WUTONG YES 1133591
SQL> show parameter db_flashback
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
步骤3:在scott用户下查询有哪些表,并且分别查询emp和test_emp中的数据量
SQL> conn scott/tiger
Connected.
SQL> select * from tab;
TNAME TABTYPECLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
TEST_EMP TABLE
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
步骤4:设置会话时间格式,分别用truncate清除test_emp和emp表
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2016-09-12 03:37:30
SQL> truncate table test_emp;
Table truncated.
SQL> select sysdate from dual;
SYSDATE
-------------------
2016-09-12 03:38:39
SQL> truncate table emp;
Table truncated.
步骤5:把数据库启动到mount下,以timestamp/scn/sequence方式闪回,并且以只读方式打开数据库
SQL> select sysdate from dual;
SYSDATE
-------------------
2016-09-12 03:39:05
SQL> conn / as sysdba
Connected.
SQL> startup mount;
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 2405122048 bytes
Fixed Size 2255592 bytes
Variable Size 603981080 bytes
Database Buffers 1778384896 bytes
Redo Buffers 20500480 bytes
Database mounted.
SQL> flashback database to timestamp to_timestamp('2016-09-12 03:37:30','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
SQL> alter database open read only;
Database altered.
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
SQL> select count(*) from scott.test_emp;
COUNT(*)
----------
14
最后以resetlogs方式打开数据库,但是一旦以resetlogs方式打开数据库就不能再flashback 至resetlogs之前的时间点了
此时可以看到数据已经恢复,如果数据恢复的不够理想,则关闭数据库后重新进行上述恢复。
这篇关于oracle闪回数据库flashback database的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!