Как переместить базу данных из SQL Server 2012 в SQL Server 2005

30

Какие есть варианты, если мне нужно переместить базу данных из SQL Server 2012 (32-разрядная версия) в SQL Server 2005 (64-разрядная версия)?

Я знаю, что не могу:

  • восстановить резервную копию базы данных на SQL Server 2005
  • отсоединить и прикрепить

Я знаю что могу:

  • использовать мастер импорта данных, и я попробовал его на одной базе данных, но он только перемещает данные, и даже это было хлопотно, так как мне нужно было проделать большую работу, создавая временные таблицы для поддержки столбцов идентификаторов, воссоздавая все FK, индексы и т. д.

Есть ли более простой вариант?

Грег Балаевич
источник
12
Если честно, проще было бы обновить пункт назначения до 2012 года.
Аарон Бертран

Ответы:

40

Вы можете использовать любой метод ниже:

Примечание. Если вы используете какие-либо новые функции, такие как новые типы данных и т. Д., Вам придется протестировать, так как это приведет к ошибкам.

МЕТОД 1: Использование нативных инструментов

  1. Сценарий базы данных SCHEMA_ONLY и воссоздать пустую базу данных на конечном сервере. Ниже приведены скриншоты:

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

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

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

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

Ниже приведен скрипт, который поможет вам с частью 2.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

Способ 2: использование сторонних инструментов

Создайте пустую базу данных на конечном сервере. Используйте сравнение схем Redgate и сравнение данных для создания и загрузки данных на целевой сервер.

Примечание: я использовал схему и сравнение данных Redgate, и они являются лучшими инструментами для такого рода задач, и поэтому, если вы используете инструменты сторонних производителей, то я бы порекомендовал Redgate.

Кин Шах
источник
7
+1, но имейте в виду, что есть некоторые вещи, которые просто не будут работать в пункте назначения (и я не уверен, как изящные сторонние инструменты будут справляться со всем этим). Такие объекты, как SEQUENCE, код как OFFSET / FETCH, LAG / LEAD и т. Д.
Аарон Бертран
1
Если у вас есть схема, созданная с помощью сценариев и запуска этих сценариев для более старой базы данных, другой вариант передачи данных - это копирование непосредственно из одного экземпляра в другой путем настройки связанного сервера. Не должно быть трудным написать сценарий, который выполняет всю работу. Чтобы справиться с ограничениями FK, вам необходимо убедиться, что вы копируете таблицы в соответствующем порядке, или вы можете временно удалить FK и снова включить их после копирования. Точно так же вы захотите отключить любые триггеры в месте назначения во время копирования.
Дэвид Спиллетт
4

В дополнение к методам, уже предложенным здесь, вы также можете попробовать создать файл BACPAC и импортировать его в место назначения. Это похоже на то, как Microsoft рекомендует переносить ваши базы данных из локальных в облачные базы данных Azure.

Преимущество этого состоит в том, что это комбинация экспорта схемы и данных, и она не зависит от версии базы данных, поэтому вы можете теоретически импортировать базы данных из любой версии в любую версию.

Недостатком является то, что перед тем, как сгенерировать файл BACPAC в источнике, он запускает какой-то строгий процесс проверки, который может легко потерпеть неудачу, если у вас есть ссылки на объекты вне вашей базы данных (будь то пользовательские или системные базы данных), или если у вас есть зашифрованные объекты. Но если вам повезет, и это не удастся, то это может быть довольно простым решением.

Все, что вам нужно, это одна из более новых версий SSMS (17 или 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Чтобы начать создание файла BACPAC, щелкните правой кнопкой мыши базу данных и выберите «Экспортировать приложение уровня данных ...» (не путайте с «Извлечь приложение уровня данных ...», которое отличается):

Экспорт приложения уровня данных ...

Вам будет представлен простой мастер, который проведет вас по шагам. Когда вы закончите, вы можете использовать «Импортировать приложение уровня данных ...» на вашем конечном сервере, что вы можете увидеть, щелкнув правой кнопкой мыши на узле «Базы данных» (опять же, не путайте с «Развертывание данных»). Приложение ... "):

Импортировать приложение уровня данных ...

Это также покажет вам простой мастер, который проведет вас по шагам.

Эйтан Блумин
источник
-1

Уменьшить версию Sql Server очень тяжело.
Есть несколько вариантов, чтобы уменьшить как;
Прежде всего, создайте все сценарии объекта базы данных и запустите на конечном сервере.
После этого вы можете использовать;

  • SSIS,
  • Инструмент импорта данных,
  • Сторонний инструмент, такой как RedGate или другой.

Но для инструмента сравнения данных RedGate ,

Вы должны учитывать, что он сравнивает только таблицы с первичными ключами. Так что если в ваших таблицах нет первичного ключа, вы должны использовать другие способы

hasantatarli
источник
8
Я не думаю, что этот ответ улучшает ответ Кинса
Джеймс Андерсон
-3

Невозможно понизить версию базы данных на SQL Server. Тем не менее, обходной путь заключается в сценарии всех объектов БД и применении сценария в целевой базе данных. SSIS - отличный способ помочь выполнить это.

Усама Вали
источник
4
Как вы думаете, это добавляет что-то важное к ответу Кин ?
Дезсо