December 12, 2005
Oracle Diagnostics:Why sysdate is fixed?
作者:eygle
出处:http://blog.eygle.com
今天一个朋友在MSN上问到一个问题:为什么我的SYSDATE不变了?
他查询SYSDATE的值一直停留在2005-03-01 11:41:15。感觉很奇怪。
忍不住指导他研究一下,先是从系统级诊断,发现没有问题。
再从数据库角度来诊断,发现:
select current_date from dual; 的输出是正确的,而
select sysdate from dual; 却是不正确的。
猜测是某个参数导致了系统日期被固化,让他传来alert文件,果然发现了一个此前未注意到的参数: FIXED_DATE,
core_dump_dest = /u01/app/oracle/admin/unicode/cdump |
文档上的解释为:
FIXED_DATE
|
Parameter type |
String |
|
Syntax |
|
|
Default value |
There is no default value. |
|
Parameter class |
Dynamic: |
FIXED_DATE enables you to set a constant date that SYSDATE will always return instead of the current date. This parameter is useful primarily for testing. The value can be in the format shown above or in the default Oracle date format, without a time.
找到了这个参数也就找到了答案!
Posted by eygle at 11:21 PM | Comments (2)
How to maintain Oracle10g Recyclebin?
作者:eygle
出处:http://blog.eygle.com
从Oracle10g开始,Oracle引入了flashback drop的新特性,这个新特性,允许你从当前数据库中恢复一个被drop了的对象。在执行drop操作时,现在Oracle不是真正删除它,而是将该对象自动将放入回收站。对于一个对象的删除,其实仅仅就是简单的重令名操作。
所谓的回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,你甚至还可以对已经删除的表查询,也可以利用flashback功能来恢复它, 这个就是flashback drop功能。
这个功能虽然可以极大的简化误drop导致的恢复操作,但是长时间的积累可能会导致大量的空间占用(虽然Oracle具有自己的清理机制),很多时候我们需要手工介入去清理回收站。本文主要介绍清理回收站的几种方法.
1.大量累计的空间占用
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.3.0
OWNER OBJECT_NAME CREATETIME DROPTIME 750 rows selected SQL> |
2.不同用户在回收站的对象
SQL> select owner,count(*) from dba_recyclebin group by owner; OWNER COUNT(*) 6 rows selected. |
3.我们可以指定删除某些特定对象
|
SQL> purge table common.T_SERVICE_CODE_INFO; Table purged. |
4.指定清除某个表空间的所有回收站对象
SQL> purge tablespace common; Tablespace purged. SQL> select owner,count(*) from dba_recyclebin group by owner; OWNER COUNT(*) |
5.以SYSDBA身份可以清除所有回收站对象
|
SQL> purge dba_recyclebin; DBA Recyclebin purged. SQL> select owner,count(*) from dba_recyclebin group by owner; no rows selected |
6.禁用recyclebin
如果我们不希望使用Oracle的recyclebin,可以通过参数禁用这个特性。
在Oracle10gR1中,通过修改一个隐含参数:_recyclebin 为False可以禁用这个特性:
SQL> set linesize 132 NAME VALUE ISDEFAULT ISMOD ISADJ 1 row selected. |
在Oracle10gR2中,recyclebin变成了一个常规参数,可以在session/system级动态修改:
[oracle@danaly ~]$ sqlplus "/ as sysdba" SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 12 15:34:56 2005 Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> show parameter recyclebin NAME TYPE VALUE SQL> alter session set recyclebin=off; Session altered. SQL> alter session set recyclebin=on Session altered. SQL> alter system set recyclebin=off; System altered. SQL> alter system set recyclebin=on; System altered. |
Posted by eygle at 3:45 PM | Comments (3)
Definer and Invoker Rights
作者:eygle
出处:http://blog.eygle.com
在Oracle8i以前,所有已编译存储对象(包括packages, procedures, functions, triggers, and views)只能以定义者(Definer)身份解析运行;从Oracle8i开始,Oracle引入调用者(invoker)权限,使得对象可以以调用者身份和权限执行。
定义者(Definer)指编译存储对象的所有者.
调用者(Invoker)指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema).
TOM在他的《Expert One on One》的第23章曾经详细介绍这一特性,本文引用Tom的一个例子用于说明Definer and Invoker权限。
1.以Eygle用户(definer)创建2个过程
$ sqlplus eygle/eygle SQL*Plus: Release 9.2.0.4.0 - Production on Sun Dec 11 11:39:27 2005 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> create or replace procedure definer_proc Procedure created. SQL> Grant succeeded. SQL> Procedure created. SQL> Grant succeeded. |
注意invoker权限的本质是引入了AUTHID CURRENT_USER子句,通过此句Oracle得以使用invoker身份编译执行对象。
2.以test用户(invoker)身份执行
SQL> connect test/test PL/SQL procedure successfully completed. SQL> exec eygle.invoker_proc PL/SQL procedure successfully completed. |
注意只有使用invoker者权限执行时,Schema才转换为TEST.
SQL> alter session set current_schema = system; Session altered. SQL> exec eygle.definer_proc PL/SQL procedure successfully completed. SQL> exec eygle.invoker_proc PL/SQL procedure successfully completed. SQL> |
Posted by eygle at 12:08 PM | Comments (3)
