Oracle闪回特性如何设置撤消表空间(上)

原创|其它|编辑:郝浩|2009-05-22 11:32:29.000|阅读 605 次

概述:Oracle数据库的很多特性使用起来的确让人倍感轻松惬意,不过任何特定的特性要想用起来得心应手,首先得把数据库设置妥当,排除掉制约因素,才能真正做到事半功倍。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  本文将为大家逐步解读Oracle使用手册中提及的如何为Oracle的闪回(Flashback)特性设置自动撤消管理(Automatic UNDO Management),相应地附上相关脚本和注意事项。

  Oracle数据库闪回特性在实际应用中的第一道坎就是自动撤消管理。对于并没有完全了解“undo”为何物的人来说,undo只是Oracle存储起来用于数据库回滚或撤消操作的信息。一谈到闪回技术,undo数据在某一时间点前的数据重建上的重要性可以说显而易见。然而,任何事情都是两面的,在闪回某特定时间点数据的实际操作中,undo也是一个制约因素;如果没有足够的undo数据,那么闪回查询就会失败,甚至触发一些异常的数据库错误。

  Oracle一直以来都极力支持使用自动撤消管理,当然是有原因的。相信那些曾经和手动撤消管理进行过奋战的DBA们是深谙其中的困难,你得花上相当的时间和精力来正确创建和控制回滚段,不停地重复调整回滚段的大小,才能避免出现ORA-1555快照过旧之类的错误。有了自动撤消管理(AUM)就不一样了,Oracle就可以为你自动监控和管理撤消段。从Oracle 11g开始,AUM成为默认设置,而且绝大部分数据库都会在创建时生成一个名为UNDOTBS1的自动扩展的撤消表空间。你可以用以下的SQL语句来查看该撤消表空间:

  SQL> SELECT dt.tablespace_name, dt.contents,
  ddf.file_name, ddf.bytes/1024/1024 size_MEG

  FROM dba_tablespaces dt,

  dba_data_files ddf

  WHERE dt.tablespace_name = ddf.tablespace_name

  AND dt.contents = 'UNDO';

  TABLESPACE_NAME CONTENTS FILE_NAME SIZE_MEG

  --------------- --------- --------------------------------- ----------

  UNDOTBS1 UNDO /oradata/db11FS/undotbs01.dbf 2048
 
  如果你的数据库中没有撤消表空间,用CREATE TABLESPACE语句很容易就能够创建一个。如果选择了AUTOEXETEND选项,则如下所示:

  CREATE UNDO TABLESPACE undotbs1
  DATAFILE '/oradata/db11FS/undotbs01.dbf' SIZE 2048M REUSE AUTOEXTEND ON;
 
  如果你正在被手动撤消管理(使用回滚段)折腾得焦头烂额,不妨轻松过渡到自动撤消管理。切换的法门就在UNDO_MANAGEMENT初始化参数,它可以指定系统当前使用的撤消模式。通过SHOW PARAMETER命令可以查看当前的参数设置:

  SQL> SHOW PARAMETER undo
  NAME TYPE VALUE

  --------------------- ----------- ---------

  undo_management string AUTO

  undo_retention integer 900

  undo_tablespace string UNDOTBS1

  如果你使用的是Oracle 11g,且UNDO_MANAGEMENT设置为AUTO或没有经过设置,那么你的数据库实例已经使用着自动撤消管理,那么也就没你其他什么事做了。问题是,这是Oracle 11g的新设置,此前的版本并没采用。在11g以前的版本,不对UNDO_MANAGEMENT进行设置就表示你的数据库用的是手动撤消管理。所以,如果你用的是11g以前的版本就得小心了。这种情况下很适合对选定好初始化参数设置为ALWAYS,你就再也不用再去瞎猜默认值了。不管怎样,如果你的UNDO_MANAGEMENT设置为MANUAL模式,那么你就需要从手动撤消管理(使用回滚段)切换到自动撤消管理(使用撤消表空间)。这个切换过程如下:

  1. 设置UNDO_MANAGEMENT=MANUAL,如果使用init.ora文件,在init.ora文件中添加一个条目(entry),如果使用spfile则设置ALTER SYSTEM SET undo_management=manual SCOPE=spfile

  2. 重启数据库实例,使参数设置有效;

  3. 想要调整撤消表空间到合适大小,建议实际观测系统的工作负载,然后使用以下的代码让Oracle确定UNDO表空间的合适大小:

  SQL> SET SERVEROUTPUT on
  SQL> DECLARE

  utbsiz_in_MB NUMBER;

  BEGIN

  utbsiz_in_MB := DBMS_UNDO_ADV.RBU_MIGRATION;

  dbms_output.put_line('undo size : '||utbsiz_in_MB||'MB');

  end;

  /

  undo size : 740MB

  PL/SQL procedure successfully completed.
 
  4. 如前文所述创建UNDO TABLESPACE。要记住,用户对数据库数据所作的更新越多,那么为回闪操作设置的撤消表空间所需的空间就越大。如果你按照前文所述创建了该表空间(启用AUTOEXTEND设置),那么Oracle就会管控这个表空间的大小,并使撤消数据的保存时间长于最长的查询持续时间及UNDO_RETENTION参数指定的时间(下面会谈到)。

  5. 设置以下初始化参数。同样的,如果你用的是init.ora文件,则要确保在该文件中编辑并存储这些参数,并使用ALTER SYSTEM命令对这些参数进行设置。如果你使用的是spfile,那么在设置这些参数的时候,要指定SCOPE=spfile,这样通过重启数据库就能够使参数设置生效。

  a) UNDO_MANAGEMENT:用于设置数据库实例的撤消管理模式

  ALTER SYSTEM SET undo_management=auto SCOPE=spfile

  b) UNDO_TABLESPACE:用于设置为AUM准备的撤消表空间

  ALTER SYSTEM SET undo_tablespace=undotbs01 SCOPE=spfile

  c) UNDO_RETENTION:用于设置撤消数据保存的保存时间(以秒为单位)

  ALTER SYSTEM SET undo_retention=900 SCOPE=spfile

  在设置这些参数时要记住,UNDO_MANAGEMENT是一个静态参数(无法设置为动态),而且需要重启数据库实例才能使设置生效。因此,建议只是修改init.ora文件或spfile,然后重启数据库。

  如果你完成了每一个步骤,那么你的数据库实例就已经启用了自动撤消管理,并拥有一个撤消表空间。可见,切换到自动撤消管理以及创建撤消表空间并不是什么难事,难的部分是它的实际使用过程。如果你设置的UNDO_RETENTION时长太短,或者UNDO表空间的AUTOEXTEND没有启用,又会出现哪些问题呢?这些将在本文的第二部分进行讨论。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP