web-dev-qa-db-ja.com

Microsoft SQL Serverインスタンスを停止すると、クエリの実行はどうなりますか?

MS SQL Serverインスタンスが長時間実行されるクエリを実行していると考えてください。サービスは、services.mscを介して停止されます。または、実際に発生しているように、サーバーが開発途上国にあり、停電が発生しているため、UPSによってシステムがシャットダウンされます。

これが発生すると、サービスはしばらくの間「停止」状態のままになり、そのプロセスのCPUとディスクI/Oはハイのままになります。

実行されているクエリはどうなりますか?サービスが「停止」状態になる前に完了することは許可されていますか、それともキャンセルされてロールバックされますか?

理想的には、私が知らない要因に応じて異なる動作を疑うので、答えとして信頼できるソース(Microsoftドキュメント)を探しています。つまり、クエリがロールバックすることもあれば、クエリが完了することもあります。おそらく、サービスは、トランザクションの進行状況と、ロールバックまたは完了の方が速いかどうかについて電話をかけます。

それが違いを生むのであれば、これはSQL2012です。

前もって感謝します!

3
alifen

NOWAITの有無にかかわらず、サーバーをシャットダウンするかどうかによって異なります。

から [〜#〜] msdn [〜#〜]

WITH NOWAITオプションが使用されていない限り、SHUTDOWNは次の方法でSQLServerをシャットダウンします。

  • ログインの無効化(sysadminおよびserveradmin固定サーバーロールのメンバーを除く)。
  • 現在実行中のTransact-SQLステートメントまたはストアドプロシージャが終了するのを待っています。すべてのアクティブなプロセスとロックのリストを表示するには、それぞれsp_whoとsp_lockを実行します。
  • すべてのデータベースにチェックポイントを挿入します。

SHUTDOWNステートメントを使用すると、sysadmin固定サーバーロールのメンバーがSQLServerを再起動するときに必要な自動回復作業の量が最小限に抑えられます。

NOWAITでシャットダウンする場合:

オプション。すべてのデータベースでチェックポイントを実行せずにSQLServerをシャットダウンします。 SQL Serverは、すべてのユーザープロセスを終了しようとした後に終了します。サーバーが再起動すると、未完了のトランザクションに対してロールバック操作が発生します。

デフォルトでは、現在実行中のトランザクションが終了するのを待ちます(NOWAITはオプションです)。

2