我们都知道可是使用 alter system flush shared_pool 来清除shared pool 信息,当时不能指定清除某个对象。
因为在系统繁忙的时侯 使用 alter system flush shared_pool  是很危险的,
在oracle 10.2.0.4 以及 11g 有了新的方法。提供的DBMS_SHARED_POOL.PURGE 程序来完成。

不过需要注意一点,在10.2.0.4中,虽然PURGE过程已经存在,但是要使这个过程可以真正的生效,还必须设置一个EVENT:

SQL> alter system set event = '5614566 trace name context forever' scope = spfile;

System altered.

设置EVENT后需要重启,DBMS_SHARED_POOL的PURGE才可以生效。也就是说,除非提前进行过设置,否则这个PURGE的功能对于一个产品环境而言,必须在10.2.0.5以上版本才可以使用。

Porcedure的说明如下
 
procedure purge (name varchar2, flag char DEFAULT 'P', heaps number
DEFAULT 1); 
 Explanation: Purge the named object or particular heap(s) of the object. 

 Input arguments: 
  name: The name of the object to purge.
       
There are two kinds of objects: 
         PL/SQL objects, triggers,
sequences, types and Java objects which are specified by name,
         SQL
cursor objects which are specified by a twopart number. The value for this
identifier
         is the concatenation of the 'address' and 'hash_value'
columns from the v$sqlarea view.
  flag: This is an optional parameter. If the parameter is not specified, 

        the package assumes that the first parameter is the name of a 

        package/procedure/function and will resolve the name. Otherwise, 

        the parameter is a character string indicating what kind of object 

        to purge the name identifies. The string is case insensitive. 

        The possible values and the kinds of objects they indicate are 

        given in the following table: 
        Value Kind of Object to keep 
        -----
---------------------- 
            P package/procedure/function 

            Q sequence 
            R trigger 
            T type 

           JS java source 
           JC java class 
           JR
java resource 
           JD java shared data 
            C cursor 
  heaps: heaps to purge. e.g if heap 0 and heap 6 are to be purged. 

         1<0 | 1<6 => hex 0x41 => decimal 65. so specify
heaps=>65. 
         Default is 1 i.e heap 0 which means the whole object
will be purged. 
eg:
SQL> exec dbms_shared_pool.purge ('000000007A6CF430,1052545619
','C');
 
In case the first argument is a cursor address and hash-value, the parameter should be set to any character except 'P' or 'p' or 'Q' or 'q' or 'R' or 'r' or 'T' or 't'.

This feature was introduced via the fix in bug 5614566 and I actually know a customer who has this applied on top of 10.2.0.3.

Here is an example is using dbms_shared_pool.purge to remove RAM for a specific cursor from the shared pool library cache:

SQL> exec dbms_shared_pool.purge('00000003DE576D40,353632309','C',65); ==> purge heap 0 and heap 6

PL/SQL procedure successfully completed.

This would actually not work against a cursor which is currently executing.(pinned)

Session 1:
=========
Do a massive Merge Join Cartesian
select * from dba_objects a, dba_objects b, dba_objects c;

Session 2:
=========
Identify the sql address and hash value and try to purge the cursor..
exec dbms_shared_pool.purge('00000003DE825198,3691928467','C',65); ==> This hangs
and this session is waiting on "cursor: pin X" requesting an exclusive mutex pin for the cursor object whilst it has already been pinned by session 1

Session 3
==========
select event,p1,p2 from v$session where username='SYS' and type='USER';
EVENT P1 P2
----------------------------------------- ---------- ----------
cursor: pin X 3691928467 1

The p1 value here is the Hash value of the cursor we are trying to flush.

From the short stack of the process which is executing the purge API a function called kxsPurgeCursor is called which would try to take a mutex (since _kks_use_mutex_pin is TRUE by default) The purge completes only after you cancel the sql in session 1 and exit from the same or kill the session executing the SQL.

Set the event 5614566 in the init.ora to turn purge on.

event=”5614566 trace name context forever”

SQL> select address, hash_value from v$sqlarea where sql_text = ’select * from dept’;

ADDRESS HASH_VALUE
    ——– ———-
    2671F27C 3599690174

SQL> exec dbms_shared_pool.purge(’2671F27C,3599690174′,’C');

PL/SQL procedure successfully completed.

SQL> select address, hash_value from v$sqlarea where sql_text = ’select * from dept’;

no rows selected

备注:
如果没有dbms_shared_pool , 可以通过
$ORACLE_HOME/rdbms/admin/dbmspool.sql 来创建。
在10.2.0.2/3 也提供了相应的patch There exists patches for some platforms in
10.2.0.2 and 10.2.0.3 downloadable as Patch 5614566.
 
参考:
457309.1  How To Flush an Object out the Library Cache
[SGA]
751876.1  DBMS_SHARED_POOL.PURGE Is Not Working On 10.2.0.4

http://www.dba-oracle.com/t_flush_session_dbms_shared_pool_purge.htm

 
通常我们想单独的从library cache中purge一个执行计划,其实是为了让SQL在重新进行一次解析.
要达到这个目的,在10G之前,可以用 comment on table/ grant&revoke 来实现这样的功能。基本原理就是一个表进行了DDL操作后,依赖于它的执行计划就会自动失效.
 
下面是一个演示:

SQL>
select count(*) from dual;

COUNT(*)
----------

1
SQL>
select sql_id, address, hash_value, executions, loads, parse_calls,
invalidations

from
v$sqlarea where sql_text = 'select count(*) from
dual';

SQL_ID ADDRESS HASH_VALUE EXECUTIONS
LOADS PARSE_CALLS INVALIDATIONS
------------- ----------------
---------- ---------- ---------- ----------- -------------
4m94ckmu16f9k
00000000B6C61FC0 4094900530 1 1 1
0

SQL>
select 1 from dual;

1
----------
1

SQL>
select * from dual;

D
-
X

SQL>
select 'a' from dual;

'
-
a

SQL>
select count(1) from dual;

COUNT(1)
----------
1

SQL>
select sql_id, address, hash_value, executions, loads, parse_calls,
invalidations
2 from
v$sqlarea
3 where lower(sql_text) like
'%dual%';

SQL_ID ADDRESS HASH_VALUE EXECUTIONS
LOADS PARSE_CALLS INVALIDATIONS
------------- ----------------
---------- ---------- ---------- ----------- -------------
gr7s3j0cg8pr6
00000000B6A5A470 418666214 1 1
1 0
40p7rprfbt1as 00000000B69BDC38 3703342424
1 1 1 0
520mkxqpf15q8
00000000B6DD9610 2866845384 1 1 1
0
ak90gdq0udv37 00000000B6E3C6B0 2175200359 2
2 2 1
4m94ckmu16f9k 00000000B6C61FC0
4094900530 1 1 1
0
a5ks9fhw2v9s1 00000000B698DA88 942515969
1 1 1 0
800hwktjz3zuc
00000000B6999268 1676803916 1 1 1
0

7 rows
selected.

SQL>
grant select on dual to sys;
grant select on dual to
sys
*
ERROR at line 1:
ORA-01749: you may not GRANT/REVOKE
privileges to/from yourself

SQL> grant select on dual to public;

Grant
succeeded.

SQL>
select sql_id, address, hash_value, executions, loads, parse_calls,
invalidations
2 from
v$sqlarea
3 where lower(sql_text) like
'%dual%';

SQL_ID ADDRESS HASH_VALUE EXECUTIONS
LOADS PARSE_CALLS INVALIDATIONS
------------- ----------------
---------- ---------- ---------- ----------- -------------
gr7s3j0cg8pr6
00000000B6A5A470 418666214 2 1
2 0
ak90gdq0udv37 00000000B6E3C6B0 2175200359
2 2 2 1

对于其他用户而言,都可以使用将表的查询权限授权给OWNER本身的方法,但是测试用户本身为SYS,因此需要其他用户授权,方便起见使用了授权给PUBLIC的方式。

可以看到,这种方式同样可以生效,但是仍然存在打击面过大的问题。对于系统中一个频繁访问的表,很可能这个授权的操作,导致少则几十,多则几百个SQL都是失效,

这个风险仍然不可小觑。

Using dbms_shared_pool.purge to remove a single task from the library cache的更多相关文章

  1. Multi-tasking RTOS for microprocessors with limited memory by saving only a single return address per task during context switching

    A real-time operating system (RTOS) for use with minimal-memory controllers has a kernel for managin ...

  2. C# 多任务之 Task

    Task 是什么 ? Task 是一个类, 它表示一个操作不返回一个值,通常以异步方式执行. Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中. 继承层 ...

  3. 使用DBMS_SHARED_POOL包将对象固定到共享池

    使用DBMS_SHARED_POOL包将对象固定到共享池2011年06月24日 09:45:00 Leshami 阅读数:5808 版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. htt ...

  4. C# Task WaitAll和WaitAny

    Task 有静态方法WaitAll和WaitAny,主要用于等待其他Task完成后做一些事情,先看看其实现部分吧: public class Task : IThreadPoolWorkItem, I ...

  5. 深圳scala-meetup-20180902(2)- Future vs Task and ReaderMonad依赖注入

    在对上一次3月份的scala-meetup里我曾分享了关于Future在函数组合中的问题及如何用Monix.Task来替代.具体分析可以查阅这篇博文.在上篇示范里我们使用了Future来实现某种non ...

  6. Task Class

    https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?redirectedfrom=MSDN&view ...

  7. poj 1776 Task Sequences

    http://poj.org/problem?id=1776 题意: 有一个机器要完成N个作业, 给你一个N*N的矩阵, M[i][j]=1,表示完成第i个作业后不用重启机器,继续去完成第j个作业 M ...

  8. C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel

    大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...

  9. 状态机模式中的Task与对象池

    Task 抽象带来Task 首先,假设我们有这么一段逻辑:收到一个参数,先校验格式是否正确,再提取相关的参数出来,执行我们的事务,然后构建结果并返回.伪代码如下: /** * 一个engine类 ** ...

随机推荐

  1. js判断鼠标位置是否在某个div中

    div的onmouseout事件让div消失时,会出现这样的情况,就是当鼠标移至div中的其它内容时,此时也判定为离开div,会触发 onmouseout事件,这样div中的内容就不能操作了.解决的办 ...

  2. SQL中批量删除被注入的恶意代码的方法

    下文将为您介绍SQL中批量删除被注入的恶意代码的方法,供您参考,如果您也遇到了这样的问题,不妨一看,相信对您会有所帮助. 1,如果你的数据表很少的话,那么写几条简单的sql就搞定了 对于表中的nvch ...

  3. Laptop Issue Letter (读取Excel中指定内容,然后生成新的Excel文件)

    $xl = New-Object -ComObject "Excel.Application" $cmdbwb = $xl.Workbooks.Open("F:\Ivan ...

  4. 学习之痛(数据库->存储过程和函数)

    存储过程和函数作为数据库的一部分,为什么是学习之痛. 项目实际开发,考虑性能和代码维护,绝对不用存储过程. 如果单纯自己写个小程序糊弄人玩,还可以写写. [学习] 在数据库中定义一些SQL语句集合,然 ...

  5. Ubuntu 14.04 安装 VirtualBox

    参考: ubuntu14.04,安装VirtualBox 5.0(虚拟机软件)! 由于Vagrant工具的需要,安装了一下VirtualBox. 使用参考链接的法一居然在软件中心里面报错,我想可能是没 ...

  6. 嵌入式Linux的FTP服务端软件(stupid-ftpd)

    我自己试没成功 http://blog.csdn.net/gzshun/article/details/7358651

  7. 20145235 学号 《Java程序设计》第2周学习总结

    教材学习内容总结 本周学习教材第三章,本章主要讲述了java语言中的一些基础语法,java是个支持面向对象的程序语言,但在正式进入面向对象支持语法的探讨前,对于类型.变量.运算符.流程控制等,这些各种 ...

  8. java endorsed

    endorsed目录,充许你将一些特殊的类库放到其中以供项目使用. 官方说明:    Specifying the -Djava.endorsed.dirs=lib/endorsed system p ...

  9. 通过驱动向打印机发送一段(ESC)控制指令

    这个功能看起来挺奇葩的, 写这个是因为有客户在使用驱动连接票据打印机, 但是又要开钱箱, 驱动里只能每张单据都开钱箱, 而这个打印机又不是只打印结帐单 所以就需要用软件控制打印机开钱箱 票据打印机一般 ...

  10. BLE蓝牙通信指令交互过程配对与绑定

    最简单一次蓝牙通信需要以上相关步骤,包括discovery device,connect,pairing,bond等4个主要部分.BLE中主从机建立连接,到配对和绑定的过程如下图: