先查看哪些表被锁住了
select b owner b object_name a session_id a locked_mode
from v$locked_object a dba_objects b
where b object_id = a object_id
OWNER OBJECT_NAME SESSION_ID LOCKED_MODE
WSSB SBDA_PSHPFTDT
WSSB_RTREPOS WB_RT_SERVICE_QUEUE_TAB
WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB
WSSB_RTREPOS 滑铅 WB_RT_NOTIFY_QUEUE_TAB
WSSB 改喊 SBDA_PSDBDT 核让野
WSSB_RTREPOS WB_RT_AUDIT_DETAIL
select b username b sid b serial# logon_time
from v$locked_object a v$session b
where a session_id = b sid order by b logon_time
USERNAME SID SERIAL# LOGON_TIME
WSSB_RTACCESS
WSSB_RTACCESS
杀会话
alter system kill session sid serial#
e g
alter system kill session
如果有ora 错误 则在后面加immediate
alter system kill session immediate
1 查哪个过程被锁
查V$DB_OBJECT_CACHE视图:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER= 过程的所属用户 AND CLOCKS!=
查是哪一个SID 通过SID可知道是哪个SESSION
查V$ACCESS视图:
SELECT * FROM V$ACCESS WHERE OWNER= 过程的所属用户 AND NAME= 刚才查到的过程名
查出SID和SERIAL#
查V$SESSION视图:
SELECT SID SERIAL# PADDR FROM V$SESSION WHERE SID= 刚才查到的SID
查V$PROCESS视图:
SELECT SPID FROM V$PROCESS WHERE ADDR= 刚才查到的PADDR
杀进程
( ) 先杀ORACLE进程:
ALTER SYSTEM KILL SESSION 查出的SID 查出的SERIAL#
( ) 再杀 *** 作系统进程:
KILL 刚才查出的SPID
或
ORAKILL 刚才查出的SID 刚才查出的SPID
oracle的死锁
查询数据库死锁
select t username|| ||t sid|| ||t serial#|| ||t logon_time|| ||t sql_text
from v$locked_object t v$session t v$sqltext t
where t session_id=t sid
and t sql_address=t address
order by t logon_time
查询出来的结果就是有死锁的session了
下面就是杀掉
拿到上面查询出来的SID和SERIAL# 填入到下面的语句中
alter system kill session sid serial#
一般情况可以解决数据库存在的死锁了
或通过session id 查到对应的 *** 作系统进程 在unix中杀掉 *** 作系统的进程
SELECT a username c spid AS os_process_id c pid AS oracle_process_id FROM v$session a v$process c
WHERE c addr=a paddr and a sid= and a serial#=
然后采用kill (unix) 或 orakill(windows )
在unix中
ps ef|grep os_process_id
kill os_process_id
ps ef|grep os_process_id
经常在oracle的使用过程中碰到这个问题 所以也总结了一点解决方法 )
)查找死锁的进程
sqlplus /as sysdba (sys/change_on_install)
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
)kill掉这个死锁的进程
alter system kill session sid serial# (其中sid=l session_id)
)如果还不能解决
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
lishixinzhi/Article/program/Oracle/201311/17405方法/步骤\x0d\x0a1.查询哪些对象被锁:\x0d\x0aselect object_name,machine,s.sid,s.serial# \x0d\x0afrom v$locked_object l,dba_objects o ,v$session s\x0d\x0awhere l.object_id = o.object_id and l.session_id=s.sid\x0d\x0a\x0d\x0a2.杀死进程:\x0d\x0aalter system kill session '137,233'(其中137,223分别是上面查询出的sid,serial#)\x0d\x0a\x0d\x0aPS.以上两步,可通过Oracle的管理控制台来执行。\x0d\x0a\x0d\x0a如果利用上面的方法杀死进程后穗陪,进程状态虽被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在OS一级再杀死相应的进程(线程)\x0d\x0a\x0d\x0a1.首先获得进程(线程)号:\x0d\x0aselect spid, osuser, s.program \x0d\x0afrom v$session s,v$process p\x0d\x0awhere s.paddr=p.addr and s.sid=137 (137是上面的sid)孝培\x0d\x0a\x0d\x0a2.在OS上杀死这个进程(线程):\x0d\x0a\x0d\x0a1)在unix上,用root身份执行命令: \x0d\x0a#kill -9 12345(猜慎蠢即上面查询出的spid)\x0d\x0a\x0d\x0a2)在windows(unix也适用)用orakill杀死线程,例:c:>orakill orcl 12345\x0d\x0aorakill是oracle提供的一个可执行命令,语法为:orakill sid thread\x0d\x0a其中:\x0d\x0asid:表示要杀死的进程属于的实例名\x0d\x0athread:是要杀掉的线程号,即上面查询出的spid。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)