適用先
SQL Server 2012 Enterprise

現象

次のような状況で問題が発生します。

  • Microsoft SQL Server 2005、Microsoft SQL Server 2008、または Microsoft SQL Server 2008 R2 のインスタンスをインストールします。

  • SQL Serverのインスタンスは INST1 という名前で、Test_RO_FG_DBという名前のデータベースをホストします。

  • データベースには、次のファイル グループが含まれています。

    • プライマリ

    • RO_FG

    • RW_FG

  • RO_FG という名前のファイル グループは、READ_ONLYとしてマークされます。

  • Microsoft SQL Server 2012 の新しいインスタンスをインストールします。 SQL Server 2012 のこのインスタンスの名前は INST2 です。

  • Test_RO_FG_DB データベースを INST1 からデタッチします。

  • Test_RO_FG_DB データベースを INST2 にアタッチしようとするとします。

  • 以下のようなエラー メッセージが表示される。

    メッセージ 3415、レベル 16、状態 2、行 1Database 'Test_RO_FG_DB' は、読み取り専用ファイル、読み取り専用ファイル、またはユーザーに一部のファイルを変更するアクセス許可がないため、アップグレードできません。 データベースまたはファイルを書き込み可能にし、復旧を再実行します。

  • Test_RO_FG_DB データベースを INST1 に再アタッチしようとするとします。

このシナリオでは、データベースを INST1 に再アタッチすることはできません。 また、SQL Server エラー ログに次のエラー メッセージが表示されます。

注 この問題は、READ_ONLYマークされているファイル グループを含むデータベースをアタッチしようとすると発生します。 この問題は、すべてのデータがREAD_ONLYマークされているREAD_ONLY データベースを移動しようとすると発生しません。

原因

この問題は、SQL Server 2012 では、データベースのアップグレードを開始する前に読み取り専用ファイル グループが検出されないために発生します。 アップグレードが開始された後、SQL Server 2012 はトランザクション ログにエントリを書き込みます。 以前のバージョンでは、新しいトランザクション ログ エントリを読み取ることができません。

状態

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

解決方法

累積的な更新プログラムの情報

SQL Server 2012

この問題の修正プログラムは、SQL Server 2012 の累積的な更新プログラム 2 で最初にリリースされました。 この累積的な更新プログラム パッケージの詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。

2703275 SQL Server 2012 の累積的な更新プログラム パッケージ 2注 ビルドは累積的であるため、新しい修正プログラムの各リリースには、以前の SQL Server 2012 修正プログラム リリースに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 Microsoft では、この修正プログラムを含む最新の修正プログラム リリースを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。

2692828 SQL Server 2012 がリリースされた後にリリースされた SQL Server 2012 ビルド SQL Server 2012 のインストールにSQL Server 2012 修正プログラムを適用する必要があります。

回避策 

この問題を回避するには、以下のいずれかの方法を使用します。方法 1 INST2 で INST1 からデータベースのバックアップを復元します。注「現象」セクションで説明されている問題は、以前のバージョンからバックアップを復元する場合、SQL Server 2012 では発生しません。方法 2以前のバージョンの SQL Server を SQL Server 2012 にインプレース アップグレードします。方法 3読み取り専用ファイル グループを含むデータベースを、SQL Server 2012 のインスタンスに移動します。 これを行うには、次の手順を実行します。注 2012 SQL Server実行しているサーバーで手順 4 から 11 を実行します。 たとえば、INST2 で手順 4 から 11 を実行します。

  1. INST1 で、データベースをデタッチします。 たとえば、Test_RO_FG_DB データベースをデタッチします。

  2. INST2 インスタンスをホストするサーバーにデータベース ファイルを移動します。

  3. データベースを INST2 にアタッチしてみてください。 次のサンプル コードは、これを行う方法を示しています。

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACH;GO

    注: "現象" セクションに記載されている 3425 エラー メッセージが表示されます。

  4. コマンド プロンプトで、データベース ファイルの名前を変更します。 次のサンプル コマンドは、これを行う方法を示しています。

    rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf 
  5. SQL Server Management Studioで、アタッチするデータベースと同じ名前と物理構造を持つデータベースを作成します。 次のサンプル コードは、これを行う方法を示しています。

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
  6. データベースをオフラインに設定します。 これを行うには、次のコマンドを実行します。

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. コマンド プロンプトで、新しいデータベース内のファイルの名前を変更します。 次のサンプル コマンドは、これを行う方法を示しています。

    rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf 
  8. コマンド プロンプトで、手順 2 で移動したデータベース内のファイルの名前を変更します。 手順 4 で作成したデータベースと一致するようにファイルの名前を変更します。 次のサンプル コマンドは、これを行う方法を示しています。

    rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf 
  9. データベースを ONLINE に設定します。 これを行うには、次のコマンドを実行します。

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. データベースがオンラインであることを確認し、Service Broker 機能を再確立します。

  11. 不要なデータベース ファイルを削除します。 次のサンプル コマンドは、これを行う方法を示しています。

    del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf 

方法 4読み取り専用ファイル グループを含むデータベースを、SQL Serverの以前のインスタンスに再アタッチします。 これを行うには、次の手順を実行します。ノート

  • データベースには、失敗したアップグレードからの新しいトランザクション ログ エントリも含まれています。

  • 以前のバージョンのSQL Serverを実行しているサーバーで手順 3 から 10 を実行します。 たとえば、INST1 で手順 3 から 10 を実行します。

  1. データベース ファイルを、INST1 をホストしているSQL Serverのインスタンスに移動します。

  2. データベースを INST1 にアタッチしてみてください。 次のサンプル コードは、これを行う方法を示しています。

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACHGO

    注: "現象" セクションに記載されている 3624 エラー メッセージが表示されます。 1813 エラー メッセージも表示されます。

  3. コマンド プロンプトで、INST1 のデータベース ファイルの名前を変更します。 次のサンプル コマンドは、これを行う方法を示しています。

    rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf 
  4. SQL Server Management Studioで、アタッチするデータベースと同じ名前と物理構造を持つデータベースを作成します。 次のサンプル コードは、これを行う方法を示しています。

    CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
  5. データベースをオフラインに設定します。 これを行うには、次のコマンドを実行します。

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. コマンド プロンプトで、新しいデータベース内のファイルの名前を変更します。 次のサンプル コマンドは、これを行う方法を示しています。

    rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf 
  7. コマンド プロンプトで、手順 2 で移動したデータベース内のファイルの名前を変更します。 手順 4 で作成したデータベースと一致するようにファイルの名前を変更します。 次のサンプル コマンドは、これを行う方法を示しています。

    rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf 
  8. データベースを EMERGENCY モードに設定し、修復を実行します。 このためには、次のコマンドを実行します。メモ この手順では、データベース トランザクション ログが再構築されます。 これにより、データが失われる可能性があります。 そのため、この手順を実行する前にデータベースをバックアップすることをお勧めします。

    ALTER DATABASE Test_RO_FG_DB SET EMERGENCYGOALTER DATABASE Test_RO_FG_DB SET SINGLE_USERGODBCC CHECKDB (Test_RO_FG_DB, repair_allow_data_loss) WITH ALL_ERRORMSGSGOALTER DATABASE Test_RO_FG_DB SET MULTI_USERGO 
  9. データベースがオンラインであることを確認し、Service Broker 機能を再確立します。

  10. 不要なデータベース ファイルを削除します。 次のサンプル コマンドは、これを行う方法を示しています。

    del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf 

詳細情報

データベースが SQL Server のインスタンスにアタッチされている場合、いくつかの手順が発生します。 これらの手順には、データベースの復旧と以前のバージョンのSQL Serverからのファイルのアップグレードが含まれます。 「現象」セクションで説明されている問題では、SQL Server 2012 では、データベース内の読み取り専用ファイルが検出される前にアップグレード プロセスが開始されます。 アップグレード手順には、データベースのブート ページで "クリーン シャットダウン" ビットをクリアするためのトランザクションの開始が含まれます。 以前のバージョンのSQL Serverでは、開始トランザクション レコードを読み取ることができません。 そのため、データベースは以前のバージョンのSQL Serverでは使用できません。SQL Serverは 3624 エラーを生成します。データベースが読み取り専用としてマークされている場合のインプレース アップグレード Test_RO_DB という名前の読み取り専用データベースを含む SQL Server のインスタンスのインプレース アップグレードを実行すると、SQL Server SQL Server エラー ログに次のようなエラー メッセージが表示されることがあります。

アップグレード プロセスの最後に、Test_RO_DB データベースはRECOVERY_PENDING状態になります。 ALTER DATABASE コマンドを使用して、データベースをREAD_WRITEに設定する必要があります。 次に、ALTER DATABASE コマンドを使用して、データベースを READ_ONLY に設定します。 これにより、SQL Server エンジンはデータベースを正しいバージョンにアップグレードできます。読み取り/書き込みデータベースに読み取り専用としてマークされたファイル グループが含まれている場合のインプレース アップグレード 2012 SQL Serverへのインプレース アップグレードを実行すると、SQL Server エラー ログに次のようなメッセージが表示されることがあります。 この問題は、SQL Serverの以前のインスタンスが読み取り/書き込みデータベースをホストし、READ_ONLYマークされたファイル グループが含まれている場合に発生します。 ただし、アップグレード プロセスは期待どおりに完了し、データベースはオンラインで開始されます。注 次のエラー メッセージでは、データベースには Test_RO_FG という名前が付けられます。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。