扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
具体步骤如下:
10年积累的成都做网站、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有兴安盟乌兰浩特免费网站建设让你可以放心的选择与我们合作。
1.首先使用下面的命令,将有关的跟踪标志启用。
SQL codeDBCC TRACEON (3605,1204,1222,-1)
说明:
3605
将DBCC的结果输出到错误日志。
1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令。
1222
返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,SQL
2005及以上可用)。
-1 以全局方式打开指定的跟踪标记。
以上跟踪标志作用域都是全局,即在SQL
Server运行过程中,会一直发挥作用,直到SQL Server重启。
如 果要确保SQL Server在重启后自动开启这些标志,可以在SQL
Server服务启动选项中,使用 /T 启动选项指定跟踪标志在启动期
间设置为开。(位于SQL Server配置管理器-SQL
Server服务-SQL Server-属性-高级-启动参数)
在运行上面的语句后,当SQL
Server中发生死锁时,已经可以在错误日志中看到了,但还不够直观(和其它信息混在一起)。(SSMS
- SQL Server实例 -
管理 - SQL Server日志)
2.建表,存放死锁记录
SQL codeUSE [Cole] --Cole是我的示例数据库,你可以根据实际情况修改。 GO
CREATE TABLE DeadLockLog ( id int IDENTITY (1, 1) NOT NULL, LogDate DATETIME, ProcessInfo VARCHAR(10), ErrorText VARCHAR(MAX) )
GO
3.建立JOB
新建一个JOB(假设名称为DeadLockJob),在"步骤"中新建一步骤,随便写一个步骤名称,数据库为"Cole",在"命令"栏中输入以下语句:
SQL code--新建临时表 IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null
DROP TABLE #ErrorLog
CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX)) --将当前日志记录插入临时表
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog --将死锁信息插入用户表
insert DeadLockLog
select a, b, c from #ErrorLog where id = (select MAX(id) from #ErrorLog WHERE c Like '%Deadlock encountered%')
DROP TABLE #ErrorLog
4.新建警报
在"新建警报"窗体的"常规"选项卡中,进行以下设置:
名称:可根据实际自行命名,这里我用DeadLockAlert
类型:选择"SQL
Server性能条件警报"
对象:SQLServer:Locks
计数器:Number of
Deadlocks/sec
实例:_Total
计数器满足以下条件时触发警报:高于
值:0
在"响应"选项卡中,选中"执行作业",并选择步骤3中我们新建的作业(即DeadlockJob)
到这里为止,我们已经完成了全部步骤,以后,你就可以随时查询DeadLockLog表,来显示死锁信息了。
--查看死锁
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked 0 ) or (blocked 0)
--解锁
kill 进程号(spid)
详细步骤如下:
1、点击【新建查询】按钮,打开SQL命令编辑框,对数据库表的操作以及维护都可以通过编辑SQL命令实现。
2、在编辑框内编辑创建数据库表的代码,确认代码无误后,单击【执行】按钮,创建数据表。
3、创建数据表的源代码如下:
use test go
if exists(select name from sys.tables where name='Student')
drop table Student go
create table Student
(sname nchar(10) primary key,
sex nchar(2) not null,
bir datetime)
数据库管理系统,database management system,简称dbms,是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。用户通过dbms访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。
提供数据定义语言(ddl)。用它书写的数据库模式被翻译为内部表示。数据库的逻辑结构、完整性约束和物理储,存结构保存在内部的数据字典中。数据库的各种数据操作(如查找、修改、插入和删除等)和数据库的维护管理都是以数据库模式为依据的。
死锁,简而言之,两个或者多个trans,同时请求对方正在请求的某个对象,导致双方互相等待。简单的例子如下:\x0d\x0a trans1 trans2\x0d\x0a ------------------------------------------------------------------------\x0d\x0a 1.IDBConnection.BeginTransaction 1.IDBConnection.BeginTransaction\x0d\x0a 2.update table A 2.update table B\x0d\x0a 3.update table B 3.update table A\x0d\x0a 4.IDBConnection.Commit 4.IDBConnection.Commit \x0d\x0a 那么,很容易看到,如果trans1和trans2,分别到达了step3,那么trans1会请求对于B的X锁,trans2会请求对于A的X锁,而二者的锁在step2上已经被对方分别持有了。由于得不到锁,后面的Commit无法执行,这样双方开始死锁。\x0d\x0a 好,我们看一个简单的例子,来解释一下,应该如何解决死锁问题。\x0d\x0a -- Batch #1\x0d\x0a CREATE DATABASE deadlocktest\x0d\x0a GO\x0d\x0a USE deadlocktest\x0d\x0a SET NOCOUNT ON\x0d\x0a DBCC TRACEON (1222, -1)\x0d\x0a -- 在SQL2005中,增加了一个新的dbcc参数,就是1222,原来在2000下,我们知道,可以执行dbcc \x0d\x0a --traceon(1204,3605,-1)看到所有的死锁信息。SqlServer 2005中,对于1204进行了增强,这就是1222。\x0d\x0a GO \x0d\x0a \x0d\x0a IF OBJECT_ID ('t1') IS NOT NULL DROP TABLE t1\x0d\x0a IF OBJECT_ID ('p1') IS NOT NULL DROP PROC p1\x0d\x0a IF OBJECT_ID ('p2') IS NOT NULL DROP PROC p2\x0d\x0a GO\x0d\x0a CREATE TABLE t1 (c1 int, c2 int, c3 int, c4 char(5000)) \x0d\x0a GO\x0d\x0a DECLARE @x int\x0d\x0a SET @x = 1\x0d\x0a WHILE (@x = [@p1] AND [t1].[c2] = [@p1] AND [deadlocktest].[dbo].[t1].[c2]
回答于 2022-11-16
死锁检测
use master
Select * from sysprocesses where blocked0
--找到SPID
exec sp_lock
--根据SPID找到OBJID
select object_name(85575343)
--根据OBJID找到表名
sqlserver的数据库文件是什么?
以 .MDF结尾的是数据库文件,以 .LDF结尾的是日志文件 ;
在企业管理器中选择您的要导入数据的数据库,然后点击右键,选择所有任务-附加数据库-选择MDF文件,就可以了 ;
对于数据库的还原,最好的备份数据库后,再还原数据库。可以使用定期备份;
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流