• Oracle 9


    1.redo

    redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术。

    每个Oracle数据库至少有2个在线重做日志组,循环写。

    只有INSERT, DELETE, UPDATE,MERGE才会生成redo日志,

    redo日志用于数据库故障恢复,比如系统崩溃,磁盘介质问题。

    2.undo

    undo 与redo相反, 修改数据时,会生成undo信息,以便回到更改前的状态。

    undo存放在数据库中一组undo变空间和undo段中。

    每次用undo恢复数据时,只是逻辑回滚,就是将数据恢复到更改前的状态。 物理变化不会被回滚,比如执行INSERT, 数据库为之创建了新的Extents, 此时回滚的话,这个新创建的extents就不会被消除。

    做个试验,通过启用autotrace,查看insert空和insert大量数据后, 再执行SELECT的I/O情况。

    3.多次提交和一次提交多个语句。

    执行COMMIT的开销

    (1) 增加和数据库的通信。

    (2) 每次提交都需要将redo写到磁盘,导致等待I/O, 只要是log file sync。

    再执行COMMIT之前,大多数工作都已经被完成, 比如

    (1) 已经在SGA中生成undo块

    (2) 已经在SGA中生成了已修改数据块

    (3) 已经在SGA中生成了前2项的redo

    (4) 取决于#1,2,3数据量大小,有些可能已经被输出到磁盘, LGWR一直在后台不停的工作。

    (5) 已经得到全部锁

    所以提交的时候,做的事情就下面几件

    (1) 生成一个SCN

    (2) 将余下的redo缓存输出到磁盘,并把SCN记录到其中. 到这里事物就已经提交,再v$transaction中已经查不到该transaction

    (3) 释放锁,块清除。

    从上面可以看出COMMIT的开销并不大。但是大量的频繁的提交小transaction,也可能带来长时间的lgwr I/O等待。

    执行Rollback操作时,要撤销已做的修改。从undo段读回数据。

    后续内容

    分析redo, 分析undo

  • 相关阅读:
    代码高亮测试
    自定义Edit控件控制输入范围
    多字节字符与界面 manifest
    实现类成员函数回调
    [VIM插件]fedora22编译vim7.4对perl组件支持的问题
    火车头Ecshop2.7文章采集发布模块
    js 创建对象
    js 属性类型
    JS函数的属性
    JS 函数中返回另一个函数
  • 原文地址:https://www.cnblogs.com/xzpp/p/3416286.html
Copyright © 2020-2023  润新知