none
SQL Server の終了オプションについて RRS feed

  • 質問

  •  

    はじめて、質問させて頂きます。

    OS:WindowsServer2003にて SQL Server 2005を使用しています。

    基本的にOSのシャットダウン時に、他のアプリからの接続が全てログアウトするまで

    SQL Server 2005の終了は待つものなのでしょうか?

     

    それとも、oracleで言う、shutdown immediate や shutdown abort のような状態に

    なるのでしょうか?

     

    これらのような終了オプションがあるのでしょうか。

    また、このようなshutdownを記述する、shutdownスクリプトも存在するのでしょうか。

     

    以上

     

    2008年10月8日 6:11

回答

  • こんにちは、naginoです。

     

    SQL Server はサービスの1つですので、OS のシャットダウンが行われると、他のサービスと同様にサービスの停止処理が行われます。

    他のアプリからの接続がある場合、サービス側から切断します。

     

    ただし、実行中のトランザクションがある場合、完了するまで待つようです。

    http://msdn.microsoft.com/ja-jp/library/ms189095(SQL.90).aspx

     

    終了オプションについては私は聞いたことがありませんので、ご存知の方がいらっしゃいましたらフォローをお願いします。

     

    ご参考になれば幸いです。

    2008年10月8日 8:46
  • Oracleにあまり詳しくないので外していたらごめんなさい。

     

    > OS:WindowsServer2003にて SQL Server 2005を使用しています。
    > 基本的にOSのシャットダウン時に、他のアプリからの接続が全てログアウトするまで
    > SQL Server 2005の終了は待つものなのでしょうか?

     

    基本的には待ちません。MSDNには
    「現在実行中のすべての Transact-SQL ステートメントまたはストアド プロシージャが終了するまで待ちます。」
    と書かれていますが、トランザクションが完了するまで待つ訳ではないようです。

     

    試しにトランザクションをかけたまままの状態でSQL Serverを停止したところ、SQL Serverへの接続が切断され

    ROLLBACKされた状態になってしまいました。
    ※OracleでいうところのSHUTDOWN IMMEDIATEに相当すると思われます。


    また、SQL Serverでは「一時停止」という状態に出来ます。

    これはログイン中のユーザーはそのまま継続して使用でき、新規にログインはできない状態となります。
    ※Oracleで言うところのSHUTDOWN NORMALに相当すると思われます。
     ただし、全てのユーザーがログアウトしてもSQL Serverは停止せず、一時停止の状態のままとなります。
     シャットダウンする前にSQL Server一時停止に移行し、その間に接続しているユーザーにメッセージを
     送り、全てのユーザーがログアウトした時点でSQL Serverを停止するような運用を想定しているようです。


    SHUTDOWN ABORTですが、強いて言えば(osqlユーティリティ等で)SHUTDOWN WITH NOWAITコマンドが相当します。
    ただし、手動で復旧作業を行う必要は無く、次回SQL Server起動時に自動的に修復が行われます。

    また、不意の電源が切断されること等によりデータベースの整合性が取れなくなった場合にも、SQL Server起動時に復旧処理が行われますが、この場合、運が悪いと復旧に失敗する事があります。

    その場合は手動でデータベースを復旧したり、最悪の場合はバックアップからリストアを行い、運がよければトランザクションログから最新の状態まで復旧できます。


    > また、このようなshutdownを記述する、shutdownスクリプトも存在するのでしょうか。

    SQL ServerはWindowsのサービスで動いているので、サービスを一時停止/停止する事で実現できます。
    コマンドプロンプトで以下のコマンドを実行することで、それぞれの状態に移行することが出来ます。

    (既定のインスタンスの場合)

    サービスの一時停止

    NET PAUSE MSSQLSERVER

     

    サービスの停止

    NET STOP MSSQLSERVER

     

    サービスの開始

    NET START MSSQLSERVER

     

    また、Transact-SQLにもSHUTDOWNというコマンドがあるので、こちらでSQL Serverを停止する事も出来ます。

    コマンドプロンプトでosql.exeやisqlw.exeを起動して以下のコマンドを実行してください。

    通常のシャットダウン(停止に相当)

    SHUTDOWN
    GO

     

    また、即時に停止する場合は以下のコマンドを実行してください。

    即時シャットダウン

    SHUTDOWN WITH NOWAIT
    GO

     

    以上、参考になりましたでしょうか?

     

    2008年10月14日 15:42

すべての返信

  • こんにちは、naginoです。

     

    SQL Server はサービスの1つですので、OS のシャットダウンが行われると、他のサービスと同様にサービスの停止処理が行われます。

    他のアプリからの接続がある場合、サービス側から切断します。

     

    ただし、実行中のトランザクションがある場合、完了するまで待つようです。

    http://msdn.microsoft.com/ja-jp/library/ms189095(SQL.90).aspx

     

    終了オプションについては私は聞いたことがありませんので、ご存知の方がいらっしゃいましたらフォローをお願いします。

     

    ご参考になれば幸いです。

    2008年10月8日 8:46
  • Oracleにあまり詳しくないので外していたらごめんなさい。

     

    > OS:WindowsServer2003にて SQL Server 2005を使用しています。
    > 基本的にOSのシャットダウン時に、他のアプリからの接続が全てログアウトするまで
    > SQL Server 2005の終了は待つものなのでしょうか?

     

    基本的には待ちません。MSDNには
    「現在実行中のすべての Transact-SQL ステートメントまたはストアド プロシージャが終了するまで待ちます。」
    と書かれていますが、トランザクションが完了するまで待つ訳ではないようです。

     

    試しにトランザクションをかけたまままの状態でSQL Serverを停止したところ、SQL Serverへの接続が切断され

    ROLLBACKされた状態になってしまいました。
    ※OracleでいうところのSHUTDOWN IMMEDIATEに相当すると思われます。


    また、SQL Serverでは「一時停止」という状態に出来ます。

    これはログイン中のユーザーはそのまま継続して使用でき、新規にログインはできない状態となります。
    ※Oracleで言うところのSHUTDOWN NORMALに相当すると思われます。
     ただし、全てのユーザーがログアウトしてもSQL Serverは停止せず、一時停止の状態のままとなります。
     シャットダウンする前にSQL Server一時停止に移行し、その間に接続しているユーザーにメッセージを
     送り、全てのユーザーがログアウトした時点でSQL Serverを停止するような運用を想定しているようです。


    SHUTDOWN ABORTですが、強いて言えば(osqlユーティリティ等で)SHUTDOWN WITH NOWAITコマンドが相当します。
    ただし、手動で復旧作業を行う必要は無く、次回SQL Server起動時に自動的に修復が行われます。

    また、不意の電源が切断されること等によりデータベースの整合性が取れなくなった場合にも、SQL Server起動時に復旧処理が行われますが、この場合、運が悪いと復旧に失敗する事があります。

    その場合は手動でデータベースを復旧したり、最悪の場合はバックアップからリストアを行い、運がよければトランザクションログから最新の状態まで復旧できます。


    > また、このようなshutdownを記述する、shutdownスクリプトも存在するのでしょうか。

    SQL ServerはWindowsのサービスで動いているので、サービスを一時停止/停止する事で実現できます。
    コマンドプロンプトで以下のコマンドを実行することで、それぞれの状態に移行することが出来ます。

    (既定のインスタンスの場合)

    サービスの一時停止

    NET PAUSE MSSQLSERVER

     

    サービスの停止

    NET STOP MSSQLSERVER

     

    サービスの開始

    NET START MSSQLSERVER

     

    また、Transact-SQLにもSHUTDOWNというコマンドがあるので、こちらでSQL Serverを停止する事も出来ます。

    コマンドプロンプトでosql.exeやisqlw.exeを起動して以下のコマンドを実行してください。

    通常のシャットダウン(停止に相当)

    SHUTDOWN
    GO

     

    また、即時に停止する場合は以下のコマンドを実行してください。

    即時シャットダウン

    SHUTDOWN WITH NOWAIT
    GO

     

    以上、参考になりましたでしょうか?

     

    2008年10月14日 15:42
  • naginoさん、ありがとうございます。

    返事が遅くなりすみません。

    URLも参考になりました。

    2008年10月20日 11:53
  •  

    CatTailさん、詳細な回答ありがとうございます。

    また、実験までしていただき、多謝です。

     

    通常の使用ですと、「SHUTDOWN IMMEDIATE」ってことですね。

     

    とても参考になりました。

    回答が遅くなり申し訳けございません。

     

     

     

    2008年10月20日 12:25
  • broken_kids さん、

     

    こんにちは!

    フォーラム オペレーターの服部 清次です。

    今回、nagino さんと CatTail さんの回答が参考になったようですので、こちらの情報を他の方々に活用していただくためにも、私の方で回答チェックを付けさせていただきました。

     

    また何か疑問がありましたら、ぜひ TechNet Forum に投稿してください。

    これからも、よろしくお願いします。

    それでは、また!

     

    _____________________________________________

    マイクロソフト株式会社 フォーラム オペレータ 服部 清次

    2008年10月23日 4:13