Oracle redo文件记录的内容

2014-11-24 18:16:57 · 作者: · 浏览: 0

redo的内容


也和redo记录的精简内容有关.




为了了解redo的内容,先需要了解两个概念:改变向量和重做记录


改变向量(change vector)


改变向量表示对数据库内某一个数据块所做的一次变更.改变向量(change vector)中包含了变更的数据


块的版本号,事务操作代码,变更从属数据块的地址(DBA)以及更新后的数据.例如,一个update事务包含


一系列的改变向量,对于数据块的修改是一个向量,对于回滚段的修改又是一处向量.




重做记录(redo record)


重做记录通常由一组改变向量组成,是一个改变向量的集合,代表一个数据库的变更(insert,update,delete


等操作),构成数据库变更的最小恢复单位.例如,一个update的重做记录包括相应的回滚段的改变向量和相应


的数据块的改变向量等.




假定发出了一个更新语句;


update scott.emp set sal=4000 where empno=7788;


看一下这个语句是怎么执行的


1.检查empno=7788记录在buffer cache中是否存在,如果不存在则读取到buffer cache中.


2.在回滚表空间的相应回滚段事务表上分配事务槽,这个操作需要记录redo信息.


3.从回滚段读入或者在buffer cache中创建sal=3000的前镜像,这需要产生redo信息并记入redo log buffer


4.修改sal=4000,这是update的数据变更,需要记入redo log buffer


5.当用户提交时,会在redo log buffer记录提交信息,并在回滚段标记该事务为非激活(Inactive)




下面通过珍上具体的试验来再现这个过程.


1.先通过switch logfile切换日志,使用sys用户进行日志切换,使得接下来的更新可以使用新的日志.


SQL> alter system switch logfile;




System altered.




SQL> select * from v$log;




GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS


---------- ---------- ---------- ---------- ---------- --- ----------------


FIRST_CHANGE# FIRST_TIME


------------- ------------


1 1 14 52428800 1 NO ACTIVE


801067 03-JAN-14




2 1 15 52428800 1 NO CURRENT


813289 04-JAN-13




3 1 13 52428800 1 NO INACTIVE


764715 30-DEC-13




2.更新并提交事务


SQL> select * from scott.emp a where a.empno=7788;




EMPNO ENAME JOB MGR HIREDATE SAL COMM


---------- ---------- --------- ---------- ------------ ---------- ----------


DEPTNO


----------


7788 SCOTT ANALYST 7566 19-APR-87 3000


20





SQL> update scott.emp set sal=4000 where empno=7788;




1 row updated.




SQL> commit;




Commit complete.





3.使用sys用户在另外的session转储日志文件:


SQL> alter system dump logfile '/u01/app/oracle/product/10.2.0/oradata/jingyong/redo02.log';




System altered.




SQL> select


2 d.value||'/'||lower(rtrim(i.instance,


3 chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name


4 from ( select p.spid


5 from sys.v$mystat m,


6 sys.v$session s,sys.v$process p


7 where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,


8 ( select t.instance from sys.v$thread t,sys.v$parameter v


9 where v.name = 'thread' and


10 (v.value = 0 or t.thread# = to_number(v.value))) i,


11 ( select value from sys.v$parameter


12 where name = 'user_dump_dest') d


13 /




TRACE_FILE_NAME


--------------------------------------------------------------------------------


/u01/app/oracle/admin/jingyong/udump/jingyong_ora_3969.trc