分类: LINUX
2009-05-18 09:10:59
第八章-oracle的闪回特性
8.1oracle
9i的闪回查询特性
从9i开始oracle引入了闪回查询(flashbak
query)特性,通过闪回查询我们可以安装时间戳或SCN来向前查询,获得修改之前的数据镜像,再通过insert等操作就可以恢复数据。
8.1.1闪回查询的使用
以下通过一个实例来说明如何使用9i的这个特性。
首先记录一下当前的时间戳,然后删除测试表中的两条数据并提交:
SQL>select
systimestamp from dual;
SQL>delete from eygle
where rownum<3
现在可以根据删除的估算时间向前推移查询,通过适当的时间估计,数据可以通过前镜像被很容易地查询回来:
SQL> select count(*)
from eygle as of timestamp (systimestamp –interval
‘10’
second)
也可以获得当前的SCN,通过估算,减少SCN向前进行查询尝试,也可以获得删除之前的数据:
SQL> col scn for
9999999999999
SQL> select
dbms_flashback.get_system_change_number scn from dual;
SQL> select count(*)
from eygle as of scn 18246565656;
8.1.2使用oracle闪回查询特性恢复案例
8.2SMON_SCN_TIME与闪回查询
8.2.1oracle 9i中的SMON_SCN_TIME
SMON_SCN_TIME是oracle数据库的系统表,SMON每5分钟更新一次这张表,记录一个时间戳(timestamp)和当前的SCN,这个表共保存1440条记录,也就是5天的记录,通过这个表,数据库可以对5天内的SCN和时间进行粗略的对应和转换。
8.2.2oracle 10g中的SMON_SCN_TIME
现在smon_scn_time表最多能够保存144000记录,也就是说能够支持每3秒一次的数据更新。在10g之前SMON_SCN_TIME由SMON来获取和记录SCN信息的,从10g开始,LGWR首先会在SGA中记录SCN与时间的映射关系,SMON则定期检查SGA是否内存中记录的映射大于磁盘上的,如果有就刷新记录到磁盘。在10g中,time_mp的时间模式被修改,现在的时间起点和9i不再相同。
8.2.3oracle 10g中的SCN与时间的映射及转换
10g提供了两个新的函数对于SCN和时间戳进行相互转换,这两个函数是scn_to_timestamp和timestamp_to_scn,通过对SCN和时间戳进行转换,oracle极大方便了很多备份和恢复过程。
来看一下这两个函数的用法,首先通过dbms_flashback.get_system_change_number可以获得系统当前的SCN值:
SQL> select
scn_to_timestamp(4546456465465) scn from dual;
再通过timestamp_to_scn可以将时间戳转换为SCN:
SQL>
select timestamp_to_scn(scn_to_timestamp(4546456465465)) scn
from dual;
最后总结一下,需要理解的是,oracle的SCN和时间转换要依赖于SMON_SCN_TIMEN表中的映射关系,如果表中没有记录,则无法转换,也就是说,时间和SCN之间并不存在绝对的对应关系。
8.3oracle 10g的闪回特性
在10g中,oracle对闪回特性进行了全面加强,现在flashback能够恢复几乎所有的数据库错误(除文件损坏、介质错误等问题之外)。
从10g开始,flashback支持的恢复级别包括:
n
数据库级闪回恢复:数据库级别的闪回能够将整个数据库恢复到过去的时间点
n
表级闪回恢复:表级闪回能够将数据表闪回回到过去的时间点,或者对DROP掉的数据表进行闪回恢复
n
行级恢复:闪回查询可以将表中的记录恢复到过去的时间点
n
事务闪回:通过事务级闪回,可以安装事务将数据库变更闪回。
8.3.1oracle 10g的数据库级闪回
Flashback database 是10g的新增功能,在启用Flashback
database功能之后,数据库会定期将发生变化的数据块的前镜像写入闪回日志的日志文件中,在进行数据库闪回时,这些数据库可以被直接复制回来以满足数据库的恢复需求,同时redo
log可以被应用辅助数据恢复到更精确的时间点,从而极大的缩短了恢复时间。
闪回数据库的日志文件不是有传统的log
writer 进程写入,而是有一个称做recovery
writer(RVWR)的新过程写入,这是10g新增的一个后台进程.
数据库的闪回状态可以从v$database视图中查询得到。
闪回需要在mount状态下进行,可以指定Timestamp/SCN/sequence进行闪回。
首先将数据库闪回到第一个时间点,以read
only的方式打开数据库:
SQL> flashback
database to timestamp to timestamp(‘2009-03-10
13:45:54’.’yyyy-mm-dd hh24:mi:ss’)
8.3.2oracle 10g的flashback
drop功能
Oracle 10g的flashback
drop功能,允许你从当前数据库中恢复一个被drop的对象,在执行drop操作时,现在oracle不是真正删除它,而是将该对象自动将放入回收站。回收站的相关信息可以从recyclebin/user_recylebin/dba_recyclebin
等视图中获取或者通过SQL*PLUS的show
recyclebin命令查看。
我们简单测试一下这个功能:
SQL> drop table t1;
SQL> show recyclebin;
要恢复这个对象,只需要使用如下命令即可:
SQL> flashback table
t1 to before drop;
如果向彻底清除这些对象,可以使用purge命令,如:
SQL> purge table t1;
使用purge
recyclebin可以清除回收站中的所有对象,类似的可以通过purge
user_recyclebin或者时purge
dba_recyclebin来清除不同的回收站对象,通过PURGE
TABLESPACE
另外需要注意的是,当使用DROP
TABLESPACE … INCLUDEING CONTENTS命令来删除表空间,表空间中的所有对象会被清除,包括回收站的内容,当使用DROP
USER … CASCADE命令来删除用户时,该用户下所有的对象会被清除,包括回收站中的内容。
当我们想要彻底删除一个表:
SQL> drop table
tablename purge;
需要注意的时sysdba的drop操作不会被记录,oracle也从不推荐用户使用sysdba身份创建用户对象。
如果我们不希望使用oracle的recyclebin,可以通过参数禁用。
SQL>alter system set
recyclebin=off;
8.3.3oracle 10g的flashback
version query
我们知道10g之前的闪回查询只能得到过去某个时间上的数据版本,但是在当前时间和过去的某个时间点上,一个表中的数据可能已经被变更或修改过多次,单一版本可能无法满足恢复的需要。
8.3.4通过10g的flashback
transaction query进行事务撤销
8.3.5闪回表
闪回表允许我们将数据表恢复到过去的某个时间点,而不必像以前一样采用基于时间点的恢复
Oracle 10g的flashback
table有如下特性:
n
可以在线操作
n
恢复到指定时间点或者SCN的任何数据
n
自动恢复相关属性,如索引、触发器
n
满足分布式的一致性
n
满足数据一致性,所有相关对象将自动一致
闪回表的常用语法为:
Alter table table_name enable row
movement;
Flashback table table_name to
timestamp|scn < timestamp|scn >
如果需要flashback一个数据表,需要具有flashback
any table的系统选项或者时该表的flashback对象权限,同时还需要拥有该表的SELECT
,INSERT,DELETE,ALTER权限,由于flashback table技术使用了DML操作区恢复数据,不能保证rowid不变,所以在闪回之前需要启用表的row
movement特性。
8.4使用函数辅助闪回
8.4.1oracle 10g新的内建函数ora_rowscn
这个函数可以用于返回相关记录的SCN值。
8.4.2结合ora_rowscn进行闪回恢复