スクリプト アップグレード モード

 

神谷 雅紀
Escalation Engineer

 

最近連続してスクリプト アップグレード モードに関する問合わせがあったため、今回は、スクリプト アップグレード モードについて、説明したいと思います。

 

スクリプト アップグレードモードとは

サービスパックや Hotfix をインストールすると、sqlservr.exe などの実行可能ファイルだけでなく、master データベース内のシステム ストアドプロシージャやシステム テーブルの一部も更新される場合があります。スクリプト アップグレード モードとは、これらデータベース内の ストアドプロシージャや テーブルの更新を行なうためのスクリプトを実行するためのモードで、SQL Server 2008 から導入されています。SQL Server 2005 以前は、サービスパック等のインストール中にスクリプトが実行されていました。

 

いつスクリプト アップグレード モードになるのか

SQL Server は、起動時に、master データベースに記録されているスクリプト バージョンとインストールされているスクリプトバージョンを比較します。このバージョン比較の結果、バージョンが一致していない場合に、スクリプト アップグレード モードになり、スクリプトの実行が始まります。一致していれば、スクリプト アップグレード モードにはならず、スクリプトも実行されません。

従って、次の場合にスクリプト アップグレード モードになります。

  • サービスパックや Hotfix のインストールが完了し、インストール済みスクリプトのバージョンが上がった場合、その後の最初の SQL Server 起動時 (アップグレード)
  • サービスパックや Hotfix のアンインストールが完了し、、インストール済みスクリプトのバージョンが下がった場合、その後の最初の SQL Server 起動時 (ダウングレード)
  • master データベースが復元 (restore) され、master データベース内のスクリプトバージョンがインストール済みスクリプトバージョンよりも低くなった場合、その後の最初の SQL Server 起動時 (アップグレード)

スクリプト実行中に SQL Server を停止した場合、次回起動時には、実行が完了していないスクリプトから順に実行されます。すべてのスクリプトの実行が完了し、master とインストール済みスクリプトのバージョンが一致するまでは、再起動ごとにスクリプト アップグレード モードになり、スクリプトは実行されます。

 

スクリプト アップグレード モードの影響

  • スクリプト アップグレード モードにある SQL Server には、専用管理者接続 (Dedicated Admin Connection / DAC) 以外ではログインすることはできず、ログインしようとしても以下のメッセージが返され、その試行は失敗します。

メッセージ 18401
ユーザー 'loginname' はログインできませんでした。理由: サーバーがスクリプト アップグレード モードです。この時点では管理者だけが接続できます。

  • スクリプトの実行時間は環境に依存しますが、レプリケーションが行なわれている環境では、レプリケーションのアップグレードも含まれる場合があるため、完了までに時間がかかる場合があります。
  • フェールオーバクラスタの IsAlive ポーリングは、この影響を受けません。IsAlive ポーリングは、イベントログやクラスタログに以下のメッセージを記録しますが、ログイン試行時にメッセージ 18401 が返された場合には、SQL Server がスクリプト アップグレード モードにあると判断し、SQL Server クラスタリソースは「失敗」とは見なされません。

[sqsrvres] checkODBCConnectError: Tolerable Connection error: sqlstate = 42000; native error = 47e1; message = [Microsoft][SQL Server Native Client 10.0][SQL Server]ユーザー 'Domain\User' はログインできませんでした。理由: サーバーがスクリプト アップグレード モードです。この時点では管理者だけが接続できます。

[sqsrvres] OnlineThread: Could not connect to server but server is considered up.

 

スクリプト の実行完了確認方法

SQL Server Errorlog ファイル (SQL Server 2008 R2 の既定の場所 C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\Log) で確認可能です。

以下は、Errorlog ファイルのサンプルです。”Database 'master' is upgrading script 'xxx' from level nnnnnnnn to level mmmmmmm.” 形式のメッセージとスクリプトの実行結果が記録された後、全データベースの復旧処理 (トランザクションのロールフォワードロールバック) が完了したことを示す ”Recovery is complete.” が記録されていれば、スクリプトの実行は完了しています。

2011-11-29 17:29:03.15 Server      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) …

2011-11-29 17:29:17.02 spid7s      Database 'master' is upgrading script 'msdb_upgrade_discovery.sql' from level 171050577 to level 171051460.

2011-11-29 17:30:09.59 spid7s      Recovery is complete. This is an informational message only. No user action is required.

 

以下のメッセージは、スクリプトレベルが 10.50.1617 (セキュリティ修正 MS11-049) から 10.20.2500 (SP1) になったことを示しています。

Database 'master' is upgrading script 'msdb_upgrade_discovery.sql' from level 171050577 to level 171051460.

メッセージ内の数値は、バージョンです。

171050577 –> 0x0A320651 –> 0x0A 0x32 0x0651 –> 10 50 1617