新版本可以给软件带来更高效率的技术现在我们可以忘却Oracle数据库的5个方面。
1.只有DBA可以恢复数据
以SQL数据库——DBAs直接工作的人们以及IT资讯人员都可以因为一个不匹配的命令而导致数据库的破坏或者数据的丢失。事实上,对于Oracle,用户的错误操作是导致数据库停止工作的主要原因。从数据库而不是开发过程得到的一个表单可以造成程序及其所有用户操作的瘫痪。而且,一个不合适的更新也有可能破坏数据库操作的结果。
直到现在,从这些错误中恢复数据是一个极其耗时的差事,并且只有DBA可以实现。但自从Oracle 9i以来,用户可以通过SQL命令来修正很多这样的错误。其中的机制是引入了新的Oracle 9i的名为闪回查询(Flashback Query)的特性。
这里是一个在SCOTT schema中操作的范例。范例中,一个职工记录被删除,并提交更改结果:
DELETE FROM emp WHERE empno = 7934;
COMMIT;
代码行丢失了SELECT语句,而且一个ROLLBACK也不能恢复这一行。然而,一个闪回查询可以显示10分钟之前的表单内容:
SELECT * FROM emp
AS OF TIMESTAMP (SYSTIMESTAMP – INTERVAL "10" MINUTE)
WHERE empno = 7934;
SELECT语句可以使用INSERT语句的子查询来载入被删除的数据。然而,请注意到,这一INSERT操作必须受限于表单中的约束。
为了将整个会话返回到特定的时间,可以使用DBMS_FLASHBACK包:
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(TIMESTAMP ‘yyyy-mm-ddhh:mi:ss’);
在一个闪回查询过程中,被访问的数据不能被更改,只能被读取。这有点象科幻小说中的时间追踪:你可以访问过去,但你不改变过去。为了获得过去的会话,可以键入:
EXEC DBMS_FLASHBACK.DISABLE;
为了使得闪回查询得以工作,数据库必须使用自动删除管理(AUM, Automated Undo Management),并建立一个删除表。用户可以“闪回”的时间限度取决于undo_retention参数和删除表大小的初始化。
虽然这一特性对于IT咨询者来说是福音,但是Oracle的主要目的是使得用户直接键入SQL就可以从他或她的错误中得以恢复。闪回查询是一个很好的功能,所以它可以通过系统权限来恢复单一表单或者所有表单。
FLASHBACK ANY TABLE
但是你还可以等待:在Oracle 10g会做得更好。在9i版本中,闪回查询受限于数据操作语言(DML,Data Manipulation Language)命令,比如SELECT, INSERT, UPDATE, and DELETE。但在10g中,即使一个dropped表也可以通过闪回来恢复。
Oracle不能保存小数点的时间

