Oracle 好书 07 ( undo 表空间管理 )
对于DML语句来说,只要修改了数据块,oracl数据库就会将修改前的数据保留下来,保存在undo segment里,而 undo segment 则保存在 undo 表空间里。
- DML语句与 undo
DML 语句执行过程
1. 在shared pool 里进行解析,从而生成执行计划
2. 假设根据执行计划, 得出的记录放在10号数据文件的54号数据块里
3. 服务器进程在 buffer cache 里找到一个可用的undo数据块,如果没有发现, 则到undo表空间里找一
个可用的undo块,并调入 buffer cache, 假设获得的 undo 数据块号为 24号,位于11号undo数据
文件里。
4. 将改变前的值放入11号数据块
5. 由于 undo 数据块发生了变化,于是产生重做记录,假设重做记录号为120.
6. 在buffer cache 里找到54号数据块,如果没有发现,从10号数据文件里调入
7. 将改变后的值存入54号数据块
8. 由于数据库发生变化,于是产生重做记录,假设重做记录号为121
9. 控制权返回给用户,如果在sql*plu里执行DML, 则表现为光标返回。
10. 当用户发出 commit 命令时,触发LGWR进程,将120与121这两个重做记录写入联机日志文件,并将
54号数据块和11号undo数据块头部所记录的事务状态标记设置为已提交。然后控制权返回用户,
如果在sql*plus里执行DML操作,则表现为光标返回。
11. 这个时候,54号数据块以及11号undo块并不一定被DBWn写入数据文件,只有在脏数据块的数量
达到一定程度才会被写入。
事务只要被提交或回滚,那么该事务所使用的undo块就可以被覆盖。
- undo 作用
提供一致性读,回滚事务,实例恢复。
一致性读 :
- 配置 AUM
先设置 undo_management 参数, 设置为 auto
然后创建一个undo表空间,并初始化参数 undo_tablespace,这个参数说明数据库当前使用哪个undo
表空间, 剩下的工作就数据库自动完成了.
当发生一个 DML 操作时,服务器进程会选择一个 undo segment. AUM采用的是事务绑定 undo segment
的算法,算法如下:
- 管理 undo 表空间
数据库只能使用一个 undo 表空间, 如果我们改变 undo_tablespace, 这叫做 undo表空间切换。
alter tablespace undoew retention guarantee;
alter tablespace undoew retention noguarantee;
借助 Database Control 所提供的 Undo Advisory 更简单可以判断undo 表空间大小。