SQL Server 2008 R2 SP1を適用したらサービスが起動しなくなった時の対応

SQL Server 2008 R2 SP1 を適用したら、SQL Serverのサービスが起動しなくなって、あうあうしたのメモっておく。

緊急度Aでマイクロソフト プレミアムサポートに問い合わせをしたら、無事解決策を提示していただき、あっさりと復旧させることができた。感謝感謝。

現象

SQL Server 2008 R2 SP1をインストールし、再起動したら以下のようなエラーが表示されて、SQL Serverのサービスが起動しなくなった。
記載されている内容に従ってバックアップデータからmasterデータベースを復旧させようと、SQL Serverをシングルユーザーモードで起動しても、エラーが出て起動させられず途方に暮れた。

image

アップグレード手順 ‘sqlagent100_msdb_upgrade.sql’ でエラー 574、状態 0、重大度 16 が発生したため、データベース ‘master’ のスクリプト レベルのアップグレードが失敗しました。このエラー状態は深刻で、通常の操作に影響を与える可能性があるので、データベースはオフラインになります。’master’ データベースのアップグレード中にこのエラーが発生した場合は、SQL Server インスタンス全体を開始できません。スクリプトのアップグレード手順が最後まで実行されるように、これまでのエラー ログ エントリを参考にしてエラーを調査し、適切な方法で対処して、データベースを再起動してください。

 

image

master データベースを復旧できません。SQL Server を実行できません。master データベースを、完全バックアップを使用して復元するか、修復または再構築してください。master データベースを再構築する方法の詳細については、SQL Server オンライン ブックを参照してください。

状況

SQL Server が起動できない状況となっていた際には、次のエラーにより SQL Server 起動時のスクリプトアップグレードが失敗していたようです。

spid8s      エラー: 15002、重大度: 16、状態: 1。
spid8s      プロシージャ ‘sys.sp_dbcmptlevel’ はトランザクション内では実行できません。
spid8s      エラー: 574、重大度: 16、状態: 0。
spid8s      CONFIG ステートメントはユーザー トランザクション内では使用できません。

SQL Server 2008 で Service Pack や Cumulative Update を適用した後には、次回の SQL Server 起動時に、スクリプトを実行することにより必要なアップグレード操作が実行されて、
上記の現象は、このスクリプトアップグレードの実行が失敗し、システムデータベースの起動ができないために SQL Server が停止していた状況らしいです。

スクリプトは静的なスクリプトとして準備されているもので、トランザクション管理の観点で動作が変わることはないため、このエラーは対象の SQL Server 上の環境に依存して発生しているものと考えれると。

このエラーは、SQL Server の構成オプションの一つである user options の設定において、implicit transactions が有効な場合に発生します。

タイトル : user options オプション
<http://msdn.microsoft.com/ja-jp/library/ms176031(v=sql.100).aspx>
>2
>IMPLICIT_TRANSACTIONS
>dblib ネットワーク ライブラリ接続の場合、ステートメントの実行時にトランザクションを暗黙的に開始するかどうかを制御します。IMPLICIT_TRANSACTIONS の設定は、ODBC または OLEDB 接続には影響を与えません。
タイトル : ユーザー オプションを構成する方法 (SQL Server Management Studio)
<http://msdn.microsoft.com/ja-jp/library/ms190763(v=sql.100).aspx>

このオプションの効果が発生している場合には、上記のように静的なスクリプトの実行でもトランザクション状況が変わるため、エラーとなりうる。

対処方法

SQL Server のスクリプトアップグレード操作を一時的に停止し、implicit transactions 設定を無効にし、SQL Server を再度起動します。

  1. スクリプトアップグレードを一時的に停止するトレースフラグ 3608 を指定して SQL Server を起動します。
    管理者権限で開いたコマンドプロンプトから、次のコマンドを実行。
    sqlservr.exe -c –T3608
    SQL Server の起動が完了したら、コマンドプロンプトは開いたままにしておく。
  2. 別のコマンドプロンプトから専用管理者接続を使用して SQL Server に接続します。
    別のコマンドプロンプトから、対処用のコマンドを実行します。次の手順で行う。
    – 管理者権限で、別のコマンドプロンプトを開く。
    – SQL Server 上で管理者権限を持つ Windows アカウントで、次のコマンドを実行。
        sqlcmd.exe -Sadmin:K01-DB02 –E
  3. 、implicit transactions 設定を無効にします。
    接続が完了してプロンプトが現れたら、次のコマンドを実行。
        exec sp_configure ‘user options’
        go
    出力された結果の、run_value(一番右端の値)を記録しておく。
    値を控えたら、次のコマンドを実行します。
        exec sp_configure ‘user options’,0
        reconfigure
        go
    ‘user options’ が変更されたことが表示されたら、exit コマンドで sqlcmd を終了。
  4. SQL Server を再起動します。
    手順 1) で起動した SQL Server を停止。
    コマンドプロンプト上で Ctrl+C を押し、Shutdown を聞かれるので Y を押すと、SQL Server が停止。
    この手順の後、SQL Server をサービスから通常通りに起動。
    起動が成功すれば、対処は完了。
  5. 起動後、パッチ適用が再開されるのでDBが使用できるまでに多少の時間あ必要