当前位置:首页 » 编程语言 » oraclekillsql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oraclekillsql

发布时间: 2022-07-19 00:41:50

㈠ 如何查看oracle服务器上正在执行的sql语句

首先,你要以dba身份登陆数据库。 第二,为某个用户开启sql跟踪。那个用户就是你要跟踪的、正在执行sql语句的那个用户。命令如下: execute dbms_system.set_sql_trace_in_session(sid,serial#,true) 其中参数的意义是,sid-会话id,serial#-序列号,这两个参数可以从v$session中得到。 第三,上面的命令执行成功之后数据库就自动对该用户所发出的所有sql语句进行跟踪,并把结果写在用户跟踪文件里。用户跟踪文件存放在数据库服务器上,路径请参考init.ora文件中的ump参数值。文件名为ora_sid_xxxx.trc(for unix)或者oraxxxxx.trc(for NT),其中xxxx文件系统进程编号,这个编号可以从v$process和v$session两个表通过关联的方式查询得到。

㈡ 请教oracle kill session spid 后不释放锁的问题

今天在做统计数据,整了一个特复杂的SQL,通过PL/SQL来执行,状态栏下显示执行完成,以及执行时间,可是弹出一个错误提示框,说执行错误,窗口上的“执行”按钮不可用,点“中断”也不起作用。
把该SQL拷贝到一新的窗口再次执行,依然提示成功的提示成功,报错的窗口照样弹出,提示错误,晕死。
这时,我得确定,这两次SQL,是不是还在数据库里面执行。
select * from v$session se, v$sqlarea sq
where suser = 'test'
and se.sql_id = sq.sql_id
发现那两条SQL确实还在运行,采用 kill session 来终止SQL的执行。
SQL> alter system kill session '3961,26056';
System altered
SQL> alter system kill session '4923,8094';
System altered
SQL>
再次执行以上语句查看session,发现session的status居然是killed,session还存在。原来 kill session 并没有真正释放资源,还需要在OS里kill进程来达到资源的真正释放。
kill session 虽然没释放资源,但还是把v$session里面的PADDR这个字段变成一样的了。由于PADDR字段已经改变,我们无法通过v$session和v$process关联来获得spid(v$session的paddr和v$process的addr字段进行关联)。
只能采用以下方式:
select addr, pid, spid
FROM v$process p
where addr in (select p.addr
from v$process p
where pid <> 1
minus
select s.paddr from v$session s)

最后在unix环境用kill -9 spid杀掉进程,在windows环境用orakill sid spid杀掉进程。

这是再执行如下语句:
select *
from v$session se, v$sqlarea sq
where suser = 'test'
and se.sql_id = sq.sql_id
发现 killed 的记录已经没有了。

㈢ 查看Oracle中是否有锁表的sql

oracle的锁是个庞大的体系,种类很多,建议你专门搜寻资料学习一下。
从你的问题提问来看,你应该是问事务锁,也就是常见的TX锁,即dml操作带来的锁表。
----------------------------------------------------------------------------------------------------------

你可以用如下语句看到表上锁等待情况:(集群或单实例环境通用)
SELECT DECODE(request,0,'Holder: ','Waiter: ')||inst_id , sid ,
id1, id2, lmode, request, type,CTIME
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
ORDER BY id1, request;

然后根据查出的sid,寻找sql语句:
select s.USERNAME,s.SID||','||s.SERIAL#,'kill -9 '||p.SPID,s.STATUS,s.SQL_ID,s.STATE,s.EVENT,s.WAIT_CLASS,s.PROGRAM,s.MACHINE,s.SECONDS_IN_WAIT,s.LAST_CALL_ET,sq.SQL_TEXT ,sq.SQL_FULLTEXT,s.USERNAME from v$session s,v$sqlarea sq ,v$process p
where s.PADDR = p.ADDR and s.SQL_ID = sq.SQL_ID(+)
and s.SID = 355 ;
------------------------------------------------------------------------------------
上面查找锁的sql语句,需要你学习下锁的级别,类型等知识。

㈣ oracle数据库死锁怎么解决

Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决:

第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除!

.2.0.1.0
Connectedasquik
SQL>selectxisn,object_id,session_id,locked_modefromv$locked_object;--查死锁的对象,获取其SESSION_ID
XIDUSNOBJECT_IDSESSION_IDLOCKED_MODE
-----------------------------------------
1030724293
1030649293
SQL>selectusername,sid,serial#fromv$sessionwheresid=29;--根据上步获取到的sid查看其serial#号
USERNAMESIDSERIAL#
--------------------------------------------------
QUIK2957107
SQL>altersystemkillsession'29,57107';--删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待一段时间看能否会自动消失,如长时间消失不掉,则需要做后续步骤
altersystemkillsession'29,57107'
ORA-00031:sessionmarkedforkill
SQL>selectpro.spidfromv$sessionses,v$processprowhereses.sid=29andses.paddr=pro.addr;--查看spid号,以便在操作系统中根据该进程号删除进程
SPID
------------
2273286

第二步:进入操作系统进行删除进程,本示例的操作系统是IBM aix。

login:root--录入用户名
root'sPassword:--录入密码
*******************************************************************************
**
**
*WelcometoAIXVersion5.3!*
**
**
*PleaseseetheREADMEfilein/usr/lpp/bosforinformationpertinentto*
*.*
**
**
*******************************************************************************
Lastunsuccessfullogin:FriApr2314:42:57BEIDT2010on/dev/pts/1from10.73
.52.254
Lastlogin:FriApr2315:27:50BEIDT2010on/dev/pts/2from10.73.52.254
#ps-ef|grep2273286--查看进程详情
root22898642494636017:07:15pts/10:00grep2273286
oracle22732861014:38:24-0:21oracleQUIK(LOCAL=NO)
#kill-92273286--删除进程,小心操作,别写错进程号,如果oracle的关键进程被删,数据库会崩溃的!
#ps-ef|grep2273286--再次查看
root22898642494636017:07:15pts/10:00grep2273286
ForWindows,attheDOSPrompt:orakillsidspid
ForUNIXatthecommandline>kill–9spid

㈤ 如何杀掉Oracle中的会话

有时,Oracle中造成一些表被死锁或者会话异常退出,如执行了更新记录操作后,既没有commit也没有rollback,网络就断开了,也会造表或记录被锁住,待到超时后才会被解开,那样都会造成应用操作被阻塞。

可以以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象,然后杀除指定的会话。

用下面的语句查询被锁的对象,可以带上更多约束条件,如schemaname等更精确的匹配。

SELECT
a.object_id, a.session_id, b.object_name, c.*
FROM
v$locked_object a, dba_objects b, v$session c

WHERE
a.object_id = b.object_id

AND
a.SESSION_ID = c.sid(+)

杀Seesion的SQL语句语法如下:
alter system kill session 'sid, serial#'

如上面查出来的一条记录的sid是53, serial#为663,就执行以下的语句 alter system kill session '53,663'

如果要一次性杀死多个会话,一个一个填写sid和serial#十分的繁琐,应该在查询被锁对象的同时拼凑出多条的杀会话语句,以分号分隔,一起复制下来,然后就可以批量的执行了。

拼凑kill语句的方式如下,下面加了一个过滤条件和一个排序,杀除真正关心的表,并且着重注意超时时间过长的会话。
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||''';',

a.object_id, a.session_id, b.object_name, c.*
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
AND schemaname = 'Unmi'
ORDER BY logon_time

你遇到过下面类似的情况吗?一个用户进程长期占用资源而不释放,导致Oracle进程占用了系统的大量资源,Oralce系统的效率变得很低。如果简单的关闭重启Oracle
实例,势必影响所有的用户。有没有办法仅仅只Kill掉有问题的用户进程而不用关闭整个Oralce实例呢?答案是可以的,使用Oralce提供的一个名叫Orakill的工具。

大家都知道,Windows
2000是一个基于线程的操作系统,而不是象Unix、Linux那样基于进程的操作系统。整个Oracle的后台进程、用户进程等,在Windows
2000环境下,都包含在ORACLE.EXE这单独的一个体系进程中了,通过查看’任务管理器’――’进程’就可以看到。如果你不是使用MTS多线程服
务器的模式,如果你Kill掉ORACLE.EXE这个进程,将导致整个Oracle实例关闭,如同使用Shutdown
abort命令一样。

由于Windows自己没有提过一个专门用来Kill掉单个线程的工具,因此Oracle从Oracle7.3.3.6开始,自己提供了一个基于字符界面的用来在Windows环境下强制Kill掉一个线程的工具――Orakill。

在NT中如果使用alter system kill
session
'sid,serial#'来清楚会话,在执行之后该会话的状态会变为KILLED,但是有时候这个状态会保持很长时间,直到最后被清除。

如果想更快地从内存中清理这个会话,那么可以在使用了alter
system之后,再在NT中使用Orakill实用程序(该程序随Oracle数据库同时安装)直接清除该会话的线程。

Orakill的使用方法如下:

Dos提示符下:>orakill sid thread

说明: sid Oracle的Sid号

thread Oracle的线程id号

首先取得被杀掉的会话的Thread Number:

SET pagesize 100

SET linesize 100

COLUMN Program format a20

SELECT s.sid AS "Sid", s.serial# AS "Serial#", p.spid AS
"ThreadID",

s.osuser

AS "OSUser", s.program AS "Program"

FROM v$process p, v$session s

WHERE p.addr = s.paddr(+)

ORDER BY s.sid

输出可能如下:

Sid Serial# ThreadID OSUser Program

--- ------- -------- ------ -------

...

10 809 102 User01 Prog.exe

11 345 333 SeUser App.exe

15 719 422 User01 Prge.exe

20 345 123 SeUs Acco.exe

555

324

然后在命令行窗口执行Orakill命令

例:orakill ORCL 555

orakill ORCL 324

orakill的命令帮助如下:

C:>orakill

Usage: orakill sid thread

where sid = the Oracle instance to target

thread = the thread id of the thread to kill

The thread id should be retrieved from the spid column of a query
such

as:

SELECT spid, osuser, s.program

FROM v$process p, v$session s

WHERE p.addr = s.paddr;

需要注意的是,如果你Kill掉的是Oracle的核心后台线程(DBWR, LGWR, SMON or
PMON),将导致Oracle实例关闭。检查Oracle的核心后台线程的方法如下:

sql:>Select vb.name NOME, vp.programe PROCESSNAME,
vp.spid THREADID, vs,sid SID

sql:>From v$session vs, v$process vp, v$bgprocess
vb

sql:>Where vb.addr <>
‘00’ and

sql:>vb.paddr = vp.addr and

sql:>vp.addr = vs.paddr

查询结果如下:

NOME
PROCESSNAME
THREADID SID

----- ----------------------------------- --------- ------

PMON
ORACLE.EXE
169
1

DBW0
ORACLE.EXE
215
2

LGWR
ORACLE.EXE
280
3

CKPT
ORACLE.EXE
267
4

SMON
ORACLE.EXE
287
5

RECO
ORACLE.EXE
288
6

SNP0
ORACLE.EXE
271
7

SNP1
ORACLE.EXE
282
8

8 rows selected.

特别提醒,这里的sid指的是oracle的实例号



select instance from v$instance;
而且orakill只能用于oracle实例安装在windows上的时候

㈥ 如何杀掉(kill)Oracle中的会话(Session)

杀掉(kill)Oracle中的会话(Session)的方法:

SQL> conn etl/etl

Connected.

SQL> update test set status='invalid';

55944 rows updated.

SQL> update test2 set dropped='Y';

3090 rows updated.

㈦ oracle里kill session的影响

1.看看数据库是否有其他人在开发程序啊?最好让他们先退出来
2.kill session 要看看操作系统的session是否kill掉了

㈧ oracle数据库 用户session Kill不掉

用alert system kill session的方式杀会话,会话会被标注为killed状态,但不一定会立即释放。
所以对于确信可以杀掉的会话,
建议在操作系统级别使用kill -9的方式,简单粗暴又高效
windows呢,可以使用orakill sid spid的方式