发表人:rusher 2022-04-18 10:51:59 最新回复: 2022-04-18 10:51:59
前段时间,吐哈油田数据服务器宕机,吐哈油田当时在机器上同时装了oracle和pg两种数据库,宕机之后,pg快速修复,而oracle自动回复失败,查看日志返现ora-600 【4193】错,4193一般和undo有关,仔细检查果然,undo 的scn与#file2的某一块不一致,导致回复失败,重建并recover之后修复成功。
由这个问题引出今天的话题 Oracle 和pg 的事物处理机制差别:
有数据库以来,关于事物处理有两打派别: 以oracle 为首的undo派别和以mysql为首的多版本派别,(顺便 说一下,这两个派别的创建者,均为图灵奖获得者,在业内都是天花板级别的存在),简单的说undo的原理就是把旧版本映射到undo表空间上,新的在原址上修改,两边通过事物号控制,一旦回滚,把undo中的内容在恢复回来。而多版本的原理就是所有的修改都是在新块上先将老数据拷贝到新快,然后更新新块内容。当然在每行都有版本号,事物号,提交标志等信息。
undo的读一致性我就不多说了,比较简单,就是看块信息,然后到undo上查找,未提交的数据信息,而多版本派别稍微复杂一些,当一个事务修改一个块但是尚未提交,那么其他事务在读一致性上,需要倒查所有符合条件的,事物号最大的块。
undo派的update可以看出,一旦回退,仅仅需要将修改的内容改回去就可以,比如一个表100列,如果只修改了一列,那么回滚的时候仅仅回滚一列的内容就可以了,而多版本派别即使修改的是一列,那么也要把正行复制一遍 所以在update 上undo 略胜一筹
然而在insert上 undo派别需要将新行先写入undo,一旦提交再将undo更新到表中,这显然比多版本派别要慢
最后是delete操作,多版本的delete操作仅仅是在源行上打个标签,非常轻松,而undo派别就比较麻烦了,因此delete操作多版本派别在性能上稍好一些
总结一下,多版本派别的核心思想就是所有的改动都不在原址上操作,而undo 在处理上稍微复杂但是更优雅
在insert/delete上多版本略胜一筹但是在update上尤其是少量列的update上,undo完胜
另外多版本还有一个比较恶心的问题就是空间的极速膨胀以及空间回收的问题
总的来说undo更优雅,而多版本略显简单粗暴(但是我喜欢)
以上都是我个人的一些观点,欢迎大家批评指正