• Oracle redo 与 undo


    Oracle数据库中最重要的两部分数据:redo与undo。redo(重做信息)是oracle 在线(或归档)重做日志文件中记录的信息,万一出现失效时可以利用这些数据来“重放”(或重做)事务。

    undo(撤销信息)是Oracle在undo段中记录的信息,用于取消或回滚事务。

    1 什么是redo

    重做日志文件(redo log file)对Oracle数据库来说至关重要。Oracle维护着两类重做日志文件:

    在线(online)重做日志文件和归档(archived)重做日志文件。 都用于恢复。

    其主要目的是:万一实例失效或者介质失败,它们就能派上用场。

    归档重做日志文件实际上就是已填满的”旧“在线重做日志文件的副本。

    2 什么是undo

    对数据库执行修改时,数据库会生成undo信息。以便回到更改前的状态。

    redo用于在失败时重放事务(恢复事务),undo则用于取消一条语句或一组语句的作用

    与redo不同,undo在数据库内部存储在一组特殊的段中,这称为undo段(undo segment)

    怎么才能看到undo生成(undo generation)的具体情况呢?

    (1)创建一个空表

    (2)对它做一个全表扫描,观察读表所执行的I/O数量。

    (3)在表中填入许多行(但没有提交)

    (4)回滚这个工作、并撤销。

    (5)再次进行全表扫描,观察所执行的I/O数量。

    1. scott@orclpdb1:orclcdb> create table t
    2. 2 as
    3. 3 select *
    4. 4 from all_objects
    5. 5 where 1=0;
    6. Table created.
    7. scott@orclpdb1:orclcdb> set autotrace on
    8. scott@orclpdb1:orclcdb> select * from t;
    9. no rows selected
    10. Execution Plan
    11. ----------------------------------------------------------
    12. Plan hash value: 1601196873
    13. --------------------------------------------------------------------------
    14. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    15. --------------------------------------------------------------------------
    16. | 0 | SELECT STATEMENT | | 1 | 481 | 2 (0)| 00:00:01 |
    17. | 1 | TABLE ACCESS FULL| T | 1 | 481 | 2 (0)| 00:00:01 |
    18. --------------------------------------------------------------------------
    19. Statistics
    20. ----------------------------------------------------------
    21. 96 recursive calls
    22. 181 db block gets
    23. 148 consistent gets
    24. 1 physical reads
    25. 30504 redo size
    26. 2375 bytes sent via SQL*Net to client
    27. 366 bytes received via SQL*Net from client
    28. 1 SQL*Net roundtrips to/from client
    29. 2 sorts (memory)
    30. 0 sorts (disk)
    31. 0 rows processed
    32. scott@orclpdb1:orclcdb> set autotrace traceonly statistics
    33. scott@orclpdb1:orclcdb> select * from t;
    34. no rows selected
    35. Statistics
    36. ----------------------------------------------------------
    37. 0 recursive calls
    38. 0 db block gets
    39. 0 consistent gets
    40. 0 physical reads
    41. 0 redo size
    42. 2375 bytes sent via SQL*Net to client
    43. 366 bytes received via SQL*Net from client
    44. 1 SQL*Net roundtrips to/from client
    45. 0 sorts (memory)
    46. 0 sorts (disk)
    47. 0 rows processed
    48. scott@orclpdb1:orclcdb>
    49. scott@orclpdb1:orclcdb> insert into t select * from all_objects;
    50. 54936 rows created.
    51. Statistics
    52. ----------------------------------------------------------
    53. 1377 recursive calls
    54. 9467 db block gets
    55. 105040 consistent gets
    56. 304 physical reads
    57. 9009588 redo size
    58. 494 bytes sent via SQL*Net to client
    59. 937 bytes received via SQL*Net from client
    60. 2 SQL*Net roundtrips to/from client
    61. 31 sorts (memory)
    62. 0 sorts (disk)
    63. 54936 rows processed
    64. scott@orclpdb1:orclcdb> rollback;
    65. Rollback complete.
    66. scott@orclpdb1:orclcdb> select * from t;
    67. no rows selected
    68. Statistics
    69. ----------------------------------------------------------
    70. 2 recursive calls
    71. 1 db block gets
    72. 1134 consistent gets
    73. 0 physical reads
    74. 140 redo size
    75. 2375 bytes sent via SQL*Net to client
    76. 370 bytes received via SQL*Net from client
    77. 1 SQL*Net roundtrips to/from client
    78. 0 sorts (memory)
    79. 0 sorts (disk)
    80. 0 rows processed
    81. scott@orclpdb1:orclcdb> set autotrace traceonly statistics
    82. scott@orclpdb1:orclcdb> select * from t;
    83. no rows selected
    84. Statistics
    85. ----------------------------------------------------------
    86. 0 recursive calls
    87. 0 db block gets
    88. 1118 consistent gets
    89. 0 physical reads
    90. 0 redo size
    91. 2375 bytes sent via SQL*Net to client
    92. 370 bytes received via SQL*Net from client
    93. 1 SQL*Net roundtrips to/from client
    94. 0 sorts (memory)
    95. 0 sorts (disk)
    96. 0 rows processed
    97. scott@orclpdb1:orclcdb>
    98. scott@orclpdb1:orclcdb>
    99. scott@orclpdb1:orclcdb> create table t (x int)
    100. 2 ;
    101. create table t (x int)
    102. *
    103. ERROR at line 1:
    104. ORA-00955: name is already used by an existing object
    105. scott@orclpdb1:orclcdb> drop table t;
    106. Table dropped.
    107. scott@orclpdb1:orclcdb> create table t(x int);
    108. Table created.
    109. scott@orclpdb1:orclcdb> select extent_id, bytes, blocks
    110. 2 from user_extents
    111. 3 where segment_name='T'
    112. 4 order by extend_id;
    113. order by extend_id
    114. *
    115. ERROR at line 4:
    116. ORA-00904: "EXTEND_ID": invalid identifier
    117. scott@orclpdb1:orclcdb> select extent_id, bytes, blocks
    118. 2 from user_extents
    119. 3 where segment_name='T'
    120. 4 order by extent_id;
    121. no rows selected
    122. Statistics
    123. ----------------------------------------------------------
    124. 252 recursive calls
    125. 0 db block gets
    126. 497 consistent gets
    127. 6 physical reads
    128. 0 redo size
    129. 504 bytes sent via SQL*Net to client
    130. 446 bytes received via SQL*Net from client
    131. 1 SQL*Net roundtrips to/from client
    132. 14 sorts (memory)
    133. 0 sorts (disk)
    134. 0 rows processed
    135. scott@orclpdb1:orclcdb> insert into t(x) values (1);
    136. 1 row created.
    137. Statistics
    138. ----------------------------------------------------------
    139. 39 recursive calls
    140. 62 db block gets
    141. 35 consistent gets
    142. 1 physical reads
    143. 6536 redo size
    144. 494 bytes sent via SQL*Net to client
    145. 925 bytes received via SQL*Net from client
    146. 2 SQL*Net roundtrips to/from client
    147. 1 sorts (memory)
    148. 0 sorts (disk)
    149. 1 rows processed
    150. scott@orclpdb1:orclcdb> rollback;
    151. Rollback complete.
    152. scott@orclpdb1:orclcdb> select extent_id, bytes, blocks
    153. 2 from user_extents
    154. 3 where segment_name='T'
    155. 4 order by extent_id;
    156. 1 row selected.
    157. Statistics
    158. ----------------------------------------------------------
    159. 1 recursive calls
    160. 0 db block gets
    161. 135 consistent gets
    162. 0 physical reads
    163. 0 redo size
    164. 709 bytes sent via SQL*Net to client
    165. 457 bytes received via SQL*Net from client
    166. 2 SQL*Net roundtrips to/from client
    167. 1 sorts (memory)
    168. 0 sorts (disk)
    169. 1 rows processed
    170. scott@orclpdb1:orclcdb> set trace off
    171. SP2-0158: unknown SET option "trace"
    172. scott@orclpdb1:orclcdb> set autotrace off
    173. scott@orclpdb1:orclcdb> select extent_id, bytes, blocks
    174. 2 from user_extents
    175. 3 where segment_name='T'
    176. 4 order by extent_id;
    177. EXTENT_ID BYTES BLOCKS
    178. ---------- ---------- ----------
    179. 0 65536 8
    180. 1 row selected.
    181. scott@orclpdb1:orclcdb>

    可以看到,表创建之后没有分配任何存储空间——这个表没有使用任何区段。完成一个INSERT 后,紧接着执行ROLLBACK,可以看到INSERT分配了存储空间,不过ROLLBACK并没有将分配的存储空间”释放“。

    总结:

    • 段确实由INSERT创建但是未被ROLLBACK撤销。
    • 由INSERT新创建的格式化块被第二次扫描,这两方面结合在一起,说明回滚只是一种逻辑上”将数据库恢复原状态“的操作。数据库并不会完全恢复原状,只是逻辑上相同而已。

    3. redo 和undo如何协作

    尽管undo信息存储在undo表空间或undo段中,但也会受到redo的保护。

    意思是,会把undo数据当成是表数据或索引数据已有,对undo的修改会生成一些redo,这些redo将计入日志。将undo数据增加到undo段中,并像其他部分的数据一样,在缓冲区中得到缓存。

    提交和回滚处理

    4.提交和回滚处理

    COMMIT做什么

    Rollback做什么

    5.分析redo

    生成的redo越多,操作花费的时间就越长,整个系统也会越慢。

    能关掉重做日志生成程序吗?

    不能,因为重做日志对数据库至关重要,它不是开销,不是浪费。重做日志是实实在在必不可少的。是数据库采用的工作方式。 如果你关闭了redo,那么磁盘驱动器的任何暂时失败,掉电或某个软件崩溃都会导致整个数据库不可用。而且不可恢复。

  • 相关阅读:
    华为软件测试笔试真题之变态逻辑推理题【二】华为爆火面试题
    C语言练习之递归实现n的k次方
    数码品牌这样做,教你实现用户增长
    Dockerfile手册
    基于时延估计的动力型下肢假肢分段控制策略研究
    云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)
    卷积神经网络的训练算法,卷积神经网络算法实现
    Hadoop学习笔记:运行wordcount对文件字符串进行统计案例
    maven运行报错解决
    React技巧之中断map循环
  • 原文地址:https://blog.csdn.net/u011868279/article/details/127133931