Відновити резервну копію 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.