Saya memiliki dua database SQL Server. Satu adalah klien (aplikasi Windows) dan yang kedua di server. Saya ingin menyinkronkan kedua database ini sesering mungkin (mis. Setiap 2 menit!).
Saya telah membaca tentang berbagai cara sinkronisasi seperti replikasi, cap waktu, tabel log menggunakan pemicu, Microsoft Sync Framework dan sebagainya.
Sebenarnya saya tidak suka menggunakan metode sinkronisasi yang mungkin berupa kotak hitam (seperti replikasi) karena saya tidak ingin tabel khusus SQL Server diblokir saat saya memperbarui mereka dan menyinkronkannya dengan server.
metode mana menurut Anda yang harus saya gunakan dalam keadaan seperti itu? Ingat bahwa setiap beberapa menit saya harus mengirim beberapa perubahan tabel dari klien ke server dan mengambil juga dua perubahan tabel dari server.
Saya telah menemukan metode yang aneh tetapi baru. Apakah mungkin bahwa saya mencatat semua prosedur tersimpan yang dijalankan (untuk pilihan tertentu) di klien dan mengirimkannya dengan parameter mereka dalam
.sql
file ke server dan menjalankannya di sana? Hal yang sama akan terjadi di server dan dikirim ke klien. Apakah Anda berpikir bahwa ini adalah metode yang sederhana namun bermanfaat atau tidak?tolong sarankan saya pendekatan yang berguna jika Anda bisa. Terima kasih banyak.
EDIT: Ingat bahwa ini adalah sinkronisasi waktu-nyata dan ini membuatnya istimewa. Itu berarti ketika pengguna klien menggunakan tabel, proses sinkronisasi dengan server harus terjadi setiap beberapa menit sehingga tidak ada tabel yang harus dikunci.
sumber
Jawaban:
Yah saya mungkin tidak mengerti, tetapi saya mencoba menjawabnya.
Anda bilang Anda membutuhkan solusi kinerja tinggi yang sering berjalan (minimal semua 2 menit) dan Anda membutuhkan pendekatan yang baik yang harus cepat tanpa mengunci. Tetapi Anda tidak ingin sistem blackbox.
Alih-alih sistem blackbox, yang digunakan pada jutaan instalasi dengan hasil yang baik, Anda mencoba untuk menemukan roda lagi dan membangun solusi Anda sendiri? Hm, terdengar agak aneh.
Sebenarnya ini adalah saran saya.
ISOLATION LEVEL
keREAD_COMMITTED_SNAPSHOT
. Anda dapat membaca lebih lanjut di sini . Ini akan menghabiskan sebagian dari tempdb Anda, tetapi tabel Anda selalu dapat dibaca dan ditulisi dan replikasi dapat bekerja di latar belakang.Lihat contoh di bawah ini:
CDC
bisa menjadi hal yang rapuh dalam beberapa keadaan.CDC
akan menangkap semua data pada tabel yang ditonton (Anda perlu menentukan setiap tabel yang ditonton secara manual). Setelah itu Anda akan mendapatkan nilai sebelum dan nilai setelahINSERT
,UPDATE
atauDELETE
.CDC
akan menahan informasi tersebut untuk jangka waktu tertentu (Anda dapat menentukannya sendiri). Pendekatannya dapat digunakanCDC
pada tabel tertentu yang perlu Anda perhatikan dan secara manual mereplikasi perubahan tersebut ke database lain. Omong-omong,CDC
gunakan Replikasi Server SQL di bawah tenda juga. ;-) Anda dapat membaca lebih lanjut di sini .Nah ini 2 sen saya. Semoga Anda memiliki gambaran umum yang baik dan mungkin Anda menemukan satu solusi yang cocok untuk Anda.
sumber
Saya akan mencoba untuk menyebutkan beberapa opsi di sini dengan kelebihan dan kekurangan saat saya mempersepsikannya:
Microsoft Sync Framework - bagi saya lebih cocok untuk basis data aplikasi seluler yang lebih kecil. Ini menambahkan cukup banyak tabel ke database Anda dan tidak seefisien replikasi. Karena ini diterapkan di luar SQL Server sebagai komponen, itu akan lebih sulit untuk dikonfigurasi. Saya tidak punya pengalaman dengan itu, hanya mencobanya dan memutuskan untuk tidak menggunakannya.
Pelacakan perubahan basis data . Ini adalah fungsi SQL Server bawaan yang berfungsi untuk Anda mengubah pelacakan termasuk memasukkan, memperbarui, dan menghapus. Semua hal lain seperti mengirim dan menerapkan perubahan, menyelesaikan konflik, dll. Anda harus membuat kode sendiri.
CDC sebagaimana disebutkan dalam jawaban Ionic - saya tidak punya pengalaman dengan itu, karena hanya tersedia dalam edisi Perusahaan atau Pengembang.
Menggunakan trik Anda sendiri dengan mencatat prosedur tersimpan yang dijalankan - sangat tergantung pada sifat aplikasi database Anda. Tetapi ketika prosedur menjadi sedikit berbeda, di sana Anda bisa mendapatkan kekacauan besar dalam data. Dan bagaimana Anda menangani konflik?
Dari pertanyaan Anda, tampaknya Anda perlu menyinkronkan hanya beberapa tabel dan tidak seluruh database besar. Untuk tujuan ini, Anda harus menganalisis kebutuhan Anda lebih detail daripada yang Anda tentukan dalam pertanyaan, seperti:
Jika pada akhirnya Anda mengetahui, bahwa penghapusan dan konflik bukanlah masalah Anda dan bahwa struktur Anda tidak akan banyak berubah, Anda dapat mempertimbangkan untuk menulis logika Anda sendiri, tetapi dapat dengan mudah berkembang menjadi 1000 baris kode.
sumber
Terima kasih atas tanggapan Anda.
Saya berhasil menyelesaikan proses sinkronisasi dengan menangkap prosedur tersimpan yang dijalankan bukan sebagai banyak tetapi satu per satu yang bekerja sangat baik dalam kasus saya. Karena integritas dan semuanya dipertimbangkan dengan hati-hati, sistem telah bekerja secara real-time hingga sekarang.
sumber
Jawaban terlambat tetapi mungkin bermanfaat untuk memberi tahu pengunjung
Saya memiliki tantangan serupa mencoba mendistribusikan data di server yang berbeda dan menyelesaikannya dengan menggunakan alat pihak ketiga ( Diff untuk perubahan skema dan DataDiff untuk sinkronisasi perubahan data) dan mengikuti skrip PowerShell yang diperlukan untuk mengotomatiskan proses:
Metode ini menjadwalkan perbandingan antara dua database dan menyinkronkan perubahan yang ditemukan secara real time. Berikut adalah beberapa artikel yang menawarkan petunjuk langkah demi langkah:
https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database- skema-dalam-sinkronisasi /
sumber