http://liwenshui322.iteye.com/blog/1166934
DDL鎖有三種:
1.排他DDL鎖(Exclusive DDL lock):這會防止其他會話得到它們自己的DDL鎖或TM(DML)鎖。這說明,在DDL操作期間你可以查詢一個表,但是無法以任何方式修改這個表。
2.共享DDL鎖(Share DDL lock):這些鎖會保護所引用對象的結構,使之不會被其他會話修改,但是允許修改數據。
3.可中斷解析鎖(Breakable parse locks):這些鎖允許一個對象(如共享池中緩存的一個查詢計划)向另外某個對象注冊其依賴性。如果在被依賴的對象上執行DDL,Oracle會查看已經對該對象注冊了依賴性的對象列表,並使這些對象無效。因此,這些鎖是“可中斷的”,它們不能防止DDL出現。
排他DDL鎖:如:Alter table t add new_column date
共享DDL鎖:在創建存儲的編譯對象(如過程和視圖)時,會對依賴的對象加這種共享DDL鎖。例如,如果執行以下語句:
Create view MyView
as
select *
from emp, dept
where emp.deptno = dept.deptno;
案例:刪除一張表,無響應
SQL> select count(*) from T_LOG;
COUNT(*)
----------
9097
SQL> truncate TABLE "ELON"."T_LOG";
SQL> drop table "ELON"."T_LOG";
SQL> select owner,table_name,status from dba_tables where table_name='T_LOG';
OWNER TABLE_NAME STATUS
------------------------------ ------------------------------ --------
ELON T_LOG VALID
SQL> conn ELON/ELON
SQL> select sid,serial#,paddr,username,osuser,machine,program from v$session where sid in( select SESSION_ID from dba_ddl_locks where name='T_LOG');
SID SERIAL# PADDR USERNAME OSUSER MACHINE PROGRAM
---------- ---------- ---------------- ------------------------------ ------------------------------ --------------- -------------------------
58 61519 C000000CEB26D418 SYS oracle app01 sqlplus@app01 (TNS V1-
V3)
2808 16967 C000000CEB31B6E8 JDSS Administrator WIN-LLI9R4268RH JDBC Thin Client
5121 4795 C000000CEAF1F888 SYS oracle app01 oracle@app01 (J013)
查詢持有DDL排它鎖的會話
SQL>select sid,serial#,s.sql_id,sql_text,program from v$session s,v$sql l where sid in(58,2808,5121) and s.sql_id=l.sql_id
SID SERIAL# SQL_ID SQL_TEXT PROGRAM
---------- ---------- ------------- -------------------------------------------------- -------------------------
2808 16967 fgzbtnugq630d update T_LOG a set (a.STATUS,a.ZGSTATUS)=( JDBC Thin Client
select STATUS,ZGSTATUS from T_LOG@ELON_XHDoT_WH b where b.txid=a.txid) where a.STATUS<>'1' and a.STATUS<>'2' and a.modify_time>sysdate-5 and ts='GCN'
5121 4795 1cv2jg0a6m0k8 begin DBMS_STATS.CLEANUP_STATS_JOB_PROC(:1,:2,:3,: oracle@app01 (J013)
4,:5); end;
SQL> alter system kill session '2808,16967';
alter system kill session '2808,16967'
*
ERROR at line 1:
ORA-00031: session marked for kill
SQL> select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=2808;
SPID OSUSER PROGRAM
------------------------ ------------------------------ -------------------------
23928 Administrator JDBC Thin Client
app01@/data/diag/rdbms/prod/prod/trace$ps -ef | grep 23928
oracle 21349 19923 0 17:28:48 pts/0 0:00 grep 23928
oracle 23928 1 0 4? 10 ? 1:22 oraclecddb (LOCAL=NO)
app01@/data/diag/rdbms/prod/prod/trace$kill -9 23928
app01@/data/diag/rdbms/prod/prod/trace$ps -ef | grep 23928
oracle 21680 19923 0 17:31:45 pts/0 0:00 grep 23928