Отнася се за
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 г.

Корекцията за този проблем първо е издадена в сборна актуализация 2 за SQL Server 2012. За повече информация относно този сборен пакет щракнете върху следния номер на статия в базата знания на Microsoft:

2703275 Кумулативен пакет за актуализация 2 за SQL Server 2012Note Тъй като компилациите са кумулативни, всяка нова корекция версия съдържа всички горещи поправки и всички корекции на защитата, които са включени в предишната SQL Server 2012 корекция издание. Microsoft препоръчва да помислите за прилагането на най-новата корекция издание, което съдържа тази актуална корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

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. Проверете дали базата данни е онлайн и установите отново функционалността на брокера на услугата.

  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. Проверете дали базата данни е онлайн и установите отново функционалността на брокера на услугата.

  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. Трябва да използвате командата ALTER DATABASE, за да зададете базата данни да READ_WRITE. След това използвайте командата ALTER DATABASE, за да зададете базата данни да READ_ONLY. Това позволява на SQL Server ядро да надстрои базата данни до правилната версия.Надстройва на място, когато база данни за четене/запис съдържа файлови групи, които са маркирани самоза четене Когато извършвате надстройка на място до SQL Server 2012, може да получите съобщения, подобни на следните в регистрационния файл на SQL Server грешки. Този проблем възниква, когато по-ранният екземпляр на SQL Server хоства база данни за четене/запис и съдържа файлови групи, маркирани с READ_ONLY. Обаче процесът на надстройка завършва по очаквания начин и базата данни започва онлайн.Забележка В следното съобщение за грешка базата данни се нарича Test_RO_FG:

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.