套用到
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。

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

    Msg 3415,第 16 級,狀態 2,第 1行資料庫「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 熱修補。

因應措施 

若要暫時略過這個問題,請使用下列其中一個方法。方法一:從 INST1 還原資料庫備份到 INST2。注意:「症狀」章節中描述的問題,在 SQL Server 2012 中,當你從較早版本還原備份時,並不會發生。方法二:將早期版本的 SQL Server 進行原地升級至 SQL Server 2012。方法三:將包含唯讀檔案群組的資料庫移至 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. 在命令提示字元時,重新命名你在第二步移動的資料庫檔案。 將檔案重新命名為你在步驟 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 

方法四:將包含唯讀檔案群組的資料庫重新附加到先前的 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. 在命令提示字元時,重新命名你在第二步移動的資料庫檔案。 將檔案重新命名為你在步驟 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 錯誤。當資料庫被標記為唯讀時,即原地升級 當你對包含只讀資料庫(名稱為 Test_RO_DB SQL Server to 2012)的 SQL Server 實例進行原地升級時,你可能會在 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:

需要更多協助嗎?

想要其他選項嗎?

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