oracle undo解析(二)
undo 为自动管理模式。
900 表示在900秒内,undo上的数据不能被覆盖。
UNDOTBS1 是当前正在使用的undo表空间。
创建undo表空间,与创建一般的表空间类似,命令如下:
SQL> create undo tablespace myundotbs
2 datafile '/ora10/product/oradata/ora10/myundotbs1.dbf' size 10M;
www.2cto.com
Tablespace created.
查看新创建的undo表空间
SQL> select tablespace_name,contents from dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------------------------------------ ------------------
SYSTEM PERMANENT
UNDOTBS1 UNDO //老的undo表空间
SYSAUX PERMANENT
TEMP TEMPORARY
USERS PERMANENT
PAUL PERMANENT
MYUNDOTBS UNDO // 新创建的undo表空间
SQL> show parameter undo 再次查看当前使用的表空间
NAME TYPE VALUE
------------------------------------ ----------------------------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
www.2cto.com
切换undo表空间:
SQL> alter system set undo_tablespace=myundotbs;
System altered.
SQL> show parameter undo 再次查看当前使用的表空间
NAME TYPE VALUE
------------------------------------ ----------------------------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string MYUNDOTBS //已经切换的了undo表空间
www.2cto.com
删除undo表空间:
SQL> drop tablespace myundotbs;
Tablespace dropped.
Drop一个undo表空间后,在磁盘上还是存在的,我们需要通过操作系统层面用rm命令将文件删除。
思考:
表空间的切换、删除命令非常简单,但这里我们需要思考一下实际切换场景。当我们执行一个事务时,事务执行了一半还没有提交,这个时候进行切换undo表空间是否可以成功 理论上undo表空间正在使用中,是不允许切换的。但实际上undo表空间在使用中是可以切换的,但切换之后立刻删除,系统会提示错误。把事务提交后再删除,系统依然提示错误。这里只有将替换掉的undo表空间切换到使用状态,再切换到废弃状态才能被删除。上面的情况,有兴趣有同学可以验证一下。
Undo调优
www.2cto.com
Undo的设置取决于我们实际的生产系统。如何设置undo更合理地为我们工作呢?
Undo表空间的大小:
我们在创建一个undo表空间的使用,就指定了它的大小,这个大小一旦创建是不可变更的。设置过大,是一种浪费,设置过小,例如删除100万条记录,这些删除的记录都要临时存放到undo表空间中,如果undo的大小不能存储100万条记录,那么就会出问题。
Undo数据的存放时间:
也就是undo_retention 参数所对应的时间,undo上有数据存放时间与undo大小的密切关系。存放时间越长,需要的表空间越大。就像理发师的数量与理发师的效率的关系一样。理发师效率很高,一秒钟解决一个客户,那么就不需要太多的理发师傅。
Undo表空间的历史信息:
如何合理设置undo表空间的大小和存放时间呢?那么就需要参考历史记录
这个数据每隔10分钟采集一次,结束时间减去开始时间,在这段时间内使用了多少个undo数据块。
计算每秒钟使用数据块的多少?
求最大值:
SQL> select max(undoblks / ((end_time-begin_time)*24*3600)) from v$un
dostat;
MAX(UNDOBLKS/((END_TIME-BEGIN_TIME)*24*3600))
---------------------------------------------
14.15833333
www.2cto.com
求平均值:
SQL> select sum(undoblks)/sum((end_time - begin_time)*24*3600) from v$undostat;
SUM(UNDOBLKS)/SUM((END_TIME-BEGIN_TIME)*24*3600)
------------------------------------------------
4.122282389