Kembalikan cadangan SQL Server 2012 ke database SQL Server 2008?

41

Apakah ada cara untuk memulihkan cadangan database SQL Server 2012 ke SQL Server 2008?

Saya mencoba melampirkan file, tidak berhasil.

Aaron Bertrand
sumber
Ada pertanyaan lain yang setara dengan yang ini dan dijawab dengan sangat baik: superuser.com/questions/468578/…
Cavaleiro
1
Ada jawaban yang bagus untuk masalah ini di sini (migrasi, bukan cadangan / pengembalian): stackoverflow.com/questions/19837886/…
Don Jewett

Jawaban:

30

Anda memiliki beberapa opsi:

Opsi A : Script out database dalam mode kompatibilitas menggunakan opsi Generate script:

Catatan: Jika Anda skrip database dengan skema dan data, tergantung pada ukuran data Anda, skrip akan besar dan tidak akan ditangani oleh SSMS, sqlcmd atau osql (mungkin dalam GB juga).

masukkan deskripsi gambar di sini

Opsi B:

Pertama skrip tabel pertama dengan semua Indeks, FK, dll dan buat tabel kosong di database tujuan - opsi dengan SCHEMA ONLY (Tidak ada data).

Gunakan BCP untuk memasukkan data

  1. bcp keluar data menggunakan skrip di bawah ini. atur SSMS dalam Mode Teks dan salin output yang dihasilkan oleh skrip di bawah ini dalam file 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. Jalankan file bat yang akan menghasilkan file dat di folder yang telah Anda tentukan.

  3. Jalankan skrip di bawah ini pada server tujuan dengan SSMS dalam mode teks lagi.

    --- 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. Jalankan output menggunakan SSMS untuk memasukkan kembali data dalam tabel.

Ini adalah metode bcp yang sangat cepat karena menggunakan mode Asli.

Kin Shah
sumber
Sangat membantu - metode B bekerja untuk saya (SQL yang dihasilkan oleh metode A adalah 7GB dan SSMS tidak memilikinya). Beberapa SSID dan server tertaut tidak berjalan dengan benar, tetapi kapan ada hubungannya dengan server tertaut yang pernah bekerja pertama kali? Tidak yakin saya akan senang menggunakan ini dalam produksi tetapi untuk mendapatkan lingkungan pengujian 95% dengan cepat itu sempurna.
aucuparia
@aucuparia Some SSIDs and linked servers didn't go across properly. Server yang terhubung harus dibuat secara manual. SSID dapat ditransfer menggunakan sp_helprevlogin. Pekerjaan SQLAgent, paket ssis dll harus dipindahkan sesuai kebutuhan Anda. Inti dari metode ini adalah untuk mendapatkan data secepat mungkin saat Anda menurunkan versi atau menggabungkan 2 basis data.
Kin Shah
Opsi B adalah satu-satunya metode yang bekerja untuk saya, karena skrip yang dihasilkan terlalu besar dengan cara lain
JumpingJezza
23

Tidak, Anda tidak bisa mundur, hanya maju. Anda bisa membuat database kosong pada 2008 dan kemudian menggunakan wizard Generate Scripts di Management Studio untuk skrip skema dan data (atau alat perbandingan pihak ke-3 dari Red Gate dan lainnya). Pastikan Anda menetapkan versi target yang tepat sebagai 2008, dan Anda harus menyempurnakan hal-hal yang tidak kompatibel (misalnya OFFSET atau FORMAT) yang mungkin Anda gunakan pada tahun 2012.

Aaron Bertrand
sumber
8

Tidak ada cara yang didukung untuk melakukan ini karena SQL Server tidak mengizinkan kompatibilitas semacam ini.

Yang bisa Anda lakukan adalah

  1. pulihkan database pada SQL 2012

  2. menghasilkan skrip untuk objek dan data

  3. bersihkan skrip dari semua detail yang unik untuk SQL 2012
  4. jalankan skrip pada 2008

Jika Anda tidak memiliki SQL Server 2012 maka Anda dapat menggunakan alat pihak ketiga untuk membaca cadangan dan mengekstrak data dan struktur.

Dalam hal ini buat saja database kosong pada SQL 2008 dan gunakan alat seperti ApexSQL Diff dan ApexSQL Data Diff untuk menyinkronkan objek dan data. Anda dapat menemukan ini dari vendor besar lainnya juga seperti Red-Gate atau Idera.

David Smithers
sumber