应用对象
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。

  • 从 INST1 分离Test_RO_FG_DB数据库。

  • 尝试将 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

此问题的修补程序首次在 2012 SQL Server累积更新 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 就地升级到 2012 SQL Server。方法 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. 将数据库设置为 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. 将数据库设置为“紧急”模式,然后执行修复。 为此,请运行以下命令。注意 在此步骤中会重新生成数据库事务日志。 这可能会导致数据丢失。 因此,建议在执行此步骤之前备份数据库。

    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 2012 Test_RO_DB命名的只读数据库的 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:

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。