oracle过程被锁如何解决?急死人了数据库又不能随便的重启,就不知道怎么办了?

时间:2022-05-05 22:30:36
调试Oracle存储过程时发现刚才存储过程被锁了,只要一编译该存储过程或者修改过程都会出现停止响应,用以下的方法还是不得。

1:找过程到相关存储过程的sid

select sid from v$access where object = '存储过程名'

2.根据sid找到serial#

select SERIAL# from V$session where sid=70 

---70是第一个SQL语句查出来的SID

根据sid和serial#杀掉存储过程的锁

alter system kill session '70,1'; 

出现 :“标志会话结束命令” 这种方法也是无法杀掉存储过程的锁,请问还有别的比较好的方法解决过程被锁的吗???先谢谢了!

11 个解决方案

#1


新手,看看。。。

#2


查询一下是否有DDL锁,你那个查询的是DML锁

select * from DBA_DDL_LOCKS --------这个是查询DDL锁,看看存储过程是否被锁住了。

#3


加上 immediate呢?

#4


2.根据sid找到serial#

select SERIAL# from V$session where sid=70  

---70是第一个SQL语句查出来的SID

根据sid和serial#杀掉存储过程的锁

alter system kill session '70,1';  

--杀掉所有的SID看看。。。

#5


引用楼主 dreaminglove 的回复:
调试Oracle存储过程时发现刚才存储过程被锁了,只要一编译该存储过程或者修改过程都会出现停止响应,用以下的方法还是不得。

1:找过程到相关存储过程的sid

select sid from v$access where object = '存储过程名'

2.根据sid找到serial#

select SERIAL# from V$session where sid=70 
……

这个是数据库级别的
还有一个就是操作系统级别的杀死进程
根据SID 找出SPID,在服务器中进行KILL,
或者就是由于我说的DDL锁造成的。

#6


1、如果使用alter system kill session无法杀掉的进程。
可以在操作系统级强行杀掉进程或线程。

2、使用如下语句取得spid即为进程(unix,linux)或线程(windows)ID。
SELECT p.SPID, s.OSUSER, p.PROGRAM
  FROM v$session s, v$process p
 WHERE s.PADDR = p.ADDR
   AND s.SID =
       (SELECT t.SID FROM v$access t WHERE t.OBJECT = upper('对象名'));

3、强终杀掉线程或进程
UNIX、LINUX下使用(如:SPID为6666)
$ kill -9 6666

WINDOWS下使用(如:SPID为6666,实例名<ORACLE_SID>为ORCL),则
C:\>orakill ORCL 6666

#7


引用 6 楼 tangren 的回复:
1、如果使用alter system kill session无法杀掉的进程。
可以在操作系统级强行杀掉进程或线程。

2、使用如下语句取得spid即为进程(unix,linux)或线程(windows)ID。
SELECT p.SPID, s.OSUSER, p.PROGRAM
  FROM v$session s, v$process p
 WHERE s.PADDR = p.A……

+1

#8


3、强终杀掉线程或进程
UNIX、LINUX下使用(如:SPID为6666)
$ kill -9 6666
这个很强大的

#9


学习。。。

#10


学习了~~~
引用 6 楼 tangren 的回复:
1、如果使用alter system kill session无法杀掉的进程。
可以在操作系统级强行杀掉进程或线程。

2、使用如下语句取得spid即为进程(unix,linux)或线程(windows)ID。
SELECT p.SPID, s.OSUSER, p.PROGRAM
  FROM v$session s, v$process p
 WHERE s.PADDR = p.AD……

#11


不懂啊

#1


新手,看看。。。

#2


查询一下是否有DDL锁,你那个查询的是DML锁

select * from DBA_DDL_LOCKS --------这个是查询DDL锁,看看存储过程是否被锁住了。

#3


加上 immediate呢?

#4


2.根据sid找到serial#

select SERIAL# from V$session where sid=70  

---70是第一个SQL语句查出来的SID

根据sid和serial#杀掉存储过程的锁

alter system kill session '70,1';  

--杀掉所有的SID看看。。。

#5


引用楼主 dreaminglove 的回复:
调试Oracle存储过程时发现刚才存储过程被锁了,只要一编译该存储过程或者修改过程都会出现停止响应,用以下的方法还是不得。

1:找过程到相关存储过程的sid

select sid from v$access where object = '存储过程名'

2.根据sid找到serial#

select SERIAL# from V$session where sid=70 
……

这个是数据库级别的
还有一个就是操作系统级别的杀死进程
根据SID 找出SPID,在服务器中进行KILL,
或者就是由于我说的DDL锁造成的。

#6


1、如果使用alter system kill session无法杀掉的进程。
可以在操作系统级强行杀掉进程或线程。

2、使用如下语句取得spid即为进程(unix,linux)或线程(windows)ID。
SELECT p.SPID, s.OSUSER, p.PROGRAM
  FROM v$session s, v$process p
 WHERE s.PADDR = p.ADDR
   AND s.SID =
       (SELECT t.SID FROM v$access t WHERE t.OBJECT = upper('对象名'));

3、强终杀掉线程或进程
UNIX、LINUX下使用(如:SPID为6666)
$ kill -9 6666

WINDOWS下使用(如:SPID为6666,实例名<ORACLE_SID>为ORCL),则
C:\>orakill ORCL 6666

#7


引用 6 楼 tangren 的回复:
1、如果使用alter system kill session无法杀掉的进程。
可以在操作系统级强行杀掉进程或线程。

2、使用如下语句取得spid即为进程(unix,linux)或线程(windows)ID。
SELECT p.SPID, s.OSUSER, p.PROGRAM
  FROM v$session s, v$process p
 WHERE s.PADDR = p.A……

+1

#8


3、强终杀掉线程或进程
UNIX、LINUX下使用(如:SPID为6666)
$ kill -9 6666
这个很强大的

#9


学习。。。

#10


学习了~~~
引用 6 楼 tangren 的回复:
1、如果使用alter system kill session无法杀掉的进程。
可以在操作系统级强行杀掉进程或线程。

2、使用如下语句取得spid即为进程(unix,linux)或线程(windows)ID。
SELECT p.SPID, s.OSUSER, p.PROGRAM
  FROM v$session s, v$process p
 WHERE s.PADDR = p.AD……

#11


不懂啊