ORACLE 存储过程解及表解锁和停止执行
2023-09-27 14:29:13 时间
查看进程:
select * from v$process
根据存储过程名称查找是否被锁:
select * FROM dba_ddl_locks where name =upper('sp_1');
select * FROM dba_ddl_locks where name like upper('%sp_1%');
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid;
select s.* from v$locked_object l, dba_objects o, v$session s, v$process p where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr AND object_name= upper(''表或存储过程名字');
查找SID:
select t.sid,t.serial# from v$session t
where t.sid=550;
杀session解锁:
alter system kill session '550,10047' immediate;
--sid,t.serial#
如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, osuser, s.program from v$session s,v$process p where
s.paddr=p.addr and s.sid=550
(550就是上面的sid)
单机: SELECT A.PID, B.SID, B.SERIAL#, C.SQL_TEXT,A.SPID FROM V$PROCESS A, V$SESSION B, V$SQLAREA C WHERE A.ADDR = B.PADDR AND B.SQL_ADDRESS = C.ADDRESS rac: SELECT A.PID, B.SID, B.SERIAL#, C.SQL_TEXT,A.SPID FROM GV$PROCESS A, GV$SESSION B, GV$SQLAREA C WHERE A.ADDR = B.PADDR AND B.SQL_ADDRESS = C.ADDRESS
再到linux下 kill -9 pid
杀会话
select a.USERNAME,a.MACHINE, sql_text,'alter system kill session '''||a.SID||','||a.SERIAL#||',@'||a.INST_ID||'''immediate;' ,status from gV$session a inner join GV$sql b on a.sql_id=b.sql_id
WHERE status = 'ACTIVE'
定时任务,杀掉特定服务器上执行超过一个小时的语句
create or replace procedure ks_kill_sp_timeout /****************************************************************** 存储过程名称: 存储过程内容:监控存储过程是否正常 作者姓名: 编写时间: 2017年4月17日 输入参数: 输出参数: *******************************************************************/ as v_sql varchar2(2000); v_count number; begin select count(distinct 'alter system kill session '''||a.SID||','||a.SERIAL#||',@'||a.INST_ID||''' immediate;') into v_count from gV$session a inner join GV$sql b on a.sql_id=b.sql_id WHERE a.status = 'ACTIVE' and a.MACHINE = 'db' and ceil( (sysdate - a.SQL_EXEC_START) * 24 * 60) >= 60 ; if v_count > 0 then select distinct 'alter system kill session '''||a.SID||','||a.SERIAL#||',@'||a.INST_ID||''' immediate;' into v_sql from gV$session a inner join GV$sql b on a.sql_id=b.sql_id WHERE a.status = 'ACTIVE' and a.MACHINE = 'db' and ceil( (sysdate - a.SQL_EXEC_START) * 24 * 60) >= 60 ; dbms_output.put_line(v_sql); execute immediate v_sql; else dbms_output.put_line(v_count); end if; end;
相关文章
- SQL与ORACLE中存储过程调用存储过程返回的结果集插入到临时表写法
- Oracle中时间字段如果是varchar2类型可以不经过任何转换直接进行between查询
- oracle存储过程报错> ORA-24344: success with compilation error的原因,execute immediate 执行动态SQL
- Oracle开发技能提升之层次查询全面解析
- 数据极端倾斜下,如何用Oracle DBMS_STATS正确补救?
- [转]oracle存储过程中update不成功的一个原因
- [转]oracle数据类型和对应的java类型
- Oracle 执行计划(Explain Plan) 说明
- 《Oracle性能优化与诊断案例精选》——2.1 人生若只如初见
- ORACLE存储过程实现等表WAIT_TABLE
- 转 ORACLE数据库它可以存储 中文 字节或字符
- 《Oracle高性能自动化运维》一一第3章 Oracle重做日志(Redo)
- Oracle初学者入门指南-什么是 Metalink 或 MOS ?
- [Oracle]OpenVMS 运行 Oracle 时的推荐值
- ORACLE小工具:存储过程清空所有表或使所有触发器失效
- 如何在Oracle中使用Java存储过程(详解)
- Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)
- Oracle:instantclien下载地址
- Oracle问题小记五:服务启动-索引-子查询-分页存储过程
- Mybatis之Oracle增删查改示例--转
- Oracle-触发器和程序包