電子書籍の厳選無料作品が豊富!

いつもお世話になっております。
SQL Server 2005 Expressを使用しておりまして、C#で作成されているアプリケーションからシャットダウンしております。
またそのアプリケーションには、
『ExitWindowsEx(ExitWindowExFlags.EWX_REBOOT | ExitWindowExFlags.EWX_FORCE, 0);』
とありまして、 強制的にシャットダウンしてします。
そこで、大変お手数ですが、『強制的にSQLServerをシャットダウンした場合』どのようなプロセスで終了しているのか
ご教示いただけないでしょうか。
参考になるURLでも大変助かります。よろしくお願いいたします。

A 回答 (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)は、より安全できると思います。
参考になれば幸いです。

この回答への補足

kero_mio 様

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

補足日時:2007/10/11 10:56
    • good
    • 0

なるほど。


インスタンスの停止手順がどういう手順かということですね。
納得しました。

まず、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/ms190 …
にございますので、ご確認頂けたらと思います。

参考URL:http://technet.microsoft.com/ja-jp/library/ms190 …

この回答への補足

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

補足日時:2007/10/10 15:12
    • good
    • 0

すいません。

質問の趣旨を勘違いしておりました。

いずれにしても、SQL Serverプロセスの停止は、下記のサンプルのような「サービス停止」で行われていると思います。(割り込みで強制終了したとしても)

『強制的にSQLServerをシャットダウンした場合』を
知って、何をしようとしているのか記載がないので、回答はできませんが、
使用しているプロセスはSCM(Service Control Manager)と
sqlservr.exe、sqlagent.exeが持っていますので、
SQL Serverだけのプロセスを知ったところで何もできないような気がします。

もし、具体的にProccess名を知る必要があれば、ProccessExploreと
いうツールがありますので、それでお調べになってみては如何でしょうか?

http://www.forest.impress.co.jp/lib/sys/wincust/ …

参考URL:http://www.forest.impress.co.jp/lib/sys/wincust/ …

この回答への補足

kero_mio 様

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

参考にしたURLです。
ttp://www.atmarkit.co.jp/fdb/ref/ref_oracle/shutdown.html

補足日時:2007/10/09 10:39
    • good
    • 0

未確認ですが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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す