Home > Database > Mysql Tutorial > body text

Oracle 10g 读书笔记之 redo 与 undo

WBOY
Release: 2016-06-07 17:05:29
Original
766 people have browsed it

尽管 undo 信息存储在 undo 表空间或 undo 段中,但也会受到 redo 的保护。换句话说,会把 undo 数据当成是表数据或索引数据一样

redo(重做信息)是 Oracle 在在线(或归档)重做日志文件中记录的信息,用于重做事务;undo(撤销)是 oracle 在 undo 段中记录的信息,用于取消或回滚事务。

undo 操作数据库只是逻辑的恢复到原来的样子,但数据结构以及数据块本身在回滚后可以大不相同。这样做的原因是同时可能会有多个并发的事务。

尽管 undo 信息存储在 undo 表空间或 undo 段中,但也会受到 redo 的保护。换句话说,会把 undo 数据当成是表数据或索引数据一样,对 undo 的修改会生成一些 redo 并记入日志。

Oracle 的事务提交是一个非常快的操作,不论事务有多大,COMMIT 的响应时间都差不多。因为在提交之前已经完成了99.9%工作,例如已经发生了如下操作:

a、已经在 SGA 中生成了 undo 块
b、已经在 SGA 中生成了已修改的数据块
c、已经在 SGA 中生成了对应前两项的缓存 redo
d、取决于前三项的大小,以及这些工作花费的时间,前面的某些数据可能已经刷新输出到磁盘
e、已经得到了所需的全部锁
执行 COMMIT 时,余下的工作只是
a、为事务生成一个 SCN。它是 oracle 使用的一种简单的计时机制,用于保证事务的顺序,并支持失败恢复。它还用于保证数据库中的读一致性和检查点。
b、LGWR 将所有余下的缓存重做日志条目写至磁盘,并把 SCN 记录到在线重做日志文件中。这一小是真正的 COMMIT。之后事务条目为从 V$TRANSACTION 中“删除”。
c、V$LOCK 中记录着我们的会话持有锁,这些锁都将被释放,而排队等待这些锁的每一个人都会被唤醒,可以继续完成他们的工作。
d、如果事务修改的某些块还在缓冲区中,则会清除存储在数据库块首部与锁相关的信息。

相反 ROLLBACK 时要做以下工作:
a、撤销已做的所有修改。从 undo 段读回数据,然后实际上逆向执行前面所做的操作,并将 undo 条目标记为已用。
b、会话持有的所有锁都将释放,如果有人在排队等待我们持有的锁,就会被唤醒。

减少重做日志的生成:
a、在 SQL 中设置 NOLOGGING。这并不是说这个对象的所有操作在执行时都不生成重做日志,只是说有些特定的操作生成的 redo 会比平常少得多。
b、在索引上设置 NOLOGGING。在段(索引或表)上设置 NOLOGGING 属性,从而隐式的采用 NOLOGGING 模式来执行操作。
c、可以采用 NOLOGGING 模式执行以下操作:
1、索引的创建和 ALTER。例如 create index t_idx on t(name) nologging ,alter index t_idx nologging,alter index t_idx rebuild
2、表的批量 INSERT 。表数据不生成 redo,但是所有的索引修改会生成 redo。
3、LOB 操作(对大对象的更新不必生成日志)。
4、通过 CREATE TABLE AS SELECT 创建表。
5、各种 ALTER TABLE 操作,如 MOVE 和 SPLIT。

块清除:即删除所修改数据库块上与“锁定”有关的信息。后面提到 ORA-01555:snapshot too old 会用到这个概念。
数据锁实际上是数据的属性,存储在块首部。下次访问这个块时,就要将这些事务信息删除,这个动作会生成 redo,并导致块变脏,也就是说 SELECT 可能也会生成 redo 并将块刷新至磁盘。
如果块在还在缓冲区中,,那么 COMMIT 时会清除,这样后面的 SELECT 就不必再清理了。只有块的 UPDATE 才会真正清除残余的事务信息,由于 UPDATE 时已经生成 redo,所以注意不到清除工作。

临时表不会为它们的块生成 redo,但会生成 undo,而且这个 undo 为记入日志。
INSERT 会生成很少甚至不生成 undo/redo 活动。因为生成的 undo 很少,oracle 只需要记录要删除的 rowid。
DELETE 在临时表上生成的 redo 与在正常表上生成的 redo 同样多,因它的 undo 很大,需要把整行的前映像记录到 undo 段中。
临时表的 UPDATE 会生成正常表一半的 redo,对于临时表来说不必保存“后映像”(redo)。

SQL> show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO //自动 undo 管理
undo_retention                       integer     900 // undo 保留的时间
undo_tablespace                      string      UNDOTBS1 // undo 存储表空间

linux

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!