次の方法で共有


Sqldumper.exe ツールを使用して SQL Server でダンプ ファイルを生成する

この記事では、SQL Server に含まれるSqldumper.exe ツールの一般的なガイドラインについて説明します。 このツールは、さまざまな種類のダンプ ファイルを生成するために使用されます。

元の製品バージョン: SQL Server 2019、SQL Server 2017、SQL Server 2016、SQL Server 2014、SQL Server 2012、SQL Server 2008、SQL Server 2005
元の KB 番号: 917825

まとめ

Sqldumper.exe ツールは Microsoft SQL Server に含まれています。 SQL Server のメモリ ダンプ ファイルとデバッグ用の関連プロセスが生成されます。 この記事では、Sqldumper.exeを使用して Watson エラー報告またはデバッグ タスクのダンプ ファイルを生成する方法について説明します。

この記事では、ダンプ ファイルを生成する他の 2 つの方法についても説明します。

  • アタッチされた PowerShell スクリプト は、コマンド ライン オプションSQLDumper.exe自動化します。
  • DBCC STACKDUMP Transact-SQL (T-SQL) コマンドを使用して、SQL Server でダンプ ファイルを生成できます。

Sqldumper.exeを手動で実行する方法

SQL Server が最初にツールをインストールしたフォルダーのコンテキストで、Sqldumper.exe ツールを実行します。

既定では、Sqldumper.exeのインストール パスは <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe です。 <SQLServerInstall Drive> は、SQL Server をインストールしたドライブのプレースホルダーであることに注意してください。

Sqldumper.exe ツールを使用してダンプ ファイルを生成するには、次の手順に従います。

  1. SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared フォルダーを開きます。

    このフォルダー パスでは、 <number> は次のいずれかのバージョンのプレースホルダーです。

    • SQL Server 2019 の場合は 150
    • SQL Server 2017 の場合は 140
    • SQL Server 2016 の場合は 130
    • SQL Server 2014 の場合は 120
    • SQL Server 2012 の場合は 110
    • SQL Server 2008 の場合は 100
    • SQL Server 2005 の場合は 90
  2. Dbghelp.dll ファイルがこのフォルダーにあることを確認します。

  3. Start>Run を選択し、「cmd」と入力し、OK を選択します。

  4. コマンド プロンプトで、次のコマンドを入力して Enter キーを押します。

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    

    Note

    このフォルダー パスでは、 <number> は、前述のように SQL Server のバージョンで変更されるのと同じプレースホルダーです。

  5. 特定の種類のダンプ ファイルを生成するには、コマンド プロンプトで対応するコマンドを入力し、 Enter キーを押します:

    • 完全ダンプ ファイル:

      Sqldumper.exe <ProcessID> 0 0x01100
      
    • ミニ ダンプ ファイル:

      Sqldumper.exe <ProcessID> 0 0x0120
      
    • 間接的に参照されるメモリを含むミニ ダンプ ファイル (これは推奨されるオプションであり、メモリ ダンプ ファイルを自動生成するときに SQL Server によって既定で使用されます)。

      Sqldumper.exe <ProcessID> 0 0x0128
      
    • フィルター処理されたダンプ ファイル:

      Sqldumper.exe <ProcessID> 0 0x8100
      

    Note

    <ProcessID> は、ダンプ ファイルを生成する Windows アプリケーションのプロセス識別子のプレースホルダーです。

Sqldumper.exe正常に実行されると、ツールがインストールされているフォルダーにダンプ ファイルが生成されます。

生成Sqldumper.exeダンプ ファイルには、 SQLDmpr<xxxx>.mdmp のようなファイル名パターンがあります。

このパターンでは、 <xxxx> は、同じフォルダー内のファイル名が似ている他のファイルに基づいて決定される数が増えています。 指定したパターンに一致するファイルがフォルダー内にある場合は、作成日時を比較して目的のファイルを見つけることを検討してください。

Microsoft Windows アプリケーション プロセス識別子を取得する方法

Sqldumper.exe ツールを使用してダンプ ファイルを生成するには、ダンプ ファイルを生成する Windows アプリケーションのプロセス識別子が必要です。 プロセス識別子を取得する方法を次に示します。

  1. Ctrl + Alt + Delete キーを押し、Task Manager を選択します。
  2. [ Windows タスク マネージャー ] ダイアログ ボックスで、[ Processes ] タブを選択します。
  3. [ View メニューの [列の選択] 選択
  4. [列の選択] ダイアログ ボックスで、[PID (プロセス識別子)] チェック ボックスをオンにし、[OK を選択します。
  5. ダンプ ファイルを生成する Windows アプリケーションのプロセス識別子をメモします。 SQL Server アプリケーションの場合は、 Sqlservr.exe プロセスのプロセス識別子をメモします。
  6. [タスク マネージャー] を閉じます。

または、SQL Server エラー ログ ファイルを使用して、コンピューター上で実行されている SQL Server アプリケーションのプロセス識別子を取得します。 SQL Server エラー ログ ファイルの一部は、次の例のようになります。

2021-09-15 11:50:32.690 Server       Microsoft SQL Server 2019 (RTM-CU12) (KB5004524) - 15.0.4153.1 (X64)
    Jul 19 2021 15:37:34
    Copyright (C) 2019 Microsoft Corporation
    Enterprise Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19043: ) (Hypervisor)
2021-09-15 11:50:32.690 Server       UTC adjustment: -5:00
2021-09-15 11:50:32.690 Server       (c) Microsoft Corporation.
2021-09-15 11:50:32.690 Server       All rights reserved.
2021-09-15 11:50:32.690 Server       Server process ID is 7028.

Server process IDの後に表示される番号は、Sqlservr.exe プロセスのプロセス識別子です。

メモリ ダンプ ファイルの出力パス

SQLDumper.exeは、例外、アサート、非生成スケジューラなどの特定の問題を解決するためにメモリ ダンプが必要な場合に、主に SQL Server プロセスのメモリ ダンプ ファイルを生成します。 このような場合、SQL Server はSQLDumper.exeを呼び出して、そのプロセスのメモリ ダンプ ファイルを生成します。 既定では、メモリ ダンプ ファイルは SQL インスタンス MSSQL\LOG\ ディレクトリに格納されます。

既定のパスを変更する方法

たとえば、ダンプ ファイルのサイズが大きすぎる場合は、次の手順に従ってパスを変更できます。

  1. [SQL Server 構成マネージャー] を開きます。
  2. SQL Server Servicesで、調査中の SQL Server インスタンスを見つけます。
  3. そのエントリを右クリックし、 Properties を選択し、[ Advanced ] タブに移動します。
  4. そのダンプ ディレクトリを目的のパスに変更し、 OK を選択します。
  5. 新しい設定を有効にするには、(可能な場合は) SQL Server を再起動します。

Sqldumper.exe ツールを手動で使用して任意の Windows アプリケーションのダンプ ファイルを生成する場合、ダンプ ファイルは、Windows アプリケーションが現在使用しているメモリと同じ大きさになる可能性があります。 Sqldumper.exeがダンプ ファイルを書き込むドライブに十分なディスク領域があることを確認します。

コマンドでカスタム出力フォルダーを指定する

Sqldumper.exe ツールでダンプ ファイルを書き込むディレクトリを指定できます。 Sqldumper.exeを実行する前に、ディレクトリが既に存在している必要があります。 それ以外の場合、Sqldumper.exeは失敗します。 ダンプ ファイルの場所として UNC (汎用名前付け規則) パスを使用しないでください。 次の手順では、ミニ ダンプ ファイルの場所を指定する方法の例を示します。

  1. Start>Run を選択し、「cmd」と入力し、OK を選択します。

  2. コマンド プロンプトで、次のコマンドを入力して Enter キーを押します。

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    
  3. コマンド プロンプトで、次のコマンドを入力して Enter キーを押します。

    Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
    

    Note

    <MdumpPath> は、Sqldumper.exe ツールでダンプ ファイルを書き込むディレクトリのプレースホルダーです。 既定では、ファイルは現在のフォルダーに書き込まれます。

完全ダンプ ファイルまたはフィルター処理されたダンプ ファイルを生成するように指定した場合、ダンプ ファイルの生成にSqldumper.exe数分かかる場合があります。 所要時間は、次の変数によって異なります。

  • 現在使用 Sqlservr.exe メモリの量。
  • ダンプ ファイルを格納するためにツールによって使用されるドライブの書き込み速度。

この間、Sqldumper.exe ツールはコマンドを処理しません。 サーバーが応答を停止していることがわかります。 さらに、クラスターのフェールオーバーが発生する可能性があります。

アクセス許可の要件

Sqldumper.exeを実行するには、次のいずれかの方法を使用して Windows にサインインする必要があります。

  • コンピューター上の管理者のグループのメンバーであるアカウントを使用します。
  • SQL Server サービスが実行されているのと同じユーザー アカウントを使用します。

Sqldumper.exe ツールがリモート デスクトップまたはターミナル サービスを介して正常に動作するには、コンソール モードでリモート デスクトップまたはターミナル サービスを起動する必要があります。 たとえば、コンソール モードでリモート デスクトップを起動するには、 Start>Run を選択し、「 mstsc /console」と入力して、 OK を選択します。 ターゲット サーバーが Windows 2000 を実行している場合、 /コンソール オプションはサイレント 無視されます。 リモート デスクトップ経由でサーバーに接続できますが、コンソール セッションは使用しません。

Sqldumper.exeの実行後に現在のフォルダーにダンプ ファイルが生成されていない場合は、ツールによって生成されたコマンド ライン出力を調べて、障害の原因の可能性を特定します。 この情報は、現在のディレクトリの Sqldumper_errorlog.log ファイルにも記録されます。 次の 2 つのエラー メッセージとその原因を示します。

Message 原因
"OpenProcess failed 0x57 - パラメーターが正しくありません" Sqldumper.exe ユーティリティに無効なプロセス ID が渡されました。
"スレッド ID の値が無効です - <invalid パラメーター> パラメーター エラー" 無効なパラメーターが Sqldumper.exe ユーティリティに渡されました。

次のいずれかのエラー メッセージが生成された場合は、このメッセージを無視しても問題ありません。

  • "ミニダンプ 6 中の不明なコールバックの種類"
  • "ミニダンプ 7 中の不明なコールバックの種類"

ダンプ生成の影響

ユーザー モード プロセスのダンプ ファイルが要求されると (この記事で説明するように、スコープ外のオペレーティング システム カーネル ダンプとは対照的に)、ターゲット プロセス (ここではSQLServer.exe) は、ダンプ コンテンツをそのファイル ターゲットにシリアル化するためにかかる期間、固定されます。

固定とは、Windows クラスタリングの IsAlive and Looks Alive の実装などのリソース ポーリング メカニズムを含め、プロセスがユーザー要求や内部操作を実行できないことを意味します (その状況の処理方法の詳細については、「 クラスター フェールオーバーでのメモリ ダンプ」セクションを参照してください )。 ウォール クロック時間に依存するタイムアウトも、フリーズのために侵害される可能性があります。

前のステートメントに基づいて、凍結の期間はここで重要な要因であり、次の要因によって決まります。

  • 選択したダンプの タイプ
  • メモリ内の SQL Server プロセスの サイズ。既定のパラメーターを実行する 1 つのアクティブなインスタンスの場合、多くの場合、サーバーの 合計物理 RAM に近くなります
  • ダンプのターゲットとして使用されるディスクのパフォーマンス。

さらに、ディスク上のダンプ ファイルサイズを計画する必要があります。特に、複数のダンプが発生する可能性があり、大きい場合は既定以外のダンプの種類が選択されます。 Dump 型を確認して、想定される内容を確認してください。 既定では、一部のダンプ方法では、SQL Server インスタンスの \Log フォルダーにダンプが作成されます。既定では、単純な構成では、SQL Server のシステム ディスクとデータ + ログ ディスクも作成されます。 そのディスクを飽和状態に設定すると、SQL Server やシステムの可用性に重大な影響を与えます。

クラスター化システムへの影響を管理する

このプロセスは、ダンプの生成中に一時的に中断されます。 これは、SQL Server サービスの可用性に影響を与え、Always On コンテキスト (フェールオーバー クラスター インスタンスと可用性グループの両方) でリソースのフェールオーバーをトリガーする場合があります。 異なるプロセスのダンプ生成は、リソースに異なる影響を与えます。 ダンプ生成の ダンプの種類ダンプの種類 セクションをよくお読みください。

フェールオーバー クラスター化されたインスタンスまたは SQL Server の可用性グループ (AG) インスタンスで SQL Server ダンプをキャプチャすると、ダンプの完了に時間がかかりすぎる場合、クラスター化された SQL Server または AG が別のノードにフェールオーバーされる可能性があります。 これは、大量の RAM を使用するシステムや、フィルター処理されたメモリ ダンプまたはフル メモリ ダンプを生成する場合に特に問題になる可能性があります。 フェールオーバーを防ぐには、ダンプ ファイルをキャプチャする前に、次の設定を使用します。 変更は、ダンプ ファイルを取得した後に元に戻すことができます。

  • フェールオーバー クラスター化インスタンス (FCI) の場合:
    • クラスター管理者で SQL Server リソースを右クリックし、 リソースが失敗した場合は、再起動しないでください Policies タブを選択します。
    • Properties タブで、HealthCheck Timeout を大きくします。 たとえば、プロパティ値を 180 秒以上に設定します。 このタイムアウトに達すると、ポリシー リソースが失敗した場合は再起動されません は無視され、リソースが再起動されます。
    • Properties タブで、FailureConditionLevel 値を 0 に変更します。
  • AG の場合は、次のすべての設定を適用します。
    • セッション タイムアウトを増やします (たとえば、すべてのレプリカで 120 秒)。 SQL Server Management Studio (SSMS) で、構成するレプリカを右クリックし、 Properties を選択します。 Session timeout (seconds) フィールドを 120 秒に変更します。 詳細については、「 可用性レプリカ (SQL Server) のセッション タイムアウト期間を変更する」を参照してください。
    • すべてのレプリカの自動フェールオーバーを手動フェールオーバーに変更します。 SSMS でレプリカを右クリックし、 Properties を選択し、すべてのレプリカの 自動フェールオーバーProperties タブで手動フェールオーバーに変更します。詳細については、「 可用性レプリカ (SQL Server) のフェールオーバー モードを変更する」を参照してください。
    • LeaseTimeout60,000 ms (60 秒) に増やし、HealthCheckTimeout90,000 ミリ秒 (90 秒) に変更します。 クラスター管理者で AG リソースを右クリックし、 Propertiesを選択し、 Properties タブに切り替えて両方の設定を変更します。 詳細については、「 HealthCheckTimeout プロパティ設定の構成」を参照してください。

SQL Server への影響を軽減するための製品の機能強化

ダンプ ファイルのサイズやメモリ ダンプの生成時間を短縮するために、SQL Server の最新バージョンに 4 つの主要な機能強化が追加されました。

ビットマップ フィルター処理メカニズム

SQL Server によってビットマップが割り当てられ、フィルター処理されたダンプから除外する対象のメモリ ページが追跡されます。 Sqldumper.exe でビットマップが読み取られ、ページがフィルターで除外されます。他のメモリ マネージャー メタデータの読み取りは必要ありません。 ビットマップが有効または無効になっている場合、SQL Server エラー ログに次のメッセージが表示されます。

Page exclusion bitmap is enabled. および Page exclusion bitmap is disabled.

  • SQL Server 2016

    SQL Server 2016 SP2 CU13 以降では、ビットマップ フィルター処理は既定で有効になっています。

  • SQL Server 2017

    • これは、RTM から CU15 では使用できません。
    • SQL Server 2017 CU16 では、T8089 によるビットマップ フィルター処理を有効にし、T8089 をオフにすることで無効にすることができます。
    • SQL Server 2017 CU20 以降では、ビットマップ フィルター処理は既定で有効になっています。 トレース フラグ T8089 は適用されなくなり、オンにすると無視されます。 ビットマップ フィルタリングは T8095 を介して無効にすることができます。
  • SQL Server 2019

    これは、SQL Server 2019 RTM では既定で有効になっています。 T8095 経由で無効にすることができます。

同じ問題での繰り返しダンプの除去

同じ問題で繰り返されるメモリ ダンプは排除されます。 スタック署名を使用すると、SQL エンジンは例外が既に発生しているかどうかを追跡し、既にある場合は新しいメモリ ダンプを生成しません。 これは、アクセス違反、スタック オーバーフロー、アサート、インデックス破損の例外に適用されます。 これにより、メモリ ダンプで使用されるディスク領域が大幅に削減され、ダンプを生成するためにプロセスが一時的にフリーズすることはありません。 これは SQL Server 2019 で追加されました。

エラー ログの出力の短縮

単一のメモリ ダンプから SQL Server エラー ログで生成されたコンテンツは、圧倒的な量になるだけでなく、すべての情報をエラー ログのテキスト形式にシリアル化するために必要な時間が原因で、メモリ ダンプを生成するプロセスを遅くすることもできます。 SQL Server 2019 では、ダンプ生成時のエラー ログに格納されているコンテンツが大幅に削減され、次のようになります。

DateTimespidS pid    **Dump thread - spid = 0, EC = 0x0000015C7169BF40
DateTimespidS pid    *
DateTimespidS pid    *User initiated stack dump. This is not a server exception dump.
DateTimespidS pid    *
DateTimespidS pid    Stack Signature for the dump is 0x00000000788399E5
DateTimespidS pid    External dump process return code 0x20000001.
External dump process returned no errors.

以前の SQL Server では、たとえば、ユーザーによって手動ダンプがトリガーされたときに、各セッションまたはスレッドの情報が出力されていました。

メモリ ダンプの並列圧縮

ダンプをより高速に生成し、サイズを小さくするために、圧縮メモリ ダンプ機能は、 SQL Server 2022 CU8 および SQL Server 2019 CU23 で導入されました。 アクティブ化すると、Sqldumper.exeは複数のスレッドを作成してプロセスのメモリを同時に読み取り、圧縮してからダンプ ファイルに保存します。 このマルチスレッドの並列圧縮により、ファイル サイズが削減され、完全ダンプとフィルター処理されたダンプで使用される場合のダンプ プロセスが高速化されます。

トレース フラグ 2610 を有効にして、圧縮メモリ ダンプを有効にすることができます。

DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)

または、sql Server インスタンスにスタートアップ パラメーターとして -T2610 を追加して、常に圧縮メモリ ダンプを作成することもできます。

Sqldumper.exeを手動で実行する場合は、 -zdmp パラメーターを使用して圧縮メモリ ダンプをキャプチャできます。 例えば次が挙げられます。

Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp

-cpu:X パラメーターを使用して、圧縮ダンプの作成に使用できるコアSqldumper.exe数を制限することもできます。ここで、X は CPU の数です。 このパラメーターは、コマンド ラインからSqldumper.exeを手動で実行する場合にのみ使用できます。

Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8

メモリ ダンプの作成を妨げるか遅延する要因

遅延を引き起こしたり、メモリ ダンプの作成を妨げる要因は次のとおりです。

  • メモリ ダンプが書き込まれる IO パスのパフォーマンスが低下します。 このような場合は、ディスク I/O パフォーマンスを調査して解決することが、次の論理的な手順です。
  • ウイルス対策またはその他の監視ソフトウェアがSQLDumper.exeに干渉しています。 場合によっては、サードパーティ製ソフトウェアの迂回 ReadProcessMemory 関数があります。 これにより、ダンプ期間が大幅に長くなる可能性があります。 これらの問題のほとんどを解決するには、干渉するソフトウェアを無効にするか、除外リストにSQLDumper.exeを追加します。

ダンプの種類

次のメソッドを使用して、 mini ダンプ、フル ダンプ、フィルター処理されたダンプ の 3 種類のダンプを生成できます

参照されるメモリを持つミニ ダンプ

この種類のメモリ ダンプは、プロセスのすべてのアクティブなスレッド ("スレッド スタック") のスナップショットであり、スレッド スタックによって参照されるメモリの限られた抽出と、その他のキー プロセスまたはスレッド データです。 通常、サイズは数メガバイトであり、生成が高速です (1 秒未満から数秒)。 (何百もの CPU が間接的に SQL Server プロセスで大量のスレッドを駆動する) 大規模なサーバー システムでも、20 ~ 30 MB を超えることはめったにありません。ミニ ダンプのサイズは、SQL Server プロセスのサイズと共に拡大しません。 このダンプの種類は、例外、スケジューラの問題、ラッチの問題、データベースの破損、アサートでメモリ ダンプを自動的に生成するときに SQL Server で使用される既定の種類です。

Note

SQL Server は、組み込みのインストルメンテーションの一部として、特定の状況で自動化された "診断ミニ ダンプ" を生成します。 したがって、この操作は、SQL Server が必要に応じて自動的にトリガーできるほど安全であると見なされます。

完全ダンプ

完全メモリ ダンプは、アクティブなターゲット プロセス領域の完全なコピーです。 そのため、すべてのスレッド状態、すべてのプロセスに割り当てられたメモリ、読み込まれたすべてのモジュールが含まれます。 したがって、完全ダンプのサイズは、SQL Server プロセスとほぼ同じです。これは、システム RAM の合計と同じ大きさ 可能性があります。 1 つの SQL Server インスタンス専用の大規模なサーバーでは、数百ギガバイト以上のファイルを意味する可能性があります。 言うまでもなく、このようなファイルは生成に長い時間がかかるので、長期の凍結を誘発します。 ダンプのファイル ターゲットのディスク パフォーマンスは、フリーズ時間に大きく影響します。 この種類のダンプは、次の説明で説明するように、今日の SQL Server ではほとんど使用しません。

フィルター処理されたダンプ

SQL Server を実行している一般的なサーバーの RAM サイズが着実に増加するにつれて、完全ダンプは扱いにくくなります。 したがって、フィルター処理されたダンプが実装されます。 フィルター処理されたダンプは完全ダンプのサブセットであり、SQL Server メモリの大きな領域はディスクに書き込まれず、その場で除外されます。 通常、除外されたメモリはトラブルシューティングに付加価値を提供しません。 たとえば、データ/インデックス ページや、Hekaton データ ページやログ プール メモリなどの一部の内部キャッシュがあります。 このフィルター処理されたダンプの結果、完全ダンプよりもファイルが小さくなりますが、ダンプは引き続きほぼすべての有用性を保持します。 フィルター処理されたダンプは、ミニ ダンプでは十分でない大多数の状況で、完全ダンプを優先オプションとして置き換えました。 サイズの減少は完全なダンプと比較して異なる場合がありますが、それでもかなり大きなファイルであり、多くの場合、SQL Server プロセス サイズの 30 ~ 60% です。 したがって、十分な安全マージンを残す、最悪のオプションとして完全ダンプと同じ大きさの可能なサイズを計画することをお勧めします。 フィルター処理されたダンプは、すべてのケースで完全なダンプよりも必ずしも高速に生成できるとは限りません。これは、回避された IO の数に関連する利益がフィルター ロジックの実装に必要な時間を超えているかどうかの問題です (ディスク速度と CPU/RAM 速度が影響を受けます)。

次のクエリを使用して、フィルター処理されたダンプ サイズの大まかな見積もりを取得できます。 ほとんどのデータページまたはインデックスページはダンプから除外されますが、排他的にラッチされ、変更されるページは省略されません。

SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'

Sqldumper.exeを使用して、任意の Microsoft Windows アプリケーションの必要に応じてダンプ ファイルを生成できるため、フィルター処理されたダンプ オプションの使用を検討できます。 ただし、フィルター処理されたダンプ ファイルは、SQL Server のコンテキストでのみ適用可能で意味があります。 ミニダンプ、完全ダンプ ファイル、または SQL Server 以外のアプリケーションを正常に生成できます。

SQL Server プロセスは、Sqldumper.exe ツールを内部的に呼び出して、プロセスで例外が発生したときにダンプ ファイルを生成します。 SQL Server はパラメーターをSqldumper.exeに渡します。 トレース フラグを使用して、例外またはアサーションが発生したときに SQL Server が既定でツールに渡すパラメーターを変更できます。 これらのトレース フラグの範囲は 2540 から 2559 です。 これらのトレース フラグのいずれかを使用して、生成SQLDumper.exe既定のダンプの種類を変更できます (既定では、参照されるメモリを持つミニ ダンプです)。 例えば次が挙げられます。

  • トレース フラグ 2551: フィルター処理されたメモリ ダンプを生成します。
  • トレース フラグ 2544: 完全メモリ ダンプを生成します。
  • トレース フラグ 8026: SQL Server は、ダンプを 1 回生成した後にダンプ トリガーをクリアします。

2 つ以上のトレース フラグがアクティブな場合は、最大メモリ ダンプを示すオプションが使用されます。 たとえば、トレース フラグ 2551 と 2544 を使用すると、SQL Server によって完全なメモリ ダンプが作成されます。

クラスター のフェールオーバー時にメモリ ダンプを生成する

クラスター のフェールオーバー シナリオでは、SQL Server リソース DLL は、トラブルシューティングに役立つフェールオーバーが発生する前にダンプ ファイルを取得できます。 SQL Server リソース DLL で SQL Server リソースが失敗したと判断した場合、SQL Server リソース DLL では Sqldumper.exe ユーティリティを使用して、SQL Server プロセスのダンプ ファイルを取得します。 Sqldumper.exe ツールでダンプ ファイルが正常に生成されるようにするには、次の 3 つのプロパティを前提条件として設定する必要があります。

  • SqlDumperDumpTimeOut

    ユーザー指定のタイムアウト。リソース DLL は、リソース DLL が SQL Server サービスを停止する前に、ダンプ ファイルが完了するまで待機します。

  • SqlDumperDumpPath

    Sqldumper.exe ツールによってダンプ ファイルが生成される場所。

  • SqlDumperDumpFlags

    Sqldumper.exe使用するフラグ。

いずれかのプロパティが設定されていない場合、Sqldumper.exeはダンプ ファイルを生成できません。 リソースがオンラインになると、イベント ログとクラスター ログの両方に警告メッセージが記録されます。

SQL Server 2012 以降のバージョンでの SQLDumper のクラスター構成

ALTER SERVER CONFIGURATION (T-SQL) コマンドを使用して、これらのプロパティを変更できます。 例えば次が挙げられます。

ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpTimeOut = 0;
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpPath = 'C:\temp\';
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpFlags = 296;

または、PowerShell スクリプトを使用することもできます。 たとえば、名前付きインスタンスSQL2017AGの場合:

Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpPath" -Value "C:\temp"
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpFlags" -Value 296
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpTimeOut" -Value 0

設定が適用されているかどうかを確認するには、次の PowerShell コマンドを実行します。

Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter

SQL Server 2008/2008 R2 または Windows 2012 以前のバージョンの SQLDumper のクラスター構成

cluster resource コマンドを使用してクラスター フェールオーバーのSqldumper.exe ユーティリティプロパティを設定するには、次の手順に従います。

  1. Start>Run を選択し、「cmd」と入力し、OK を選択します。
  2. プロパティごとに、コマンド プロンプトで対応するコマンドを入力し、 Enter キーを押します:
    • SqlDumperDumpFlags プロパティ

      特定のダンプ ファイルの SqlDumperDumpFlags プロパティを設定するには、コマンド プロンプトで対応するコマンドを入力し、 Enter キーを押します:

      • すべてのスレッド フル ダンプ ファイル

        • 既定のインスタンス

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
          
        • [名前付きインスタンス]

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • すべてのスレッド ミニダンプ ファイル

        • 既定のインスタンス

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
          
        • [名前付きインスタンス]

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
          
      • フィルター処理されたすべてのスレッド ダンプ ファイル

        • 既定のインスタンス

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
          
        • [名前付きインスタンス]

          cluster resource "SQL Server  (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
          
    • SqlDumperDumpPath プロパティ

      cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
      

      Note

      <DirectoryPath> は、ダンプ ファイルが生成されるディレクトリのプレースホルダーであり、引用符 (" ") で指定する必要があります。

    • SqlDumperDumpTimeOut プロパティ

      cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
      

      Note

      <Timeout> は、タイムアウト (ミリ秒単位) のプレースホルダーです。

ツールが SQL Server プロセスのダンプ ファイルを生成するのにかかる時間は、コンピューターの構成によって異なります。 メモリの量が多いコンピューターの場合、時間が長くなることがあります。 プロセスに必要な時間を見積もるために、Sqldumper.exe ツールを使用してダンプ ファイルを手動で生成します。 SqlDumperDumpTimeOut プロパティの有効な値は、10,000 ms から MAXDWORD です。MAXDWORD は、DWORD データ型 (4294967295) の範囲内の最大値を表します。

設定が有効になっていることを確認するには、次のコマンドを実行します。

cluster resource "SQL Server" /priv

クラスター フェールオーバーのSqldumper.exeプロパティを削除する

クラスター フェールオーバーのSqldumper.exe ツールのプロパティを削除するには、次の手順に従います。

  1. Start>Run を選択し、「cmd」と入力し、OK を選択します。

  2. 特定のプロパティについては、コマンド プロンプトで対応するコマンドを入力し、 Enter キーを押します

    • SqlDumperDumpFlags プロパティ

      • 既定のインスタンス

          cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
        
      • [名前付きインスタンス]

          cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
        
    • SqlDumperDumpPath プロパティ

      • 既定のインスタンス

        cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
        
      • [名前付きインスタンス]

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
        
    • SqlDumperDumpTimeOut プロパティ

      • 既定のインスタンス

        cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
        
      • [名前付きインスタンス]

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
        

DBCC STACKDUMP の使用方法

DBCC STACKDUMP コマンドは、SQL Server インスタンスのインストールの LOG ディレクトリにメモリ ダンプを作成するのに役立ちます。 既定では、このコマンドは、サイズが制限され、SQL Server プロセスの状態を反映するのに十分なミニダンプをすべてのスレッドで作成します。 SQL Server クライアントで次のコマンドを実行します。

DBCC STACKDUMP

SQL Server 2019 の DBCC STACKDUMP の拡張機能については、「 SQL Server 2019 で導入された DBCC STACKDUMP 機能の拡張を参照してください。

このメソッドでフィルター処理されたダンプを作成できるようにするには、次のコマンドを使用してトレース フラグ 2551 を有効にします。

DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP

完全ダンプを作成するには、トレース フラグ 2544 を使用します。

ダンプ ファイルを取得した後は、コマンド DBCC TRACEOFF (<TraceNumber>, -1); を使用してトレース フラグを無効にして、SQL Server のそれ以降のすべての自己診断ミニダンプをより大きなダンプに誤ってアップグレードしないようにする必要があります。 このコマンドでは、 <TraceNumber> は、2551 や 2544 など、以前に有効にしたトレース フラグです。 例えば次が挙げられます。

DBCC TRACEOFF(2551, -1)

どのトレース フラグがアクティブなままかわからない場合は、次のコマンドを実行します。

DBCC TRACESTATUS(-1)

空の結果セットは、トレース フラグがアクティブでないことを示します。 逆に、2551 がまだアクティブな場合は、次のように表示されます。

TraceFlag 状態 グローバル セッション
2551 1 1 0

Note

DBCC TRACEONによって有効になっているtraceflagは、サービスの再起動後にリセット (削除) されます。

SQL Server 2019 で導入された拡張 DBCC STACKDUMP 機能

SQL Server 2019 CU2 以降では、 DBCC STACKDUMP コマンドが拡張され、ミニ、フィルター処理、完全ダンプなど、さまざまな種類のダンプの生成がサポートされました。 このコマンドにより、トレース フラグを使用する必要がなくなります。 また、メモリ ダンプで生成される他のテキスト ファイル内のテキスト出力を制限することもできます。 これにより、メモリ ダンプの生成にSQLDumper.exeかかる時間で、パフォーマンスが向上する可能性があります。

DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]

TEXT_DUMP = LIMITEDが既定のオプションです。 SQLDump000X.txt ファイルで詳細な出力を受け取る場合は、TEXT_DUMP = DETAILEDを使用できます。

.txt ファイル内の出力が制限されたフィルター処理されたダンプを生成するには、次のコマンドを実行します。

DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED

PowerShell スクリプトを使用して SQLDumper でダンプ ファイルを生成する方法

  • 次のコードを PS1 ファイルとして保存します (例: SQLDumpHelper.ps1

    コードの詳細

    $isInt = $false
    $isIntValDcnt = $false
    $isIntValDelay = $false
    $SqlPidInt = 0
    $NumFoler = ""
    $OneThruFour = ""
    $SqlDumpTypeSelection = ""
    $SSASDumpTypeSelection = ""
    $SSISDumpTypeSelection = ""
    $SQLNumfolder = 0
    $SQLDumperDir = ""
    $OutputFolder = ""
    $DumpType = "0x0120"
    $ValidPid
    $SharedFolderFound = $false
    $YesNo = ""
    $ProductNumber = ""
    $ProductStr = ""
    
    Write-Host ""
    Write-Host "`******************************************************************"
    Write-Host "This script helps you generate one or more SQL Server memory dumps"
    Write-Host "It presents you with choices on:`
                -target SQL Server process (if more than one)
                -type of memory dump
                -count and time interval (if multiple memory dumps)
    You can interrupt this script using CTRL+C"
    Write-Host "***********************************************************************"
    
    # check for administrator rights
    # debugging tools like SQLDumper.exe require Admin privileges to generate a memory dump
    
    if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
    {
        Write-Warning "Administrator rights are required to generate a memory dump!`nPlease re-run this script as an Administrator!"
        return
    }
    
    # what product would you like to generate a memory dump
    while ($true)
    {
        Write-Host "Which product would you like to generate a memory dump of?" -ForegroundColor Yellow
        Write-Host "1) SQL Server"
        Write-Host "2) SSAS (Analysis Services)"
        Write-Host "3) SSIS (Integration Services)"
        Write-Host "4) SSRS (Reporting Services)"
        Write-Host "5) SQL Server Agent"
        Write-Host ""
        $ProductNumber = Read-Host "Enter 1-5>"
    
        if ($ProductNumber -in 1,2,3,4,5)
        {
            break
        }
        Write-Host "`nPlease enter a valid number from list above!`n"
        Start-Sleep -Milliseconds 300
    }
    
    if ($ProductNumber -eq "1")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlservr*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SQL Server"
    }
    elseif ($ProductNumber -eq "2")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq msmdsrv*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSAS (Analysis Services)"
    }
    elseif ($ProductNumber -eq "3")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq msdtssrvr*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSIS (Integration Services)"
    }
    elseif ($ProductNumber -eq "4")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq reportingservicesservice*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSRS (Reporting Services)"
    }
    elseif ($ProductNumber -eq "5")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlagent*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SQL Server Agent"
    }
    
    if ($SqlTaskList.Count -eq 0)
    {
        Write-Host "There are currently no running instances of $ProductStr. Exiting..." -ForegroundColor Green
        break
    }
    
    # if multiple SQL Server instances, get the user to input PID for desired SQL Server
    if ($SqlTaskList.Count -gt 1)
    {
        Write-Host "More than one $ProductStr instance found."
    
        $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host
    
        # check input and make sure it is a valid integer
        while ($true)
        {
            Write-Host "Please enter the PID for the desired SQL service from list above" -ForegroundColor Yellow
            $SqlPidStr = Read-Host ">"
    
            if( $SqlPidStr -in $SqlTaskList.PID)
            {
                $SqlPidInt = [int]$SqlPidStr
                break
            }
        }
    
        Write-Host "Using PID=$SqlPidInt for generating a $ProductStr memory dump" -ForegroundColor Green
        Write-Host ""
    
    }
    else # if only one SQL Server/SSAS on the box, go here
    {
        $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host
        $SqlPidInt = [convert]::ToInt32($SqlTaskList.PID)
    
        Write-Host "Using PID=", $SqlPidInt, " for generating a $ProductStr memory dump" -ForegroundColor Green
        Write-Host ""
    }
    
    # dump type
    
    if ($ProductNumber -eq "1")  # SQL Server memory dump
    {
        # ask what type of SQL Server memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Mini-dump with referenced memory " -NoNewLine; Write-Host "(Recommended)"
            Write-Host "3) Filtered dump " -NoNewline; Write-Host "(Not Recommended)" -ForegroundColor Red
            Write-Host "4) Full dump  " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red
            Write-Host ""
            $SqlDumpTypeSelection = Read-Host "Enter 1-4>"
    
            if ($SqlDumpTypeSelection -in 1,2,3,4)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SqlDumpTypeSelection)
        {
            "1" { $DumpType="0x0120"; break }
            "2" { $DumpType="0x0128"; break }
            "3" { $DumpType="0x8100"; break }
            "4" { $DumpType="0x01100"; break }
            default { "0x0120"; break }
        }
    }
    elseif ($ProductNumber -eq "2")  # SSAS dump
    {
        # ask what type of SSAS memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Full dump  " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red
            Write-Host ""
            $SSASDumpTypeSelection = Read-Host "Enter 1-2>"
    
            if ($SSASDumpTypeSelection -in 1,2)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SSASDumpTypeSelection)
        {
            "1" {$DumpType="0x0";break}
            "2" {$DumpType="0x34";break}
            default {"0x0120"; break}
        }
    }
    elseif ($ProductNumber -in 3,4,5)  # SSIS/SSRS/SQL Agent dump
    {
        # ask what type of SSIS memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Full dump"
            Write-Host ""
            $SSISDumpTypeSelection = Read-Host "Enter 1-2>"
    
            if ($SSISDumpTypeSelection -in 1,2)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SSISDumpTypeSelection)
        {
            "1" { $DumpType="0x0"; break }
            "2" { $DumpType="0x34"; break }
            default { "0x0120"; break }
        }
    }
    
    # Sqldumper.exe PID 0 0x0128 0 c:\temp
    # output folder
    while($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder))
    {
        Write-Host ""
        Write-Host "Where would your like the memory dump stored (output folder)?" -ForegroundColor Yellow
        $OutputFolder = Read-Host "Enter an output folder with no quotes (e.g. C:\MyTempFolder or C:\My Folder)"
        if ($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder))
        {
            Write-Host "'" $OutputFolder "' is not a valid folder. Please, enter a valid folder location" -ForegroundColor Yellow
        }
    }
    
    # strip the last character of the Output folder if it is a backslash "\". Else Sqldumper.exe will fail
    if ($OutputFolder.Substring($OutputFolder.Length-1) -eq "\")
    {
        $OutputFolder = $OutputFolder.Substring(0, $OutputFolder.Length-1)
        Write-Host "Stripped the last '\' from output folder name. Now folder name is  $OutputFolder"
    }
    
    # find the highest version of SQLDumper.exe on the machine
    $NumFolder = dir "C:\Program Files\Microsoft SQL Server\1*" | Select-Object @{name = "DirNameInt"; expression={[int]($_.Name)}}, Name, Mode | Where-Object Mode -Match "da*" | Sort-Object DirNameInt -Descending
    
    for( $j=0; $j -lt $NumFolder.Count; $j++)
    {
        $SQLNumfolder = $NumFolder.DirNameInt[$j]   # start with the highest value from sorted folder names - latest version of dumper
        $SQLDumperDir = "C:\Program Files\Microsoft SQL Server\" + $SQLNumfolder.ToString() + "\Shared\"
        $TestPathDumperDir = $SQLDumperDir + "sqldumper.exe"
    
        if (Test-Path -Path $SQLDumperDir)
        {
            break
        }
    }
    
    # build the SQLDumper.exe command e.g. (Sqldumper.exe 1096 0 0x0128 0 c:\temp\)
    
    $cmd = "$([char]34)"+$SQLDumperDir + "sqldumper.exe$([char]34)"
    $arglist = $SqlPidInt.ToString() + " 0 " +$DumpType +" 0 $([char]34)" + $OutputFolder + "$([char]34)"
    Write-Host "Command for dump generation: ", $cmd, $arglist -ForegroundColor Green
    
    # do-we-want-multiple-dumps section
    Write-Host ""
    Write-Host "This utility can generate multiple memory dumps, at a certain interval"
    Write-Host "Would you like to collect multiple memory dumps (2 or more)?" -ForegroundColor Yellow
    
    # validate Y/N input
    while ($true)
    {
        $YesNo = Read-Host "Enter Y or N>"
    
        if ($YesNo -in "y","n")
        {
            break
        }
        Write-Host "Not a valid 'Y' or 'N' response"
    }
    
    # get input on how many dumps and at what interval
    if ($YesNo -eq "y")
    {
        [int]$DumpCountInt=0
        while (1 -ge $DumpCountInt)
        {
            Write-Host "How many dumps would you like to generate for this $ProductStr ?" -ForegroundColor Yellow
            $DumpCountStr = Read-Host ">"
    
            if ([int]::TryParse($DumpCountStr, [ref]$DumpCountInt) -and $DumpCountInt -gt 1)
            {
                break
            }
            Write-Host "Please enter a number greater than one." -ForegroundColor Red
        }
    
        [int]$DelayIntervalInt=0
        while ($true)
        {
            Write-Host "How frequently (in seconds) would you like to generate the memory dumps?" -ForegroundColor Yellow
            $DelayIntervalStr = Read-Host ">"
    
            if ([int]::TryParse($DelayIntervalStr, [ref]$DelayIntervalInt) -and $DelayIntervalInt -gt 0)
            {
                break
            }
            Write-Host "Please enter a number greater than zero." -ForegroundColor Red
        }
    
        Write-Host "Generating $DumpCountInt memory dumps at a $DelayIntervalStr-second interval" -ForegroundColor Green
    
        # loop to generate multiple dumps
        $cntr = 0
        while ($true)
        {
            Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist
            $cntr++
    
            Write-Host "Generated $cntr memory dump(s)." -ForegroundColor Green
    
            if ($cntr -ge $DumpCountInt)
            {
                break
            }
            Start-Sleep -S $DelayIntervalInt
        }
    
        # print what files exist in the output folder
        Write-Host ""
        Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green
        $MemoryDumps = $OutputFolder + "\SQLDmpr*"
        Get-ChildItem -Path $MemoryDumps
    
        Write-Host ""
        Write-Host "Process complete"
    }
    else # produce just a single dump
    {
        Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist
    
        # print what files exist in the output folder
        Write-Host ""
        Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green
        $MemoryDumps = $OutputFolder + "\SQLDmpr*"
        Get-ChildItem -Path $MemoryDumps
    
        Write-Host ""
        Write-Host "Process complete"
    }
    
    Write-Host "For errors and completion status, review SQLDUMPER_ERRORLOG.log created by SQLDumper.exe in the output folder '$OutputFolder'.`nOr if SQLDumper.exe failed, look in the folder from which you are running this script."
    
  • 次のコマンドを使用して、管理者としてコマンド プロンプトから実行します。

    Powershell.exe -File SQLDumpHelper.ps1
    
  • または、Windows PowerShell コンソールから実行し、次のコマンドを使用して管理者として実行します。

    .\SQLDumpHelper.ps1
    

Note

システムで PowerShell スクリプトを実行したことがない場合は、次のエラー メッセージが表示されることがあります。

"ファイル ...このシステムでは実行中のスクリプトが無効になっているため、SQLDumpHelper.ps1 を読み込めません。

コマンドを実行する機能を有効にするには、次の手順に従います。

  1. 管理者として実行 オプションを使用して、Windows PowerShell コンソールを起動します。 実行ポリシーを変更できるのは、コンピューター上の管理者グループのメンバーだけです。

  2. 次のコマンドを使用して、署名されていないスクリプトの実行を有効にします。

    Set-ExecutionPolicy RemoteSigned
    

    Note

    これにより、ローカル コンピューターで作成した署名されていないスクリプトと、インターネットから署名されたスクリプトを実行できます。