Як перемістити базу даних з 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, але майте на увазі, що є певні речі, які просто не працюватимуть у пункті призначення (і я не впевнений, як витончені сторонні інструменти впораються з усім цим). Об'єкти на зразок ПОСЛІДОВНОСТІ, код на зразок OFFSET / FETCH, LAG / LEAD тощо
Aaron Bertrand

1
Після створення схеми шляхом створення сценаріїв та запуску цих сценаріїв проти старої бази даних, ще одним варіантом передачі даних є копіювання безпосередньо з одного примірника в інший, встановивши зв'язаний сервер. Сценарій циклу, який виконує всю роботу, не повинен бути складним. Щоб мати справу з обмеженнями FK, вам потрібно переконатися, що ви скопіювали таблиці у відповідному порядку, або ви могли тимчасово видалити FKs та повторно ввімкнути їх після копіювання. Так само під час копіювання ви хочете відключити будь-які тригери в пункті призначення.
Девід Спіллетт

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 ,

ви повинні врахувати, що він порівнює лише таблиці, у яких є первинні ключі. Отже, якщо ваші таблиці, які не мають первинного ключа, ви повинні використовувати інші способи


8
Я не думаю, що ця відповідь покращується щодо відповіді Кінса
Джеймс Андерсон

-3

Знизити базу даних на SQL Server неможливо. Однак вирішення завдання полягає в тому, щоб скриптувати всі об'єкти БД і застосувати сценарій до бази даних призначення. SSIS - це прекрасний спосіб допомогти досягти цього.


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