您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > 数据库技术 > Oracle

笔记:删除Oracle死锁进程及批量清除表数据

作者:UncleToo  来源:原创  日期:2014-12-26 19:10:17
收藏  评论:( 0 )  阅读:444

1、删除正在运行的进程

如何删除Oracle数据库中正在执行的进程?如何删除Oracle数据库中死锁进程?特别是存储过程,一旦出现死锁,就无法再编译了,下面是删除Oracle死锁进程的方法

首先查询死锁进程

select * from v$access o where o.OBJECT like '%uncletoo_proc_demo%';

select * from v$session a Where A.SID=sid;

通过上面两条语句可以查询到进程的 sid 和 serial#,然后使用下面语句删除:

alter system kill session 'sid,serial#';

正常情况下最后一步执行后,进程即被删除,但是有些进程却无法删除,网上也有很多方法来解决,比如直接进入操作系统层面删除,但是这样操作太繁琐,而且如果是Linux,操作起来更麻烦,这里UncleToo给大家介绍一个简单有效的办法,即在上面 alter 语句最后加上 immediate 关键字,如:

alter system kill session 'sid,serial#' immediate;

PS:immediate 本来用于 execute 语句,立即、直接的意思,用在这里是不是非常合适呢 ^_^

再分享一个小技巧:在查询 v$access 时速度会很慢,在 select 后加上 /*+ rule*/ 会让你的查询速度更快,试试吧。


总结

上面啰嗦了一大堆废话,其实要删除Oracle进程只需要以下三句命令即可:

select /*+ rule*/ * from v$access o where o.OBJECT like '%uncletoo_proc_demo%';

select * from v$session a Where A.SID=sid;

alter system kill session 'sid,serial#' immediate;


2、批量清除表数据

declare v_new_tab_name varchar2(35);

begin

for c1 in (select table_name from user_tables where table_name like'BP%') loop

  begin

      execute immediate ( 'truncate table '||C1.Table_Name );

  exception

     when others then

         v_new_tab_name := '"' || C1.Table_Name|| '"' ;

         execute immediate (' truncate table '||v_new_tab_name) ;

  end ;

end loop;

end;

这就不多说了,利用游标循环删除符合条件的表的数据。拷贝脚本,换上你的查询条件,执行即可。




除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/oracle/1078.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论