在做DDL操作的时候,我们可能会遇到被阻塞的情况,此时如果必须快速完成DDL操作,那么可以参考如下办法处理:
思路:检查阻止当前会话DDL变更系统进程号,杀之。
以重命名表为例:
窗口1:
SQL> show parameter ddl;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout integer 0
enable_ddl_logging boolean FALSE
SQL> alter table TEST rename to TEST_0712;--这个可以是其它DDL操作
alter table TEST rename to TEST_0712;
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
窗口1查看自身会话ID:
SQL> select distinct sid from v$mystat;
SID
----------
110
窗口2:
窗口2检查阻塞的会话:
SQL> select b.INST_ID,b.sid,b.paddr,b.sql_id,b.event,b.MACHINE,b.PROGRAM,'kill -9 '||c.spid from gv$session a,gv$session b ,gv$process c where a.sid=110 and a.FINAL_BLOCKING_INSTANCE=b.INST_ID and a.FINAL_BLOCKING_SESSION=b.sid and b.paddr=c.addr and b.inst_id=c.inst_id;
例如结果返回了kill -9 8888
窗口2根据输出的结果执行:
linux系统:
kill -9 8888
windows系统:
C:\Users\Administrator>orakill oradb 8888
回到窗口1执行
SQL> alter session set ddl_lock_timeout=300;
Session altered.
SQL>
SQL>
SQL> alter table TEST rename to TEST_0712;
Table altered.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




