《深入浅出ORACLE》读后总结
粗略地读了深入浅出ORACLE DBA入门、进阶、与诊断案例,下面是对一些基础概念的理解。欢迎纠正。
数据库启动经过三个阶段:跟据参数文件的参数建立例程(nomount状态);根据控制文件、密码文件启动到mount状态;根据控制文件记录的日志文件、数据文件信息打开数据库,如果数据库启动失败,可以先确定在哪一阶段出错,然后配合警告文件分析原因。
回滚段的两个作用是:撤销未提交的事务;通过回滚段的多版本机制实现语句读一致性、事务读一致性,实现非阻塞读。
Oracleo为每一个事务只分配一个回滚段,并且回滚段空间是循环利用的,当回滚段没有空闲空间时,新事务会覆盖已提交事务的信息。如果一个查询的时间过长,在查询过程中有数据被其它会话修改并提交,这时需要从回滚段读出查询开始那一刻版本的数据,如果刚好回滚段这个数据已被覆盖,则会发生snap too old的错误。另外延迟块清除也会导致snap too old的错误。
数据段、回滚段保存在数据文件中;REDO数据则保存在在线重做日志和归档重做日志文件中;两者在内存里分别对应数据缓冲区、重做日志缓冲区。
当DML语句修改数据记录时,事务对数据段的修改会在回滚段产生辙销信息,而无论是数据段的修改还是回滚段的修改,都会产生重做日志记录。提交事务时,会立即将重做日志缓冲区的重做记录写入重做日志文件,而数据缓冲区的脏数据块未必立即写入数据文件。
检查点发生时会将检查点前的数据缓冲区中的脏数据块写回数据文件,并同步数据文件、控制文件的检查点scn。由于实例恢复是由检查点开始前滚(利用重做日志重做未写入数据文件的事务修改)回滚(利用回滚段撤销未提交事务)的,因此可以通过控制检查点发生的频率,缩短实例恢复的时间。
数据库启动时会检查控制文件的检查点SCN与数据文件的检查点SCN、stop scn。如果三者相等,说明上次正常关闭数据库并发生了检查点,数据库可以正常启动。如果控制文件的检查点SCN等于数据文件的检查点SCN,但数据文件的stop scn为无穷大,则说明上次启动是非正常关闭没有发生检查点,要进行实例恢复才能打开数据库。如果控制文件的检查点SCN不等于数据文件的检查点SCN,则说明两者版本不一致,需要进行介质恢复。
切换日志时会发生检查点,切换日志并完成检查点后,旧日志的重做记录对于崩溃/实例不再有用,这是因为Redo是重做的意思,是在实例恢复时跟据这些重做记录将未写入数据文件而丢失的修改重做。但是发生检查点后会将检查点SCN之前的脏数据块写入数据文件,既已写入,实例恢复时也不用重做了。
重做日志组有Current、Active、Inactive、Unused几种状态。Current是当前正在使用的日志组,Active表明检查点未完成,以上两种在实例恢复时都需要,因为数据的修改不能确保都已写入数据文件。Inactive的日志组表明检查点已完成,数据的修改已写入数据文件,实例恢复时不需要;Unused是指还没有使用地的日志组。因此如果丢失/损坏Current、Active的日志组,则可能会丢失数据(如果是正常半闭数据库后才丢失/损坏,因为正常半闭时会发生检查点,则也不会丢失数据);如果只是丢失/损坏Inactive日志组,则不会丢失数据。以上的观点是在归档模式中的情况。
Oracle实现两种事务隔离级别,Readcommit级别保证查询返回查询开始时刻之前已提交的数据,Serializable级别保证查询返回事务开始时刻之前已提交的数据。
[ 本帖最后由 fenggdkp 于 2007-12-24 10:06 编辑 ]
|