- ベストアンサー
SQL Serverのシャットダウンプロセスについて
- SQL Serverのシャットダウンプロセスについてのご質問です。C#で作成されたアプリケーションからExitWindowsEx関数を使用してSQL Serverを強制的にシャットダウンしているようですが、このシャットダウンプロセスについて詳細を教えていただけませんか?
- 強制的にSQL Serverをシャットダウンした場合のプロセスについて教えてください。お使いのアプリケーションではExitWindowsEx関数を使用しているようですが、どのような手順でシャットダウンが行われているのか詳細が知りたいです。
- SQL Serverのシャットダウンプロセスに関する疑問です。お使いのアプリケーションではExitWindowsEx関数を使用して強制的にシャットダウンしているようですが、このプロセスについて詳しく教えていただけませんか?
- みんなの回答 (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)は、より安全できると思います。 参考になれば幸いです。
その他の回答 (3)
- kero_mio
- ベストアンサー率90% (94/104)
なるほど。 インスタンスの停止手順がどういう手順かということですね。 納得しました。 まず、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 にございますので、ご確認頂けたらと思います。
補足
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)
すいません。質問の趣旨を勘違いしておりました。 いずれにしても、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
補足
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)
未確認ですが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 で確認しております。 ご参考になれば幸いです。
補足
kero_mio 様 ご教示ありがとうございました。 これで、ちょっと検討してみます。 本当に、参考になるアドバイスを頂きありがとうございました。