Snapshots basis data SQL Server untuk pengujian integrasi

14

Saya mencoba mendefinisikan cara bekerja dengan database pengujian (dalam SQL Server) untuk pengujian integrasi kami.

Gagasan saya adalah melakukan langkah-langkah ini pada peluncuran perakitan uji integrasi:

  • buat database yang benar-benar kosong
  • jalankan skrip "buat objek basis data" untuk membuat semua objek basis data yang relevan (tabel, tampilan, urutan, dll.)
  • isi "data dasar" (nilai pencarian dll.)
  • mengambil snapshot basis data yang disebut (db)_Basissebagai "garis dasar" untuk pengujian integrasi di masa depan

Sekarang sebelum setiap kelas uji (berisi tes 1-n), saya berencana untuk melakukan "restore from snapshot" untuk kembali ke keadaan database yang didefinisikan dengan baik, kurang lebih "kosong". Bekerja seperti pesona sejauh ini.

Namun, ada satu set tes integrasi yang perlu beroperasi pada database uji besar - jadi saya berharap untuk melakukan ini sebelum masing-masing perlengkapan tes (kelas dengan n tes individu)

  • pulihkan database dari (db)_Basissnapshot
  • masukkan 50'000 + baris data ke dalam basis data
  • buat snapshot (db)_With_Testdatasnapshot lain

dan kemudian untuk setiap tes, setel ulang database ke (db)_With_Testdataversi snapshot yang terdefinisi dengan baik , jalankan tes, verifikasi hasilnya dan sebagainya.

Masalahnya adalah: Saya sepertinya tidak dapat memiliki dua snapshot db secara bersamaan - begitu saya melakukannya, saya tidak dapat mengembalikan basis data saya ke salah satu dari mereka .... Saya terus mendapatkan kesalahan ini:

Msg 3137, Level 16, Status 4, Baris 9
Basis Data tidak dapat dikembalikan. Entah nama utama atau foto tidak ditentukan dengan benar, semua foto lain belum dijatuhkan, atau ada file yang hilang.

Msg 3013, Level 16, State 1, Line 9
KEMBALIKAN DATABASE berakhir secara tidak normal.

Apakah itu benar-benar cara kerja snapshot basis data SQL Server ?? Tampak sangat membatasi ..... Saya akan mengerti jika saya tidak dapat kembali langsung ke snapshot "(db) _Basis" asli mungkin - tetapi hanya karena saya sekarang memiliki dua snapshot, saya bahkan tidak dapat kembali ke yang terbaru ?!?!?

marc_s
sumber
Berapa lama bagian Sisipkan 50.000 baris berlangsung? Bisakah Anda menerapkannya kembali?
RBarryYoung

Jawaban:

12

Sayangnya, ini karena desain.

Diambil dari halaman BOL " Kembalikan Database ke Snapshot Database ":

Keterbatasan dan Batasan

Pengembalian tidak didukung dalam kondisi berikut:

  • Basis data saat ini harus hanya memiliki satu snapshot basis data , yang Anda rencanakan untuk dikembalikan.
  • Grup-grup baca-saja atau terkompresi ada dalam database.
  • File apa pun sekarang offline tetapi sedang online ketika foto itu dibuat

Sebagai alternatif, Anda dapat menjatuhkan snapshot pertama (db)_Basis. Saya dapat memahami bahwa ini tampaknya sangat terbatas tetapi lihat dengan cara ini: snapshot adalah file yang jarang berdasarkan pada file data asli, jadi kembali ke snapshot tertentu akan membatalkan semua snapshot tertentu (file data dasar akan diubah oleh operasi pengembalian) . Keterbatasan itu bisa mengganggu, tetapi tidak terlihat tidak masuk akal.

spaghettidba
sumber
4

Perspektif lain adalah mengambil cadangan dan memulihkan - karena Anda hanya membuat database dan skema kosong dengan beberapa nilai pencarian.

Juga, hanya menyisipkan baris 50K, basis data tidak akan sebesar itu. Jika Anda menggunakan kompresi, ukuran cadangan juga akan lebih sedikit.

Anda dapat memiliki pekerjaan Agen TSQL atau hanya skrip (mungkin Anda dapat membuat prosedur tersimpan dan hanya memanggilnya setelah tes Anda berdasarkan pada output yang Anda dapatkan).

  • Pencadangan basis - (db)_Basis
  • Dengan cadangan testdata - (db)_With_Testdata

Agar skrip integrasi Anda berjalan dan berdasarkan pada hasil akhir, Anda dapat menjalankan salah satu dari pekerjaan di atas untuk kembali ke titik apa pun yang Anda inginkan.

Saya merasa bahwa metode backup / restore jauh lebih elegan dalam skenario Anda karena Anda menekan batasan snapshot database . Juga, Paul Randal membuat blog tentang bug jahat di semua versi hingga dan termasuk SQL Server 2012 (tidak yakin apakah itu diperbaiki di CU yang lebih baru)

Ketika Anda kembali ke snapshot database, file log transaksi dari database sumber dihapus dan diganti dengan file log 0,5MB dengan dua VLFs 0,25MB.

Kin Shah
sumber
Ya, kami telah menggunakan backup / restore - tapi itu dalam rentang 5-7 detik, sementara memulihkan dari snapshot database jauh di bawah 1 detik - itu sebabnya kami sedang mencari alternatif untuk backup / restore
marc_s
@marc_s Yah bagi saya 5-7 detik dapat diterima tanpa batasan dan bug vs 1 detik dengan keterbatasan dan kemungkinan bug :-)
Kin Shah
Bagi kami, itu tidak dapat diterima - kami sedang mencari solusi yang lebih cepat
marc_s
@marc_s Saya melihat poin Anda tidak dapat diterima. Tapi Anda sudah mencapai batasan itu karena desain. Anda hanya dapat menggunakan 1 foto tetapi masih membutuhkan cadangan untuk kembali. Pilihan ada di tangan Anda - gunakan snapshot tunggal mis. Dengan testdata Anda dan gunakan cadangan untuk mengembalikan ke data base.
Kin Shah