Відновити резервну копію SQL Server 2012 до бази даних SQL Server 2008?


41

Чи є спосіб відновити резервну копію бази даних SQL Server 2012 на SQL Server 2008?

Я спробував приєднати файл, він не працює.


Оформити замовлення на ці посилання допоможуть вам: msdn.microsoft.com/en-us/library/ms140052.aspx dba.stackexchange.com/questions/5511/… Дякую

Є ще одне питання, рівне цьому, і на нього дуже добре відповіли: superuser.com/questions/468578/…
— Cavaleiro

1
Тут є чудова робоча відповідь на цю проблему (міграція, а не резервне копіювання / відновлення): stackoverflow.com/questions/19837886/…
— Дон Джіетт

Відповіді:


30

У вас є пара варіантів:

Варіант A : Сценарій бази даних у режимі сумісності за допомогою параметра Створення сценарію:

Примітка: Якщо ви скриптуєте базу даних зі схемою та даними, залежно від розміру даних, сценарій буде масивним і не буде оброблятися SSMS, sqlcmd або osql (можливо, в ГБ).

введіть тут опис зображення

Варіант B:

Спочатку спершу виведіть таблиці з усіма індексами, FK та ін. Та створіть порожні таблиці в базі даних призначення - опція ТОЛЬКО SCHEMA (Без даних).

Використовуйте BCP для вставки даних

  1. bcp з даних нижче за допомогою сценарію нижче. встановіть SSMS у текстовому режимі та скопіюйте вихід, створений нижче сценарієм, у файл bat.

    -- save below output in a bat file by executing below in SSMS in TEXT mode
    
    -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
    
    select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
        +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
    from sys.tables
    where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
    /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
  2. Запустіть файл bat, який генерує .dat файли у вказаній вами папці.

  3. Знову запустіть скрипт на цільовому сервері із SSMS у текстовому режимі.

    --- Execute this on the destination server.database from SSMS.
    
    --- Make sure the change the @Destdbname and the bcp out path as per your environment.
    
    declare @Destdbname sysname
    set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
    select 'BULK INSERT ' 
    /*Remember Tables must be present on destination database */ 
    + QUOTENAME(@Destdbname) + '.' 
    + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
    + '.' + QUOTENAME(name) 
    + ' from ''D:\BCP\' /* Change here for bcp out path */ 
    + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
    + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
    + char(10) 
    + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
    + char(10) + 'go'
       from sys.tables
       where is_ms_shipped = 0
    and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
    and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
  4. Запустіть вихід, використовуючи SSMS, щоб вставити дані назад у таблиці.

Це дуже швидкий bcp метод, оскільки він використовує Native mode.


Дуже корисно - метод B працював для мене (SQL, генерований методом A, становив 7 ГБ, а SSMS не мав нічого з цього). Деякі SSID та пов'язані сервери не перейшли належним чином, але коли щось із пов'язаними серверами коли-небудь працює? Не впевнений, що я був би радий використовувати це у виробництві, але для отримання тестового середовища на 95% швидко, це було ідеально.
— аукупарія

@aucuparia Some SSIDs and linked servers didn't go across properly. Пов'язані сервери повинні бути скриптовані вручну. SSID можуть бути захищені за допомогою sp_helprevlogin. Завдання SQLAgent, пакети ssis тощо потрібно переміщувати відповідно до ваших потреб. Сенс цього методу полягає в тому, щоб отримати дані якнайшвидше, коли ви знижуєте або зменшуєте 2 бази даних.
— Кін Шах

Варіант B був єдиним методом, який працював для мене, оскільки генеровані сценарії були занадто великими іншими способами
— JumpingJezza

23

Ні, ви не можете йти назад, тільки вперед. Ви можете створити порожню базу даних 2008 року, а потім скористатися майстром Створення скриптів у студії управління для скриптування схеми та даних (або сторонніх інструментів порівняння від Red Gate та інших). Переконайтеся, що ви встановили правильну цільову версію як 2008 рік, і вам доведеться складати невідповідні речі (наприклад, OFFSET або FORMAT), які ви могли використовувати в 2012 році.


8

Не існує підтримуваного способу зробити це, оскільки SQL Server не дозволяє підтримувати подібну сумісність.

Що ти можеш зробити

  1. відновити базу даних у SQL 2012

  2. генерувати сценарії для об'єктів і даних

  3. очистити сценарії від усіх деталей, унікальних для SQL 2012
  4. виконання сценаріїв на 2008 рік

Якщо у вас немає SQL Server 2012, тоді ви можете використовувати інструменти сторонніх виробників для читання резервних копій та вилучення даних та структури.

У цьому випадку просто створіть порожню базу даних у SQL 2008 та використовуйте такі інструменти, як ApexSQL Diff та ApexSQL Data Diff для синхронізації об’єктів та даних. Ви також можете їх знайти у інших великих постачальників, таких як Red-Gate або Idera.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.