服务器 频道

忘却Oracle的5个方面

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

IT资讯人员最害怕这样的Oracle错误信息,即ORA-1578,“Oracle data block corrupted(Oracle数据块损坏)”。其中一个数据库块的内部结构将不能被修正。信息可以通过文件数量和块数量来识别块的错误。一般而言,补救的方法通过运行以下这样的查询:

SELECT owner, segment_name, segment_type

FROM dba_extents

WHERE file_id =

AND BETWEEN block_id AND block_id + blocks - 1;

这里,为从错误信息得到的数量。这一查询可得到哪些对象包含被损坏的块。然后就可以恢复这些损坏的块,然而这些恢复要么是直接的(对于索引和临时成分),要么是混乱的(对于表单),要么是十分混乱的(对于动态的roolback部分和部分数据字典)。

然而,在Oracle 9i Enterprise Edition中,一个名为BLOCKRECOVER的恢复管理器(RMAN)的命令,可以正确地修正这些块,而不需要放弃和重新建立所涉及的对象。当进入RMAN并连接到目标数据库之后,键入:

BLOCKRECOVER DATAFILE BLOCK ;

一个新的查看,名为V$DATABASE_BLOCK_CORRUPTION,可以使得在RMAN备份过程中获得更新,并且当执行一个BLOCKRECOVER时,可以列出块的内容。为了恢复所有被损坏的块,可以使用以下的RMAN:

BACKUP VALIDATE DATABASE;

BLOCKRECOVER CORRUPTION LIST;

如果只需要恢复几个块,这一方法非常有用。对于大规模的损坏块,需要重新存储数据文件的一个先前图像,然而恢复整个数据文件,这样效率更加高。对于任何新的特性,在使用到正式的数据库之前,请认真地测试,这是有必要的。

列不能被重命名或者重新组织

4. 列不能被重命名或者重新组织

重新命名一个表格的列或者改变它的数据类型,通常这意味着建立一个新的表格和复制旧的数据到新表格。列根本不能重新命名,数据类型只有在没有数据(只能为NULL数值)时才能被改变。

Oracle 9i具有两种方法以克服这些限制。现在,ALTER TABLE命令可以直接地重新命名列:

ALTER TABLE books RENAME COLUMN tiitle TO title;

同样,一个名为DBMS_REDEFINITION的PL/SQL工具包可以使一个DBA改变表格的列结构。这是一个复杂的过程,但通常情况下遵循以下的步骤即可实现:

1 使用DBMS_REDEFINITION.CAN_REDEF_TABLE来检查表格满足在线的重新定义,并指定重新定义是否遵循主要的键或者遵循行Ids。

2在相同规划中建立一个空表格,但结构是一样的。省略你想要放弃的列,包含你想要建立的新的列。

3使用DBMS_REDEFINITION.START_REDEF_TABLE来开始重新定义过程。这一过程的参数说明了旧的表格,新的表格,以及如何将现成的列映射到新表格的列。

4建立任一约束,索引。

5使用DBMS_REDEFINITION.FINISH_REDEF_TABLE来完成这一过程。当重新定义在两个表格之间交换时,无论原来表格的大小,都必须将表格锁定为一小段时间。

6. 放弃在重新定义中使用的临时表格,而不再使用它。

当然,重新定义一个表格不会自动地更新任何可以访问表格的程序代码。程序必须分开地更新和调试。然而,DBMS_REDEFINITION does所可以做的就是缩短时间,这正是用户的需求。

只有表格的主人才能分配使用权限

5.只有表格的主人才能分配使用权限

当我提到Oracle安全特性时,客户都无法相信DBA不能将使用权限分配给表格,除非表格的主人已经将其分配给DBA。然而,在以前就是这样的情况。这些限制是Oracle设计的一部分,但它使管理更加困难。在Oracle 9i,一个新的系统权限改变了这一点。

现在的DBA具具备一个名为GRANT ANY OBJECT PRIVILEGE的系统权限。在过去,一个如此的语句

GRANT SELECT ON scott.emp TO giselle;

都会无法通过,除非SCOTT已经将DBA 的SELECT权限分配给他的表格 WITH GRANT OPTION。现在,相同的语句却可以正确运行。

保持忘却状态

正如Visa的创始人Dee Hock所说的,“问题不是你如何去获得创新的思想,而是如何去忘却旧的东西。”所以,请保持忘却状态。

0
相关文章