हम अलग-अलग सर्वरों (दोनों SQL सर्वर 2008 एंटरप्राइज़ 64 बिट्स SP2 - 10.0.4000.0) में, दोनों SQL सर्वर डेटाबेस के बीच सिंक फ्रेमवर्क की समस्या निवारण कर रहे हैं सर्वर कनेक्शन, और हम उस बिंदु पर पहुंचे जिसमें हम फंस गए हैं। MIN_ACTIVE_ROWVERSION()
के उपयोग गंदा पढ़ता से बचने के लिए सहित ROWVERSION
मूल्यों, के आधार पर निश्चित रूप सेSQL MIN_ACTIVE_ROWVERSION() मान लंबे समय तक नहीं बदलता है
तर्क जो कर रहे हैं रिकॉर्ड "सिंक करने के लंबित" की पहचान करना है।
सभी SELECT
संचालन प्रत्येक "स्रोत" पक्ष पर एसपी में encapsulated हैं। इस में से एक सपा एक योजनाबद्ध नमूना है:
PROCEDURE LoaderRetrieve(@LastStamp bigint, @Rows int)
BEGIN
...
(vars handling)
...
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Select TOP (@Rows) Field1, Field2, Field3
FROM Table
WHERE [RowVersion] > @LastStampAsRowVersionDataType
AND [RowVersion] < @MinActiveVersion
Order by [RowVersion]
END
दृष्टिकोण ठीक है, हम आम तौर पर 600k/घंटा (काम हर 30 सेकंड, बैच आकार = 5k) की अपेक्षित दर के साथ रिकॉर्ड सिंक काम करता है, लेकिन कुछ बिंदु पर , @LastStamp
पैरामीटर से अधिक ROWVERSION
मान के साथ कई हज़ार रिकॉर्ड रिकॉर्ड किए जाने के बावजूद सिंक प्रक्रिया को स्थानांतरित करने के लिए कोई भी रिकॉर्ड नहीं मिलता है।
कारण की जांच करते समय, हमने पाया है कि MIN_ACTIVE_ROWVERSION()
की कीमत @LastStamp
खोजी जा रही है (या थोड़ा अधिक, केवल 5 या 10 वृद्धि) से कम मूल्य है। निश्चित रूप से यह एक समस्या नहीं होना चाहिए, क्योंकि MIN_ACTIVE_ROWVERSION()
दृष्टिकोण गंदा पढ़ता है और पीछे के मुद्दों, लेकिन से बचने के लिए पेश किया गया था:
, वह यह है कि के लिए मूल्य MIN_ACTIVE_ROWVERSION()
लंबे समय तक (वास्तव में लंबी) अवधि के दौरान बदलता नहीं है, जैसे 30/40 मिनट, कभी-कभी एक घंटे से अधिक। और यह मान @@DBTS
मान से बहुत कम है।
हमने पहले सोचा था कि यह लंबित डीबी लेनदेन से संबंधित है जो अभी तक प्रतिबद्ध नहीं है।
वर्तमान डेटाबेस में सबसे कम सक्रिय rowversion मान देता है: प्रति
MIN_ACTIVE_ROWVERSION()
(link) के बारे में MSDN परिभाषा के रूप में। एक पंक्तिवर्ती मान सक्रिय होता है यदि इसका उपयोग ऐसे लेनदेन में किया जाता है जो अभी तक प्रतिबद्ध नहीं हुआ है।
लेकिन जब इस मुद्दे की अवधि के दौरान open_tran > 0
के साथ सत्र (sys.sysprocesses
) की जाँच, हम कुछ ही सेकंड की तुलना में एक waittime अधिक से अधिक के साथ किसी भी सत्र नहीं मिला, के + केवल एक या दो घटनाओं/- 5 मिनट waittime सत्र।
तो इस समय हम स्थिति को समझने के लिए संघर्ष कर रहे हैं: MIN_ACTIVE_ROWVERSION()
एक बड़ी अवधि के दौरान नहीं बदलता है, और इस समय के फ्रेम में लंबी प्रतीक्षा के साथ कोई असामान्य लेनदेन नहीं मिलता है।
मैं डीबीए नहीं हूं और यह मामला हो सकता है कि हम इस समस्या का विश्लेषण करने के लिए तस्वीर में कुछ खो रहे हैं, मंचों और ब्लॉगों पर कुछ शोध करने से कोई अन्य संकेत नहीं मिला। अभी तक open_tran> 0 वैध कारण था, लेकिन परिस्थितियों में मैंने खुलासा किया है, यह स्पष्ट है कि कुछ और है और क्यों नहीं पता।
कोई भी प्रतिक्रिया की सराहना की जाती है।
+1। अपने प्रश्न में अपना समाधान जोड़ने के बजाय, इसे एक उत्तर के रूप में जोड़ें। – Kermit
@luiggig: समाधान - यहां तक कि आपके द्वारा - उत्तर के रूप में पोस्ट किया जाना चाहिए। उस हिस्से को उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें। और फिर इसे स्वीकार करें, अगर कोई और बेहतर नहीं होता है। –