使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

症状

请考虑以下情况:

  • 安装 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 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错误。将数据库标记为只读时的就地升级当你执行包含只读数据库(名为 Test_RO_DB 到 SQL Server 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:

需要更多帮助?

需要更多选项?

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

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×