Bagikan melalui


Cara replikasi penggabungan melacak dan menghitung perubahan

Setelah publikasi atau langganan diinisialisasi, replikasi gabungan melacak dan mendata semua perubahan pada data dalam tabel yang diterbitkan. Perubahan dilacak melalui pemicu (yang dibuat oleh replikasi untuk setiap tabel yang diterbitkan) dan tabel sistem di dalam database publikasi dan langganan. Tabel sistem replikasi ini diisi dengan metadata yang menunjukkan perubahan mana yang harus disebarluaskan. Ketika Agen Penggabungan berjalan selama sinkronisasi, perubahan dijumlahkan oleh agen dan kemudian diterapkan ke Penerbit dan Pelanggan seperlunya.

Pelacakan perubahan

Replikasi penggabungan menggunakan pemicu dan tabel sistem berikut untuk melacak perubahan untuk semua tabel yang diterbitkan:

  • MSmerge_ins_<GUID>: sisipkan pemicu (nilai GUID untuk pemicu ini dan pemicu lainnya berasal dari sysmergearticles)
  • MSmerge_upd_<GUID>: perbarui pemicu
  • MSmerge_del_<GUID>: hapus pemicu
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

Replikasi penggabungan menggunakan tabel sistem tambahan berikut untuk melacak perubahan untuk tabel yang difilter:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Nota

Tabel sistem yang tercantum digunakan oleh semua publikasi gabungan dan langganan dalam database; misalnya, jika Anda memiliki lebih dari satu publikasi dalam database publikasi, MSmerge_contents berisi baris dari artikel di semua publikasi.

Pelacakan perubahan untuk tabel yang tidak difilter

Tabel sistem

Tabel sistem yang digunakan untuk tabel yang tidak difilter dan difilter berisi metadata berikut:

  • MSmerge_contents berisi satu baris untuk setiap baris yang disisipkan atau diperbarui dalam tabel yang diterbitkan dalam database.

  • MSmerge_tombstone berisi satu baris untuk setiap baris yang dihapus dari tabel yang diterbitkan dalam database.

  • MSmerge_genhistory berisi satu baris untuk setiap generasi. Generasi adalah kumpulan perubahan yang dikirimkan ke Penerbit atau Pelanggan. Generasi ditutup setiap kali Agen Penggabungan berjalan; Perubahan berikutnya dalam database ditambahkan ke satu atau beberapa generasi terbuka.

Proses pelacakan perubahan

Proses pelacakan perubahan berikut digunakan untuk semua tabel yang tidak difilter:

  • Saat penyisipan atau pembaruan terjadi pada tabel yang diterbitkan, pemicu MSmerge_ins_<GUID> atau MSmerge_upd_<GUID> diaktifkan, dan sebuah baris disisipkan ke dalam tabel sistem MSmerge_contents. Kolom rowguidMSmerge_contents berisi GUID untuk baris yang disisipkan atau diperbarui, menunjukkan bahwa saat sinkronisasi berikutnya, baris yang disisipkan atau diperbarui terkait dalam tabel pengguna harus dikirim ke Publisher atau Subscriber. Jika pembaruan berikutnya terjadi pada baris dalam tabel pengguna, baris dalam MSmerge_contents tersebut diperbarui untuk mencerminkan status ini.

  • Saat penghapusan terjadi pada tabel yang diterbitkan, pemicu MSmerge_del_<GUID> diaktifkan, dan baris disisipkan ke MSmerge_tombstone dalam tabel sistem. Kolom rowguid dari MSmerge_tombstone berisi GUID untuk baris yang dihapus, menunjukkan bahwa saat sinkronisasi berikutnya terjadi, penghapusan harus dikirim ke Publisher atau Subscriber untuk baris yang dihapus yang sesuai dalam tabel pengguna. Jika baris yang dihapus direferensikan di MSmerge_contents (karena disisipkan atau diperbarui sejak sinkronisasi terakhir), baris dihapus dari MSmerge_contents.

Pelacakan perubahan untuk tabel yang difilter

Tabel sistem

Selain tabel sistem yang dijelaskan di bagian sebelumnya, tiga tabel dalam database publikasi berisi metadata untuk melacak perubahan pada tabel yang difilter:

  • MSmerge_partition_groups berisi satu baris untuk setiap partisi yang ditentukan dalam publikasi. Partisi dapat berupa:

    • Ditentukan secara eksplisit menggunakan sp_addmergepartition atau halaman Partisi Data dari kotak dialog Properti Publikasi.

    • Dibuat secara otomatis ketika Pelanggan menyinkronkan jika Pelanggan memerlukan partisi yang belum memiliki entri di MSmerge_partition_groups.

  • MSmerge_current_partition_mappings berisi satu baris untuk setiap kombinasi unik baris di MSmerge_contents dan MSmerge_partition_groups. Misalnya, jika baris dalam tabel pengguna milik dua partisi, dan baris diperbarui, satu baris disisipkan ke untuk mencerminkan MSmerge_contents pembaruan, dan dua baris dimasukkan ke dalam MSmerge_current_partition_mappings, untuk menunjukkan bahwa baris yang diperbarui milik dua partisi.

  • MSmerge_past_partition_mappings berisi satu baris untuk setiap baris yang tidak lagi termasuk dalam partisi tertentu. Baris bergerak keluar dari partisi jika:

    • Baris dihapus. Jika baris dihapus dari tabel pengguna, baris disisipkan ke dalam MSmerge_tombstone dan satu atau beberapa baris disisipkan ke dalam MSmerge_past_partition_mappings.

    • Nilai dalam kolom yang digunakan untuk pemfilteran telah berubah. Misalnya, jika filter yang menggunakan parameter didasarkan pada negara bagian tempat perusahaan bermarkas dan perusahaan tersebut pindah, baris untuk perusahaan (dan baris terkait dalam tabel lain) mungkin berpindah dari satu partisi data tenaga penjual ke dalam partisi untuk tenaga penjual lain. Jika sebuah baris diperbarui sehingga tidak lagi berada dalam partisi, sebuah baris disisipkan atau diperbarui dalam MSmerge_contents dan satu atau beberapa baris disisipkan ke dalam MSmerge_past_partition_mappings.

Nota

Jika partisi yang tidak tumpang tindih dengan satu langganan per partisi (nilai 3 untuk @partition_options parameter sp_addmergearticle) digunakan, tabel MSmerge_current_partition_mappings sistem dan MSmerge_past_partition_mappings tidak digunakan untuk melacak pemetaan partisi baris, karena setiap baris hanya termasuk dalam satu partisi dan hanya dapat diubah pada satu Pelanggan.

Proses pelacakan perubahan

Proses yang dijelaskan sebelumnya (di bagian Pelacakan perubahan untuk tabel yang tidak difilter) untuk tabel yang tidak difilter juga digunakan untuk tabel yang difilter, dengan penambahan berikut:

  • Ketika penyisipan terjadi pada tabel yang diterbitkan, selain data yang diperbarui atau disisipkan ke dalam MSmerge_contents, pemetaan partisi ditambahkan ke MSmerge_current_partition_mappings untuk setiap partisi tempat baris berada.

  • Ketika pembaruan terjadi pada tabel yang diterbitkan, selain data yang diperbarui atau disisipkan ke dalam MSmerge_contents, jika pemetaan partisi tidak ada di MSmerge_current_partition_mappings untuk setiap partisi tempat baris berada, satu ditambahkan. Jika pembaruan mengakibatkan sebuah baris dipindahkan dari satu partisi ke partisi lain, maka satu baris diperbarui di dalam MSmerge_current_partition_mappings dan satu baris ditambahkan ke dalam MSmerge_past_partition_mappings.

  • Saat penghapusan terjadi pada tabel yang diterbitkan, selain baris yang disisipkan ke dalam MSmerge_tombstone, sebuah baris dihapus dari MSmerge_current_partition_mappings dan sebuah ditambahkan ke MSmerge_past_partition_mappings.

Mengubah enumerasi

Tabel dan prosedur sistem

Saat Agen Penggabungan berjalan, perubahan dijumlahkan menggunakan beberapa tabel sistem dan prosedur tersimpan:

  • MSmerge_genhistory berisi satu baris untuk setiap generasi. Generasi adalah kumpulan perubahan yang dikirimkan ke Penerbit atau Pelanggan. Generasi ditutup setiap kali Agen Penggabungan berjalan; Perubahan berikutnya dalam database ditambahkan ke satu atau beberapa generasi terbuka.

  • sysmergesubscriptions berisi informasi tentang langganan, termasuk catatan perubahan generasi terakhir yang telah dikirim dan diterima oleh simpul. Dalam database publikasi, tabel ini berisi baris untuk Penerbit dan satu baris untuk setiap Pelanggan. Dalam database langganan, tabel ini biasanya berisi baris untuk Pelanggan dan baris untuk Penerbit.

  • MSmerge_generation_partition_mappings hanya digunakan untuk tabel yang difilter, merekam apakah generasi tertentu berisi perubahan apa pun yang relevan dengan partisi tertentu. Tabel dalam database publikasi ini berisi satu baris untuk setiap kombinasi unik baris di MSmerge_genhistory dan MSmerge_partition_groups.

  • sp_MSmakegeneration menutup semua generasi yang aktif di awal proses enumerasi.

  • sp_MSenumchanges mencantumkan perubahan untuk tabel (beberapa prosedur terkait yang namanya dimulai dengan sp_MSenumchanges juga digunakan dalam proses ini).

  • sp_MSgetmetadata menentukan apakah perubahan dari satu simpul harus diterapkan pada simpul lain sebagai sisipkan, perbarui, atau hapus.

Mengubah proses enumerasi

Proses berikut terjadi selama enumerasi perubahan:

  1. Prosedur sistem bernama sp_MSmakegeneration

    • Untuk tabel yang tidak difilter dan yang sudah difilter, prosedur ini menutup semua generasi terbuka yang direferensikan dalam MSmerge_genhistory (generasi tertutup memiliki nilai 1 atau 2 di kolom genstatus).

    • Untuk tabel yang difilter, prosedur ini mengisi tabel sistem MSmerge_generation_partition_mappings. Jika generasi berisi satu atau beberapa perubahan yang relevan untuk partisi, baris disisipkan ke dalam tabel sistem. Jika generasi tidak berisi perubahan apa pun yang relevan untuk partisi tertentu, baris tidak dimasukkan ke dalam MSmerge_generation_partition_mappings, dan perubahan tidak dijumlahkan untuk Pelanggan apa pun yang menerima partisi tersebut.

  2. Prosedur sp_MSenumchanges yang tersimpan dan prosedur terkait telah dipanggil. Prosedur ini menghitung perubahan yang terjadi sejak terakhir kali sinkronisasi terjadi:

    1. Prosedur pertama-tama menentukan generasi tempat enumerasi dimulai, berdasarkan kolom sentgen (generasi terakhir dikirim) dan recgen (generasi terakhir diterima) dalam tabel sysmergesubscriptions.

      Misalnya, saat menentukan perubahan generasi mana yang harus dijumlahkan untuk Pelanggan tertentu, sentgen untuk Pelanggan (disimpan dalam database publikasi), dan recgen untuk Pelanggan (disimpan dalam database langganan) dibandingkan. Jika nilainya sama (yang menunjukkan bahwa generasi terakhir yang dikirim dari Penerbit berhasil diterima oleh Pelanggan), perubahan dijumlahkan dimulai dengan generasi berikutnya di MSmerge_genhistory. Jika nilainya tidak sama, nilai yang lebih rendah dari dua nilai digunakan untuk memastikan semua perubahan yang diperlukan dikirim.

    2. Prosedur kemudian menghitung perubahan:

      Untuk tabel yang tidak difilter, semua perubahan yang terkandung dalam generasi setelah generasi pada sentgen atau recgen akan dihitung: MSmerge_genhistory digabungkan dengan MSmerge_contents dan MSmerge_tombstone untuk menentukan perubahan apa saja yang harus dikirim.

      Untuk tabel yang difilter, MSmerge_generation_partition_mappings digabungkan ke: MSmerge_current_partition_mappings dan MSmerge_contents; dan MSmerge_past_partition_mappings dan MSmerge_tombstone untuk menentukan perubahan mana yang relevan untuk partisi yang diterima Pelanggan.

  3. Prosedur sp_MSgetmetadata tersimpan dipanggil untuk menentukan apakah perubahan harus diterapkan sebagai sisipkan, perbarui, atau hapus. Pada titik ini, deteksi konflik dan resolusi dilakukan; untuk informasi selengkapnya, lihat Cara replikasi penggabungan mendeteksi dan mengatasi konflik.