Memeriksa apakah 2 tabel (pada server yang berbeda) memiliki data pasti yang sama


10

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.

Jawaban:


11

Saya percaya Anda sedang mencari alat tablediff yang memungkinkan Anda melakukan hal itu - bandingkan dua tabel yang direplikasi untuk perbedaan. Anda mungkin menemukan artikel ini bermanfaat, untuk memulai.

Berikut ini adalah GUI untuk tablediff


Awsome, terima kasih. Saya harus membaca tentang hal ini. Juga terima kasih atas tautannya ke GUI, itu akan membuat segalanya lebih mudah sangat menghargainya!
Juan Velez


4

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 HASHBYTESalih-alih CHECKSUMkeluarga 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 (atau SELECT 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.


2

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)


Terimakasih atas infonya! Saya akan melihat itu. Naskah itu akan sangat membantu!
Juan Velez

sesuatu yang sering saya gunakan adalah except: select id, name from Table1 except select id, name from Table2akan memberi Anda segalanya di Table1 tetapi tidak di Table2
Adam
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.