Apakah perubahan pelacakan internal berubah dari SQL Server 2008 ke 2012?

9

Dalam masalah memotret masalah dengan menyinkronkan perangkat yang terputus dengan server database pusat, kami mengalami masalah setelah memutakhirkan ke SQL Server 2012 di server. Tampaknya CHANGE_TRACKING_MIN_VALID_VERSION mengembalikan nilai 1 lebih tinggi dari yang seharusnya (atau setidaknya daripada sebelum melakukan peningkatan.)

Saya telah bekerja melalui jalan besar Arshad Ali melalui contoh cara membuat contoh sederhana.

Saya telah menjalankan skrip dari # 1 hingga # 5 untuk menyisipkan, menghapus, dan memperbarui baris dalam tabel Karyawan di lingkungan SQL Server 2008 dan 2012.

Pada 2008, pernyataan berikut mengembalikan 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

Pada 2012, ia mengembalikan 1.

Dalam mengerjakan melalui beberapa skrip lagi (6-8) dalam pengujian, saya mengatur periode retensi menjadi 1 menit untuk semoga memaksa tindakan pembersihan. Saya pergi untuk hari itu dan ternyata berlari semalam.

Dalam contoh 2008, CHANGE_TRACKING_CURRENT_VERSION dan CHANGE_TRACKING_MIN_VALID_VERSION sama (11). Dalam contoh 2012, CHANGE_TRACKING_MIN_VALID_VERSION adalah satu lebih tinggi (12) dari CHANGE_TRACKING_CURRENT_VERSION (11). Ini bisa berdampak pada proses sinkronisasi ketika database tidak digunakan untuk waktu yang lama. Dan kami telah menemukan bahwa proses dapat terjebak dalam satu lingkaran, terutama ketika tes berikut dilakukan untuk menentukan apakah diperlukan inisialisasi ulang, yang bertentangan dengan sinkronisasi, diperlukan:

IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Employee')) > @sync_last_received_anchor 
       RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''...

Adakah orang lain yang mengalami perubahan perilaku ini? Adakah yang punya penjelasan?

Glenn Estrada
sumber
2
Ada item Microsoft Connect untuk masalah ini, connect.microsoft.com/SQLServer/feedback/details/770014/... pada dasarnya Microsoft berpikir masalah ini mungkin terkait dengan korupsi dalam database yang dimaksud. Bisakah Anda repro situasi ini di database yang baru dibuat
Max Vernon
1
Max, saya memang mengulas artikel Connect. Sayangnya, poster asli tampaknya telah meninggalkan diskusi dan MS menutup masalah ini. Saat menyiapkan reproduksi masalah, saya memulai pengujian dengan database yang baru dibuat dalam contoh 2008R2 dan 2012. Kedua database tampaknya berfungsi normal di semua aspek lainnya.
Glenn Estrada
3
Dengan langkah-langkah repro untuk masalah ini, silakan laporkan di Connect agar mereka dapat memperbaikinya!
Jon Seigel
Apakah Anda mengubah Tingkat Kompatibilitas DB setelah peningkatan? Saya tidak menggunakan pelacakan perubahan, tetapi pikirkan ketidakcocokan versi setelah peningkatan.
Guillaume R.

Jawaban:

3

Seseorang tidak menggunakan min_valid_version untuk melacak perubahan. Ini hanya digunakan untuk memvalidasi jika klien Anda harus diinisialisasi ulang, jika metadata telah dibersihkan sebelum klien dapat mengkonsumsi perubahan.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

Dapatkan versi minimum yang valid untuk digunakan dalam memperoleh informasi pelacakan perubahan dari tabel yang ditentukan saat Anda menggunakan CHANGETABLEfungsi.

Min_valid_version berubah dengan versi pembersihan dan tidak bergantung pada perubahan pada tabel pengguna. Setiap kali thread pembersihan berjalan, mungkin ada pembaruan untuk min_valid_version terlepas dari perubahan data.

Sebelum 2012, min_valid_version ditandai sama dengan versi pembersihan, padahal seharusnya itu lebih dari versi pembersihan karena metadata untuk versi itu sudah dibersihkan. Pada 2012 itulah yang mereka ubah untuk memastikan mereka memperbarui min_valid_version yang tepat.

Seseorang seharusnya tidak melacak perubahan menggunakan min_valid_version, sebagai gantinya harus menyimpan last_sync_version setelah setiap sinkronisasi dan memanggil CHANGETABLEuntuk menghitung perubahan setelah versi sinkronisasi terakhir.

Sesuai desain - Versi minimum yang valid berubah dengan versi pembersihan dan tidak bergantung pada perubahan pada tabel pengguna. Setiap kali thread pembersihan berjalan, mungkin ada pembaruan untuk versi yang valid terlepas dari perubahan data.

Putuskan - Ubah prosedur untuk menggunakan 'current_version' alih-alih 'min_valid_version'

stacylaray
sumber