在开始之前,我们先来思考几个问题?
1. ora-01555错误的是怎么产生的?有什么办法解决?
2. 回滚段(回滚表空间)有什么作用?
3. 数据库启动的时候,如何加载回滚段(回滚段表空间)。
4. 回滚段的数量由什么公式来计算
5. 回滚表空间的大小如何确定?
Oracle数据库在回退、撤销或者改变数据所需要的维护数据库信息的一种手段。这里的是指在数据库提交之前的记录的改变等事务信息。
Undo 信息主要有以下用途:
当系统发出rollback信息
数据库恢复
提供读一致性
当系统发出rollback命令时,undo 信息通过记录的信息将数据库的改变恢复到commit之前的状态。在数据库恢复期间,被用来从redo log中撤销任何未提交到数据文件的事务。当一个用户在访问数据时,Undo记录通过维护访问数据的前镜像数据来保证当有其他用户改变相同数据时数据库的读一致性。
以前数据库使用回滚段来存储undo信息,这种方式非常的复杂。现在数据库采用降低了管理的复杂性,同时减少了dba的工作负荷。但是在数据库只能使用这两种方式的一种。可以在数据库里定义两种方式的文件,但是,同一时刻,必须指定数据使用哪一种方式。当你。
Oracle数据库一直使用来完成系统的事务。是在数据库,创建的时候产生的,系统启动后就一直在线。Dba不需要对它作任何的操作来优化。
oracle 9i以后有个。当将undo_management时系统来管理回滚段,当它被时系统。
oracle推荐使用重做表空间代替回滚段。
,系统必须指定一个undo表空间。这个表空间可以是在数据库创建时产生,也可以数据库创建后再创建。
当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollback segment,如果没有有效的可用的undo表空间或者是回滚段,系统使用system rollback segment。这种情况是不被推荐的,。
如果系统使用要使用auto方式管理undo信息,那么需要通过指定的值来指定系统使用哪一个undo表空间来存放undo信息。如果指定了undo_tablespace的值,但是系统中不存在这样的表空间,那些系统启动将会失败。此时可以做的操作是,如果系统存在undo表空间,为undo_tablespace指定正确的undo表空间名字,或者将undo_tablespace注释。系统会采用存在的undo表空间。否则使用手动方式。
指名系统使用哪一个重做表空间。
被设置成true时表示系统创建和使用回滚段时忽略错误。
系统提交后,回滚段的数据保留多长时间,。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ - ---------- ---------------
undo_management string AUTO
undo_retention integer 1000
undo_tablespace string UNDOTBS1
该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。
一定要注意,undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建
一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。
同时还要注意,也并不是说,undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。
只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,
例如:
SQL> Alter tablespace undotbs1 retention guarantee;
例如:
SQL> Alter tablespace undotbs1 retention noguarantee;
当将系统中初始化参数后,系统启动后。如果系统没有指定undo_management,那么,即使设置了auto方式的参数,这些参数将被忽略。
当实例启动时,:
初始化参数rollback_segments
初始化参数transactions、transactions_per_rollback_segment
与menual相关的初始化参数
rollback_segments 指定实例启动时所需要的回滚段
transactions 指定系统中最大的并发事务数
transactions_per_rollback_segment 指定每一个回滚段支持的并发数
max_rollback_segments 指明系统支持的最大的online的回滚段数目
创建undo talespace有两种方式:
1. 数据库创建时创建undo tablespace;
2. 在一个已经存在的数据库创建。
在创建数据库的时候可以通过指定undo子句来创建undo tablespace,但是这个子句不是必须的。
如果在创建数据库时,,但是没有指明undo tablespace的名字,那么系统会创建一个。这个表空间根据。不过oracle推荐最好还是使用一个指定的大小。
CREATE DATABASE rbdb1
CONTROLFILE REUSE
...
UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';
如果此时系统创建undo失败,那么整个创建数据库的命令就失败了。此时
Dba需要删除已经创建的数据文件,纠正错误,重建创建数据库。
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE
AUTOEXTEND ON;
ALTER TABLESPACE undotbs_01
ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';
ALTER TABLESPACE undotbs_01 online|offline;
ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;
Drop tablespace undotbs_01;
Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。
切换undo表空间有两种方式:
1. 使用命令动态修改;
2. 修改初始化参数后重新启动数据库。
Alter system set undo_tablespace=undotbs1;
当切换命令完成后,所有的事务就会在新的回滚表空间内进行。
1. 表空间不存在;
2.. 表空间不是一个回滚段表空间;
3. 表空间已经被另一个实例使用。
。如果旧undo表空间,那么旧的undo表空间进入,在这种模式下所有的事务能够继续进行,但是undo表空间不能被其他实例使用,也不能被删除,直到所有的事务提交后, undo表空间才进入offline模式。
dba可以设置指定。在设置好这个参数时,系统会保留undo信息在指定的时间断后才收回这个空间。
一般情况下,系统会保留undo信息到指定的时间后才回收空间,但是,如果系统
存在大量的事务,也会将未到期的undo空间回收,以供使用。
Undospace = UR * UPS *db_block_size+ 冗余量
表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。
表示在undo中,每秒产生的数据库块数量。
和undo有关的动态性能视图包含undo的统计信息。使用这张视图可以估计系统当前所需的undo大小。
是undo模式的视图。是undo表空间的undo segments的统计信息
包含undo segments的信息。
包含undo表空间中每一个范围的提交时间。
来分担回滚段的争用,以提高系统性能。系统采用循环的方式来分配回滚段。当oracle创建数据库时候,,用来完成系统的事务,不为大家共用。所以系统最后能有至少一个回滚段存放用户回滚信息。
指定每一个回滚段支持的并发数;
指明系统支持的最大的online的回滚段数目;
指定实例启动时所需要的回滚段;
必须通过实例指定名称后才能使用。
如:必须在初始化参数中rollback_segments指定后,实例启动才能使用,或者在实例启动后online才能使用。
则是实例启动时系统自动发现,系统根据初始化参数决定系统启动时的回滚段。
在系统启动时指定所需要的回滚段,
。如果回滚段。可以使用optimize选项来限制回滚段自动回收。,这个可以指定maxextents的数量。
一般来说一个回滚段应该包含10到20个范围。
s=T/n
s是初始化时定义的范围的大小,T是初始化的回滚段大小,n是范围数。由此可以确定定义回滚段的子句的各个参数。
设置这个参数可以避免回滚段无限扩展以及系统自动回收空间。最小是两个范围的大小。
1:如果系统只有一个回滚表空间,那么回滚段出现问题,影响系统不能运行。
2:包含回滚段的表空间经常分配和去配容易产生碎片。
3:当回滚表空间被离线时,系统将没有回滚表空间可以用。
MINEXTENTSOPTIMAL最小应该设置成两个extents大小
INITIAL和 NEXT最好一样,除了应用使用指定的回滚段;
当创建回滚段时,。
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1STORAGE (
INITIAL K|M NEXT K|M MINEXTENTS MAXEXTENTS OPTIMAL K|M );
修改回滚段当修改回滚段时,。
ALTER ROLLBACK SEGMENT RB01 ONLINE;
ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );
ALTER ROLLBACK SEGMENT RB01;
有OPTIMAL参数时, 缩小到OPTIMAL值; 没有OPTIMAL参数时, 缩小到MINEXTENTS所对应的尺寸
ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;
ALTER ROLLBACK SEGMENT RB01 STAROGE(MAXEXTENTS 120);
当删除回滚段时,。
原则上,INITIAL总应该等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滚段。
DROP ROLLBACK SEGMENT RB01;
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);
SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;
根据事务量的大小,决定使用哪一个回滚段;
将大的查询的事务放入单独的回滚段;
当存在大的查询使用事务时,可以将它放入大的回滚段。
描述回滚段的信息,包含回滚段的名字和表空间;
描述回滚段的附加信息;
列出在线回滚段的名称
包含回滚段的统计信息
包含撤销的统计信息