Değişiklik İzleme dahili değerleri SQL Server 2008'den 2012'ye mi değişti?


9

Bağlantısı kesilmiş aygıtları merkezi bir veritabanı sunucusuyla senkronize etme konusunda sorun yaşıyorsanız, sunucuda SQL Server 2012'ye yükselttikten sonra bir sorun yaşıyoruz. Görünüşe göre CHANGE_TRACKING_MIN_VALID_VERSION değeri 1'den daha yüksek bir değer döndürüyor (veya en azından yükseltme öncesinde olduğundan daha yüksek).

Ben basit bir örnek kurmak için Arshad Ali'nin büyük yürüyüşü aracılığıyla çalışıyorum .

Bir SQL Server 2008 ve 2012 ortamında çalışan tablodaki bir satır eklemek, silmek ve güncelleştirmek için # 1 ile # 5 arasındaki komut dosyalarını çalıştırdım.

2008'de aşağıdaki ifade 0 döndürür:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

2012 yılında 1 döndürür.

Testlerde birkaç komut dosyasıyla (6-8) çalışırken, bir temizleme işlemini zorlamak için saklama süresini 1 dakikaya ayarladım. Gün için ayrıldım ve görünüşe göre bir gecede koştu.

2008 örneğinde, CHANGE_TRACKING_CURRENT_VERSION ve CHANGE_TRACKING_MIN_VALID_VERSION eşittir (11). 2012 örneğinde, CHANGE_TRACKING_MIN_VALID_VERSION, CHANGE_TRACKING_CURRENT_VERSION (11) 'den bir daha yüksektir (12). Bu, bir veritabanı uzun süre boşta kaldığında senkronizasyon sürecini etkileyebilir. Ve özellikle senkronizasyonun aksine yeniden başlatmanın gerekli olup olmadığını belirlemek için aşağıdaki test yapıldığında sürecin bir döngüye yakalanabileceğini bulduk:

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''...

Bu davranış değişikliğini yaşayan başka biri var mı? Herkesin bir açıklaması var mı?


2
Bu sorun için bir Microsoft Connect öğesi vardır, connect.microsoft.com/SQLServer/feedback/details/770014/… temelde Microsoft sorunun söz konusu veritabanındaki bozulma ile ilgili olabileceğini düşünmektedir. Bu durumu yeni oluşturulan bir veritabanında yeniden oluşturabilir misiniz?
Max Vernon

1
Max, Connect makalesini inceledim. Ne yazık ki, orijinal poster tartışmayı terk etmiş gibi görünüyor ve MS sorunu kapattı. Sorunun yeniden oluşturulmasını ayarlarken, 2008R2 ve 2012 örneklerinde yeni oluşturulan veritabanlarıyla sınamaya başladım. Her iki veritabanı da diğer tüm açılardan normal çalışıyor.
Glenn Estrada

3
Sorunla ilgili repro adımları ile sorunu çözebilmeleri için lütfen Connect'e bildirin!
Jon Seigel

Yükseltmeden sonra DB'nin Uyumluluk Düzeyi'ni değiştirdiniz mi? Değişiklik izlemeyi kullanmıyorum, ancak yeni sürüme geçtikten sonra sürüm uyumsuzluğunu düşünün.
Guillaume R.

Yanıtlar:


3

Değişiklikleri izlemek için min_valid_version kullanılmaz. Bu yalnızca müşterinizin yeniden başlatılması gerekiyorsa, meta veriler istemci değişiklikleri tüketmeden önce temizlenmişse doğrulamak için kullanılır.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-sql)

CHANGETABLEİşlevi kullanırken belirtilen tablodan değişiklik izleme bilgilerini elde etmek için geçerli olan en düşük sürümü alır .

Min_valid_version, temizleme sürümü ile değişir ve kullanıcı tablosundaki değişikliklere bağlı değildir. Temizleme iş parçacığı her çalıştığında, veri değişikliklerinden bağımsız olarak min_valid_version için bir güncelleme olabilir.

2012'den önce, min_valid_version, temizleme sürümü ile aynı olarak işaretlendi, aslında bu sürümün meta verilerinin zaten temizlendiği için temizleme sürümünden bir tane daha olması gerekiyordu. 2012'de doğru min_valid_version'u güncellediklerinden emin olmak için değiştirdikleri şey budur.

Biri min_valid_version kullanarak değişikliği izlememeli, bunun yerine her senkronizasyondan sonra last_sync_version'u kaydetmeli CHANGETABLEve son senkronizasyon sürümünden sonra değişiklikleri numaralandırmak için the.

Tasarım gereği - Temizleme sürümü ile minimum geçerli sürüm değişir ve kullanıcı tablosundaki değişikliklere bağlı değildir. Temizleme iş parçacığı her çalıştığında, veri değişikliklerine bakılmaksızın geçerli sürümü minimuma indirmek için bir güncelleme olabilir.

Çözümle - 'min_valid_version' yerine 'current_version' kullanmak için prosedürü değiştirin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.