扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
oracle死锁时杀进程的方法:
益阳网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉。但通常情况下,出现死锁时,想通过命令行或者通过oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除。
第二步:
1、select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死锁的对象,获取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根据上步获取到的sid查看其serial#号。
3、alter system kill session '29,57107'; --删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待一段时间看能否会自动消失,如长时间消失不掉,则需要做后续步骤。
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。
方法/步骤\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。
一、问题
使用system账号登录oracle,系统提示
如何解除Oracle wbr帐号锁定(the wbraccount wbris wbrlocked)
二、解决办法
1、使用oracle用户登录系统
2、执行如下步骤:
3、$ sqlplus /nolog
4、SQL connect /as sysdba
Connected.
5、SQL alter user system account unlock;User altered.
三、锁定账号方法
1、SQL alter user system account lock;
User altered.
四、修改帐号口令
1、SQL ALTER USER system IDENTIFIED BY sysPasswd;
D:\oracle\ora92\binsqlplus /nolog\x0d\x0a\x0d\x0aSQL*Plus: Release 9.2.0.1.0 - Production on 星期四 8月 16 11:32:22 2007\x0d\x0a\x0d\x0aCopyright (c) 1982, 2002, Oracle Corporation. All rights reserved.\x0d\x0a\x0d\x0aSQL conn /as sysdba\x0d\x0a已连接。\x0d\x0aSQL alter user system identified by password;\x0d\x0a\x0d\x0a用户已更改。\x0d\x0a\x0d\x0aSQL alter user sys identified by password;\x0d\x0a\x0d\x0a用户已更改。\x0d\x0a\x0d\x0aSQL alter user system identified by manger;\x0d\x0a\x0d\x0a用户已更改。\x0d\x0a\x0d\x0aSQL exit\x0d\x0a从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production\x0d\x0aWith the Partitioning, OLAP and Oracle Data Mining options\x0d\x0aJServer Release 9.2.0.1.0 - Production中断开\x0d\x0a\x0d\x0aD:\oracle\ora92\binsqlplus\x0d\x0a\x0d\x0aSQL*Plus: Release 9.2.0.1.0 - Production on 星期四 8月 16 11:40:37 2007\x0d\x0a\x0d\x0aCopyright (c) 1982, 2002, Oracle Corporation. All rights reserved.\x0d\x0a\x0d\x0a请输入用户名: system\x0d\x0a请输入口令:\x0d\x0a\x0d\x0a连接到:\x0d\x0aOracle9i Enterprise Edition Release 9.2.0.1.0 - Production\x0d\x0aWith the Partitioning, OLAP and Oracle Data Mining options\x0d\x0aJServer Release 9.2.0.1.0 - Production\x0d\x0a\x0d\x0aSQL select instance_name from v$instance;\x0d\x0a\x0d\x0aINSTANCE_NAME\x0d\x0a----------------
Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决:
第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除!
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as quik
SQL select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死锁的对象,获取其SESSION_ID
XIDUSN OBJECT_ID SESSION_ID LOCKED_MODE
---------- ---------- ---------- -----------
10 30724 29 3
10 30649 29 3
SQL select username,sid,serial# from v$session where sid=29; --根据上步获取到的sid查看其serial#号
USERNAME SID SERIAL#
------------------------------ ---------- ----------
QUIK 29 57107
SQL alter system kill session '29,57107'; --删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待一段时间看能否会自动消失,如长时间消失不掉,则需要做后续步骤
alter system kill session '29,57107'
ORA-00031: session marked for kill
SQL select pro.spid from v$session ses,v$process pro where ses.sid=29 and ses.paddr=pro.addr; --查看spid号,以便在操作系统中根据该进程号删除进程
SPID
------------
2273286
第二步:进入操作系统进行删除进程,本示例的操作系统是IBM aix。
login: root --录入用户名
root's Password: --录入密码
*******************************************************************************
* *
* *
* Welcome to AIX Version 5.3! *
* *
* *
* Please see the README file in /usr/lpp/bos for information pertinent to *
* this release of the AIX Operating System. *
* *
* *
*******************************************************************************
Last unsuccessful login: Fri Apr 23 14:42:57 BEIDT 2010 on /dev/pts/1 from 10.73
.52.254
Last login: Fri Apr 23 15:27:50 BEIDT 2010 on /dev/pts/2 from 10.73.52.254
# ps -ef|grep 2273286 --查看进程详情
root 2289864 2494636 0 17:07:15 pts/1 0:00 grep 2273286
oracle 2273286 1 0 14:38:24 - 0:21 oracleQUIK (LOCAL=NO)
# kill -9 2273286 --删除进程,小心操作,别写错进程号,如果oracle的关键进程被删,数据库会崩溃的!
# ps -ef|grep 2273286 --再次查看
root 2289864 2494636 0 17:07:15 pts/1 0:00 grep 2273286
For Windows, at the DOS Prompt: orakill sid spid
For UNIX at the command line kill –9 spid
1、生成Kill Session语句
select 'alter system kill session ''' || SID ||',' || SERIAL# || ''';' from
(
select distinct a.sid, a.Serial#, status, machine, LOCKWAIT, logon_time
from v$session a, v$locked_object b
where (a.status = 'ACTIVE' or a.status = 'INACTIVE')
and a.sid = b.session_id
and b.ORACLE_USERNAME='XYHISTEST'--加上用户名是避免把其他系统的会话也关闭,以免伤及无辜
)
2、批量执行第一步生成的语句
alter system kill session 'sid,serial#';
--alter system kill session '6976,33967';
3、查询oracle用户名,机器名,锁表对象
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
/*或者
select s.SID, s.OSUSER, p.spid as OSPID, s.MACHINE, s.TERMINAL, s.PROGRAM
from v$session s, v$process p
where s.sid = 6 --session_id
and s.paddr = p.addr;
*/
4、查询是执行何sql语句导致锁表的
select b.sql_text
from v$session a, v$sql b
where a.sid = 6 --session_id
and a.SQL_ADDRESS = b.ADDRESS(+);
/*--或者
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
FROM v$sqlarea a,v$session s, v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
*/
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流