段是由一个或多个扩展区组成的逻辑存储单元,数据库模式对象在逻辑上是以段来占据表空间的大小,段代表特定数据类型的数据存储结构。
1、 段的类型
段分为:数据段、索引段、临时段、回滚段
1)数据段
数据段用来存储表或簇的数据,可以细分为表数据段、索引表数据段、分区表数据段及簇数据段四种。
2)索引段
用来存放索引信息,主要包括存储ROWID和索引键。索引段与其相应的表段经常会被同时访问,为了减少硬盘访问的冲突,索引段与表段可以放到处于不同物理位置的表空间中。
3)临时段
当用户进行排序查询时,如果在指定的内存无法完成排序,Oracle将自动从用户默认的临时表空间中指派临时段进行排序。会话结束,数据将从临时段中自动删除。
4)回滚段
回滚段用于保存数据库的回滚信息,包含当前未提交事务所修改的数据的原始版本。一个事务只能使用一个回滚段存放它的回滚信息,但是一个回滚段可以存放多个事务的回滚信息。回滚段可以动态创建和撤销。
2、 回滚段(UndoSegment)
(1)回滚段的工作方式
回滚段采用循环写的方式进行写入。当回滚段中最后一个区写满时,Oracle将覆盖写入回滚段的第一个区,如果此时第一个区保存得回滚条目所对应的事务依然处于活动状态(事务未提交),则此时该区不能被覆盖,Oracle将为回滚段分配一个新的区。
一个回滚段至少需要两个区。一个事务可以占用回滚段中的多个区,同一个区也能够存放多个事务的数据
(2)回滚段的作用
1)事务回滚
当启动一个事务时,Oracle把一个回滚段指定给该事务。当事务修改数据时,该数据修改前的信息会保存在该回滚段中,当用户执行事务回滚操作时(ROLLBACK),Oracle会利用保存在回滚段中的数据将修改的数据恢复到原来的值。
2)数据库恢复
当数据库实例运行失败时,在数据库恢复时,Oracle先利用重做日志文件中的信息对数据文件进行恢复(包括提交事务和未提交事务的恢复),然后利用回滚段中的信息回滚未提交事务对数据的修改。
3)数据的读一致性
当一个用户对数据库进行修改,但还没有提交时,系统将用户修改的数据的原始信息保存在回滚段中,这样就可以为正在访问相同数据的其他用户提供一份该数据的原始视图,从而保证当前用户未提交的修改其他用户无法看到,保证了数据的读一致性。
4)闪回查询
闪回查询技术是Oracle 10g引入的新特性,利用该技术可以查询某个表过去某个时间点的状态。
(3)回滚段的种类
1)系统回退段
创建数据库时Oracle系统自动在SYSTEM表空间中创建一个“SYSTEM”系统回退段。该回退段只用于系统事务的回退处理,保存系统表空间中对象的前影像。
2)非系统回退段
用户可以创建非SYSTEM回退段,用于用户事务的回退处理,保存非系统表空间中对象的前影像。非系统回退段又分为私有回退段和公有回退段,其中私有回退段只能被一个实例使用,其数目和名称由ROLLBACK_SEGMENTS参数决定;公有回退段可以被多个实例共享使用,其数目由TRANSACTIONS和TRANSACTION_PER_ROLLBACK_SEGMENT决定。
(4)回滚段的管理
1)自动撤销(回滚)管理
如果将初始化参数UNDO_MANAGEMENT设置为AUTO,则启动自动撤销管理方式。DBA不需要为数据库创建多个回滚段,也不需要管理回滚段的使用,只需要为数据库创建撤销表空间,并将UNDO_TABLESPACE参数设置为创建的撤销表空间。这样,数据库运行时的回滚信息就由撤销表空间自动管理。
2)手动撤销(回滚)管理
如果将数据库初始化参数UNDO_MANAGEMENT设置为MANUAL,则需要手动进行撤销管理,即需要DBA以手动方式对回滚段进行管理。手动撤销管理增加了DBA的管理负担,正逐渐被Oracle淘汰。
(5)回滚段的查询
DBA_ROLLBACK_SEGS:包含所有回滚段信息,包括回滚段的名称、所属表空间;
DBA_SEGMENTS:包含数据库中所有段的信息;
V$ROLLNAME:包含所有联机回滚段的名称;
V$ROLLSTAT:包含回滚段的性能统计信息;
V$UNDOSTAT:包含撤销表空间的性能统计信息;
V$TRANSACTION:包含事务所使用的回滚段的信息。