• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL Server のシャットダウンのプロセスについて)

SQL Serverのシャットダウンプロセスについて

このQ&Aのポイント
  • SQL Serverのシャットダウンプロセスについてのご質問です。C#で作成されたアプリケーションからExitWindowsEx関数を使用してSQL Serverを強制的にシャットダウンしているようですが、このシャットダウンプロセスについて詳細を教えていただけませんか?
  • 強制的にSQL Serverをシャットダウンした場合のプロセスについて教えてください。お使いのアプリケーションではExitWindowsEx関数を使用しているようですが、どのような手順でシャットダウンが行われているのか詳細が知りたいです。
  • SQL Serverのシャットダウンプロセスに関する疑問です。お使いのアプリケーションではExitWindowsEx関数を使用して強制的にシャットダウンしているようですが、このプロセスについて詳しく教えていただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.4

基本的におっしゃったような手順がGoodかと思います。 ただ、気になるのは、 「もしなんらかの事象でSQLServerのインスタンスが停止しない場合は、強制終了等の保険の手段をもって終了する」 のところですね。 この場合、TerminateProcessというAPIを使って、SQL Serverのサービス(インスタンス)を強制終了するようにすべきですね。 C#で書くと、 [DllImport("Coredll.DLL")] public static extern int TerminateProcess(IntPtr hProcess, int uExitCode); を定義して、TerminateProcessを呼び出す必要があります。 hProcessは、OpenProcessというAPIで、SQL Serverのサービス用 プロセスを取得したもの、uExitCodeは、 確かSERVICE_CONTROL_SHUTDOWN?(忘れてしまいましたが)を 設定し、TerminateProcessすれば、問題ありません。 # OpenProcessもTerminateProcessも.NET Frameworkの   マネージコードではなく、アンマネージ(Win32)用の   Functionになりますので、DllImportして、呼び出してください。 # OpenProcess、TerminateProcessのサンプルがVC++のものは   たくさんありますが、C#用のものが少ないみたいなので   少しネットでお探しになってみることをお勧めします。   (私も半分忘れてます) こうすれば、(2)は、より安全できると思います。 参考になれば幸いです。

t-usa
質問者

補足

kero_mio 様 ご教示ありがとうございました。 これで、ちょっと検討してみます。 本当に、参考になるアドバイスを頂きありがとうございました。

その他の回答 (3)

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.3

なるほど。 インスタンスの停止手順がどういう手順かということですね。 納得しました。 まず、OracleとSQL Serverでは、インスタンスの起動・停止方法は まったく異なります。 というのも、SQL Serverは先日も申し上げた通り、SCM(Service Control Manager) の管理下にありますので、 インスタンスの停止も開始もすべて、SCMを使ってやる必要があります。 なので、停止手順は、「SQL Serverのサービスを停止する」これだけです。 もし、C#から、停止するコードを書くのであれば、先日ご紹介しました、 using System.ServiceProcess; ServiceController controller = new ServiceController(); controller.MachineName = "."; controller.ServiceName = "MSSQL$SQLEXPRESS"; string status = controller.Status.ToString(); controller.Stop(); で十分できますし、また、DOSコマンドで確実にやりたいので あれば、 net stop "MSSQL$SQLEXPRESS" だけでOKで、それ以外の手順は何も要りません。 #Expressなので、Agentサービスはないと思いますが、  他のバージョンであれば、Agentサービスも停止してあげる  必要があります。 詳しくは、 http://technet.microsoft.com/ja-jp/library/ms190236.aspx にございますので、ご確認頂けたらと思います。

参考URL:
http://technet.microsoft.com/ja-jp/library/ms190236.aspx
t-usa
質問者

補足

kero_mio 様 ご教示ありがとうございます。 あと、ご返信が送れて大変申し訳ありませんでした。 SCMですが、自分は、『service contorol manager』が、わからない状態だったので、詳しく教えて頂き大変たすかりました。 ということは、アプリケーションにある 『ExitWindowsEx(ExitWindowExFlags.EWX_REBOOT | ExitWindowExFlags.EWX_FORCE, 0);』 と、強制的にシャットダウンしているところを、 (1)SQLServerインスタンスを停止する (2)もしなんらかの事象でSQLServerのインスタンスが停止しない場合は、強制終了等の保険の手段をもって終了する (3)OSのシャットダウンを行う みたいにすれば、SQLServerに限っては、今までやっていたように強制終了するよりは、安全にシャットダウンできると考えてよいでしょうか。 大変お手数ですが、もう少しご教示いただけないでしょうか。 service contorol managerで参照したURLです。 ttp://www.atmarkit.co.jp/fwin2k/bookpreview/eventlog02/eventlog02_02.html

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.2

すいません。質問の趣旨を勘違いしておりました。 いずれにしても、SQL Serverプロセスの停止は、下記のサンプルのような「サービス停止」で行われていると思います。(割り込みで強制終了したとしても) 『強制的にSQLServerをシャットダウンした場合』を 知って、何をしようとしているのか記載がないので、回答はできませんが、 使用しているプロセスはSCM(Service Control Manager)と sqlservr.exe、sqlagent.exeが持っていますので、 SQL Serverだけのプロセスを知ったところで何もできないような気がします。 もし、具体的にProccess名を知る必要があれば、ProccessExploreと いうツールがありますので、それでお調べになってみては如何でしょうか? http://www.forest.impress.co.jp/lib/sys/wincust/taskservice/prcsxplorer.html

参考URL:
http://www.forest.impress.co.jp/lib/sys/wincust/taskservice/prcsxplorer.html
t-usa
質問者

補足

kero_mio 様 ご教示ありがとうございます。 kero_mio様、すいません。 自分が調べたいのは、強制的にSQLServerをシャットダウンした場合のシークエンスというか、 どのような順序でSQLServerが停止するのを調べたかったのです。 オラクルDBには、SQL*Plusで4つのモードがあるみたいなのですが、SQLServerにそのような資料がなく困って質問いたしました。 誤解を招くような質問で大変申し訳ありませんでした。 参考にしたURLです。 ttp://www.atmarkit.co.jp/fdb/ref/ref_oracle/shutdown.html

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

未確認ですがExitWindowsExだと、SQL Serverのプロセスは落とせないので、SQL Serverのサービスを停止するのが確実かと思います。 ExitWindowsExでプロセス名を意識せずにサービス名を意識する ことで、下記のコードのようにプロセスは止められます。 using System.ServiceProcess; ServiceController controller = new ServiceController(); controller.MachineName = "."; controller.ServiceName = "MSSQL$SQLEXPRESS"; string status = controller.Status.ToString(); controller.Stop(); # C#は、2.0, VS.NET2005 で確認しております。 ご参考になれば幸いです。

参考URL:
http://www.dotnetspider.com/kb/Article1254.aspx

関連するQ&A