Восстановить резервную копию 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 : Сценарий базы данных в режиме совместимости с помощью параметра Generate script:

Примечание. Если вы создадите сценарий для базы данных со схемой и данными, в зависимости от размера данных, сценарий будет массивным и не будет обрабатываться SSMS, sqlcmd или osql (также может быть в ГБ).

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

Вариант Б:

Сначала выведите из таблицы сначала все индексы, FK и т. Д. И создайте пустые таблицы в целевой базе данных - опция ТОЛЬКО для SCHEMA (нет данных).

Используйте BCP для вставки данных

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

Кин Шах
источник
Очень полезно - метод B работал для меня (SQL, сгенерированный методом A, составлял 7 ГБ, а SSMS не имел его). Некоторые идентификаторы SSID и связанные серверы не работали должным образом, но когда что-нибудь, что связано со связанными серверами, работает впервые? Не уверен, что я был бы рад использовать это в производстве, но для быстрого создания тестовой среды на 95% это было идеально.
aucuparia
@aucuparia Some SSIDs and linked servers didn't go across properly. Связанные серверы должны быть написаны вручную. SSID могут быть переданы с помощью sp_helprevlogin. Задания SQLAgent, пакеты ssis и т. Д. Следует перемещать в соответствии с вашими потребностями. Смысл этого метода состоит в том, чтобы получить данные как можно быстрее, когда вы понижаете или объединяете 2 базы данных.
Кин Шах
Вариант B был единственным методом, который работал для меня, так как сгенерированные скрипты были слишком велики в других отношениях
JumpingJezza
23

Нет, ты не можешь идти назад, только вперед. Вы можете создать пустую базу данных в 2008 году, а затем использовать мастер создания сценариев в Management Studio для создания сценария для схемы и данных (или сторонних инструментов сравнения от 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.

Дэвид Смитерс
источник