数据库系统异常是DBA经常要面临的情景,一名有一定从业经验的DBA,都会有自己一套故障排查的方法和步骤,此文为为大家介绍一下通过系统
性能视图(SQLServer05以上版本)来排查系统异常的基本方法,希望能对大家有所帮助。
这里分两部分来介绍:
一. 从数据库连接情况来判断异常:
1. 首先我们来看一下目前数据库系统所有请求情况:
--request infoselect s.session_id, s.status,db_name(r.database_id) as database_name, s.login_name,s.login_time, s.host_name, c.client_net_address,c.client_tcp_port,s.program_name, r.cpu_time, r.reads, r.writes,c.num_reads,c.num_writes, s.client_interface_name, s.last_request_start_time, s.last_request_end_time, c.connect_time, c.net_transport, c.net_packet_size, r.start_time, r.status, r.command, r.blocking_session_id, r.wait_type, r.wait_time, r.last_wait_type, r.wait_resource, r.open_transaction_count, r.percent_complete,r.granted_query_memory from Sys.dm_exec_requests r with(nolock) right outer join Sys.dm_exec_sessions s with(nolock) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with(nolock) on s.session_id = c.session_id where s.session_id >50 order by s.session_id
某台生产机运行情况:
这个查询将目前数据库中的所有请求都显示出来了,其中比较重要的有Status、Login_name、Host_Name,Client_Net_Address、Program_name
等,但是信息比较多,我们很难查看有什么异常,但是可以通过一图中红色圈的数字:441 初步判断连接数是否超过了平时的标准(很多时候系统异常是连接
数过多造成的,而连接数过多又是因为其他原因影响的)。
2. 哪个用户连接数最多:
--request info by userselect login_name,COUNT(0) user_count from Sys.dm_exec_requests r with(nolock) right outer join Sys.dm_exec_sessions s with(nolock) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with(nolock) on s.session_id = c.session_id where s.session_id >50 group by login_name order by 2 desc
运行结果:
从图中我们可以很方便的看出用户连接数情况,如果我们的不同的功能是使用不同的的数据库账号的话,就能初步判断是哪部分功能可能出现了异常。
3. 哪台机器发起到数据库的连接数最多:
--request info by hostnameselect s.host_name,c.client_net_address,COUNT(0) host_count from Sys.dm_exec_requests r with(nolock) right outer join Sys.dm_exec_sessions s with(nolock) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with(nolock) on s.session_id = c.session_id where s.session_id >50 group by host_name,client_net_address order by 3 desc
运行结果:
这个查询能够一下就帮我们找出来哪些机器发起了对数据库的链接,它们的链接数量是否有异常;这个其实对调查某些问题非常有用,我有一次就遇
到一个case:
用户反映,过一两个星期,系统就会出现一次异常,出问题时数据库连接数量很高,大量的访问被数据库拒绝,过半个小时左右,系统又自动恢复了,但是
在数据库里面查看,并没有发现有异常的进程和错误的信息,问题一时很棘手,很难定位,系统不稳定领导不满,DBA顶着压力一时不知道如何是好;后面
转换方向,通过调查问题发生时,为什么会产生这么多连接,这些连接是那些机器发过来的,这些连接发过来正常吗,是数据库不砍业务的重负,还是业务
在某个时间段内会出现暴涨等一系列原因,最终找出是一台Web因为开发人员代码写的有问题,内存出现内存泄露,导致大量的连接不能释放,出问题是,
发出的数据库连接数比平时高3-4倍,最终影响到了数据库,问题压根和数据库没关系(从这个事实看出,DBA真是的炮灰角色,不是自己的问题,也得顶
着压力调查出原因呀);如果在类似问题发生时,我们能通过这个查询及早知道问题是出在某台Web机器上,那就不用费尽心力来调查数据库了。
4. 这些连接在访问哪个库:
--request info by databasesselect db_name(r.database_id) as database_name,COUNT(0) host_count from Sys.dm_exec_requests r with(nolock) right outer join Sys.dm_exec_sessions s with(nolock) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with(nolock) on s.session_id = c.session_id where s.session_id >50 group by r.database_id order by 2 desc
结果(为NULL的估计是没办法定位库):
5. 进程状态:
--request info by statusselect s.status,COUNT(0) host_count from Sys.dm_exec_requests r with(nolock) right outer join Sys.dm_exec_sessions s with(nolock) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with(nolock) on s.session_id = c.session_id where s.session_id >50 group by s.status order by 2 desc
结果(running数比较多,表面数据库压力比较大):
二. 从阻塞情况来判断异常(这部分内容不再一一贴图,直接上脚本):
1. 查看数据库阻塞情况:
----------------------------------------Blocked Info---------------------------------- --记录当前阻塞信息 select t1.resource_type as [lock type] ,db_name(resource_database_id) as [database] ,t1.resource_associated_entity_id as [blk object] ,t1.request_mode as [lock req] -- lock requested ,t1.request_session_id as [waiter sid] -- spid of waiter ,t2.wait_duration_ms as [wait time] ,(select text from sys.dm_exec_requests as r with(nolock) --- get sql for waiter cross apply sys.dm_exec_sql_text(r.sql_handle) where r.session_id = t1.request_session_id) as waiter_batch ,(select substring(qt.text,r.statement_start_offset/2, (case when r.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 else r.statement_end_offset end - r.statement_start_offset)/2+1) from sys.dm_exec_requests as r with(nolock) cross apply sys.dm_exec_sql_text(r.sql_handle) as qt where r.session_id = t1.request_session_id) as waiter_stmt --- statement executing now ,t2.blocking_session_id as [blocker sid] --- spid of blocker ,(select text from sys.sysprocesses as p with(nolock) --- get sql for blocker cross apply sys.dm_exec_sql_text(p.sql_handle) where p.spid = t2.blocking_session_id) as blocker_stmt,getdate() time from sys.dm_tran_locks as t1 with(nolock) , sys.dm_os_waiting_tasks as t2 with(nolock) where t1.lock_owner_address = t2.resource_address
2. 查看阻塞其他进程的进程(阻塞源头):
--阻塞其他session的session select t2.blocking_session_id,COUNT(0) counts from sys.dm_tran_locks as t1 with(nolock) , sys.dm_os_waiting_tasks as t2 with(nolock) where t1.lock_owner_address = t2.resource_address group by blocking_session_id order by 2
3. 被阻塞时间最长的进程:
--被阻塞时间最长的sessionselect top 10 t1.resource_type as [lock type] ,db_name(resource_database_id) as [database] ,t1.resource_associated_entity_id as [blk object] ,t1.request_mode as [lock req] -- lock requested ,t1.request_session_id as [waiter sid] -- spid of waiter ,t2.wait_duration_ms as [wait time] ,(select text from sys.dm_exec_requests as r with(nolock) --- get sql for waiter cross apply sys.dm_exec_sql_text(r.sql_handle) where r.session_id = t1.request_session_id) as waiter_batch ,(select substring(qt.text,r.statement_start_offset/2, (case when r.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 else r.statement_end_offset end - r.statement_start_offset)/2+1) from sys.dm_exec_requests as r with(nolock) cross apply sys.dm_exec_sql_text(r.sql_handle) as qt where r.session_id = t1.request_session_id) as waiter_stmt --- statement executing now ,t2.blocking_session_id as [blocker sid] --- spid of blocker ,(select text from sys.sysprocesses as p with(nolock) --- get sql for blocker cross apply sys.dm_exec_sql_text(p.sql_handle) where p.spid = t2.blocking_session_id) as blocker_stmt,getdate() time from sys.dm_tran_locks as t1 with(nolock) , sys.dm_os_waiting_tasks as t2 with(nolock) where t1.lock_owner_address = t2.resource_address order by t2.wait_duration_ms desc
此文大致总结了通过DMV调查数据库异常的基本方法和步骤,如果大家在调查问题时能够灵活运用,相信对数据库异常情况的定位和解决能够更快更有效。
相关推荐
以下是一个在ASP.NET中实现SQL Server数据库备份的基本方法,这个过程通常涉及到以下几个关键步骤: 1. **创建数据库连接**:首先,需要建立一个到SQL Server数据库的连接。在示例代码中,`DB.createCon()`函数用于...
在SQL Server数据库管理中,错误日志扮演着至关重要的角色,它是系统监控和故障排查的重要工具。错误日志记录了数据库服务器在运行过程中遇到的问题、警告以及重要事件,帮助管理员了解系统的健康状况,并在出现问题...
"sqlserver数据库直连包"指的是一个工具或组件,它允许用户直接与SQL Server数据库进行交互,无需通过中间层服务。这样的直连包通常包含了必要的驱动程序和接口,以便应用程序能够建立到SQL Server的连接并执行SQL...
对于使用Java进行开发并且依赖于SQL Server作为数据库的企业来说,理解如何在Java环境中执行SQL Server数据库的备份至关重要。以下将详细介绍Java与SQL Server数据库备份相关的知识点。 1. **SQL Server备份类型**:...
《SQL Server数据库管理与开发》是一本专注于数据库管理和开发的教程,其中包含了16套精心设计的试题,每套试题都附带了详尽的参考答案,为学习者提供了全面的实践机会。这些试题旨在帮助读者深入理解SQL Server的...
SSM框架,全称为Spring、SpringMVC和MyBatis的集成框架,是Java后端开发中的常用技术栈。在SSM项目中,数据库连接管理是至关重要的,而...在与SQL Server数据库配合时,理解SQL Server的特性和Druid的配置选项是关键。
在本例中,配置会指定一个数据库Appender,连接到SQL Server数据库并定义日志事件的存储方式。 5. **日志写入SQL Server**: log4net通过数据库Appender将日志信息写入SQL Server。这需要配置数据库连接字符串、存储...
在"ASP.NET + SQL Server数据库开发实例"中,我们可以学习到以下几个关键知识点: 1. **ASP.NET基础知识**:ASP.NET提供了一系列的控件和模型,如Web Forms、MVC和Web API,帮助开发者快速构建网页应用。Web Forms...
在SQL Server数据库管理中,定期备份是至关重要的,以防数据丢失或系统故障。使用C#进行SQL Server数据库的备份是一个常见的需求,特别是在开发自动化备份解决方案时。本文将深入探讨如何利用C#语言来实现SQL Server...
《基于C语言和SQL SERVER数据库实现的图书管理系统》是一个典型的结合了编程语言和数据库技术的项目,主要用于管理和操作图书信息。在这个系统中,C语言作为主要的编程工具,用于实现用户交互界面、业务逻辑处理以及...
在日常维护SQL Server数据库时,可能会遇到策略备份时间突然异常增大的情况。这种情况不仅影响到数据库的正常运行,还可能导致数据完整性受损。本文将详细探讨如何排查并解决SQL Server策略备份时间异常增大的问题。...
本文将深入探讨如何实现ASA(Adaptive Server Anywhere,Sybase公司的嵌入式数据库)与微软的SQL Server数据库之间的同步。这两个数据库系统在不同的环境中都有广泛应用,因此确保它们的数据一致性至关重要。 首先...
描述中提到这个工具附带源码,这意味着用户可以查看和修改源代码,这对于学习SQL Server数据库管理和故障排查非常有帮助。源码可能使用C#、VB.NET或其他.NET语言编写,包含与SQL Server交互的ADO.NET代码,以及可能...
在这个场景下,"SQLServer数据库日志分析数据恢复工具"正是为了解决这类问题而设计的。下面将详细阐述其关键知识点。 首先,SQL Server的日志系统,即事务日志(Transaction Log),是数据库恢复模型的基础。每当在...
在SQL Server数据库监控系统中,Fp-growth算法可以用来分析数据库操作模式,识别异常行为和潜在的安全风险,例如频繁的非法访问尝试或不寻常的数据查询模式。 基于Fp-growth算法的监控系统设计中,首先需要收集...
通过这个课程设计,学生可以深入理解数据库系统的设计原理,掌握Delphi编程语言和SQL Server数据库的使用方法,同时也能锻炼到问题解决和系统集成的能力。对于初学者来说,这是一个极好的学习起点,可以帮助他们快速...
在"Visual C# + SQL Server数据库开发与实例4"中,我们可以深入探讨以下几个关键知识点: 1. **C#语言基础**:了解C#的基本语法,包括变量、数据类型、控制结构(如if-else,switch,for,while等)、函数和类的...
- **错误日志**:记录SQL Server服务启动、停止和其他异常情况的信息,用于故障排查。 2. **Log Explorer 4.2 主要特性**: - **日志查看**:能够直接读取并显示SQL Server的事务日志,无需备份或分离数据库,...