DBA 日常管理過程中會遇到需要把特定的sql語句的執行計劃從shared pool 中清除或者需要重新生產新的執行計劃的要求。通常的alter system flush shared_pool;或者重新執行信息統計又會造成較大的影響,所以可以使用oracle提供的
dbms_shared_pool.purge 來清除某個特定的sql的執行計劃。
下面是關於dbms_shared_pool.purge 的官方介紹:
The syntax for the DBMS_SHARED_POOL.PURGE package is:
procere purge (name varchar2, flag char DEFAULT 'P', heaps number DEFAULT 1);
name: 指定要處理的對象的名稱,有兩種情況:
1 PL/SQL 對象 就是對象的名稱
2 SQL對象,指定 'address','hash_value' 的 SQL 游標。
標記位 flag是可選的。如果忽略了該參數,則該包默認是包,過程,函數的名稱並且忽視名稱。否則,該參數就指定一個對象類型。標記位是大小寫敏感的。
標記位代表的對象類型:
Value Kind of Object to keep
----- ----------------------
P package/procere/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.
實驗環境 版本:11.2.0.1.0 dbms_shared_pool.purge 只能通過dba才能使用
oracle@rac1:rac1 /home/oracle>sqlplus yang/yang
SQL*Plus: Release 11.2.0.1.0 Proction on Fri Jul 8 15:32:43 2011
yang@rac1>create table yangtab (id int) ;
Table created.
yang@rac1>select * from yangtab;
no rows selected
yang@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangtab%';
ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736EFBB8 3337951036 1 1
yang@rac1>exec dbms_shared_pool.purge('00000001736EFBB8,3337951036','C');
BEGIN dbms_shared_pool.purge('00000001736EFBB8,3337951036','C'); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'DBMS_SHARED_POOL.PURGE' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
yang@rac1>conn /as sysdba
Connected.
sys@rac1>create table yangt (id int);
Table created.
sys@rac1>select * from yangt;
no rows selected
sys@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangt%';
ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736EFBB8 3337951036 1 1 -- 使用普通用戶時生成的。
0000000170D9BA50 2693392179 1 1
使用dbms_shared_pool.purge 刪除第一個sql的游標。
sys@rac1> exec dbms_shared_pool.purge('00000001736EFBB8,3337951036','C');
PL/SQL procere successfully completed.
sys@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangt%';
ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
0000000170D9BA50 2693392179 1 1
sys@rac1>exec dbms_shared_pool.purge('0000000170D9BA50,2693392179','C');
PL/SQL procere successfully completed.
sys@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangt%'
no rows selected
B. 如何正確刪除Oracle歸檔日誌
1,首先刪除歸檔日誌物理文件,歸檔日誌一般都是位於archive目錄下,AIX系統下文件格式為「1_17884_667758186.dbf」,建議操作前先對資料庫進行備份,刪除時至少保留最近幾天的日誌用於資料庫恢復。
2,把歸檔日誌的物理文件刪除後,我們就可以正常登入ORACLE了,但是還沒完全把歸檔日誌刪除干凈,ORACLE的controlfile中仍然記錄著這些archivelog的信息,在oracle的OEM管理器中有可視化的日誌展現出,當我們手工清除archive目錄下的文件後,這些記錄並沒有被我們從controlfile中清除掉,接下去我們要做的就是這個工作。
利用RMAN進行刪除操作,操作步驟如下:(window客戶端系統為例):
1.指定資料庫實例
C:/Documents
and
Settings/Administrator>SET
ORACLE_SID
=orcl
2.連接資料庫
C:/Documents
and
Settings/Administrator>RMAN
TARGET
SYS/sysadmin@orcl
3.查看歸檔日誌的狀態
RMAN>
list
archivelog
all;
4.手工刪除歸檔日誌文件
RMAN>
DELETE
ARCHIVELOG
ALL
COMPLETED
BEFORE
'SYSDATE-7';
5.退出rman.
C. oracle的緩存怎麼清除
altersystemflashbuffer_cache;
D. 怎麼清理oracle存儲過程中的緩存
ALTER SYSTEM FLUSH SHARED_POOL
這個語句清除SGA中的 shared pool,shared pool存儲下面的信息:
1、數據字典
2、Shared SQL & PL/SQL,存儲過程、函數、包以及觸發器
但是有一點要清楚的是假如這些對象正在使用時是無法清除的。
E. oracle清除表數據
刪除表t1中的全部數據,在命令行中輸入:
delete fron t1;
上述命令當數據量比較大的時候,執行速度慢,好處是管理員可以恢復刪除的數據。
truncate table t1;
上述命令執行速度塊,尤其是特別大的表(幾千萬行)也可以快速刪除所有數據,壞處是被刪除的數據非常難以恢復。類似刪除文件,而且清空了垃圾箱。