【oracle】multi-versioning and flashback

本文深入探讨了Oracle数据库中的多版本并发控制机制及其读一致查询特性,重点介绍了如何利用系统改变号(SCN)实现数据的历史查询。同时,文章详细阐述了闪回功能的实现原理及应用,包括如何通过SCN查询特定时间点的数据,以及在使用闪回命令时可能出现的错误及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多版本 多版本是Oracle并发控制机制的基础,Oracle采用多版本、读一致的并发模型。 当我们要检索一张员工表,并要获得所有工资的总和时,通常使用以下sql select sum(salary) from emp; 但当数据库查询到第100条时,另外的用户将第101条员工的工资提高了500,那么这时我们的查询会出现什么结果呢? 是提高了500工资之后的数据还是提高工资之前的数据呢? 实际上当oracle中的数据被改变时(如update,insert等),oracle会把改变之前的数据放在undo段的数据区内, 这个数据区也称为回滚段。 当查询语句发现要查询的数据已经被改变时,会从undo段内取得改变之前的数据,所以得到的结果就是提高工资之前的统计数据。 所谓“改变之前”的时间点就是查询开始的时间点或游标打开的时间点。 闪回(flashback) 闪回需要使用到系统改变号(system change number,简写为scn),其实scn就是一个多版本的时间点,每次commit时 scn就会向上递增。 dbms_flashback.get_system_change_number便是scn了。 可使用绑定变量取得scn: exec :scn := dbms_flashback.get_system_change_number 输出scn: print scn SCN ---------- 986408 通过scn我们就能查询到某个时间点下的数据。例如: select * from emp as of scn :scn; 这样就可以查询“历史记录”了。 在oracle 10g以后,提供了flashback命令,它使用了多版本技术,可以把对象回复到以前某个时间点的状态。 如: flashback table emp to scn :scn; 如果出现“ORA-08189: cannot flashback the table because row movement is not enabled using the FLASHBACK command” 的错误,这需要执行以下命令: alter table emp enable row movement; 这个命令的作用是,允许Oracle修改分配给行的rowid。在Oracle中,插入一行时就会为它分配一个rowid,而且这一行永远拥有这个rowid。 闪回表处理会对EMP完成DELETE,并且重新插入行,这样就会为这些行分配一个新的rowid。要支持闪回就必须允许Oracle执行这个操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值