【原創】ORA-00054問題的解決(plan_table在autotrace過程中會被鎖定)

木頭一個發表於2008-05-11

實驗環境:WinXP SP2

資料庫版本:10.2.0.1

今天在實驗過程中發現autotrace是會鎖定plan_table表的,具體實驗步驟如下:

sys@ TEST>set autotrace on trace explain

生成執行計劃

sys@TEST>select * from dual;

Execution Plan
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

在當前會話下刪除plan_table是沒有問題的

sys@TEST>drop table plan_table;

Table dropped.

但是這時候在其他會話刪除plan_table的話,就會報ORA-00054錯誤

sys@TEST>drop table plan_table;
drop table plan_table
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

通過查詢v$locked_object表可以看出,在autotrace生成執行計劃後會鎖定plan_table表

sys@TEST>col object_name for a20
sys@TEST>select object_name,oracle_username,session_id from v$locked_object l,dba_objects d where l.object_id=d.object_id;

OBJECT_NAME          ORACLE_USERNAME                SESSION_ID
-------------------- ------------------------------ ----------
PLAN_TABLE           SYS                                   130

這時候在第一個會話中關閉autotrace也不能解除鎖定

sys@TEST>set autotrace off

sys@TEST>select object_name,oracle_username,session_id from v$locked_object l,dba_objects d where l.object_id=d.object_id;

OBJECT_NAME          ORACLE_USERNAME                SESSION_ID
-------------------- ------------------------------ ----------
PLAN_TABLE           SYS                                   130

只有斷開會話後,對plan_table表的鎖定才可以解除

sys@TEST>conn / as sysdba
Connected.

sys@TEST>select object_name,oracle_username,session_id from v$locked_object l,dba_objects d where l.object_id=d.object_id;

no rows selected.

這時候就可以在第二個會話中刪除plan_table表了

sys@TEST>drop table plan_table;

Table dropped.

所有在drop過程中報ORA-00054錯誤的問題,都可以通過查詢v$locked_object看看那個會話鎖定了物件的方法來解決

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/498744/viewspace-264996/,如需轉載,請註明出處,否則將追究法律責任。

相關文章