Bagaimana cara memindahkan database dari SQL Server 2012 ke SQL Server 2005

30

Apa pilihan saya jika saya perlu memindahkan database dari SQL Server 2012 (32bit) ke SQL Server 2005 (64bit)?

Saya tahu saya tidak bisa:

  • mengembalikan cadangan database pada SQL Server 2005
  • lepaskan & lampirkan

Saya tahu saya bisa:

  • menggunakan impor data wizard, dan saya mencobanya pada satu database, tetapi hanya memindahkan data, dan bahkan itu menyusahkan karena saya perlu melakukan banyak pekerjaan membuat tabel temp untuk mempertahankan kolom identitas, menciptakan kembali semua FK, indeks dll.

Apakah ada opsi yang lebih mudah?

Greg Balajewicz
sumber
12
Opsi yang lebih mudah adalah dengan meningkatkan tujuan ke 2012, jujur.
Aaron Bertrand

Jawaban:

40

Anda dapat mengikuti metode apa pun di bawah ini:

Catatan: Jika Anda menggunakan fitur baru seperti tipe data baru, dll, maka Anda harus menguji karena akan menimbulkan kesalahan.

METODE 1: Menggunakan Alat Asli

  1. Script database SCHEMA_ONLY dan buat ulang database kosong di server tujuan. Berikut screenshotnya:

    masukkan deskripsi gambar di sini

    masukkan deskripsi gambar di sini

    masukkan deskripsi gambar di sini

  2. Gunakan BCP OUT dan BULK INSERT untuk memasukkan data.

Di bawah ini adalah skrip yang akan membantu Anda dengan Bagian 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)

Metode 2: Menggunakan Alat Pihak Ketiga

Buat database kosong di server tujuan. Gunakan skema Redgate bandingkan dan bandingkan data untuk membuat dan memuat data ke server tujuan.

Catatan: Saya telah menggunakan skema Redgate dan perbandingan data dan mereka adalah alat terbaik untuk jenis tugas seperti itu dan karenanya jika Anda menggunakan alat pihak ke-3, maka rekomendasi saya adalah Redgate.

Kin Shah
sumber
7
+1 tetapi perlu diingat bahwa ada hal-hal tertentu yang tidak akan berfungsi di tempat tujuan (dan saya tidak yakin bagaimana alat pihak ke-3 yang anggun akan menangani semua itu). Objek seperti URUTAN, kode seperti OFFSET / FETCH, LAG / LEAD, dll.
Aaron Bertrand
1
Setelah skema dibuat dengan membuat skrip dan menjalankan skrip-skrip tersebut terhadap database yang lebih lama, opsi lain untuk mentransfer data adalah menyalin secara langsung dari satu instance ke yang lain dengan menyiapkan server yang ditautkan. Seharusnya tidak sulit untuk membuat simpul yang melakukan semua pekerjaan. Untuk menghadapi kendala FK Anda harus memastikan Anda menyalin tabel dalam urutan yang sesuai atau Anda dapat menghapus FK sementara dan mengaktifkannya kembali setelah salinan. Anda juga ingin menonaktifkan pemicu di tujuan selama penyalinan.
David Spillett
4

Selain metode yang sudah disarankan di sini, Anda juga dapat mencoba membuat file BACPAC dan mengimpornya ke tujuan Anda. Ini mirip dengan cara Microsoft merekomendasikan migrasi database Anda dari on-prem ke database cloud Azure.

Keuntungannya adalah kombinasi skema pengekspor serta data, dan tidak tergantung pada versi database, sehingga Anda secara teoritis dapat mengimpor database dari versi apa pun ke versi apa pun.

Kelemahannya adalah bahwa sebelum menghasilkan file BACPAC pada sumbernya, ia menjalankan semacam proses validasi ketat yang dapat dengan mudah gagal jika Anda memiliki referensi ke objek di luar basis data Anda (baik itu basis data pengguna atau sistem), atau jika Anda memiliki objek terenkripsi. Tetapi jika Anda beruntung dan itu tidak gagal, maka itu bisa menjadi solusi yang agak mudah.

Yang Anda butuhkan adalah salah satu versi SSMS yang lebih baru (17 atau 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Untuk mulai membuat file BACPAC, klik kanan pada database dan pilih "Ekspor Aplikasi Data-tier ..." (pastikan untuk tidak bingung dengan "Ekstrak Aplikasi Data-tier ..." yang merupakan sesuatu yang berbeda):

Ekspor Aplikasi Data-tier ...

Anda akan disajikan dengan wizard sederhana untuk memandu Anda melalui langkah-langkahnya. Setelah selesai, Anda dapat menggunakan "Impor Aplikasi Data-tier ..." di server tujuan Anda, yang dapat Anda lihat dengan mengklik kanan pada simpul "Databases" (sekali lagi, jangan bingung dengan "Deploy Data -Tingkat Aplikasi ... "):

Impor Aplikasi Data-tier ...

Ini juga akan menunjukkan kepada Anda panduan sederhana untuk memandu Anda melalui langkah-langkahnya.

Eitan Blumin
sumber
-1

Untuk mengurangi versi Sql Server adalah kerja keras.
Ada beberapa opsi untuk dikurangi seperti;
Pertama-tama, buat semua skrip objek database dan jalankan di server tujuan.
Setelah itu Anda bisa menggunakan;

  • SSIS,
  • Impor Alat Data,
  • Alat pihak ketiga seperti RedGate atau lainnya.

Tapi untuk alat RedGate Data Compare ,

Anda harus mempertimbangkan bahwa itu hanya membandingkan tabel yang memiliki kunci utama. Jadi jika tabel Anda yang tidak memiliki kunci utama, Anda harus menggunakan cara lain

hasantatarli
sumber
8
Saya tidak berpikir jawaban ini meningkat pada jawaban Kins
James Anderson
-3

Tidak mungkin menurunkan versi database di SQL Server. Namun, solusinya adalah untuk skrip semua objek DB dan menerapkan skrip pada database tujuan. SSIS adalah cara terbaik untuk membantu melakukan ini.

Osama Waly
sumber
4
Apakah Anda pikir ini menambahkan sesuatu yang penting untuk jawaban Kin ?
dezso