eygle.com   eygle.com
eygle.com  
 

« December 11, 2005 | Blog首页 | December 13, 2005 »



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               = 01-MAR-05
  sort_area_size           = 524288
  db_name                  = unicode

文档上的解释为:

FIXED_DATE

Parameter type

String

Syntax

FIXED_DATE = YYYY-MM-DD-HH24:MI:SS (or the default Oracle date format)

Default value

There is no default value.

Parameter class

Dynamic: ALTER SYSTEM

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 
Connected as SYS

SQL> col owner for a12
SQL> select owner,object_name,CREATETIME,DROPTIME from dba_recyclebin
  2  order by droptime
  3  /
OWNER        OBJECT_NAME                    CREATETIME          DROPTIME
------------ ------------------------------ ------------------- -------------------
COMMON       BIN$AHsQ+pi+Kb/gRAADumkBdQ==$0 2005-08-29:16:42:19 2005-09-11:15:36:17
COMMON       BIN$AHsQ+pi9Kb/gRAADumkBdQ==$0 2005-08-29:16:42:19 2005-09-11:15:36:17
PDA          BIN$AdEb4zqqUcTgRAADumkBdQ==$0 2005-09-05:10:31:01 2005-09-28:15:40:39
......
BJLAIS_RUN   BIN$BtkGRT0dSwfgRAADumkBdQ==$0 2005-11-30:10:54:07 2005-12-01:16:13:17
BJLAIS_RUN   BIN$BtkGRT0cSwfgRAADumkBdQ==$0 2005-11-30:10:54:07 2005-12-01:16:13:17
750 rows selected
SQL> 

2.不同用户在回收站的对象

SQL> select owner,count(*) from dba_recyclebin group by owner;   
OWNER                  COUNT(*)
-------------------- ----------
BJLAIS_RUN                   44
COMMON                        8
MMSBLOG                     618
MMSHAWA_RUN                   2
PDA                           8
RING_RUN                     70
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(*)
-------------------- ----------
BJLAIS_RUN                   44
MMSBLOG                     618
MMSHAWA_RUN                   2
PDA                           8
RING_RUN                     70

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
SQL> column name format a30
SQL> column value format a25
SQL> select
  2    x.ksppinm  name,
  y.ksppstvl  value,
  3    y.ksppstdf  isdefault,
  4    5    decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')  ismod,
  6    decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE')  isadj
  7  from
  8    sys.x$ksppi x,
  9    sys.x$ksppcv y
 10  where
 11    x.inst_id = userenv('Instance') and
 12    y.inst_id = userenv('Instance') and
 13    x.indx = y.indx and
 14    x.ksppinm like '%&par%'
 15  order by
 16    translate(x.ksppinm, ' _', ' ')
 17  /
Enter value for par: recyclebin
old  14:   x.ksppinm like '%&par%'
new  14:   x.ksppinm like '%recyclebin%'
NAME                           VALUE                     ISDEFAULT ISMOD      ISADJ
------------------------------ ------------------------- --------- ---------- -----
_recyclebin                    TRUE                      TRUE      FALSE      FALSE
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.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
SQL> show parameter recyclebin 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on
SQL> alter session set recyclebin=off;
Session altered.
SQL> alter session set recyclebin=on
  2  /
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

本文用以回答留言板上的2111号问题.

在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.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
SQL> create or replace procedure definer_proc
  2  as
  3  begin
  4      for x in
  5      ( select sys_context( 'userenv', 'current_user' ) current_user,
  6               sys_context( 'userenv', 'session_user' ) session_user,
  7               sys_context( 'userenv', 'current_schema' ) current_schema
  8          from dual )
  9      loop
 10          dbms_output.put_line( 'Current User:   ' || x.current_user );
 11          dbms_output.put_line( 'Session User:   ' || x.session_user );
 12          dbms_output.put_line( 'Current Schema: ' || x.current_schema );
 13      end loop;
 14  end;
 15  /
Procedure created.
SQL> 
SQL> grant execute on definer_proc to test;
Grant succeeded.
SQL> 
SQL> create or replace procedure invoker_proc
  2  AUTHID CURRENT_USER
  3  as
  4  begin
  5      for x in
  6      ( select sys_context( 'userenv', 'current_user' ) current_user,
  7               sys_context( 'userenv', 'session_user' ) session_user,
  8               sys_context( 'userenv', 'current_schema' ) current_schema
  9          from dual )
 10      loop
 11          dbms_output.put_line( 'Current User:   ' || x.current_user );
 12          dbms_output.put_line( 'Session User:   ' || x.session_user );
 13          dbms_output.put_line( 'Current Schema: ' || x.current_schema );
 14      end loop;
 15  end;
 16  /
Procedure created.
SQL> 
SQL> grant execute on invoker_proc to test;
Grant succeeded.

注意invoker权限的本质是引入了AUTHID CURRENT_USER子句,通过此句Oracle得以使用invoker身份编译执行对象。

2.以test用户(invoker)身份执行

SQL> connect test/test
Connected.
SQL>
SQL> set serveroutput on
SQL> exec eygle.definer_proc
Current User:   EYGLE
Session User:   TEST
Current Schema: EYGLE
PL/SQL procedure successfully completed.
SQL> exec eygle.invoker_proc
Current User:   TEST
Session User:   TEST
Current Schema: TEST
PL/SQL procedure successfully completed.

注意只有使用invoker者权限执行时,Schema才转换为TEST.

SQL> alter session set current_schema = system;
Session altered.
SQL> exec eygle.definer_proc
Current User:   EYGLE
Session User:   TEST
Current Schema: EYGLE
PL/SQL procedure successfully completed.
SQL> exec eygle.invoker_proc
Current User:   TEST
Session User:   TEST
Current Schema: SYSTEM
PL/SQL procedure successfully completed.
SQL> 
通过alter session set current_schema方式修改当前模式之后,我们看到仍然是仅当使用invoker权限执行时,Schmea方切换为SYSTEM.

Posted by eygle at 12:08 PM | Comments (3)



CopyRight © 2004-2008 eygle.com, All rights reserved.