Saya memiliki database produksi yang sangat besar dan database lingkungan pengujian yang sangat besar di SQL Server 2008R2. Kedua database memiliki struktur tabel yang sama tetapi berbeda pengguna / login / izin / peran.
Saya perlu menyegarkan hanya beberapa tabel dalam database pengujian secara berkala dari produksi, sekitar sebulan sekali.
Cara saat ini saya berencana melakukan ini
- Gunakan utilitas BCP untuk mengambil ekspor tabel yang saya butuhkan dari Produksi.
- Salin file ekspor bcp ke server uji
- Nonaktifkan indeks dan batasan pada semua tabel yang saya refresh dalam Tes
- Pangkas tabel database Test
- Muat data kembali ke tabel database Test menggunakan BCP.
- membangun kembali indeks dan mengaktifkan kembali kendala dalam Tes
Ini semua tampaknya agak terlalu rumit untuk tugas sekecil itu. Sepertinya juga akan menghasilkan banyak pengulangan (di t-log) Apakah ada cara yang lebih baik untuk melakukan ini?
Cara lain yang saya pikirkan untuk melakukan ini adalah mengembalikan cadangan dari Produksi ke lingkungan pengujian - tetapi masalah yang saya miliki adalah bahwa cadangan penuh akan cukup besar dan saya tidak perlu semua tabel di-refresh, hanya beberapa- -dan juga pengguna dan keamanan dalam database produksi berbeda dari pengujian. Itu akan ditimpa oleh pengaturan keamanan di database produksi jika saya mengembalikan seluruh database.
sumber
Jawaban:
Ada 2 metode yang sesuai dengan kebutuhan Anda:
(Catatan: Jika tabel direferensikan oleh kunci asing, maka Anda tidak akan dapat menggunakan
TRUNCATE
. Anda harus menghapus dalam potongan . Atau, Anda dapat menjatuhkan semua indeks + kunci asing dan memuat data dan kemudian menciptakan kembali).BCP OUT dan BULK INSERT INTO database tujuan .
Aktifkan Bendera Jejak 610 - sisipan yang masuk secara minimal ke dalam tabel yang diindeks.
-
Metode 2: SSIS - Metode pilihan saya dalam kasus ini.
Referensi: Panduan Kinerja Pemuatan Data dan jawaban saya untuk - Sisipkan ke dalam tabel pilih * dari tabel vs masukkan massal
sumber
Tidak perlu melakukan backup dan restore, atau memanggil / mengoordinasikan proses eksternal (yaitu BCP), atau bahkan mengacaukan SSIS (sangat kuat, sangat keren, tetapi jika saya bisa menghindarinya, saya pasti akan :). Anda dapat menangani semua ini dari kenyamanan T-SQL, dalam prosedur tersimpan yang dapat Anda jadwalkan melalui SQL Agent, atau skrip yang Anda jalankan sebulan sekali (meskipun memilikinya dalam proc dan penjadwalan adalah pekerjaan yang kurang dalam jangka panjang Lari). Bagaimana? Dengan menggunakan SQLCLR untuk mengakses
SqlBulkCopy
Kelas di. NET karena pada dasarnya BCP tanpa semua kerepotan memanggil BCP. Anda dapat mengkodekannya sendiri: tidak ada pengaturan super rumit atau apa pun sebagaiSqlBulkCopy
kelas menangani hampir segalanya untuk Anda (Anda dapat mengatur ukuran bets, apakah akan memicu pemicu, dll). Atau, jika Anda tidak ingin mengacaukan dengan menyusun dan menggunakan Majelis, Anda dapat menggunakan prosedur tersimpan SQLCLR pra-dibangun seperti DB_BulkCopy yang merupakan bagian dari perpustakaan SQL # SQLCLR (yang saya penulis, tetapi ini disimpan prosedur dalam versi Gratis). Saya menjelaskan hal ini secara lebih rinci, termasuk contoh menggunakan DB_BulkCopy , dalam jawaban berikut:Impor data dari satu Database ke skrip lain
Jika tidak jelas di mana menempatkan ini dalam rencana Anda saat ini, Anda akan melakukan hal berikut:
EXEC
dari DB_BulkCopy atau apa pun yang Anda menyebutnya jika Anda kode itu sendiri, yang hanya bergerak data dari Point A ke titik B.Juga, harus ditunjukkan itu
SqlBulkCopy
dan DB_BulkCopy :UPDATE Mengenai Operasi yang Dicatat Minimal melalui SqlBulkCopy
Dimungkinkan untuk mendapatkan operasi yang tercatat minimal, tetapi Anda harus tahu:
[tempdb]
dan kemudian melakukan memasukkan memerintahkan ke tujuan. Oleh karena itu, ada beberapa beban tambahan yang timbul, baik dalam hal I / O fisik untuk tempdb (data dan file log) maupun operasi sortir (karenaORDER BY
yang diperlukan untuk mendapatkan operasi log minimal)sumber