Jadi sepertinya perusahaan yang meng-hosting Server SQL kami telah mengalami beberapa masalah dengan replikasi dari server produksi ke server cadangan ... Saya percaya beberapa tabel telah mereplikasi dengan benar. Replikasi dilakukan setiap hari (setelah jam kerja).
Apakah ada cara saya dapat membandingkan 2 dari tabel yang sama, 1 dari cadangan vs 1 dari server produksi untuk melihat apakah replikasi semalam bekerja?
Satu-satunya cara saya dapat menemukan adalah menjalankan query berikut di kedua server dan melihat apakah hasilnya cocok dengan yang "mungkin" berarti bahwa ke 2 tabel berisi informasi yang sama.
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM (
SELECT *
FROM table_to_compare
) t1
menggunakan kode di atas, Tampaknya tabel berhasil mereplikasi karena nilai checksumnya sama tetapi saya tidak yakin seberapa andal metode ini.
Adakah yang tahu metode yang lebih baik untuk memeriksa ini atau apakah ini cara yang baik?
Saya menjalankan SQL Server 2008 di komputer windows server 2008.
Terima kasih.
sumber
Saya menemukan artikel ini sangat menarik: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/
"Jika Anda membutuhkan kecepatan lebih dari akurasi - gunakan CHECKSUM, bukan BINARY_CHECKSUM.
Jika Anda membutuhkan akurasi melebihi kecepatan - gunakan HASHBYTES. "
sumber
Seberapa besar data dan seberapa cepat tautan antara database dan satu sama lain (dan Anda)? Ada sejumlah ide:
Jika data cukup kecil sehingga praktis, jalankan
SELECT * FROM <table> ORDER BY <pk>
pada setiap DB, simpan hasilnya ke tab atau file yang dibatasi koma (tidak sejajar dengan ruang yang menghasilkan ukuran file yang dihasilkan secara besar-besaran) dan bandingkan output yang dihasilkan dengan tipe diff yang Anda inginkan utilitas seperti winmerge. Dengan begitu Anda benar - benar membandingkan semua data.Jika basis data dapat saling melihat (kemungkinan besar karena mereka dapat beroperasi sebagai mitra replikasi) dan tautan di antara mereka adalah bandwidth yang cukup tinggi dan latensi yang cukup rendah, Anda dapat menggunakan fungsionalitas server tertaut (lihat http://msdn.microsoft .com / en-us / library / ms190479.aspx dan dokumentasi terkait) untuk dan membandingkan membandingkan isi tabel dalam beberapa pernyataan SQL (daftar baris
<table>
yang tidak memiliki baris identik<linked_server>.<db>..<table>
dan sebaliknya) sama seperti Anda akan membandingkan konten dua tabel lokal. Ini adalah opsi yang relatif lambat, tetapi bisa menjadi pemeriksaan yang cukup kuat untuk mengotomatisasi.Jika Anda perlu menggunakan checksum karena Anda ingin sangat mengurangi jumlah data yang perlu ditransfer, gunakan
HASHBYTES
alih-alihCHECKSUM
keluarga fungsi karena Anda dapat menggunakan hash berkualitas lebih baik sehingga Anda lebih yakin dengan mereka yang keluar sama. Ini lebih intensif CPU, tetapi untuk sejumlah besar data Anda akan I / O terikat bukan CPU terikat sehingga akan memiliki banyak siklus cadangan (dan untuk jumlah kecil sama sekali tidak masalah).Sebagai jalan tengah antara membandingkan semua data karakter-untuk-karakter dan membandingkan satu checksum yang mencakup semua data, Anda dapat mengekspor
SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>
dari setiap database dan membandingkan hasil-hasil tersebut untuk melihat apakah mereka identik (atauSELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>
untuk mengurangi jumlah data) mengalir, tetapi memiliki PK dalam output akan berarti Anda dapat mengidentifikasi baris yang berbeda, jika ada, dengan lebih sedikit pertanyaan lebih lanjut). Tentu saja opsi terakhir ini tidak ada gunanya jika data di baris rata-rata lebih kecil dari hash yang dihasilkan, dalam hal ini opsi "bandingkan semuanya " akan lebih efisien.sumber
Sementara tablediff membandingkan hanya tabel dalam database langsung, ada banyak alat pihak ke-3 yang dapat membandingkan cadangan basis data dengan database langsung.
Anda juga dapat menjalankan skrip berikut untuk melihat data yang ada di satu tabel dan tidak ada di yang lain, tetapi Anda bisa melakukannya hanya terhadap 2 database langsung:
SELECT * FROM MyTest.dbo.testtable WHERE NOT EXISTS (SELECT * FROM MyTest2.dbo.TestTable WHERE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)
sumber
except
:select id, name from Table1 except select id, name from Table2
akan memberi Anda segalanya di Table1 tetapi tidak di Table2