Oracle - 事务,回滚段和undo_retention参数如何工作?
-
07-07-2019 - |
题
我不是DBA,而且我很难理解Oracle的事务管理流程。
根据我的理解,通过阅读互联网上一些可靠的页面(最值得注意的是 AskTom note - 但不要理会评论),提交交易时,新数据不报告在实际数据块上,但仍保持登录回滚段。当有人在数据上发出SELECT时,或者当UNDO_RETENTION秒已经过去时 - 无论这两个事件首先发生 - 那么新数据就会(然后才会)写在数据块上。
但据我所知,我们公司的某个人最近告诉我相反的情况:根据他的说法,当提交一个交易时,新数据 立即写在数据块上,并且rollback segment / undo tablespace将旧数据保留UNDO_RETENTION秒的持续时间。在此期间,此旧数据仍可用于在事务之前在SCN上启动的查询进行访问。
那么,Oracle内部真正发生了什么,你能提供备份回复的参考吗?
我们正在使用Oracle 9.2.0.8。
提前致谢。
解决方案
这里有很多内容!公司中的人员基本上是正确的,除非更改在提交之前写入内存中的数据块 ,甚至在提交之前;并且它们完全独立于提交时写入磁盘(可能在之前,之后,从未作为提交操作的一部分)。
1)UNDO_RETENTION与将更改写入数据块(无论是在内存中还是在磁盘上)无关。 UNDO_RETENTION控制在您提交更改后,撤消更改所需的数据会持续多长时间。目的是在提交之前启动的其他查询或可序列化事务可能仍然需要该数据。参考: http://download.oracle.com /docs/cd/B19306_01/server.102/b14231/undo.htm#sthref1477
2)进行更新时,会修改内存中的数据块。它们可能会也可能不会被写入磁盘(甚至在您提交之前,我相信);这是通过后台进程完成的。此外,重做信息将写入重做日志缓冲区。撤消生成并存储在撤消段中。
3)提交时,Oracle会确保将重做信息写入磁盘,并将撤消数据标记为已提交。但它不会将内存中已更改的数据块写入磁盘,也不会返回并将每个块标记为已提交。这是为了使提交尽可能快。参考: http://download.oracle.com /docs/cd/B19306_01/server.102/b14220/transact.htm#sthref628
4)内存中的数据块在被后台进程写入磁盘时或下次使用时(通过SELECT或任何其他操作)将被标记为已提交。这就是AskTom笔记所讨论的内容。这不是关于您对数据的更改是否写入块;它是关于它们是否在块本身中被标记为已提交。