sql杀死进程
1. 如何杀死oracle死锁进程
oracle死锁时杀进程的方法:
第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉。但通常情况下,出现死锁时,想通过命令行或者通过oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除。
第二步:
1、select xisn, 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一级再杀。
2. 如何查看sql server 2000中的某个数据库有有多少用户正在访问
系统表sysprocesses 中有用户连接记录。亮陪可以根据数据库名察键迟称,查看连接的用户。
Selectspid,hostname,loginame,user_name(uid)Asusername
Fromsysprocesses
Wheredbid=db_id('败李glkf')
3. sql server死锁的进程怎么处理
怎么解除SQL Server死锁的问题?SQL Server死锁是我们经常会碰到的问题,下面就为您介绍如何查询SQL Server死锁,希望对您学习SQL Server死锁方面能有所帮助。
SQL Server死锁的查询方法: exec master.dbo.p_lockinfo 0,0 ---显示死锁的进程,不显示正常的进程 exec master.dbo.p_lockinfo 1,0 ---杀死死锁的进程,不显示正常的进程.
SQL Server死锁的解除方法: Create proc p_lockinfo @kill_lock_spid bit=1, --是扒派否杀掉死锁的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示 as 春培贺 declare @count int,@s nvarchar(1000),@i int select id=identity(int,1,1),标志, 进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,
数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu, 登陆时间=login_time,打开事务数=open_tran, 进程状态=status, 工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess, 域名=nt_domain,网卡地址=net_address into #t from( select 标志='死锁的进程', spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran, status,hostname,program_name,hostprocess,nt_domain,net_address,
s1=a.spid,s2=0 from mastersysprocesses a join ( select blocked from mastersysprocesses group by blocked )b on a.spid=b.blocked where a.blocked=0 union all select '|_牺中锋牲品_>', spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran, status,hostname,program_name,hostprocess,nt_domain,net_address, s1=blocked,s2=1 from mastersysprocesses a where blocked<>0 )a order by s1,s2 select @count=@@rowcount,@i=1 if @count=0 and @show_spid_if_nolock=1 begin insert #t select 标志='正常的进程', spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time, open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address from mastersysprocesses set @count=@@rowcount end if @count>0 begin create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255)) if @kill_lock_spid=1 begin declare @spid varchar(10),@标志 varchar(10) while @i<=@ count begin select @spid=进程ID,@标志=标志 from #t whereid=@ i insert #t1 exec('dbcc inputbuffer(')') if @标志='死锁的进程' exec('kill'+@ spid) set @i=@i+1 end end else while @i<=@ count begin select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t whereid=@ i insert #t1 exec(@s) set @i=@i+1 end select a.*,进程的SQL语句=b.EventInfo from #t a join #t1 b on a.id=b.id end
4. 在sql数据库中怎样取消您自己的进程
查看坦毕锁表进程SQL语句1:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;
查看锁表激信宽进程SQL语句2:
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
杀掉锁表进程:
如有记录则表示有lock,记录下SID和serial# ,将记录的ID替明亮换下面的738,1429,即可解除LOCK
alter system kill session '738,1429';
5. 通过什么指令杀死全部mysql进程
kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.
#!/bin/bash
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt
for line in `cat locked_log.txt | awk '{print $1}'`
do
echo "kill $line;" >> kill_thread_id.sql
done
现在kill_thread_id.sql的内容像这个样子
kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....
好了, 我们在mysql的shell中执行, 就可以把所有锁表的进程杀死了.
mysql>source kill_thread_id.sql
当然了, 也可以一行搞定
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done
6. sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
这个问题的原因在于有用户连接了当前要做还原的数据库,这里的用户甚至包括当前要做还原的用户。解决办法就是关闭与要还原数据库的所有连接。
脚本之家小编推荐的一个方法:到服务里面重启下sqlserver服务即可。
问题一描述:SQL
Server数据库备份还原后,在数据库名称后会出现“受限制访问”字样
问题二描述:在对SQL
Server数据库进行还原时,提示:System.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权。(Microsoft.SqlServer.Smo)。出现此问题的原因是在还原数据库时,有其他用户正在使用数据库。还原数据库要求数据库工作在单用户模式。通常就是DBA在操作时,不允许其他用户连接数据库。
问题一解决办法:
右键点击数据库
->
属性
->
选项
->
状态
->
限制访问
->
选择Multiple
->
确定。
问题二解决办法:
方法一(最方便):右键点击数据库
->
属性
->
选项
->
状态
->
限制访问
->
选择Single->
确定。然后还原。
方法二(最直接):断开数据库连接
方法三(最暴力):注销/重启数据库服务器
方法四(最麻烦):写代码修改数据库相关属性,虽然麻烦,有的时候还是要用到,那就用到的时候再研究。
①先切换数据库到master数据库。执行语句
select
*
from
master..sysprocesses
where
dbid=db_id(
'数据库名称')
②然后逐步运行语句
exec
kill
spid(上一步结果集中的数据),
问题就解决了。哈哈
今天在还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题。现将引发该问题的原因与解决方案写出来,有不对的地方欢迎大家提出来。
引发原因:是因为我在还原数据库的时候,还有其他的用户正在使用数据库,所以就会出现以上提示。
解决方法:
1,设置数据库在单用户模式下工作。
设置方法:在需要还原的数据库上右击,在右键菜单命令上选择"属性"-
>"选项"-
>"状态"-
>"限制访问"-
>"Single"。这是SQLSERVER2005的菜单命令,其它版本请自己查找。
2,利用SQL语句,杀死正在使用该数据库的所有进程,自己以前在做一个SQL
SERVER操作小工具的时候有写过该功能的SQL,贴出来供大家参考:
复制代码
代码如下:
declare
@dbname
varchar(50)
set
@dbname='数据库名称'
declare
@sql
varchar(50)
declare
cs_result
cursor
local
for
select
'kill
'+cast(spid
as
varchar(50))
from
sys.sysprocesses
where
db_name(dbid)=@dbname
open
cs_result
fetch
next
from
cs_result
into
@sql
while
@@fetch_status=0
begin
execute(@sql)
fetch
next
from
cs_result
into
@sql
end
close
cs_result
deallocate
cs_result
该SQL语句利用游标循环所有正在使用该数据库的进程,并通过kill命令杀死进程。
3,利用SQL语句,断开所有用户链接,并回滚所有事务,具体SQL语句如下:
复制代码
代码如下:
ALTER
DATABASE
[数据库名称]
SET
OFFLINE
WITH
ROLLBACK
IMMEDIATE
注意:在使用方法2与3时,不要在需要的还原的数据库下执行,建议在master数据库下面执行。
7. SQL 进程死锁
首先,需要把你的AutoCommit=TRUE,然后,这是一个编程习惯问题,在pb中,对于数据窗口的操作,首先设置数据窗口的提交方式,我一直
采用 key columns,use
update,然后记得在每次连接完成后,记得及时释放,譬如,在retrieve完成后,记得及时利用resetupdate()清除数据状态,然后,
再每次数据库更新,也就是update()后,记得利用
ll_num1=.update()
if ll_num=1 then
commit;
dw_free.resetupdate( )
else
rollback;
messagebox("提示!","数据保存失败! ")
end if
以上说法我不赞同:
1、首先AutoCommit=TRUE,以后执行delete,update,insert语句都相当执行了commit,如果是把几个SQL语句当作是一个完整的事务,要不整
体成功提交,要不rollback,这就写就不会得到正确的结果。
2、其次key columns,use update,要具体情况具体使用,这种形式的并发性最差,适合对数据的并发性要求不高的场合。
3、再次程序的死锁原因是多方面的,上述两个方面只是其中的原因罢了,具体情况具体分析,例如数据尽快提交、建立合理的索引、合理的SQ
L语句、避免交叉事务、对于数据量庞大的表,应及时转移到历史库,我想可以很大程度上避免死锁。
以上愚见,欢迎拍砖。
在MSSQL控制台中,管理-当前活动-锁/进程ID看看是那几个进程在死锁,然后在进程信息中将这些死锁的进程杀死/
对查询进行优化
也建议检查:外键建立索引,如果上索引,再调试下网络
对外键建索引可以缓解这个问题。
如在商品字典和销售明细表中,销售明细表中商品编号是外键,如果在销售明细表的商品编号上没有索引,update商品字典会造成销售明细表
整表锁表。
解决Sybase数据库死锁的方法
人民银行吉林市中心支行科技处 刘志明
在联机事务处理(OLTP)的数据库应用系统中,多用户、多任务的并发性是系统最重要的技术指标之一。为了提高并发性,目前大部分RDBMS都采
用加锁技术。然而由于现实环境的复杂性,使用加锁技术又不可避免地产生了死锁问题。因此如何合理有效地使用加锁技术,最小化死锁是开
发联机事务处理系统的关键。
死锁产生的原因
在联机事务处理系统中,造成死机主要有两方面原因。一方面,由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资
源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状
态,从而造成其对资源需求的死锁。
另一方面,数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase SQL Server 11中,最小锁为2K一页
的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表)
,被访问的频率高,就容易在该页上产生死锁。
几种死锁情况及解决方法
清算应用系统中,容易发生死锁的几种情况如下:
● 不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表;
● 在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered);
● 表中的记录少,且单条记录较短,被访问的频率较高;
● 整张表被访问的频率高(如代码对照表的查询等)。
以上死锁情况的对应处理方法如下:
● 在系统实现时应规定所有存储过程、触发器、动态SQL语句段中,对多张表的操作总是使用同一顺序。如:有两个存储过程proc1、proc2,
都需要访问三张表zltab、z2tab和z3tab,如果proc1按照zltab、z2tab和z3tab的顺序进行访问,那么,proc2也应该按照以上顺序访问这三张
表。
● 对在交换期间添加记录频繁的表,使用群集索引(clustered),以减少多个用户添加记录到该表的最后一页上,在表尾产生热点,造成死锁
。这类表多为往来账的流水表,其特点是在交换期间需要在表尾追加大量的记录,并且对已添加的记录不做或较少做删除操作。
● 对单张表中记录数不太多,且在交换期间select或updata较频繁的表可使用设置每页最大行的办法,减少数据在表中存放的密度,模拟行级
锁,减少在该表上死锁情况的发生。这类表多为信息繁杂且记录条数少的表。
如:系统配置表或系统参数表。在定义该表时添加如下语句:
with max_rows_per_page=1
● 在存储过程、触发器、动态SQL语句段中,若对某些整张表select操作较频繁,则可能在该表上与其他访问该表的用户产生死锁。对于检查
账号是否存在,但被检查的字段在检查期间不会被更新等非关键语句,可以采用在select命令中使用at isolation read uncommitted子句的方
法解决。该方法实际上降低了select语句对整张表的锁级别,提高了其他用户对该表操作的并发性。在系统高负荷运行时,该方法的效果尤为
显着。
例如:
select*from titles at isolation read uncommitted
● 对流水号一类的顺序数生成器字段,可以先执行updata流水号字段+1,然后再执行select获取流水号的方法进行操作。
小结
笔者对同城清算系统进行压力测试时,分别对采用上述优化方法和不采用优化方法的两套系统进行测试。在其他条件相同的情况下,相同业务
笔数、相同时间内,死锁发生的情况如下:
采用优化方法的系统: 0次/万笔业务;
不采用优化方法的系统:50~200次/万笔业务。
所以,使用上述优化方法后,特别是在系统高负荷运行时效果尤为显着。总之,在设计、开发数据库应用系统,尤其是OLTP系统时,应该根据
应用系统的具体情况,依据上述原则对系统分别优化,为开发一套高效、可靠的应用系统打下良好的基础。
经验:
1:前台问题:检视代码查看事物是否被提交或回滚。
2:后台问题:有时候由于处理的问题复杂度高。数据库日志空间已满或不够
导致事物未能提交。UNIX下的SYBAE就是典型的一例。解决办法各数据库厂商有更详细的说明。
虽然我从9转到10遇到了好多问题,也浪费了好几天的时间,但到了现在,我真觉得10比9好。
10没有了MSSQL专用接口,用的是OLEDB接口,用这个接口一定要注意一个问题是表死锁的事!
网上讲的连接方式都是天下一大抄。
用OLEDB要加上 SQLCA.Lock = "RC",
不然连查询也会死锁。
另个一个就是10写的软件不再乱码了,我在繁体写的软件在简体下运行不乱码,反之也可以。
第三就是编译速度明显快很多。
第四就是编译的时候有了XP样式皮肤,感觉漂亮多了。
编程要是要养成好习惯,在sql语句insert和update之后,要及时commit,数据窗口update()后也要及时commit;
阻塞是因为多个进程对同一一个资源的访问冲突,当一个进程排它访问一个资源时(从进入事务到事务结束为止),当有其他进程需要访问同
样的资源时,即造成阻塞(根据锁的级别和粒度设置);
在实际应用中阻塞可能因为事务没有提交或者网络速度太慢或者大容量的数据查询等都可能会造成阻塞。
阻塞可以通过sp_who 系统存储过程进行查看,执行sp_who 后查看所有blk不等于
0的进程ID(SPID),直到找到SPID在blk列出现,但当前spid 的blk列 =0 即它就是阻塞的源头。
最简单的办法可用 kill spid(源头进程的SPID值),同时结合sp_lock过程可查看到当前进程的加锁情况(如锁的类型被锁的对象)
最后最重要的是要根据 在查询到源头后,使用 DBCC INPUTBUFFER (spid)查看最后一次提交的内容,即可找到因为事务没有提交造成的阻塞(
一般不能使用 AutoCommit=True,因为大部分MIS程序需要使用批提交,来保证数据的完成性)
http://www.51onnet.com/bbs/forumdisplay.php?f=6
你可能平时编程时没有注意。在 SQLCA(Transaction)默认情况下 AutoCommit = false(不自动提交)。在同一事务中,如果不提交事务,
可以SELECT、Retrieve,但其它事务(其它计算机的应用程序连接数据库的事务)就不能。所以导致死锁,而在单机开发环境看不出来。
你需要在所有的 UPDATE、DELETE 的SQL语句后面,或者数据窗口的Update函数调用之后执行 COMMIT 或 ROLLBACK
死锁可能存在的原因及解决办法
一次偶然的机会在论坛上看到一个关于死锁(其实是阻塞)的帖子,于是把自己的一个小东东拿出来和大家分享,想不到很多人都遇到过这个
问题。
其实解锁并不是根本的解决办法,感觉我自己有点误导大家了,于是有了下面的内容,希望大家能根据自己的应用找出根源,而不是解锁:
阻塞可能存在的原因及解决方法:
1、事务未提交
这是造成阻塞最常见的原因,因为PB默认是自动启动事务的,如果你执行了 update,delete ,insert 语句,不执行Commit 则会出现阻塞(
不建议采用自动提交事务的方式,原因在上一帖中交代过),解决的办法很简单,查找到所有的修改数据命令(U、I、D)查看是否正常提交,找
到后加入Commit即可;
2、SQL SERVER 没有正常安装SP3
对于代码正常的用户,仍然出现阻塞,则需要检查你机器的补丁,特别是WIN2003的机器不安装补丁,1433都不能监听;如果没有安装补丁
即可(我原来就是被这种情况害过)
3、当然可能你会告诉我,代码也没有问题,补丁也装了,仍然出现可能就需要查看你的机器的CPU和内存的使用率(运行taskmgr),SQL
SERVER 的机器峰值状态可能出现阻塞,解决的办法就是出钱:升级服务器;
4、复杂的查询或者大容量查询,比如在查询中使用多个表的联合查询,或者使用 in ,not in 等语句,是非常耗时的,这种解决的办法稍微复
杂点,需要根据你的应用修改SQL 语句,优化SQL 效率,关于SQL 优化是另外一个复杂的话题,本人也学习中...
能想起的好象就这些了,可能不是很完善,希望有人能补充!
你可能平时编程时没有注意。在 SQLCA(Transaction)默认情况下 AutoCommit = false(不自动提交)。在同一事务中,如果不提交事务,
可以SELECT、Retrieve,但其它事务(其它计算机的应用程序连接数据库的事务)就不能。所以导致死锁,而在单机开发环境看不出来。
你需要在所有的 UPDATE、DELETE 的SQL语句后面,或者数据窗口的Update函数调用之后执行 COMMIT 或 ROLLBACK
补充一点,除了在执行了Update,Delete,Insert需要及时Commit外,在SQL Server中由于使用一个Tempdb的数据库,这个数据库是对所有用户共享
的,当使用了统计类型的SQL函数如:sum,count等,SQL Server会自动使用Tempdb进行暂存统计数据,这样很容易造成Tempdb被锁住,所以在读取了
一个很复杂Store Procere或创建过临时表后应进行commit,以便释放Tempdb资源,在retrieved事件中加commit是一个解决办法,特别是在读取
报表后更应加,一般报表的Store Procere都比较复杂,在程序中内嵌了SQL光标来读取数据后也要加commit,我增经试过被锁住,找了很久才知