Transfer data cadangan dari versi baru MS SQL Server ke versi yang lebih lama

Latar belakang


Suatu hari, untuk mereproduksi bug, saya membutuhkan cadangan dari basis produksi.

Yang mengejutkan saya, saya menemukan keterbatasan berikut:

  1. Cadangan database dibuat pada versi SQL Server 2016 dan tidak kompatibel dengan SQL Server 2014 saya .
  2. Di komputer saya yang bekerja, Windows 7 digunakan sebagai OS, jadi saya tidak bisa memutakhirkan SQL Server ke versi 2016
  3. Produk yang didukung adalah bagian dari sistem yang lebih besar dengan arsitektur Legacy yang sangat terhubung dan juga beralih ke produk dan pangkalan lain, sehingga menyebarkannya ke stasiun lain bisa memakan waktu yang sangat lama.

Mengingat hal di atas, saya sampai pada kesimpulan bahwa sudah waktunya untuk kruk solusi non-standar.

Pemulihan data dari cadangan


Saya memutuskan untuk menggunakan Oracle VM VirtualBox dengan Windows 10 (Anda dapat mengambil gambar uji untuk browser Edge dari sini ). SQL Server 2016 diinstal pada mesin virtual dan database aplikasi dipulihkan dari cadangan ( instruksi ).

Konfigurasikan Akses ke SQL Server di Mesin Virtual


Selanjutnya, perlu mengambil beberapa langkah untuk memungkinkannya mengakses SQL Server dari luar:

  1. Untuk firewall, tambahkan aturan untuk melewati permintaan ke port 1433 .
  2. Sangat diharapkan bahwa akses ke server tidak melalui otentikasi windows, tetapi melalui SQL dengan nama pengguna dan kata sandi (lebih mudah untuk mengkonfigurasi akses). Namun, dalam hal ini, Anda harus ingat untuk mengaktifkan otentikasi SQL di properti SQL Server.
  3. Dalam pengaturan pengguna di SQL Server, pada tab Pemetaan Pengguna , tentukan peran pengguna db_securityadmin untuk database yang dipulihkan.

Transfer data


Sebenarnya transfer data itu sendiri terdiri dari dua tahap:

  1. Transfer skema data (tabel, tampilan, prosedur tersimpan, dll.)
  2. Transfer data itu sendiri

Migrasi skema data


Kami melakukan operasi berikut:

  1. Pilih Tugas -> Buat Skrip untuk basis data portabel.
  2. Kami memilih objek yang diperlukan untuk mentransfer atau meninggalkan nilai default (dalam hal ini, skrip akan dibuat untuk semua objek dalam database).
  3. Tentukan pengaturan untuk menyimpan skrip. Lebih mudah menyimpan skrip ke dalam satu file yang disandikan dalam Unicode. Kemudian, jika terjadi kegagalan, tidak perlu mengulangi semua langkah lagi.

Setelah menyimpan skrip, dapat dijalankan pada SQL Server asli (versi lama) untuk membuat database yang diperlukan.

Perhatian: setelah menjalankan skrip, Anda perlu memeriksa kepatuhan pengaturan database dari cadangan dan database yang dibuat oleh skrip. Dalam kasus saya, tidak ada pengaturan untuk COLLATE dalam skrip, yang menyebabkan crash ketika mentransfer data dan menari dengan rebana untuk membuat ulang database menggunakan skrip yang diperbesar.

Transfer data


Sebelum mentransfer data, Anda harus menonaktifkan pemeriksaan semua pembatasan berdasarkan:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all' 

Kami mentransfer data menggunakan Tugas -> Impor Data impor panduan impor di SQL Server, tempat database yang dibuat oleh skrip berada:

  1. Tentukan pengaturan koneksi sumber (SQL Server 2016 pada mesin virtual). Saya menggunakan Sumber Data SQL Server Native Client dan otentikasi SQL yang disebutkan di atas.
  2. Tentukan pengaturan untuk menghubungkan ke tujuan (SQL Server 2014 pada mesin host).
  3. Selanjutnya, konfigurasikan pemetaan. Anda harus memilih semua objek non-baca-saja (misalnya, Anda tidak perlu memilih tampilan). Sebagai opsi tambahan, pilih "Izinkan penyisipan ke kolom identitas" , jika digunakan.
    Perhatian: jika, ketika Anda mencoba untuk memilih beberapa tabel dan mengatur properti “Izinkan penyisipan ke dalam kolom identitas” , properti tersebut telah ditetapkan untuk setidaknya satu dari tabel yang dipilih, dialog akan menunjukkan bahwa properti tersebut telah ditetapkan untuk semua tabel yang dipilih. Fakta ini dapat membingungkan dan menyebabkan kesalahan transfer.
  4. Kami memulai transfer.
  5. Kembalikan cek kendala:
     EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all' 

Jika ada kesalahan, periksa pengaturan, hapus database yang dibuat dengan kesalahan, buat kembali dari skrip, lakukan koreksi dan ulangi transfer data.

Kesimpulan


Tugas ini cukup langka dan muncul hanya karena keterbatasan di atas. Solusi paling umum adalah memutakhirkan SQL Server atau menyambung ke server jauh jika arsitektur aplikasi memungkinkan. Namun, tidak ada yang aman dari kode warisan dan tangan bengkok dari pengembangan berkualitas rendah. Saya harap Anda tidak memerlukan instruksi ini, tetapi jika Anda masih membutuhkannya, ini akan membantu menghemat banyak waktu dan saraf. Terima kasih atas perhatian anda!

Daftar sumber yang digunakan


Source: https://habr.com/ru/post/id455934/


All Articles