最近的工作内容涉及到undo,故将相关知识重新复习一遍
oracle区别于其他关系型数据库的一个特点是:回滚
重做日志–REDO
什么是重做?
重做日志包含所有数据产生的历史改变记录
重做日志文件通常用于
– 恢复(实例恢复和介质恢复)
–日志挖掘
– 流
数据库产生的每个改动,都会产生重做日志:
- 写入数据块缓冲之前,先写入重做日志
- 写入数据文件之前,先写入日志文件
当提交后,日志缓冲被刷入重做日志文件里
先写第一个,第一个写满些第二个,第二个写满写第三个,第三个写满写第一个,如果当第一个上的重做日志对应的数据块没有被写到磁盘上,会报错,每次切换都会归档
当redo01a损坏,redo01b可以继续工作,通过在一个组里增加多个日志文件来达到数据容错的目的。
redo和归档
redo的内容—改变向量
redo里面放的不是sql语句,而是改变向量
原因:sql语句的执行需要解析,当需要恢复时,数据库宕掉了,无法进行解析,只是将数据块拷贝到应在的位置上
恢复是一个物理的过程,只是数据块的覆盖
创建两张表,x字段为不同大小
打开两个窗口,登陆sqlplus,获取当前会话的SID
查看两个会话的redo值(一般值相同)
在两个会话中,分别向两张表插入数据
再次查看redo大小
产生redo并不是与插入的数据大小有关,而是由改变的数据块的大小决定的
改变向量产生的redo内容,既不是sql语句,也不是sql语句里改变值的大小,而是数据块的改变大小
undo 的redo
会产生两种redo,数据块产生的redo和undo产生的redo
UNDO
作用:
a.数据的回滚
b.一致性读:
当九点发出查询的时候,九点五分有用户修改数据块,数据从3变为4,而查询出来的结果还是3,数据库为了保证一致性读,会从回滚段中读取到3
c.表的闪回(事务,查询的闪回)
d.失败会话的恢复
undo回滚后,数据库只是逻辑地恢复到执行语句或事物之前的样子,比如一个插入操作,新分配了一些数据块。后来事务失败,插入操作全部回滚,新分配的一些数据块还是存在的,数据库会有很多并发事物也在修改同一个数据块,如果回滚回收这些数据块,则会撤销其他事物的操作。
如果一张表数据量很少,select * from需要的时间比较多,则可能这张表经常进行增删操作,原来分配的数据块依然存在,如果插入了1000w数据再删除,全表扫描依然会扫描1000w数据所占用的数据块。
查看undo相关参数:
undo里数据保留的时间是900s,自动创建回滚段,900s内可以闪回
undo表空间对应的数据文件:
回滚信息放在回滚段上,回滚段放在回滚段表空间上
一条sql Redo和Undo产生过程:
a.读取数据先去内存上找,内存上找不到去磁盘上找,读到内存上的数据块缓冲区
b.找一个回滚段数据块,将回滚段数据块放到内存里
c. 将5写到回滚段上(在修改前要把之前的放到回滚段数据块上)
d.因为修改了回滚段的数据块,产生了redo(回滚段产生的redo)
e. 将原始数据块从5改为10
f. 产生了redo
评论
