Applies ToSQL Server 2012 Enterprise

徵狀

請試想下列案例:

  • 您已安裝 microsoft sql Server 2008 或 microsoft SQL Server 2008 R2 的 Microsoft SQL Server 2005 實例。

  • 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。

  • 您會收到類似以下的錯誤訊息:

    Msg 3415、Level 16、State 2、Line 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 會將專案寫入事務記錄日誌中。 較舊的版本無法讀取新的事務記錄記錄項目。

狀態

Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。

解決方案

累積更新資訊

SQL Server 2012

此問題的修正程式是在 SQL Server 2012 的累積更新2中第一次發行。如需此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2703275 SQL Server 2012 的累積更新套件2注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2012 修正版本中所包含的所有修復程式及所有安全性修正程式。 Microsoft 建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「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 的實例。 如果要執行這項操作,請依照下列步驟執行。注意: 在運行 SQL Server 2012 的伺服器上執行步驟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. 將資料庫設定為 [線上]。 若要這樣做,請執行下列命令:

    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. 將資料庫設定為緊急模式,然後執行修復。 若要執行這項操作,請執行下列命令。注意: 在這個步驟中,會重建資料庫交易處理記錄。 這可能會導致資料遺失。 因此,建議您先備份資料庫,然後再執行此步驟。

    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錯誤。資料庫標示為唯讀時的就地升級當您執行包含唯讀資料庫的 SQL Server 實例就地升級時,如果該 SQL Server 是名為 Test_RO_DB 至 SQL Server 2012,您可能會在 SQL Server 錯誤記錄中收到如下所示的錯誤訊息:

在升級程式結束時,Test_RO_DB 資料庫將會處於 RECOVERY_PENDING 狀態。 您必須使用 ALTER database 命令,將資料庫設為 READ_WRITE。 然後使用 [ ALTER DATABASE] (變更資料庫 )命令將資料庫設定為 READ_ONLY。 這可讓 SQL Server 引擎將資料庫升級至正確的版本。當讀/寫資料庫包含標示為唯讀的檔群組時的就地升級當您執行就地升級至 SQL Server 2012 時,您可能會在 SQL Server 錯誤記錄中收到類似下列內容的訊息。 當較舊的 SQL Server 實例託管讀/寫資料庫,且包含標示為 READ_ONLY 的檔案群組時,就會發生此問題。 不過,升級程式會如期完成,而資料庫則會開始線上。注意: 在下列錯誤訊息中,資料庫命名為 Test_RO_FG:

需要更多協助嗎?

想要其他選項嗎?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。