Jak przenieść bazę danych z SQL Server 2012 do SQL Server 2005

30

Jakie są moje opcje, jeśli muszę przenieść bazę danych z SQL Server 2012 (32-bitowy) do SQL Server 2005 (64-bitowy)?

Wiem, że nie mogę:

  • przywrócić kopię zapasową bazy danych na SQL Server 2005
  • odłącz i dołącz

Wiem że mogę:

  • korzystam z kreatora importu danych i próbowałem go w jednej bazie danych, ale przenosi on tylko dane, a nawet to było kłopotliwe, ponieważ musiałem dużo pracy, tworząc tabele tymczasowe w celu utrzymania kolumn tożsamości, odtwarzając wszystkie FK, indeksy itp.

Czy jest łatwiejsza opcja?

Greg Balajewicz
źródło
12
Szczerze mówiąc, łatwiejszą opcją byłoby uaktualnienie miejsca docelowego do 2012 roku.
Aaron Bertrand

Odpowiedzi:

40

Możesz wykonać dowolną z poniższych metod:

Uwaga: jeśli używasz nowych funkcji, takich jak nowe typy danych itp., Musisz przetestować, ponieważ spowoduje to wyrzucenie błędów.

METODA 1: Korzystanie z rodzimych narzędzi

  1. Skryptuj bazę danych SCHEMA_ONLY i odtwórz pustą bazę danych na serwerze docelowym. Poniżej znajdują się zrzuty ekranu:

    wprowadź opis zdjęcia tutaj

    wprowadź opis zdjęcia tutaj

    wprowadź opis zdjęcia tutaj

  2. Użyj BCP OUT i BULK INSERT, aby wstawić dane.

Poniżej znajduje się skrypt, który pomoże ci w części 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)

Metoda 2: Korzystanie z narzędzi innych firm

Utwórz pustą bazę danych na serwerze docelowym. Użyj porównania schematu Redgate i porównania danych, aby utworzyć i załadować dane na serwer docelowy.

Uwaga: Użyłem schematu i porównania danych Redgate i są to najlepsze narzędzia do tego typu zadań, a zatem jeśli używasz narzędzi innych firm, moją rekomendacją byłoby Redgate.

Kin Shah
źródło
7
+1, ale pamiętaj, że są pewne rzeczy, które po prostu nie będą działać w miejscu docelowym (i nie jestem pewien, jak wdzięczne narzędzia innych firm poradzą sobie z tym wszystkim). Obiekty takie jak SEKWENCJE, kod jak OFFSET / FETCH, LAG / LEAD, itp.
Aaron Bertrand
1
Po utworzeniu schematu przez wykonanie skryptów i uruchomienie tych skryptów na starszej bazie danych inną opcją przesyłania danych jest skopiowanie bezpośrednio z jednej instancji do drugiej przez skonfigurowanie serwera połączonego. Skryptowanie pętli wykonującej całą pracę nie powinno być trudne. Aby poradzić sobie z ograniczeniami FK, musisz upewnić się, że skopiujesz tabele w odpowiedniej kolejności, lub możesz tymczasowo usunąć FK i włączyć je ponownie po skopiowaniu. Podobnie będziesz chciał wyłączyć wszelkie wyzwalacze w miejscu docelowym podczas kopiowania.
David Spillett,
4

Oprócz metod już zasugerowanych tutaj, możesz także spróbować utworzyć plik BACPAC i zaimportować go do miejsca docelowego. Jest to podobne do tego, w jaki sposób Microsoft zaleca migrację twoich baz danych z tymczasowych do baz danych w chmurze Azure.

Zaletą tego jest to, że jest to kombinacja eksportu schematu oraz danych i nie zależy od wersji bazy danych, więc teoretycznie można importować bazy danych z dowolnej wersji do dowolnej wersji.

Minusem jest to, że zanim wygeneruje plik BACPAC u źródła, uruchamia pewien ścisły proces sprawdzania poprawności, który może łatwo zakończyć się niepowodzeniem, jeśli masz odniesienia do obiektów spoza bazy danych (bazy danych użytkownika lub systemu), lub jeśli masz zaszyfrowane obiekty. Ale jeśli masz szczęście i nie zawiedzie, może to być dość łatwe rozwiązanie.

Wystarczy jedna z nowszych wersji SSMS (17 lub 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Aby rozpocząć tworzenie pliku BACPAC, kliknij bazę danych prawym przyciskiem myszy i wybierz „Eksportuj aplikację warstwy danych ...” (pamiętaj, aby nie pomylić jej z „Wyodrębnij aplikację warstwy danych ...”, co jest czymś innym):

Eksportuj aplikację warstwy danych ...

Zostanie wyświetlony prosty kreator, który przeprowadzi Cię przez kolejne etapy. Kiedy skończysz, możesz użyć „Importuj aplikację warstwy danych ...” na serwerze docelowym, co możesz zobaczyć, klikając prawym przyciskiem myszy węzeł „Bazy danych” (ponownie, nie mylić z „Wdrażanie danych” -Tier Application ... ”):

Importuj aplikację warstwy danych ...

To również pokaże ci prostego kreatora, który poprowadzi cię przez kolejne kroki.

Eitan Blumin
źródło
-1

Zmniejszenie wersji Sql Server jest bardzo ciężką pracą.
Istnieje kilka opcji, takich jak;
Przede wszystkim utwórz skrypt wszystkich obiektów bazy danych i uruchom go na serwerze docelowym.
Następnie możesz użyć;

  • SSIS,
  • Narzędzie do importowania danych,
  • Narzędzie innych firm, takie jak RedGate lub inne.

Ale w przypadku narzędzia RedGate Data Compare

musisz wziąć pod uwagę, że porównuje tylko tabele zawierające klucze podstawowe. Jeśli więc tabele, które nie mają klucza podstawowego, musisz użyć innych sposobów

hasantatarli
źródło
8
Nie sądzę, aby ta odpowiedź poprawiła się w stosunku do odpowiedzi Kinsa
James Anderson
-3

Nie można obniżyć poziomu bazy danych do SQL Server. Jednak obejściem tego problemu jest wykonanie skryptu dla wszystkich obiektów DB i zastosowanie skryptu w docelowej bazie danych. SSIS to świetny sposób na wykonanie tego.

Osama Waly
źródło
4
Czy uważasz, że to dodaje coś ważnego do odpowiedzi Kin ?
dezso