设为首页 收藏本站
查看: 1614|回复: 0

[经验分享] SQL Server Dump介绍

[复制链接]

尚未签到

发表于 2015-7-2 10:56:48 | 显示全部楼层 |阅读模式
参考文献
  SQL Server dump 介绍

前言
  之前听同事们之间交流经常会听到dump这个词,但是一直不明白dump是什么东西,今天特地整理一下这方面的资料。我们称dump为转储,但这边我们说的dump不是SQL Server本身的DUMP备份命令,而是指通过sqldumper.exe中的dump。那什么是dump呢,dump指的是将某种内容转换为另外一种更具可读性的方式。在ORACLE中,有专门的dump命令可以dump出数据文件等的内容,其trace也相当于另外一种dump。通过dump,我们便可以了解整个系统的运行原理。SQL Server这方面的资料很少,当然,这也符合了微软不开源的策略。不过这几年来,关于这方面的资料比较多了,通过google可以获得相关的内容。
  最早对此感兴趣的是碰到了很多人经常问的.mdmp文件,mdmp的叫mini dmp,也可以叫memory dmp,这是由于SQL Server 在运行过程中,遇到了一些bug或者错误而进行转储以便记录出错信息的文件。一般对这类文件的处理,都是建议打包后提交给微软分析的。在无法获得微软帮助的情况,就需要自己对此类文件进行分析了,然后找出问题原因,从而进行解决。

一、SQLDumper.exe介绍
  前面介绍了SQL Server 会在运行时自动产生一些dump文件,我们也可以手工产生dump文件,产生dump文件的方式,就是通过Sqldumper来进行的。自 SQL Server 2000 Service Pack 3 (SP3) 起,Microsoft SQL Server 2000 中开始附带 Sqldumper.exe。Sqldumper.exe 可根据任一 Microsoft Windows 应用程序的需要生成转储文件。Sqldumper.exe不仅可以转储SQL Server,还可以转储其他的windows application。
  我使用的环境是SQL Server 2012,因此SQLDumper位于C:\Program Files\Microsoft SQL Server\110\Shared下,我们可以运行SQLDumper /? 查看其使用方法,16进制代码是控制标识符。查询SQLDumper用处的代码如下所示:



C:\Program Files\Microsoft SQL Server\110\Shared>SqlDumper.exe /?
Usage: SqlDumper.exe [ProcessID [ThreadId [Flags[:MiniDumpFlags] [SqlInfoPtr [DumpDir [ExceptionRecordPtr [ContextPtr [ExtraFile]]]]]]]] [-I] [-S][-remoteservers:[print|dump|freeze|resume|remote:guid\dumporigin\signature\localId\port\operationType]]
Flags:
dbgbreak                         = 0x0001
nominidump                       = 0x0002
validate_image                   = 0x0004
referenced_memory                = 0x0008
all_memory                       = 0x0010
dump_all_threads                 = 0x0020
match_file_name                  = 0x0040
no_longer_used_flag              = 0x0080
verbose                          = 0x0100
wait_at_exit                     = 0x0200
send_to_watson                   = 0x0400
defaultflags                     = 0x0800
maximumdump                      = 0x1000
mini_and_maxdump                 = 0x2000
force_send_to_watson             = 0x4000
full_filtered_dump               = 0x8000
no_auto_remote_dump_invocation   = 0x40000
MiniDumpFlags:
Normal                           = 0x0000
WithDataSegs                     = 0x0001
WithFullMemory                   = 0x0002
WithHandleData                   = 0x0004
FilterMemory                     = 0x0008
ScanMemory                       = 0x0010
WithUnloadedModules              = 0x0020
WithIndirectlyReferencedMemory   = 0x0040
FilterModulePaths                = 0x0080
WithProcessThreadData            = 0x0100
WithPrivateReadWriteMemory       = 0x0200
WithoutOptionalData              = 0x0400
WithFullMemoryInfo               = 0x0800
WithThreadInfo                   = 0x1000
  从上面的命令可以看出,要想对某一application进行dump,需要先找出其pid(processes id),然后加上一些Flags的控制标识来控制dump内容。比如,我现在想对SQL Server 进行dump,先找到SQL Server 的pid 为1672(可以在sql server configure management中找到sql server 2012服务的ProcessID),想dump所有的内存信息,那就可以用下面的命令来进行:



C:\Program Files\Microsoft SQL Server\110\Shared>SqlDumper.exe 1672 0x0010
  其中,0x0010 表示all_memory,这样,在C:\Program Files\Microsoft SQL Server\110\Shared目录下会产生SQLDmpr0001.mdmp和SQLDUMPER_ERRORLOG.log这两个文件,这就是转储文件(.mdmp)。
  以下是几个比较常见的dump 标识:



0x0120 - Minidump --这个flag只dump 一个Process的堆栈和载入模块的信息,这是最小的转储方式,也是SQL Server自动产生dump文件的方式。
0x01100 – Full Dump --这个flag会转储Process的整块信息,如果在64位的系统上,其文件大小还是很大的。
0x8100 – Filtered Dump --这个flag用来转储用于于其他服务器用途(包括过程缓存)的内存信息
二、SQL Server方式的DUMP
  使用Sqldumper只是手工产生dump文件的一种方式,当然,产生dmp文件的方式还是很多的,SQL Server内部也提供了这样的工具。主要是DBCC STACKDUMP 和DBCC dumptrigger 这两个命令。当然还可以通过TraceFlag来控制是否产生dmp文件或者遇到什么错误时才产生文件。比如,我们想产生一个Full Dump,必须打开Trace Flag 2544 和 2546,然后执行DBCC STACKDUMP ,命令如下:



--DBCC stackdump
dbcc traceon(2544, -1)
go
dbcc traceon(2546, -1)
go
dbcc stackdump
dbcc traceon(2544, -1)
go
dbcc traceon(2546, -1)
go
  在执行完上述命令以后,我们会发现在D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log(我将sqlserver2012的示例安装在了D盘)目录下多出了如下图所示的三个文件:
DSC0000.png
  再次执行上述命令,又会多出下图所示的三个文件:
DSC0001.png
  而SQLDUMPER_ERRORLOG.log和ERRORLOG这两个文件是公用的。
  如果想让SQL Server 只针对 某个错误而产生转储文件,可以使用dbcc dumptrigger,下面是一个例子



--DBCC dumptrigger
--设置dump的触发器为错误802
dbcc dumptrigger('set', 802)
go
-- 查看当期的dump触发器内容
dbcc traceon(3604, -1)
go
dbcc dumptrigger('display')
go
dbcc traceoff(3604, -1)
go
-- 关闭当期的dump触发器。
dbcc dumptrigger('clear', 802)
go
  执行上述命令以后,在SSMS中显示如下信息:



DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Dump Triggers
DebugBreak = 0                     
CExDumpTriggers @0x00000001ECBD4140
Exception = 802                     
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
三、分析mdmp文件的一些知识说明
  以上只是介绍了mdmp的产生,以及如何自己手工产生mdmp文件,但如何对mdmp文件进行分析才是重点。曾经对其进行了一些分析,但道行有限,能获得的信息不多。把如何分析mdmp文件的过程分享出来,希望更厉害的人能从中找到一些SQL Server的运行原理。

1、调试
  由于SQL Server 也是在windows平台是运行的一款程序,有问题时,把它当成一款普通的windows程序来进行调试就行了。在windows上,有两方面的调试,一个是内核模式调试,一个是用户模式调试。内核调试是针对Windows操作系统进行调试的,反应windows OS内部和硬件设备的运行。用户模式的调试就是对应用程序进行调试,因为应用程序就是运行在用户模式上的。二者的调试是不同的,这边就不做过多的介绍,有疑问,就google吧。
  调试还有另外一个区别:是在程序运行时对其调试(live-debugging),还是读取mdmp分析调试(post-mortem debugging)。这二者也是不一样的。在live-debugging时会使程序挂起,然后设置bp(break point),观察程序的运行行为。这边主要介绍post-mortem debugging.
  在调试过程中,我们最常见的是分析线程(thread)的堆栈(stack)的跟踪信息。因为在windows平台上,application是以process来运行的,而一个process又包含了thread,thread才是真正在运行一些函数功能。我们可以通过如下命令来看运行SQL Server的线程信息:



use master
select spid,kpid from sys.sysprocesses
  查询结果如下:



spid   kpid
------ ------
1      3260
2      3356
3      3352
4      3252
5      3256
6      3236
7      3368
8      3372
10     0
11     3436
12     3380
13     3264
14     4016
15     3768
16     3348
17     3284
18     0
19     0
20     0
21     0
22     0
23     0
24     3576
25     4024
26     0
28     4020
29     2368
30     2556
31     4028
51     0
52     3364
53     0
56     0
57     0
  查看线程信息也可以通ProcessExplorer查看,如下图所示:
DSC0002.png
  不过这得windbg的支持才可以,windbg可以在Download and Install Debugging Tools for Windows下载到,我使用的是Install Debugging Tools for Windows as a Standalone Component,也就将windbg作为一个单独的组件进行安装。

四、使用windbg
  在了解上述知识后,就可以使用windbg来进行分析了。

1、windbg环境的配置
  到微软的网站下载windbg后直接安装,安装完成后,需要配置symbols的path,打开windbg,File --> Symbols File Path 在弹出的对话框输入



srv*D:\app\symbols*http://msdl.microsoft.com/download/symbols
  其中D:\app\symbols是本地硬盘的文件夹,在使用时,windbg会到http://msdl.microsoft.com/download/symbols下载相关的symbols,我这边下载的一共有6.27MB大小。

2、打开mdmp文件
  打开windbg,File --> Open Crash Dump,选择mdump文件,在弹出的对话框里点击yes,这里我选择的是在C:\Program Files\Microsoft SQL Server\110\Shared目录下会产生SQLDmpr0001.mdmp。

3、分析mdmp
  在下面的对话框输入“~”,如下图所示:
DSC0003.png
  敲回车以后会出现线程的信息,信息如下:


DSC0004.gif DSC0005.gif View Code


0:000> ~
.  0  Id: 688.e68 Suspend: 1 Teb: 000007ff`fffde000 Unfrozen
1  Id: 688.f2c Suspend: 1 Teb: 000007ff`fffd5000 Unfrozen
2  Id: 688.2ec Suspend: 1 Teb: 000007ff`fff9e000 Unfrozen
3  Id: 688.2184 Suspend: 1 Teb: 000007ff`fff9a000 Unfrozen
4  Id: 688.ba0 Suspend: 1 Teb: 000007ff`fff98000 Unfrozen
5  Id: 688.f94 Suspend: 1 Teb: 000007ff`fff96000 Unfrozen
6  Id: 688.dc4 Suspend: 1 Teb: 000007ff`fff94000 Unfrozen
7  Id: 688.fdc Suspend: 1 Teb: 000007ff`fff92000 Unfrozen
8  Id: 688.1fdc Suspend: 1 Teb: 000007ff`fff90000 Unfrozen
9  Id: 688.d60 Suspend: 1 Teb: 000007ff`fff8e000 Unfrozen
10  Id: 688.d64 Suspend: 1 Teb: 000007ff`fff8c000 Unfrozen
11  Id: 688.d58 Suspend: 1 Teb: 000007ff`fff8a000 Unfrozen
12  Id: 688.d48 Suspend: 1 Teb: 000007ff`fff88000 Unfrozen
13  Id: 688.1c58 Suspend: 1 Teb: 000007ff`fff86000 Unfrozen
14  Id: 688.1b7c Suspend: 1 Teb: 000007ff`fff84000 Unfrozen
15  Id: 688.1ecc Suspend: 1 Teb: 000007ff`fff82000 Unfrozen
16  Id: 688.20f8 Suspend: 1 Teb: 000007ff`fff80000 Unfrozen
17  Id: 688.2288 Suspend: 1 Teb: 000007ff`fff7e000 Unfrozen
18  Id: 688.f0c Suspend: 1 Teb: 000007ff`fff7c000 Unfrozen
19  Id: 688.2260 Suspend: 1 Teb: 000007ff`fff7a000 Unfrozen
20  Id: 688.c14 Suspend: 1 Teb: 000007ff`fff78000 Unfrozen
21  Id: 688.a54 Suspend: 1 Teb: 000007ff`fff76000 Unfrozen
22  Id: 688.b9c Suspend: 1 Teb: 000007ff`fff74000 Unfrozen
23  Id: 688.1838 Suspend: 1 Teb: 000007ff`fffd7000 Unfrozen
24  Id: 688.82c Suspend: 1 Teb: 000007ff`fff6e000 Unfrozen
25  Id: 688.fd0 Suspend: 1 Teb: 000007ff`fff6c000 Unfrozen
26  Id: 688.8e4 Suspend: 1 Teb: 000007ff`fff6a000 Unfrozen
27  Id: 688.c84 Suspend: 1 Teb: 000007ff`fff68000 Unfrozen
28  Id: 688.c80 Suspend: 1 Teb: 000007ff`fff66000 Unfrozen
29  Id: 688.c8c Suspend: 1 Teb: 000007ff`fff64000 Unfrozen
30  Id: 688.cb0 Suspend: 1 Teb: 000007ff`fff60000 Unfrozen
31  Id: 688.cb4 Suspend: 1 Teb: 000007ff`ffeae000 Unfrozen
32  Id: 688.cf0 Suspend: 1 Teb: 000007ff`ffea8000 Unfrozen
33  Id: 688.cec Suspend: 1 Teb: 000007ff`ffea6000 Unfrozen
34  Id: 688.f14 Suspend: 1 Teb: 000007ff`ffea2000 Unfrozen
35  Id: 688.11f0 Suspend: 1 Teb: 000007ff`ffea0000 Unfrozen
36  Id: 688.6ec Suspend: 1 Teb: 000007ff`ffe9c000 Unfrozen
37  Id: 688.d3c Suspend: 1 Teb: 000007ff`ffe9a000 Unfrozen
38  Id: 688.548 Suspend: 1 Teb: 000007ff`ffe92000 Unfrozen
39  Id: 688.dc0 Suspend: 1 Teb: 000007ff`ffe86000 Unfrozen
40  Id: 688.246c Suspend: 1 Teb: 000007ff`ffe94000 Unfrozen
41  Id: 688.1b5c Suspend: 1 Teb: 000007ff`ffe90000 Unfrozen
42  Id: 688.1a08 Suspend: 1 Teb: 000007ff`fff70000 Unfrozen
43  Id: 688.1e28 Suspend: 1 Teb: 000007ff`ffea4000 Unfrozen
44  Id: 688.2a3c Suspend: 1 Teb: 000007ff`fffdc000 Unfrozen
45  Id: 688.2728 Suspend: 1 Teb: 000007ff`fff72000 Unfrozen
46  Id: 688.2b54 Suspend: 1 Teb: 000007ff`ffeac000 Unfrozen
47  Id: 688.ffc Suspend: 1 Teb: 000007ff`ffe9e000 Unfrozen
48  Id: 688.34b0 Suspend: 1 Teb: 000007ff`fffd9000 Unfrozen
49  Id: 688.3698 Suspend: 1 Teb: 000007ff`fffd3000 Unfrozen
50  Id: 688.1f64 Suspend: 1 Teb: 000007ff`fff9c000 Unfrozen
51  Id: 688.1740 Suspend: 1 Teb: 000007ff`fff62000 Unfrozen
3、其他
  windbg的功能是很强大的,是通往sql server内部一个强大工具。要想了解的话,估计得好好研究下,有兴趣的可以自行深入。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82483-1-1.html 上篇帖子: Imail+ASP.NET+SQL Server+LumiSoft.Net 开发网上邮局(三)--收邮件 下篇帖子: SQL SERVER CURSOR
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表