服务器 频道

忘却Oracle的5个方面

【IT168 服务器学院】新版本可以给软件带来更高效率的技术现在我们可以忘却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不能保存小数点的时间

2.Oracle不能保存小数点的时间

Oracle的DATE数据类型只能以秒来存储时间数据。需要更精确时间的开发人员只能使用NUMBER数据类型。这一操作使得时间间隔的计算更加困难。

自从9i版本之后,Oracle包含了一个与1999 SQL相互兼容的时间/日期数据类型。为了声明诸如一个时间列,可以使用TIMESTAMP数据类型,并显示需要的小数点个数(缺省情况下为6):

CREATE TABLE event_ts (

event_id NUMBER(6)

,event_name VARCHAR2(40)

,start_time TIMESTAMP(2)

,elapsed_time TIMESTAMP(2)

);

对于一个TIMESTAMP字面意义,比如DATE,必须被一个单引号包括。以下的字面代表着March 23, 2004,在午夜的半秒时刻:

TIMESTAMP ‘2004-03-23 00:00:00.50’

虽然标准的DATE字面意义没有包含时间,而一个TIMESTAMP字面意义的标准格式却需要包含时间。NLS_TIMESTAMP_FORMAT参数控制格式,同样,NLS_DATE_FORMAT设定了标准DATE格式。一个新的转换函数,即TO_TIMESTAMP,可以从其它输入格式建立一个TIMESTAMP,并且TO_CHAR函数可用于显示一个TIMESTAMP的组成。

为了以TIMESTAMP格式获得当前日期和时间,可以使用SYSTIMESTAMP函数,而不是使用SYSDATE函数,例如:

SELECT SYSTIMESTAMP FROM DUAL;

一个损坏的块就需要放弃一个对象

0
相关文章