Undo数据的作用:
1. 回退事务
通过rollback语句可以取消事务变化
2. 读一致性
Commit提交后。。
3. 事务恢复
例程恢复的一部分。
4. 倒叙查询
从过去的某个时间点查询。
配置undo表空间
n undo_management (auto,manual)
n undo_tablespace
可以创建多个undo talbespace,但同一时刻只有一个有效(active)。
Undo_management = auto;
Undo_tablespace = undotbs;
Ø 建立undo表空间
系统会自动创建。
Create undo tablespace undo1
Datafile ‘path\undo1db01.dbf’ size 100M;
Ø 修改undo表空间
Alter tablespace undotbs
Add datafile ‘path\undotbs2.dbf’
Size 300M
Autoextend on; // 添加undo表空间,还没有active。
Ø 切换undo表空间
Alter system set undo_tablespace = undotbs2;
Ø 删除undo表空间
Drop tablespace undotbs2; // 不是active时,才可以删。
注:
无需多个undo tablespace ,只需创建一个足够大的。
切换undo tablespace 时候,必须保证老的undo tablespace 里面的数据没用了,才可切换,否则不能切换。最好在没有人用得时候,切换。
在用户修改数据表中的数据后,而没有commit:此时,undo表空间和redo中,都有记录,而此时切换undo表空间后,数据提交,数据并没有丢失,而是正常;如果切换表空间后,删除该表空间,则报错,不能删除该表空间。
对数据修改,产生Undo信息,同时undo也会产生redo信息。
是不是不能回滚了??
Show parameter undo; // 查看默认的undo表空间指向哪个(undotbs1)。
Select tablespace_name,contents,status from dba_tablespaces;
Other parameters
undo_management
指定undo数据的管理方式
Undo_retention参数:单位是秒,规定undo表空间最大保存数据的时间。
循环使用。
Alter system set undo_retention = 9000; // 修改参数
Show parameter undo;显示参数如下:
Undo_management // auto mode
Undo_retention // undo表空间保存数据的时间
Undo_tablespace // 指定默认的undo表空间。
Undo quota参数:给用户分配空间最高限额。
超出限额就会报错
Undo_pool包,设定参数
undo_tablespace
指定例程所要使用的undo表空间
Undo表空间大小问题
Select addr, used_ublk from v$transaction;
// 查询占用undo表空间的数据块。
// 当用户修改数据库记录,如果commit,则数据块释放()。
// 如果没有commit,回滚,就是用undo中的数据块信息将修改的数据覆盖。
Undo表空间多大,就得需要估计:
1. 考虑transaction大小,影响的数据多少。如:插入多少条数据等
2. undo_retention , 时间越长,需要的空间越大。
3. V$undostat 记录undo表空间的历史信息。
如果undo表空间,不够用,则会报错(报错后,就回滚了)。
决定undo表空间大小的因素:
1) Undo_retention // 默认900秒
2) 每秒钟产生undo数据块的个数
方法1:最大值 【该方法好】
Select max ( undoblks / ( ( end_time-begin_time ) * 24 * 3600) ) from v$undostat;
方法2:平均值
select sum(undoblks) / sum( ( end_time-begin_time ) * 24 * 3600) from v$undostat;
3) Db_block_size
Show parameter block; //显示块的大小,8K
因此:undo空间大小 = 900 * 8K * (2产生的值);
监视undo表空间信息
在自动undo管理模式下,
1. 确定当前例程正在使用的undo表空间
使用自动undo管理模式时,oracle会使undo表空间存放undo数据。
Show parameter undo_tablespace;
2. 显示数据库的所有undo表空间
使用自动undo管理模式时,必须建立undo表空间
Select tablespace_name
from dba_tablespaces
Where contents=’UNDO’ //显示当前数据库包含的所有UNDO表空间
3. 显示undo表空间统计信息
为合理规划undo表空间的尺寸,应在数据库运行的高峰阶段搜集undo表空间的统计信息,最终根据统计信息确定undo表空间的尺寸。
Select to_char(begin_time, ‘HH24:MI:SS’) begin_time,
To_char(end_tiem , ‘HH24: MI:SS’) end_time,
Undoblks
From V$undostat;
// begin_time 起始统计时间
// end_time 结束统计时间
// Undoblks undo数据所占用的数据块个数
// oracle 每个10分钟生成一行统计信息
Select usn , status from v$rollstat; //
Select * from v$rollname; //
4. 显示undo段统计信息
使用自动undo管理模式时,oracle会在undo表空间上自动建立10个undo段,
通过查询动态性能视图V$ROLLNAME,可以显示所有联机undo段的名称
通过查询动态性能视图V$ROLLSTAT,可以显示undo段的统计信息
Col name format a10
Select a.name, b.xacts, b.writes, b.extents
From v$rollname a, V$rollstat b
Where a.usn=b.usn;
// name : undo 段的名称
// writes :在undo段上所写入的字节数
// xacts :undo段所包含的活动事务个数
// extents :undo段的区个数
5. 显示活动事务信息
动态性能视图v$session用于显示会话的详细信息
动态性能视图v$transaction用于显示事务的详细信息
动态性能视图v$rollname 用于显示联机undo段的名称
Col username format a10
Col name format a10
Select a.username, b.name, c.used_ublk
From v$session a, v$transaction c, v$rollname b
Where a.saddr=c.ses_addr and b.usn=c.xidusn and a.username=’system’;
6. 显示undo区信息
数据字典视图dba_undo_extents 用于显示undo表空间所有区的详细信息。
以下显示undo段_SYSSMU5$的所有区为例
Select extent_id, bytes, status
From dba_undo_extents
Where segment_name=’_SYSSMU5$’
// extent_id 区编号
// bytes 区尺寸
// status 区状态(active 该区处于活动状态, expired 该区未用)
7. Dba_rollback_segs视图//
Select segment_name, tablespace_name from dba_rollback_segs;
// 所有的sgements 信息 (active的undo表空间,非active 的undo表空间 )
// 每个segment可以被多个transaction共享
// system : 用来修改数据字典所用的segment等,是由oracle修改的。
8 V$transaction 视图
//某个transation占用undo数据块的信息
select addr, used_ublk from v$transation;
9 v$session视图
//用户登陆的信息
10 v$rollname 视图
// 所有在线的undo segments (active的undo表空间,只有一个undo表空间是active)
select * from v$rollname;