在Oracle的存储过程中如何执行杀掉某进程的命令??

skyrocket 2009-05-06 09:59:18
在Oracle的存储过程中如何执行杀掉某进程的命令(orakill oracle_sid 1234)??

我想写一个存储过程,定期杀掉另外一个存储过程被死锁的进程。代码如下:

CREATE OR REPLACE PROCEDURE P_Test as
myRecnum number(10);
mySID number(10);
mySpid number(10);
cursor c_test is SELECT SID FROM V$ACCESS WHERE OWNER='AAA' AND object = 'PROC1' and type = 'PROCEDURE';
begin
myRecnum:=0;
SELECT count(*) into myRecnum FROM V$DB_OBJECT_CACHE WHERE OWNER='AAA' AND name = 'PROC1' and LOCKS <> '0';
if myRecnum > 0 then
open c_test;
fetch c_test into mySID;
while c_test%FOUND LOOP
select spid into mySpid from v$session s,v$process p where s.paddr=p.addr and s.sid = mySID;
--杀掉进程
orakill Oracle_SID mySpid;
fetch c_test into mySID;
end LOOP;
close c_test;
end if;
end;
...全文
816 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
superhsj 2009-05-07
  • 打赏
  • 举报
回复
lz可以尝试写一个杀进程的应用程序,然后用存储过程去调用
skyrocket 2009-05-06
  • 打赏
  • 举报
回复
好像通过ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';杀掉后,进程还是很长时间锁定系统资源,不释放。所以想在操作系统级强行杀掉。
superhsj 2009-05-06
  • 打赏
  • 举报
回复
不一定非要用orakill啊,用ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';不行吗?
[Quote=引用 3 楼 skyrocket 的回复:]
orakill不是SQL命令,execute immediate 'orakill oce 4052'; 试过了,不行啊!
[/Quote]
Richard345265669 2009-05-06
  • 打赏
  • 举报
回复
动态sql
Excute immediate‘语句’
skyrocket 2009-05-06
  • 打赏
  • 举报
回复
orakill不是SQL命令,execute immediate 'orakill oce 4052'; 试过了,不行啊!
ldw2545398 2009-05-06
  • 打赏
  • 举报
回复
动态sql
Excute immediate‘语句’
superhsj 2009-05-06
  • 打赏
  • 举报
回复
转载
1.查哪个过程被锁
查V$DB_OBJECT_CACHE视图:

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';

2. 查是哪一个SID,通过SID可知道是哪个SESSION.
查V$ACCESS视图:

SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';

3. 查出SID和SERIAL#
查V$SESSION视图:

SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'

查V$PROCESS视图:

SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';

4. 杀进程
(1).先杀ORACLE进程:

ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';

(2).再杀操作系统进程:

KILL -9 刚才查出的SPID

ORAKILL 刚才查出的SID 刚才查出的SPID
方法二:


经常在oracle的使用过程中碰到这个问题,所以也总结了一点解决方法:)
1)查找死锁的进程:
sqlplus "/as sysdba"
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉这个死锁的进程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
3)如果还不能解决,
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其中sid用死锁的sid替换。
exit
ps -ef|grep spid
其中spid是这个进程的进程号,kill掉这个Oracle进程。
oracle基础教程 课程说明 1 课程介绍 1 课程目标 1 相关资料 1 第1章 ORACLE数据库概述 2 1.1 产品概述 2 1.1.1 产品简介 2 1.1.2 基本概念 3 1.2 ORACLE系统结构 4 1.2.2 ORACLE物理结构 4 1.2.3 系统全局区 6 1.2.4 进程 8 1.3 存储管理 9 1.3.2 逻辑结构 10 1.3.3 表(Table) 14 1.3.4 视图(View) 18 1.3.5 索引(Index) 18 1.3.6 同义词(Synonym) 19 1.3.7 序列(Sequence) 19 1.3.8 数据库链(Database Link) 20 第2章 管理ORACLE数据库 21 2.1 基本概念 21 2.1.1 数据字典 21 2.1.2 事务管理 23 2.1.3 数据库管理员(DBA) 24 2.1.4 ORACLE的四种状态 25 2.2 SQL*Plus方式的ORACLE数据库启动和关闭 26 2.2.1 启动数据库 26 2.2.2 关闭数据库 26 2.3 svrmgrl方式的ORACLE数据库启动和关闭 28 2.3.1 启动数据库 28 2.3.2 关闭数据库 30 2.4 应用开发工具(SQL * Plus) 31 2.4.1 SQL 32 2.4.2 PL/SQL 33 2.4.3 数据库管理工具 36 2.5 ORACLE用户及权限管理 36 2.5.1 ORACLE的用户管理 37 2.5.2 ORACLE的权限管理 38 2.6 ORACLE数据库的备份与恢复 39 2.6.1 Export 转入程序 40 2.6.2 Import 转入程序 42 2.6.3 增量卸出/装入 44 第3章 ORACLE数据库的网络应用 46 3.1 SQL*Net产品介绍 46 3.2 配置客户机/服务器结构 47 3.2.1 配置listener.ora 47 3.2.2 配置tnsnames.ora文件 48 第4章 常用任务示例 51 4.1 如何恢复被误删的数据文件 51 4.2 如何杀掉吊死session 51 4.3 如何修改字符集 51 4.4 如何追加表空间 51 4.5 如何加大表的maxextents值 52 4.6 如何查询无效对象 52 4.7 怎样分析SQL语句是否用到索引 52 4.8 怎样判断是否存在回滚段竞争 53 4.9 怎样手工跟踪函数/存储过程执行情况 54 4.10 多种业务使用同一数据库如何分配回滚段 54 4.11 怎样倒出、倒入文本数据 54 4.11.1 倒出 54 4.11.2 倒入 55 4.12 如何更新当前数据库日志备份方式为archive 56 4.13 Unix环境下如何实现自动备份 56 4.13.1 设置运行环境 56 4.13.2 倒出数据 56 4.13.3 异地备份 57 4.13.4 启动备份进程 58 4.14 怎样分析ORACLE故障 59 小结 61 附录A ORACLE数据字典与视图 62 附录B 动态性能表 68 附录C SQL语言运算符与函数 70
目录 课程说明 1 课程介绍 1 课程目标 1 相关资料 1 第1章 ORACLE数据库概述 2 1.1 产品概述 2 1.1.1 产品简介 2 1.1.2 基本概念 3 1.2 ORACLE系统结构 4 1.2.2 ORACLE物理结构 4 1.2.3 系统全局区 6 1.2.4 进程 8 1.3 存储管理 9 1.3.2 逻辑结构 10 1.3.3 表(Table) 14 1.3.4 视图(View) 18 1.3.5 索引(Index) 18 1.3.6 同义词(Synonym) 19 1.3.7 序列(Sequence) 19 1.3.8 数据库链(Database Link) 20 第2章 管理ORACLE数据库 21 2.1 基本概念 21 2.1.1 数据字典 21 2.1.2 事务管理 23 2.1.3 数据库管理员(DBA) 24 2.1.4 ORACLE的四种状态 25 2.2 SQL*Plus方式的ORACLE数据库启动和关闭 26 2.2.1 启动数据库 26 2.2.2 关闭数据库 26 2.3 svrmgrl方式的ORACLE数据库启动和关闭 28 2.3.1 启动数据库 28 2.3.2 关闭数据库 30 2.4 应用开发工具(SQL * Plus) 31 2.4.1 SQL 32 2.4.2 PL/SQL 33 2.4.3 数据库管理工具 36 2.5 ORACLE用户及权限管理 36 2.5.1 ORACLE的用户管理 37 2.5.2 ORACLE的权限管理 38 2.6 ORACLE数据库的备份与恢复 39 2.6.1 Export 转入程序 40 2.6.2 Import 转入程序 42 2.6.3 增量卸出/装入 44 第3章 ORACLE数据库的网络应用 46 3.1 SQL*Net产品介绍 46 3.2 配置客户机/服务器结构 47 3.2.1 配置listener.ora 47 3.2.2 配置tnsnames.ora文件 48 第4章 常用任务示例 51 4.1 如何恢复被误删的数据文件 51 4.2 如何杀掉吊死session 51 4.3 如何修改字符集 51 4.4 如何追加表空间 51 4.5 如何加大表的maxextents值 52 4.6 如何查询无效对象 52 4.7 怎样分析SQL语句是否用到索引 52 4.8 怎样判断是否存在回滚段竞争 53 4.9 怎样手工跟踪函数/存储过程执行情况 54 4.10 多种业务使用同一数据库如何分配回滚段 54 4.11 怎样倒出、倒入文本数据 54 4.11.1 倒出 54 4.11.2 倒入 55 4.12 如何更新当前数据库日志备份方式为archive 56 4.13 Unix环境下如何实现自动备份 56 4.13.1 设置运行环境 56 4.13.2 倒出数据 56 4.13.3 异地备份 57 4.13.4 启动备份进程 58 4.14 怎样分析ORACLE故障 59 小结 61 附录A ORACLE数据字典与视图 62 附录B 动态性能表 68 附录C SQL语言运算符与函数 70

17,075

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧