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

prasejarah

Suatu kali, untuk mereproduksi bug, saya memerlukan cadangan database produksi.

Yang mengejutkan saya, saya mengalami keterbatasan berikut:

  1. Cadangan basis data dibuat pada versi SQL Server 2016 dan tidak kompatibel dengan saya SQL Server 2014.
  2. Di komputer kerja saya, OS yang digunakan adalah Windows 7jadi saya tidak bisa memperbarui SQL Server hingga versi 2016
  3. Produk yang didukung adalah bagian dari sistem yang lebih besar dengan arsitektur warisan yang dipasangkan dengan erat dan juga berkomunikasi dengan produk dan basis lain, sehingga akan membutuhkan waktu yang sangat lama untuk menerapkannya ke stasiun lain.

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

Memulihkan data dari cadangan

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

Mengonfigurasi akses ke SQL Server pada mesin virtual

Selanjutnya, perlu dilakukan beberapa langkah untuk dapat mengakses SQL Server dari luar:

  1. Untuk firewall, tambahkan aturan untuk melewati permintaan port 1433.
  2. Diinginkan bahwa akses ke server tidak melalui otentikasi Windows, tetapi melalui SQL menggunakan login dan kata sandi (lebih mudah untuk mengatur 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 Pengguna Pemetaan tentukan peran pengguna untuk database yang dipulihkan db_securityadmin.

Transfer data

Sebenarnya transfer data itu sendiri terdiri dari dua tahap:

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

Transfer skema data

Kami melakukan operasi berikut:

  1. memilih Tugas -> Hasilkan Skrip untuk basis portabel.
  2. Pilih objek yang perlu Anda transfer atau biarkan nilai default (dalam hal ini, skrip akan dibuat untuk semua objek database).
  3. Tentukan pengaturan untuk menyimpan skrip. Akan lebih mudah untuk menyimpan skrip dalam satu file Unicode. Kemudian, jika terjadi kegagalan, Anda tidak perlu mengulang semua langkah lagi.

Setelah skrip disimpan, skrip dapat dijalankan di SQL Server asli (versi lama) untuk membuat basis yang diperlukan.

peringatan: Setelah menjalankan skrip, Anda perlu memeriksa korespondensi antara pengaturan database dari cadangan dan database yang dibuat oleh skrip. Dalam kasus saya, tidak ada pengaturan untuk COLLATE dalam skrip, yang menyebabkan kegagalan saat mentransfer data dan menari dengan rebana untuk membuat ulang database menggunakan skrip tambahan.

Transfer data

Sebelum mentransfer data, Anda harus menonaktifkan pemeriksaan semua batasan pada database:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Transfer data dilakukan menggunakan wisaya impor data Tugas -> Impor Data di SQL Server, tempat database yang dibuat oleh skrip berada:

  1. Tentukan pengaturan koneksi ke sumber (SQL Server 2016 di mesin virtual). Saya menggunakan sumber data Klien Asli SQL Server dan otentikasi SQL yang disebutkan di atas.
  2. Tentukan pengaturan koneksi untuk tujuan (SQL Server 2014 di mesin host).
  3. Selanjutnya, atur pemetaan. Semua harus dipilih tidak hanya-baca objek (misalnya, tampilan tidak perlu dipilih). Sebagai opsi tambahan, pilih "Izinkan penyisipan ke dalam kolom identitas"jika seperti itu digunakan.
    peringatan: jika, ketika mencoba memilih beberapa tabel dan mengatur propertinya "Izinkan penyisipan ke dalam kolom identitas" properti telah disetel untuk setidaknya satu dari tabel yang dipilih, dialog akan menunjukkan bahwa properti telah disetel untuk semua tabel yang dipilih. Fakta ini dapat membingungkan dan menyebabkan kesalahan migrasi.
  4. Kami memulai transfer.
  5. Mengembalikan pemeriksaan kendala:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Jika terjadi kesalahan, kami memeriksa pengaturan, menghapus database yang dibuat dengan kesalahan, membuatnya kembali dari skrip, melakukan koreksi, dan mengulangi transfer data.

Kesimpulan

Tugas ini cukup langka dan terjadi hanya karena keterbatasan di atas. Solusi paling umum adalah memutakhirkan SQL Server atau menyambung ke server jarak jauh jika arsitektur aplikasi mengizinkannya. Namun, tidak ada yang kebal dari kode lama 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 tenaga. Terima kasih atas perhatian Anda!

Daftar sumber yang digunakan

Sumber: www.habr.com