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-Addacomment(notsupportedinallformats)添加注释,不支持所有格式
/j-ProvideaJIT_DEBUG_INFOaddress提供一个JIT_DEBUG_INFO地址
/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上使用