2017-11-26 DBA日记,oracle闪回查询的源头验证

一、背景描述

今日,在oracle DBA群里有一个群友提问,在没有打开闪回数据库的前提下,oracle 闪回查询是依赖于undo,还是会依赖redo ,archivelog呢?结果在群里的讨论就产生了两个派系,一个是只依赖于undo,能闪回的时间长短取决于undo表空间所能保存的数据;另一个就是先取undo,如果undo没有就去取redo,archivelog;那么到底是谁对谁错呢?对于技术问题,我认为是不能口水战的,需要理论+实践。于是针对此问题,进行研究。

二、问题

验证以下说法那个是正确的:

  1. only undo ,undo有保存则可以闪回,没有则失败。
  2. undo -> redo -> archivelog ,如果都没有则无法闪回。

三、设计检验案例

  1. 环境 oracle database 11Gr2 ,归档模式,undo_retention=3600,单用户使用。闪回数据库选项关闭。

  2. 在一个只有我一个用户的oracle数据库下,作简单的事务,并作闪回查询测试。代码如下:

select flashback_on from v$database; #返回no
archive log list; # 返回归档模式
create table book (name varchar(10));
insert into book value'kk');
commit;
等待5分钟后,
select to_char(sysdate,'hh24:mi:ss') from dual;
insert into book value'kk');
commit;
select * from book as of timestamp to_timestamp('2017-11-26 11:00:00','yyyy-mm-dd hh24:mi:ss')

结果:成功闪回5分钟前的数据。

  1. 删除undo表空间,替换一个新的,再校验是否能够实现闪回。
create undo tablespace undot1 datafile '+datadg' size 16G;
alter system undo_tablespace=undot1;
drop tablespace undotbs1 including contents and datafiles;
select * from book as of timestamp to_timestamp('2017-11-26 11:00:00','yyyy-mm-dd hh24:mi:ss')

结果:能成功闪回5分钟前的数据。

  1. 清空redo,再检验一次闪回,代码如下:
alter system checkpoint;
alter system archive log current;
select * from book as of timestamp to_timestamp('2017-11-26 11:00:00','yyyy-mm-dd hh24:mi:ss')

结果: 能成功闪回数据。

  1. 清空归档,再检验一次闪回,代码如下:
rman target /
delete noprompt archivelog all;
select * from book as of timestamp to_timestamp('2017-11-26 11:00:00','yyyy-mm-dd hh24:mi:ss')

结果: 能成功闪回数据。

  1. 通过上面的测试,根本试验不出闪回与是那个组件有直接的关系。如是把结果与群友分享,讨论后,对以上测试调整为,切换undo表空间后,立即flush buffer_cache,或重启。
  2. 重复2的测试,并在删除旧undo表空间后,立即执行如下代码:
alter system flush buffer_cache;
select * from book as of timestamp to_timestamp('flush buffer_cache之前的时间','yyyy-mm-dd hh24:mi:ss')

结果:ora-01555 ,snapsho too old,rollback segment number with name "" too small ,undo空间不在了,闪回也失效了。

四、结论

闪回查询只与undo有关,undo不在了,闪回也失败了。即问题中的假设一成立。

五、后续问题

  1. 为什么undo删除后,不flush,为什么还能闪回? 是BUG吗?还是因为drop tablespace undotbs1 including contents and datafiles;不会直接刷新内存,只是在redo上记录,但是我发出了checkpoint,还是没有生效。那另一个可能是受undo_retention控制呢?还需要后续研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值