一次开发人员直接在数据库服务器上做delete table操作系统,由时在上班高峰运行,造成长时间执行无反应,进而把sqlplus客户端关闭
一次开发人员直接在数据库服务器上做delete table操作系统,由时在上班高峰运行,造成长时间执行无反应,进而把sqlplus客户端关闭掉,再次运行删除语句,造成数据库运行缓慢。
询问操作过程知道了是由锁表造成,最终处理;本文只是模拟锁表处理过程,下次遇到相同问题可以快速处理。
oracle学习笔记:sqlplus用户登录
sqlplus登录oracle时ora-01017: invalid username/password; logon denied的错误
sqlplus中的feedback设置
1. 查看数据库的等待事件
如果不清楚原因,可以通过先通过等待事件进行分析。
sql> select sid,event from v$session_wait where wait_class'idle';
sid event
---------- ----------------------------------------------------------------
158 sql*net message to client
159 enq: tx - row lock contention
sql>
2. 查看数据库是否有锁
sql> select * from v$lock where block=1;
3. 查询lock锁, 看谁锁谁
说明:block为1的行,,表示资源由它锁定。request表示需要这个锁。
sql> select sid, id1, id2, lmode, block,request, type
from v$lock
where id1 in (select id1 from v$lock where lmode = 0)
order by id1, request;
sid id1 id2 lmode block request ty
---------- ---------- ---------- ---------- ---------- ---------- --
153 655397 308 6 1 0 tx
157 655397 308 0 0 6 tx
4. 查询锁表的sid,serial#,用户、开始时间,然后就可以杀掉该进程了。
sql> select t1.sid,t1.serial#,t1.username,t1.logon_time from v$session t1,v$locked_object t2 where t1.sid = t2.session_id order by t1.logon_time ;
sid serial# username logon_time
---------- ---------- ------------------------------ -------------------
153 12 abc 2014-11-17 09:19:33
157 106 abc 2014-11-17 09:54:24
5. 可以进一步查询出sid,spid等信息
sql> select s.username, s.osuser, s.sid, s.serial#, p.spid, s.program,s.status
from v$session s,v$process p
where s.paddr = p.addr and s.username is not null;
username osuser sid serial# spid program status
------------------------------ ------------------------------ ---------- ---------- ------------ ------------------------------------------------ --------
abc oracle 153 12 4290 sqlplus@oradb (tns v1-v3) inactive
sys oracle 150 12 4417 sqlplus@oradb (tns v1-v3) active
abc oracle 157 119 4830 sqlplus@oradb (tns v1-v3) active
要么在oracle进行杀掉,以及在操作系统下杀掉,对于status为killed的语句,应用通过操作系统kill命令才能最终最快杀掉。
alter system kill session '153,12';
alter system kill session '157,119';
或操作系统中
kill -9 4290
kill -9 4830
6. 查询被锁的表的sid及相关资源
说明:出被锁的表及sql,还是要结合上面的查询进行手工处理, 也可以通过sid找到sql语句。
set pagesize 999;
set linesize 200;
col program for a25;
col terminal for a10;
sql> select s.status,s.sid,s.serial#,p.spid,
s.last_call_et as exec_seconds,t.sql_text as curr_sql
from gv$session s,v$process p,v$instance i,v$lock k, v$sqltext t
where s.paddr = p.addr
and s.type != 'background'
and s.lockwait = k.kaddr
and s.sql_hash_value = t.hash_value
and s.username is not null;
status sid serial# spid exec_seconds curr_sql
-------- ---------- ---------- ------------ ------------ ----------------------------------------------------------------
active 159 28 4072 1285 update test_lock set where id = 1
sql>
本文永久更新链接地址: