原文摘自:http://hi.baidu.com/ouleiq/blog/item/916e86952df8ce4dd0135e7b.html 假设有张表,叫table1,里面有5000万行数据,假设预计全表扫描1次需要1个小时,我们从过程来看: 1、在1点钟,有个用户A发出了select * from table1;此时不管将来table1怎么变化,正确的结果应该是用户A会看到在1点钟这个时刻的内容。这个是没有疑问的。 2、在1点30分,有个用户B执行了update命令,更新了table1表中的第4000万行的这条记录,这时,用户A的全表扫描还没有到达第4000万条。毫无疑问,这个时候,第4000万行的这条记录是被写到了回滚段里去了的,我假设是回滚段RBS1,如果用户A的全表扫描到达了第4000万行,是应该会正确的从回滚段RBS1中读取出1点钟时刻的内容的。 3、这时,用户B将他刚才做的操作commit了,但是这时,系统仍然可以给用户A提供正确的数据,因为那第4000万行记录的内容仍然还在回滚段RBS1里,系统可以根据SCN来到回滚段里找到正确的数据,但是大家注意到,这时记录在RBS1里的第4000万行记录已经发生了一点重大的改变:就是这个第4000万行的在回滚段RBS1里的数据有可能随时被覆盖掉,因为这条记录已经被提交了!!! 4、由于用户A的查询时间漫长,而业务在一直不断的进行,RBS1回滚段在被多个不同的tracnsaction使用着,这个回滚段里的extent循环到了第4000万行数据所在的extent,由于这条记录已经被标记提交了,所以这个extent是可以被其他transaction覆盖掉的! 5、到了1点40分,用户A的查询终于到了第4000万行,而这时已经出现了第4条说的情况,需要到回滚段RBS1去找数据,但是已经被覆盖掉了,于是01555就出现了。
|
深度理解Oracle10g中UNDO_RETENTION参数的使用
2009-04-30 16:54
每一中数据库都需要有一种管理回滚或者撤销数据的方法。当一个DML发生以后,在用户还没有提交(COMMIT)改变,用户不希望这种改变继续保持,需要撤销所做的修改,将数据回退到没有发生改变以前,这时就需要使用一种被称为撤销记录的数据。 使用撤销记录,我们可以: 1、 当使用ROLLBACK语句时回滚事务,撤销DML操作改变的数据 2、 恢复数据库 3、 提供读取的一致性 4、 使用Oracle Flashback Query分析基于先前时间点的数据 5、 使用Oracle Flashback特性从逻辑故障中恢复数据库 Oracle10g中的自动撤销管理(AUM) 在Oracle10g中对于回滚段的管理可以通过配置参数而实现自动管理。为启用撤销空间的自动管理,首先必须在init.ora中或者SPFILE文件中指定自动撤销模式。其次需要创建一个专用的表空间来存放撤销信息,这保证用户不会在SYSTEM表空间中保存撤销信息。此外还需要为撤销选择一个保留时间。 如果需要实现AUM,需要配置以下3个参数: UNDO_MAMAGEMENT UNDO_TABLESPACE UNDO_RETENTION 查看初始化参数的设置:
初始化参数的描述:
如果将初始化参数UNDO_MANAGEMENT设置为AUTO,则Oracle10g将启用AUM。 可以在初始化参数UNDO_RETENTION中设置撤销保留时间的大小: UNDO_RETENTION=1800 设置保留时间为30分钟(1800秒) UNDO_RETENTION参数默认设置为900秒。 UNDO_RETENTION的值应该设置为多少才合理? 不存在理想的UNDO_RETENTION的时间间隔。保留时间间隔依赖于估计最长的事务可能运行的时间长度。根据数据库中最长事务长度的信息,可以给UNDO_RETENTION分配一个大致的时间。 可以通过v$undostat视图的maxquerylen列查询在过去的一段时间内,最长的查询执行的时间(以秒为单位)。UNDO_RETENTION参数中的时间设置应该至少与maxquerylen列中给出的时间一样长。 Oracle提供如下为新数据库设置撤销保留时间间隔的指导: 1、 OLTP系统:15分钟 2、 混合: 1小时 3、 DSS系统:3小时 4、 闪回查询:24小时 UNDO_RETENTION参数的较高值并不保证撤销数据保留UNDO_RETENTION参数指定的时间。为保证撤销保留指定的时间,必须使用RETENTION GRARANTEE子句。 例如:
也可以使用ALTER DATABASE命令保证数据库中的撤销保留
关闭撤销信息的保证保留
设置撤销表空间的尺寸 Oracle建议使用Undo Advisor的帮助下设置撤销表空间的尺寸。可以创建一个小尺寸(大约500M)的撤销表空间,AUTOEXTEND数据文件属性设置为ON,从而允许表空间自动扩展。此表空间将自动增长以支持数据库中活动事务数目的增长以及事务长度的增长。 在数据库运行适当的一段时间后,可以使用UNDO Advisor来得出关于设置撤销表空间尺寸的建议。应该使用Analysis Time Period字段中允许的最大时间。出于此目的,可以使用OEM UNDO Management页面中给出的Longest——Runing Query长度。还必须根据闪回需求指定New UNDO Retention字段的值。例如:如果希望表能闪回24小时,应该使用24小时作为这个字段的值。 假如数据库中用RETENTION GUARANTEE子句配置了保证保留撤销。如果撤销表空间太小不能满足使用它的所有活动事务,那么会发生以下情况: 1、 如果撤销表空间用完85%,Oracle将发布一个自动表空间警告 2、 当撤销表空间用完97%时,Oracle将发布一个自动表空间严重警告 3、 所有DML语句将不允许,并且会接收到一个空间超出错误 4、 DDL语句允许继续执行 |
回滚段的问题:
问题一:事务要求的回滚段空间不够,表现为表空间用满(ORA-01560错误),回滚段扩展到达参数MAXEXTENTS的值(ORA-01628)。
解决方法:向回滚段表空间添加文件或使已有的文件变大;增加MAXEXTENTS的值。
问题二:读一致性错误(ORA-01555 SNAPSHOT TOO OLD)
解决方法:增加MINEXTENTS的值,增加区段(EXTENT)的大小,设置一个高的OPTIMAL值。