调试SQLSERVER生成dump文件的方法.docx
- 文档编号:9524960
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:16
- 大小:2.69MB
调试SQLSERVER生成dump文件的方法.docx
《调试SQLSERVER生成dump文件的方法.docx》由会员分享,可在线阅读,更多相关《调试SQLSERVER生成dump文件的方法.docx(16页珍藏版)》请在冰豆网上搜索。
调试SQLSERVER生成dump文件的方法
调试SQLSERVER生成dump文件的方法
我们知道调试程序主要有两种方法
一种是:
livedebugging(附加进程使进程hang住)生产环境最好不要livedebugging
一种是:
post-mortemdebuggingorreadingdumpfiles(生成dump文件然后进行分析)
现在介绍一下如何生成dump文件,以及各种方法的差异
第一步:
确定SQLSERVER的进程ID
由于我的机器安装了四个SQLSERVER实例,所以看到会有四个进程
方法1:
在cmd窗口输入下面命令
tasklist|find/i"sqlservr"
方法2:
打开任务管理进行查看
方法3:
在SSMS里执行下面sql语句
SELECTSERVERPROPERTY('PROCESSID')ASsqlpid
方法4:
从SQLerrorlog里获取进程ID
EXEC[sys].[sp_readerrorlog]
第二步:
生成DUMP文件
方法1:
使用SqlDumper
最一般的方法就是使用SQLSERVER内部的SqlDumper程序,如果使用默认安装路径defaultinstallationpath会是
C:
\ProgramFiles\MicrosoftSQLServer\100\Shared
语法如下:
SqlDumper MinidumpFlags> 如果对语法不太熟悉,可以使用/? 查看帮助 一般我们会使用到的flag如下: 0x0120–Minidump(只会dump出栈和所加载的模块,是最小的dump类型,并且这是sqlserver正常情况下自动生成的dump类型) 0x01100–FullDump(这种dump类型包含整个进程空间,如果是64位系统并且SQLSERVER占用大量内存那么dump出来的文件将会非常大) 0x8100–FilteredDump(FilteredDump会dump出 StolenMemory和bufferpool部分) SqlDumper这个工具不但只可以dump出sqlserver,也可以dump出其他软件,进而生成dump文件 示例: Minidump: sqldumper311600x01200C: \Temp FullDump: sqldumper311600x011000C: \Temp FilteredDump: sqldumper311600x81000C: \Temp SQL进程里当前有45个线程 生成的minidump文件 dump文件的命名规则一般是: SQLDmpr####.mdmp 方法2: 使用debuggertools 例如使用WINDBG或其他debugger工具,将debugger附加到进程(使用PID)里面 WINDBG的下载地址: 下载下来进行安装,当然这时候可以同时下载公有符号包 下载地址: 安装好之后,就可以开始菜单看到WINDBG程序,点击他启动 选择AttachtoaProcess。 。 。 我们附加到进程ID为2168的这个sqlserver进程 一旦连接上,我们只需要使用.dump命令就能生成dump文件,语法如下: Optionsare: /a-Createdumpsforallprocesses(requires-u)创建所有进程的dump文件需要-u选项 /b[a]-PackagedumpinaCABanddeletedump包装dump文件为CAB格式然后删除dump文件 /c /j /f-Createalegacystylefulldump创建一个历史fulldump /m[acdfFhiprRtuw]-Createaminidump(default)创建一个minidump文件(默认选项) /o-Overwriteanyexistingfile覆盖任何已经存在的文件 /u-Appenduniqueidentifiertodumpname追加唯一标识符到dump文件名 “.dump/ma”命令对于创建一个完整的用户态内存dump文件是合适的 使用下面命令创建SQLSERVER的minidump文件放在C: \Temp路径下 .dump/maC: \Temp\sqlexpress_pid2168_dump.dmp 方法3: 使用SQLSERVER内置的命令 在SQLSERVER里面,你可以使用两种方法创建dump文件,第一,使用下面的undocumented命令手工(手工触发)创建 DBCCSTACKDUMP 这个命令会在SQLSERVER实例安装路径下的LOG文件夹生成dump文件,要生成fulldump,minidump,full-filtereddump需要配合不同的traceflag 要生成fulldump使用下面命令 --fulldump DBCCtraceon(2544,-1) go dbcctraceon(2546,-1) go dbccstackdump go dbccTRACEOFF(2544,2546,-1) go 生成minidump使用下面命令 --minidump dbcctraceon(2546,-1) go dbccstackdump GO dbccTRACEOFF(2544,2546,-1) GO 生成full-filtereddump使用下面命令 --full-filtereddump dbcctraceon(2551,-1) go dbccstackdump GO dbccTRACEOFF(2544,2546,2551,-1) go 首先看一下你的SQL实例是安装在哪里,打开服务器属性,看到根目录那一栏 然后执行上面的命令 fulldump minidump full-filtereddump 可以看到dump文件的大小都不一样 另一种方法是使用下面的另一个undocumented命令(SQLSERVER自动触发)创建DUMP文件 DBCCDUMPTRIGGE DBCCDUMPTRIGGER命令会在当有错误发生的时候触发dump的产生,当然你可以指定当发生某种特定错误的时候才触发 可以使用下面的命令当发生701错误的时候触发 --turnonTFsforfulldump DBCCTRACEON(2544,-1) GO DBCCTRACEON(2546,-1) GO --setDUMPTRIGGERforexception701 DBCCdumptrigger('set',701) GO --exception701occur BACKUPDATABASE[Temp2] TO DISK='E: \Temp21FULLBACKUP.BAK', DISK='E: \Temp22FULLBACKUP.bak', DISK='E: \Temp23FULLBACKUP.bak', DISK='E: \Temp24FULLBACKUP.bak', DISK='E: \Temp25FULLBACKUP.bak', DISK='E: \Temp26FULLBACKUP.bak' WITHBUFFERCOUNT=999999999,FORMAT --消息3013,级别16,状态1,第2行 --BACKUPDATABASE正在异常终止。 --消息701,级别17,状态17,第2行 --资源池'default'没有足够的系统内存来运行此查询。 --viewexceptionssetforDUMPTRIGGER DBCCTRACEON(3604,-1) GO DBCCdumptrigger('display') GO DBCCTRACEOFF(3604,-1) GO --Turnoffdumptriggerforexception701 DBCCdumptrigger('clear',701) GO 这时候在LOG文件夹下就会看到生成的dump文件 方法4: 添加SQLSERVER的启动参数 –y: 启动参数在SQL启动的时候能完成DBCCDUMPTRIGGER命令类似的功能 Formoreinformationreferto: 方法5: 在任务管理器里按右键->创建转储文件 这个方法不是太推荐,不是太可控 当点击按钮“创建转储文件”的时候,Windows会创建一个full dump文件 这个功能只能在Windows2008、Windows2008R2、Vista、Windows7上使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 调试 SQLSERVER 生成 dump 文件 方法