天天看点

oracle10G新特性之闪回特性

oracle10G新特性之闪回特性

事务:是作为逻辑单元的SQL DML语句的集合

撤消表空间作用:逻辑事务的回滚,读一致性,各种数据库恢复操作及闪回功能

回滚:当DML命令对表进行改动时,DML命令改变的旧数据值记录在撤消表空间中,当回滚整个事务时,没有存储点的事务,oracle就会使用

撤消记录来撤消从事务开始以来DML命令进行的所有改动,释放受影响行上的锁,并且结束事务,当回滚到指定的存储点为止的部分事务,则

oracle会撤消存储点后DML命令进行的所有改动。所有随后的存储点都会丢失,释放在存储点后获得的所有锁,并且事务保持活动

读一致性:如果一个用户正在读取涉及另一个用户的DML事务中的记录,那么撤消为这些用户提供了读一致性,就是说所有正在读取受影响行

的用户将不会看到行中的任何改动,即读取的还是撤消表空间中的旧数据库记录,直到他们在DML用户提交事务(commit)后发出一个新的

查询,这样才会查取DML操作后的新数据。

数据库恢复:联机重做日志将提交和未提交的事务带入到实例崩溃的时间点,撤消数据用于回滚在崩溃或实例失败时没有提交的任何事务。

闪回操作:flashback table,flashback query,DBMS_FLASHBACK。

UNDO_RETENTION:指定为查询保留撤消信息的最小时间量,默认为900秒

撤消表空间中有3种类型的撤消数据:活动的或未到期的、到期的、未使用的

活动的或未到期的撤消数据是指读一致性仍然需要的撤消数据,即使在事务已经执行以后。

到期的撤消数据是指一旦需要活动撤消数据的所有查询已经完成,并达到撤消保留周期,活动的撤消数据就变成了到期的撤消数据。

未使用的撤消数据是指撤消表空间中从来没有使用过的空间。因此撤消表空间的最小大小是保存所有未提交或未回滚事务中所有数据的前像

版本所需要的空间。

撤消表空间过少导致查询失败的查询方法:

select to_char(end_time,'yyyy-mm-dd hh24:mi') end_time,undoblks,ssolderrcnt from v$undostat where ssolderrcnt <> 0;

ssolderrcnt:表明有多少查询失败并显示snapshot too old错误。

根据经验,可以使用下面公式来计算撤消表空间所需要的大小:

undo_tablespace_size=UR*UPS+overhead

UR等同于以秒为单位的撤消保留,通过undo_retention获得

UPS 等同于每秒使用的撤消块最大值:如数据库块为8K,每秒生成500个撤消块,则ups=500*8192

overhead等同于撤消元数据,通常是相对于整个大小的非常小的数量,可以忽略。

算出undo_tablespace_size后一般会增加10-20%,在10G中可以通过撤消顾问(undo advisor)来确定撤消表空间的利用率是最好的。

撤消表空间的动态性能视图:

dba_tablespaces 主要给出表空间名及其特征,如:TEMP表空间名,类型是temporary

dba_undo_extents 主要给出数据库中所有撤消段的大小,盘区,驻留的表空间及当前状态(未过期/过期)

v$undostat 主要给出10分钟间隔内数据库的撤消利用的数量,包含最多1008行(7天的数据)

v$rollstat 回滚段统计,包括大小和状态

v$transaction 包含实例的每个活动事务的一行

撤消保留保证(retention guarantee):一般是在表空间级别上的,并且可以任意时刻改动,设置撤消保留保证可确保表空间中未到期的

撤消被保留,即意味着DML事务可能没有足够的撤消表空间来成功完成。默认是noguarantee.可以更改为guarantee,如:

alter tablespace undotbs1 retention guarantee;

撤消表空间的支持的闪回特性:flashback query,flashback table,flashback version query,flashback transaction query。

flashback database,flashback drop.其中flashback database是使用闪回恢复区域中的闪回日志而不是撤消表空间中的撤消数据。

可以允许其他用户对别人的表进行flashback操作,只需要给该用户flashback权限,如:

grant flashback on hr.departments to scott;

flashback query:

从oracle9i2开始可以在select查询中使用as of子句检索在给定时间戳或SCN时表的状态。假如不小心一个小时前删除了两条记录,如:

delete from employees where employee_id in (195,186);

commit;

要恢复这两条记录,可以使用时间戳和flashback query来检索删除的行,如:

insert into employees_archive select * from employees as of timestamp systimestamp - interval '60' minute where

employees.employee_id not in (select employee_id from employees);

commit;

然后再插入到employees表:

insert into employees select * from employees_archive;

commit;

与使用时间戳相比,更可取的方法是使用SCN用于闪回,SCN非常精确,而时间戳值只是每5分钟存储一次以支持闪回操作。

当然可以使用flashback table来恢复整个表,这样更快,但不清楚删除的是哪几行。

当然也可以使用CTAS(不适合的恢复)进行恢复,如:

create table employees_del as select * from employees as of timestamp systimestamp - interval '60' minute where

employees.employee_id not in (select employee_id from employees);

然后再插入到employees表:

insert into employees select * from employees_del;

commit;

dbms_flashback:

其实是实现flashback query的另一种方法,与flashback query的关键区别是:flashback query是对象级别上的操作,而dbms_flashback是

在会话级别上的操作。从特定的时间戳或SCN启用dbms_flashback后,数据库就如同回到了特定的时间戳或SCN的状态,直到禁用

dbms_flashback,这样就不允许有DML操作了(因为数据库的状态不是当前状态了),如果要使用DML操作并更新到当前状态时间点的数据库中,

可以在启用dbms_flashback之前打开游标。

dbms_flashback可用的过程有:

disable 表示禁用该会话的闪回模式

enable_at_system_change_number 启用该会话的闪回模式,指定SCN

enable_at_time 启用该会话的闪回模式,使用最接近于指定的timestamp的SCN

get_system_change_number 返回当前的SCN

scn_to_timestamp

timestamp_to_scn 转换oracle timestamp,并且返回最接近timestamp值的SCN

execute dbms_flashback.enable_at_time(to_timestamp(sysdate - interval '45' minute));

为了确保dbms_flashback启动后能进行DML操作,需要建立游标,需要建立匿名块,在此不在叙述。

flashback table:

为了在一个表或多个表上使用flashback table,必须在执行闪回操作之前在表上启用行移动(如果应用程序是基于rowid的,则不要使用

行移动),执行恢复操作如下:

flashback table employees to timestamp systimestamp - interval '60' minute;

如果是多表恢复的话,可以使用

flashback table employees,departments to timestamp systimestamp - interval '60' minute;

flashback version query:

是返回两个SCN或时间戳之间给定行的完整历史记录。在此不做详细说明

当不小心使用了drop table employees cascade constraints;在10G以后,drop的表并没有完全消失,它的块仍就保持在其表空间中,并占用

空间,可以通过recyclebin(user_recyclebin)数据字典视图来查看删除的对象,可以通过如下命令从回收站中恢复该表

flashback table employees to before drop;需要注意的是不能恢复该表引用的约束.如果对drop掉的表进行清除,可以使用purge命令

来删除所有在recycle中的被删除的对象.

闪回查询可以将查询结果保存在一个分离的表中也可以根据闪回查询的结果来更新表中的行.

比如在update时因未加where条件,更新了所有的数据,如:

update employees set empname='wang';

commit;

这样整个表都出现了错误数据,如果要恢复该表到以前的数据,我们可以做如下操作:

1、确定当前的SCN号

execute dbms_flashback.get_system_change_number 得到当前的SCN号,如结果为:71220

2、允许该表可以进行行移动

alter table employees enable row movement;

3、闪回到以前的一个SCN

flashback table employees to scn(71000)

flashback database命令

该命令将数据库返回到一个过去的时间戳或SCN,提供一种执行不完整的恢复,在使用该操作时,必须使用alter database open resetlogs

命令再次打开它,必须拥有sysdba系统权限,以便使用flashback database命令。

flashback database命令的语法如下:

flashback [standby] database [database]

{to {scn | timestamp} expr |to before {scn |timestamp} expr }

如果不使用时间戳或SCN的话,可以使用如下命令进行闪回

startup mount exclusive;

alter database archivelog;

alter database flashback on;

alter database open;

其中有两个初始化参数来控制保留在数据库中的闪回数据的数量。

db_flashback_retention_target 设置闪回数据库的时间程度设置上限(单位是分钟)

db_recovery_file_dest 设置flash recovery area的大小,用于控制保存闪回日志的总大小

注意点:flashback table 使用已经存在撤消表空间中的数据,flashback database依赖于flash recovery area中的闪回日志

可以通过v$flashback_database_log来确定可以闪回数据库的程度。可以通过v$database来查看闪回的状态

如果通过时间戳来进行恢复,可以使用如下命令

startup mount exclusive;

flashback database to timestamp sysdate-1/24; 恢复一小时之前的数据库

一旦完成闪回,必须使用alter database open resetlogs;来进行打开,如果为了关闭闪回数据库选项,需要执行以下命令:

startup mount exclusive;

alter database flashback off;

alter database open;