Saya perlu memindahkan sejumlah besar (100+) besar (jutaan baris) tabel dari satu database SQL2008 ke yang lain.
Saya awalnya hanya menggunakan Wisaya Impor / Ekspor, tetapi semua tabel tujuan tidak memiliki kunci utama dan asing, indeks, batasan, pemicu, dll. (Kolom identitas juga dikonversi ke INT sederhana, tapi saya pikir saya baru saja melewatkan kotak centang di Penyihir.)
Apa cara yang benar untuk melakukan ini?
Jika ini hanya beberapa tabel, saya akan kembali ke sumber, skrip definisi tabel (dengan semua indeks, dll), kemudian jalankan bagian pembuatan indeks skrip pada tujuan. Tetapi dengan begitu banyak tabel, ini tampaknya tidak praktis.
Jika tidak ada begitu banyak data, saya bisa menggunakan wizard "Buat Skrip ..." untuk skrip sumber, termasuk data, tetapi skrip baris 72m sepertinya bukan ide yang bagus!
Jawaban:
Membuat skrip tabel, kemudian menggunakan SSIS untuk mentransfer data akan menjadi cara yang paling dapat diandalkan dan efektif untuk memindahkan data ke database baru.
sumber
Kami benar-benar melakukannya menggunakan banyak skrip manual dalam hubungannya dengan panduan Impor, tetapi pagi ini saya menemukan jawaban yang lebih baik, milik artikel blog Tibor Karaszi .
Bagian dari frustrasi kami di sini adalah bahwa SQL 2000 "DTS Import / Export Wizard" sebenarnya membuat ini hampir sepele dengan memilih "Copy Objects and Data":
Opsi ketiga ini adalah yang berisi kemampuan untuk memasukkan indeks / pemicu, dll:
Opsi ini DIHAPUS dari Wisaya Impor SQL 2005/2008 . Mengapa? Tidak ada ide:
Pada 2005/2008, Anda tampaknya harus secara manual membuat paket SSIS di BIDS dan menggunakan Transfer SQL Server Objects Task , yang berisi semua opsi yang sama yang ada di panduan 2000:
sumber
Saya akan mempertimbangkan untuk menuliskan tabel, atau menggunakan alat perbandingan (misalnya Gerbang Merah) untuk menghasilkan tabel dalam database target. Belum ada indeks atau kendala.
Lalu saya akan mempertimbangkan memulihkan database dengan nama yang berbeda dan melakukan di server yang sama
.. untuk setiap tabel, dengan SET IDENTITAS INSERT AKTIF jika diminta
Lalu saya akan menambahkan indeks dan batasan setelah memuat data.
Itu tergantung pada tingkat kenyamanan Anda dengan SSIS (jawaban mrdenny) atau jika Anda lebih suka SQL mentah.
sumber
Saya akan menambahkan jawaban Tn. Denny: Tuliskan skema tabel lalu gunakan BCP untuk memindahkan data. Jika Anda tidak terbiasa dengan SSIS, maka menggunakan BCP dan batch harus mudah dilakukan. Untuk jutaan baris, tidak ada yang mengalahkan BCP (masukkan massal) :).
sumber
Saya orang yang benar-benar tidak nyaman dengan SSIS.
Ketika tabel sumber tidak memiliki kolom identitas
Sekarang T-SQL untuk menghasilkan pernyataan Select * into ...
Ini menghasilkan garis untuk setiap tabel untuk menyalin suka
Dalam hal tabel berisi kolom identitas, saya skrip tabel termasuk properti identitas dan kunci utama.
Saya tidak menggunakan masukkan ke ... pilih ... menggunakan server yang terhubung dalam hal ini, karena ini bukan teknik massal. Saya sedang mengerjakan beberapa skrip PowerShell yang mirip dengan [pertanyaan SO 1 ini , tapi saya masih mengerjakan penanganan kesalahan. Tabel yang benar-benar besar dapat menyebabkan kesalahan memori, karena seluruh tabel dimuat ke dalam memori, sebelum dikirim melalui SQLBulkCopy ke database.
Rekreasi indeks dll. Mirip dengan kasus di atas. Kali ini saya dapat melewatkan rekreasi dari kunci utama.
sumber
Anda dapat menggunakan alat perbandingan yang membandingkan skema dan data basis data dan pertama-tama menyinkronkan blank skema database dengan db asli, untuk membuat semua tabel.
Kemudian, sinkronkan data dari database asli dengan yang baru (semua tabel ada di sana, tetapi semuanya kosong) untuk menyisipkan rekaman ke dalam tabel
Saya menggunakan ApexSQL Diff dan ApexSQL Data Diff untuk ini, tetapi ada alat serupa lainnya.
Hal yang baik tentang proses ini adalah Anda tidak harus benar-benar menyinkronkan basis data menggunakan alat ini, karena ini bisa sangat menyakitkan bagi jutaan baris.
Anda bisa membuat skrip INSERT INTO SQL (jangan kaget jika beberapa gigs) dan jalankan.
Karena skrip yang begitu besar bahkan tidak dapat dibuka di SQL Server Management Studio, saya menggunakan sqlcmd atau osql
sumber
Seperti yang disebutkan @rdenny -
Alih-alih menggunakan SSIS, gunakan BCP untuk memasukkan data
bcp keluar data menggunakan skrip di bawah ini. atur SSMS dalam Mode Teks dan salin output yang dihasilkan oleh skrip di bawah ini dalam file bat.
Jalankan file bat yang akan menghasilkan file dat di folder yang telah Anda tentukan.
Jalankan skrip di bawah ini di
Jalankan output menggunakan SSMS untuk memasukkan kembali data dalam tabel.
Ini adalah metode bcp yang sangat cepat karena menggunakan mode Asli.
sumber