-- 创建undo表空间
create undo tablespace undo_tbs datafile ‘’ size 500m;
-- 切换undo表空间
alter system set undo_tablespace = undo_tbs scope = both;
求教:关于估算undo表空间>>>>>>>>>>>>>>>>>>>
在资料上看到估算undo表空间的大小的脚本如下:
SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
FROM (SELECT value AS UR
FROM v$parameter
WHERE name = 'undo_retention'),
(SELECT (SUM(undoblks)/SUM
(((end_time-begin_time)*86400))) AS UPS
FROM v$undostat),
(SELECT value AS DBS
FROM v$parameter
WHERE name = 'db_block_size');
Oracle9i数据库打破了时间障碍,提供不使用回滚(转返)段而实现数据恢复的功能。
Oracle9i数据库一个曾被重点预告的特点是提供称之为"闪回"式查询的能力。这种查询可以在数据库中查询过去某些时间的数据。闪回式查询是使用相同的"撤消(Undo)"数据来实现的。这种"撤消(Undo)"数据已被Oracle9i数据库维护,以提供事务处理支持和保证多用户读取数据的一致性。
切换到自动撤消管理
为了进行闪回式查询,需要使用自动撤消管理。也就是说必须把数据库设置为将回滚数据写入"撤消(UNDO)"表空间,而不是写入回滚段。Oracle9i数据库自动管理"撤消(UNDO)"表空间,所以你不必再为建立回滚段和为其设定合适的大小而操心。需要做的全部工作就是确定所需"撤消(UNDO)"空间的总量,并据此来设定"撤消(UNDO)"表空间的大小。
Jonathan Gennick在 关于闪回式查询的更多信息及实例,请参见 OTN中关于PL/SQL的更多信息,请参见: 购买Oracle9i 关于PL/SQL的多媒体报道 Oracle.com上关于 PL/SQL的前沿技术 Oracle Publishing发表的关于PL/SQL的文章 |
自动撤消管理是Oracle9i数据库的新特性。切换到自动撤消管理状态的过程相当简单,首先建立一个"撤消(UNDO)"表空间:
CREATE UNDO TABLESPACE undodataDATAFILE '/oradata/undodata01.dbf'SIZE 40M;
建立了"撤消(UNDO)"表空间之后,在使用前,还需要对数据库实例进行一些设置:指定保留时间,将数据库实例切换到自动撤消管理模式--通过设置三个初始化参数来完成,如下例所示:
UNDO_MANAGEMENT = AUTOUNDO_RETENTION = 1800UNDO_TABLESPACE = UNDODATA
UNDO_RETENTION参数指明来自提交的事务处理的撤消信息在允许改写之前需保留的时间。指定保留时间以秒为单位。缺省值为900秒(15分),本文设置为1800秒(30分)。
UNDO_RETENTION 和 UNDO_TABLESPACE是两个动态参数,而UNDO_MANAGEMENT则不然。所以,为使切换到自动撤消管理的设置生效,需要关闭并重新启动数据库实例。
正确是设置"撤消(UNDO)"表空间的大小非常重要。Oracle9i数据库中的新特性--V$UNDOSTAT视图对此很有帮助。V$UNDOSTAT每10分钟返回一行过去24小时保留的数据。从UNDOBLKS列可以知道在每个时间间隔内,"撤销"数据所占用的数据块的数目。我们来看一下"撤消(undo)"率和一个因数:希望"撤消(undo)"数据保留的时间,并增加一个足够大的安全系数。例如,在我的测试实例中,在任一个10分钟内,"撤消(undo)"耗费最大为189块。考虑到三个10分钟间隔即为保留时间30分钟,可知,我所需要的"撤消(undo)"表空间如下所示:
189 * 8K (block size) * 3 (10-minute intervals) = 4,644,864 bytes
它远低于我在建立"撤消(undo)"表空间时所分配的40MB。
授权对DBMS_FLASHBACK的访问
使用Oracle9i数据库闪回式查询的另一个必备条件是你必须拥有对DBMS_FLASHBACK包的EXECUTE访问授权。该软件包为SYS所有。以SYS登录后,按如下方式授权:
GRANT EXECUTE ON DBMS_FLASHBACK TO GENNICK;
建立闪回式查询
为了进行闪回式查询,需将你的查询作为参数,调用DBMS_FLASHBACK软件包的两个过程。从过程中返回时,可依据指定的date/time值返回,也可按照系统改变数(SCN)返回。为指定date/time值,可使用DBMS_FLASHBACK.ENABLE_AT_TIME,如清单1所示。下一节中的清单2 将说明如何进行基于SCN的闪回式查询。
如清单1所示,运行于DBMS_FLASHBACK.ENABLE_AT_TIME和DBMS_FLASHBACK.DISABLE的查询返回过去的10分钟的正确结果。启动闪回式查询模式后,只能运行SELECT语句。在使用DBMS_FLASHBACK.DISABLE退出闪回式查询模式前,不能运行INSERT, UPDATE和DELETE语句。
使用闪回式查询恢复数据
清单1中所用技巧的用途很有限。它允许查看过去的数据,却不能将这些数据恢复为当前数据。而闪回式查询的真正强大之处正在于它能在过去的数据与当前数据之间建立关系,或者将过去的数据再次恢复成为当前数据。
同时处理过去数据与当前数据的关键是游标(cursors)。在闪回查询状态下打开一个游标之后,即使调用了DBMS_FLASHBACK.DISABLE,该游标也仍处于该状态。这样,要将过去的数据恢复为当前数据,应该启动闪回式查询模式,打开一个游标以返回想要处理的数据,然后执行闪回查询模式。游标会继续返回过去的数据,同时,现在建立的DML语句也会影响到当前数据。
清单2 中给出了一个使用闪回式查询恢复被意外删除的数据的示例。在该例中,首先记录当前的SCN(可从DBMS_FLASHBACK.GET _SYSTEM_ CHANGE_NUMBER得到)。SCN是返回到撤消误删除(DELETE)时的基础。注意过程性PL/SQL的用法。这种情况下,必须使用过程编码。因为游标必须在闪回式查询模式下打开,而必须在结束闪回式查询模式后才能运行DML语句以恢复丢失的数据。不能通过任何类型的INSERT...SELECT FROM语句来恢复丢失的数据。
深入理解闪回式查询
闪回式查询的结果本质上总是建立在SCN的基础上。Oracle9i数据库每5分钟跟踪一次SCN,并记录最近5天的操作信息。ENABLE_AT_TIME利用该记录查看与你所指定时间相关的SCN,并将此SCN作为所建立的闪回查询的基础。这里有两种情况。一种情况是,如果希望返回到五天以前的状态,则必须确定并使用SCN。另一种情况是,你传送给ENABLE_AT_TIME的时间值在最近的五天之内。这一情况如清单3所示。请注意:尽管我返回到下午2:37--该时间晚于我删除表中全部数据行的操作,但闪回查询仍然显示了一个不为零的行数。有效闪回时间在早于我所指定的时间之前就结束了。如果希望在返回时得到精确数据,就需要使SCN。
清单4 说明SYSDATE函数总是返回当前的系统日期,即使用于闪回式查询也是如此。使用SYSDATE时,查询的结果有多种。如果有一个返回今天执行的全部事务处理的查询,而该查询使用SYSDATE来确定"今天(today)",那么,如果你闪回到了昨天,则会得到什么样的结果呢?这就需要考虑在所执行的所有闪回式查询中使用SYSDATE的影响。
与SYSDATE函数相似,不管是否处于闪回查询模式,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函数总是返回当前的SCN。
只能在事务处理开始时进入闪回式查询模式。如果已经使用DML语句来更改数据,则必须将其执行COMMIT后才能进行闪回查询。另外,如果对表结构进行了修改,那么返回的时间不能早于最后一次更改的时间。这是因为闪回查询使用当前数据字典中的数据。即使只是对某列的数据类型进行简单的更改也会限制闪回式查询的能力。
闪回查询有发展前途吗?
很显然,闪回查询对于查询最近的数据是非常有用的。然而,在某些应用软件中(如对医学记录进行跟踪的软件),就需要保留所有的历史数据。这些应用软件就必须依靠触发器和审核表(或类似的机制)来跟踪过去所有的更改。
闪回式查询能否使用户自己恢复丢失或损坏的数据,而不必在半夜去唤醒DBA?答案是肯定的。但它不会象安装Oracle9i数据库或授权访问DBMS_FLASHBACK那样容易。为了使这一特性对终端用户真正有用,程序员应该特意编写带有闪回式查询功能的软件。