一、背景描述
今日,在oracle DBA群里有一个群友提问,在没有打开闪回数据库的前提下,oracle 闪回查询是依赖于undo,还是会依赖redo ,archivelog呢?结果在群里的讨论就产生了两个派系,一个是只依赖于undo,能闪回的时间长短取决于undo表空间所能保存的数据;另一个就是先取undo,如果undo没有就去取redo,archivelog;那么到底是谁对谁错呢?对于技术问题,我认为是不能口水战的,需要理论+实践。于是针对此问题,进行研究。
二、问题
验证以下说法那个是正确的:
- only undo ,undo有保存则可以闪回,没有则失败。
- undo -> redo -> archivelog ,如果都没有则无法闪回。
三、设计检验案例
-
环境 oracle database 11Gr2 ,归档模式,undo_retention=3600,单用户使用。闪回数据库选项关闭。
-
在一个只有我一个用户的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分钟前的数据。
- 删除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分钟前的数据。
- 清空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')
结果: 能成功闪回数据。
- 清空归档,再检验一次闪回,代码如下:
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')
结果: 能成功闪回数据。
- 通过上面的测试,根本试验不出闪回与是那个组件有直接的关系。如是把结果与群友分享,讨论后,对以上测试调整为,切换undo表空间后,立即flush buffer_cache,或重启。
- 重复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不在了,闪回也失败了。即问题中的假设一成立。
五、后续问题
- 为什么undo删除后,不flush,为什么还能闪回? 是BUG吗?还是因为drop tablespace undotbs1 including contents and datafiles;不会直接刷新内存,只是在redo上记录,但是我发出了checkpoint,还是没有生效。那另一个可能是受undo_retention控制呢?还需要后续研究。