Применяется к
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, 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 записывает записи в журнал транзакций. В более ранних версиях не удается прочитать новые записи журнала транзакций.

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".

Решение

Сведения о накопительном пакете обновления

SQL Server 2012

Исправление этой проблемы было впервые выпущено в накопительном пакете обновления 2 для SQL Server 2012 г. Чтобы получить дополнительные сведения об этом накопительном пакете обновления, щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

2703275 Накопительный пакет обновления 2 для SQL Server 2012Примечаемые сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2012 года. Корпорация Майкрософт рекомендует применить последний выпуск исправления, содержащий это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:

2692828 Сборки SQL Server 2012, выпущенные после выпуска SQL Server 2012. Необходимо применить исправление SQL Server 2012 к установке SQL Server 2012.

Обходной путь

Для решения проблемы используйте один из указанных ниже способов.Способ 1. Восстановление резервной копии базы данных из INST1 в INST2.Примечание. Проблема, описанная в разделе "Симптомы", не возникает в SQL Server 2012 при восстановлении резервной копии из более ранней версии.Способ 2. Выполните обновление более ранней версии SQL Server на месте до SQL Server 2012 г.Метод 3. Перемещение базы данных, содержащей файловую группу только для чтения, в экземпляр SQL Server 2012. Для этого выполните следующие действия.Примечание. Выполните шаги 4–11 на сервере, работающем SQL Server 2012. Например, выполните шаги 4–11 в INST2.

  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. Для этого выполните следующие действия.Заметки

  • База данных также содержит новые записи журнала транзакций после неудачного обновления.

  • Выполните шаги 3–10 на сервере под управлением более ранней версии SQL Server. Например, выполните шаги 3–10 в INST1.

  1. Переместите файлы базы данных в экземпляр SQL Server, на котором размещается INST1.

  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.Обновление на месте, когда база данных помечена как доступная толькодля чтения. При обновлении на месте экземпляра SQL Server, содержащего базу данных только для чтения с именем Test_RO_DB до SQL Server 2012 г., в журнале ошибок SQL Server могут отображаться сообщения об ошибках, похожие на следующие:

В конце процесса обновления база данных Test_RO_DB будет находиться в состоянии RECOVERY_PENDING. Чтобы задать для базы данных значение READ_WRITE, необходимо использовать команду ALTER DATABASE. Затем используйте команду ALTER DATABASE, чтобы задать для базы данных значение READ_ONLY. Это позволяет ядру SQL Server обновить базу данных до правильной версии.Обновление на месте, когда база данных для чтения и записи содержит группы файлов, помеченные как доступные толькодля чтения. При обновлении на месте до SQL Server 2012 года в журнале ошибок SQL Server могут появиться сообщения, аналогичные приведенным ниже. Эта проблема возникает, когда более ранний экземпляр SQL Server размещает базу данных для чтения и записи и содержит группы файлов, помеченные READ_ONLY. Однако процесс обновления завершается должным образом, и база данных запускается в режиме "в сети".Примечание. В следующем сообщении об ошибке база данных называется Test_RO_FG:

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.