SQL Server 2012 kompatibilitas mundur untuk cadangan dengan 2008

14

Saya memiliki sejumlah klien dengan SQL Server 2008 dan itulah yang saya miliki di server saya juga. Saya menggunakan file cadangan untuk mengirim bolak-balik database antara klien dan di kantor saya.

Saya telah membaca bahwa ketika Anda membuat cadangan dari SQL Server 2012 tidak ada cara untuk mengembalikannya ke contoh 2008. Saya berasumsi bahwa tingkat kompatibilitas akan mengatasi masalah ini, tetapi tidak. Karena itu, saya bingung bagaimana cara memutakhirkan. Selain memutakhirkan semua klien saya sekaligus, yang tidak mungkin, saya tidak bisa memikirkan cara bersih untuk melakukan ini.

Saya memiliki kebutuhan untuk mengirim database ke klien dan juga menerima database dari klien. Ini adalah peningkatan versi pertama saya di SQL Server, jadi saya baru untuk masalah ini. Ada ide tentang bagaimana untuk melanjutkan?

Jeff Stock
sumber
4
Anda dapat memiliki satu contoh SQL Server 2008 dan satu contoh SQL Server 2012 diinstal di server Anda pada saat yang sama dengan nama contoh yang berbeda. Mungkin itu akan menyelesaikan masalah Anda dengan klien pada versi yang berbeda?
Mikael Eriksson
Pertanyaan serupa pada SO: stackoverflow.com/q/1744808/95710
DForck42

Jawaban:

16

Ada dua hal yang terlibat di sini: nomor versi file, dan tingkat kompatibilitas. Ketika Anda melampirkan database ke versi utama yang lebih baru (seperti dari 2008 hingga 2008R2, atau 2008R2 hingga 2012) versi database diubah secara permanen, dan Anda tidak bisa melampirkan database itu ke versi yang lebih lama lagi.

Tingkat kompatibilitas untuk parsing old-school T-SQL usang yang digunakan untuk bekerja di versi SQL Server yang lebih lama. Itu tidak mengubah bagaimana data disimpan di disk.

Untuk memberikan database kepada seseorang di versi SQL Server yang lebih lama, Anda harus mengekspor data dan mengimpornya ke database lain. Alat-alat seperti Red Gate's Data Compare sangat membantu untuk ini.

Brent Ozar
sumber
Yup, saya pernah mengalami masalah yang sama sebelumnya. Akhirnya menulis seluruh database dan kemudian menulis semua data. SQL Bandingkan Red Gate dan Data Perbandingan datang untuk menyelamatkan hari itu.
DForck42
@ DForck42: Dalam kasus saya, DB terlalu besar untuk skrip dengan data, jadi saya akhirnya membuat skrip skema, lalu memindahkan data dengan bcp.
ivan_pozdeev
@ivan_pozdeev maksud Anda diekspor menggunakan SQL Server 2012 BCP, dan diimpor menggunakan SQL Server 2008R2 BCP? Jadilah hebat untuk mengetahui format file yang kompatibel, terima kasih.
Chris
2
@Chris msdn.microsoft.com/en-us/library/ms162802.aspx "Dalam SQL Server 2014, utilitas bcp mendukung file data asli yang kompatibel dengan SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2, dan SQL Server 2012. "
ivan_pozdeev
Terima kasih @ivan_posdeev, ini telah menjadi wahyu. Saya telah mendokumentasikan langkah-langkah saya di bawah ini jika itu membantu orang lain.
Chris
6

Pengaturan tingkat kompatibilitas digunakan oleh SQL Server untuk menentukan bagaimana fitur-fitur baru tertentu harus ditangani. Dengan cara ini DB dapat dimigrasikan ke versi SQL yang lebih baru tanpa memiliki masalah dengan aplikasi. Tingkat kompatibilitas dapat diubah bolak-balik.

Sayangnya, file cadangan tidak kompatibel mundur. Salah satu metode adalah menggunakan impor / ekspor untuk memindahkan data Anda dari DB Anda saat ini ke instance versi lama Anda.

StanleyJohns
sumber
3

Untuk migrasi SQL, gunakan Wisaya Migrasi Database SQL sumber terbuka dan gratis.

Saya memiliki database 5GB dengan pasangan ~ 10 juta catatan dan mencoba rute melalui Generate Script dan kemudian menjalankannya dengan sqlcmd.exe. Pertama-tama, skrip yang dihasilkan tidak selalu berfungsi dengan benar. Kedua, sqlcmd.exe dapat gagal pada file besar juga, mengeluh tentang memori yang tersedia. osql.exe berfungsi, tetapi hanya butuh waktu lama (dan memiliki argumen baris perintah yang sama).

Lalu saya menemukan alat yang luar biasa untuk memigrasi SQL Server ke database SQL Azure. Ini berfungsi untuk SQL Server ke SQL Server juga, misalnya jika Anda ingin memigrasi database SQL 2012 ke 2008 R2. Ini menggunakan bcp.exe, yang menggunakan salinan massal. Ada versi GUI dan baris perintah (Batch) yang tersedia dan open source. Lihat http://sqlazuremw.codeplex.com/ . Dalam kasus saya, operasi memakan waktu 16 menit.

Di layar lanjutan Anda dapat memilih bahwa target Anda adalah SQL Server, bukan SQL Azure.

lvmeijer
sumber
2

Saya telah menemukan BCP lebih efektif daripada beberapa alat untuk mendapatkan data ke versi SQL Server sebelumnya, dan untuk menarik data dari RDS. (Terima kasih @ivan_posdeev.)

Saya pertama kali menghasilkan skema dengan mengklik kanan pada database di SQL Server Management Studio, Tugas, Menghasilkan skrip. Centang semua objek, dalam objek lanjutan memastikan semua yang Anda butuhkan akan ditulis (statistik, indeks, dll.), Hapus centang "USE database" jika database tujuan Anda memiliki nama yang berbeda, atur kompatibilitas ke versi database tujuan Anda, dan hasilkan sebuah file yang membuat skema Anda. Buat database di tujuan Anda dan jalankan file ini di atasnya (menggunakan osql, sqlcmdatau GUI).

Untuk memindahkan data, jalankan kueri berikut dua kali pada basis data sumber , pertama-tama beri komentar pada kolom kedua untuk menghasilkan file batch untuk mengekstrak data, lalu beri komentar pada kolom pertama untuk menghasilkan file batch impor untuk dijalankan di tujuan Anda. (Anda perlu menambahkan server sumber dan tujuan Anda, nama contoh, direktori file keluaran dan input, nama pengguna dan kata sandi. Untuk menggunakan keamanan terintegrasi, ganti opsi -Udan -Pdengan adil -T.)

Ini mendukung Unicode, jika Anda tidak membutuhkannya, ubah -Nsakelar di kedua pernyataan menjadi -n.

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

Setelah menjalankan periksa file bernama schema.tablename.ERRORS.dat - akan menyertakan baris yang gagal, kosongkan jika tidak ada.

Referensi MSDN untuk BCP di sini , lebih bersahabat dari opsi BCP di sini .

Saya telah menemukan ini sangat unggul untuk menghasilkan skrip, dan salah satu alat yang saya coba. Ini juga berjalan pada basis data RDS (yang tidak mengizinkan cadangan). File data yang dihasilkan berukuran 30% dari ukuran skrip SQL, menjalankannya membutuhkan waktu, dan jauh lebih andal. (Skrip yang dihasilkan oleh SQL Server untuk data skrip selalu tersandung, kadang-kadang dapat diprediksi kadang tidak, SQL yang dihasilkan tidak kompatibel dengan 2008R2 (misalnya, digunakan nvarchar(0), sering tidak lengkap tanpa alasan yang dapat dilihat, dll. BCP juga mereplikasi pelanggaran kendala apa pun) , seperti integritas referensial.).

Chris
sumber