日期:2014-05-18  浏览次数:20437 次

SQL Server 转储的介绍 I

转储的英文单词是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 2008,因此SQLDumper位于C:\Program Files\Microsoft SQL Server\100\Shared下,我们可以运行SQLDumper /? 查看其使用方法

C:\Program Files\Microsoft SQL Server\100\Shared>SqlDumper.exe /?
Usage: SqlDumper.exe [ProcessID [ThreadId [Flags[:MiniDumpFlags] [SqlInfoPtr [DumpDir [ExceptionRecordPtr [ContextPtr [E
xtraFile]]]]]]]] [-I<InstanceName>] [-S<ServiceName>][-remoteservers:[print|dump|freeze|resume|remote:guid\dumporigin\si
gnature\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

  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 为900,想dump所有的内存信息,那就可以用下面的命令来进行:
C:\Program Files\Microsoft SQL Server\100\Shared>SqlDumper.exe 900 0x0010
其中,0x0010 表示all_memory,这样,在C:\Program Files\Microsoft SQL Server\100\Shared目录下会产生SQLDmprnnn.mdmp的文件,这就是转储文件(.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

SQL code

                    香港云服务器 免备案 云主机VPS 国内 独立IP 独享15M 月付SSD