Ознаки
Розглянемо такий сценарій:
-
Інсталюється екземпляр 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, перелічених у розділі "Стосується".
Спосіб вирішення
Сукупні відомості про оновлення
SQL Server 2012 р.
Виправлення цієї проблеми вперше випущено в сукупному пакеті оновлень 2 для SQL Server 2012. Щоб отримати додаткові відомості про цей пакет сукупного оновлення клацніть номер статті в базі знань Microsoft Knowledge Base:
2703275 Сукупний пакет оновлень 2 для SQL Server 2012Note, оскільки збірки сукупні, кожен новий випуск виправлення містить усі виправлення та всі виправлення системи безпеки, які входили в попередній випуск виправлення SQL Server 2012. Корпорація Майкрософт рекомендує розглянути застосування останнього випуску виправлення, який містить це виправлення. Щоб отримати докладні відомості, клацніть номер цієї статті бази знань 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.
-
У INST1 від'єднайте базу даних. Наприклад, від'єднайте базу даних Test_RO_FG_DB.
-
Перемістіть файли бази даних на сервер, на якому розміщено екземпляр INST2.
-
Спробуйте вкласти базу даних до 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, описане в розділі "Ознаки".
-
Перейменуйте файли бази даних у командному рядку. У наведеному нижче зразку команди показано, як це зробити:
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
-
У 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
-
Установіть для бази даних значення "офлайн". Для цього виконайте таку команду:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
У командному рядку перейменуйте файли в новій базі даних. У наведеному нижче зразку команди показано, як це зробити:
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
-
У командному рядку перейменуйте файли в базі даних, переміщені на кроці 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
-
Установіть для бази даних значення ONLINE. Для цього виконайте таку команду:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Переконайтеся, що базу даних розміщено в онлайні, і повторно відкрийте функціональні можливості посередника служби.
-
Видаліть непотрібні файли бази даних. У наведеному нижче зразку команди показано, як це зробити:
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.
-
Перемістіть файли бази даних до екземпляра SQL Server, на якому розміщено inST1.
-
Спробуйте вкласти базу даних до 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.
-
У командному рядку перейменуйте файли бази даних на 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
-
У 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
-
Установіть для бази даних значення "офлайн". Для цього виконайте таку команду:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
У командному рядку перейменуйте файли в новій базі даних. У наведеному нижче зразку команди показано, як це зробити:
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
-
У командному рядку перейменуйте файли в базі даних, переміщені на кроці 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
-
Установіть для бази даних режим "АВАРІЙНИЙ" і виконайте відновлення. Для цього виконайте таку команду:Примітка Журнали транзакцій бази даних перебудуються на цьому кроці. Це може призвести до втрати даних. Тому перед виконанням цього кроку радимо створити резервну копію бази даних.
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
-
Переконайтеся, що базу даних розміщено в онлайні, і повторно відкрийте функціональні можливості посередника служби.
-
Видаліть непотрібні файли бази даних. У наведеному нижче зразку команди показано, як це зробити:
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: