2013-02-28 10 views
15

हम अलग-अलग सर्वरों (दोनों 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 वैध कारण था, लेकिन परिस्थितियों में मैंने खुलासा किया है, यह स्पष्ट है कि कुछ और है और क्यों नहीं पता।

कोई भी प्रतिक्रिया की सराहना की जाती है।

+3

+1। अपने प्रश्न में अपना समाधान जोड़ने के बजाय, इसे एक उत्तर के रूप में जोड़ें। – Kermit

+6

@luiggig: समाधान - यहां तक ​​कि आपके द्वारा - उत्तर के रूप में पोस्ट किया जाना चाहिए। उस हिस्से को उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें। और फिर इसे स्वीकार करें, अगर कोई और बेहतर नहीं होता है। –

उत्तर

6

अच्छी तरह से, मुझे अंत में थोड़ा और खोदने के बाद समाधान मिल गया।

समस्या यह है कि हम एक लंबे waittime के साथ सत्र देख रहे थे है, लेकिन असली सौदा सत्र जो थोड़ी देर के बाद से एक सक्रिय बैच है खोजने के लिए किया गया था।

यदि कोई सत्र है जहां open_tran = 1 है, तो यह लेनदेन कब खुला है (और निश्चित रूप से अभी भी सक्रिय है, अभी तक प्रतिबद्ध नहीं है), फ़ील्ड last_batch sys.sysprocesses से चेक किया जाएगा।

select 
    batchDurationMin= DATEDIFF(second,last_batch,getutcdate())/60.0, 
    batchDurationSecs= DATEDIFF(second,last_batch,getutcdate()), 
    hostname,open_tran,* from sys.sysprocesses a 
    where spid > 50 
    and a.open_tran >0 
    order by last_batch asc 

हम एक खुली ट्रॅन सक्रिय 30+ मिनट होने के साथ एक सत्र की पहचान कर सकते हैं:

इस क्वेरी का उपयोग करना। और होस्टनाम मानों और वेब सेवाओं के भीतर कुछ और जांच के साथ (और dbcc inputbuffer का उपयोग करके) हमें जिम्मेदार प्रक्रिया मिली।

तो, अंतिम प्रश्न वास्तव में "एक असामान्य लेनदेन के साथ एक सक्रिय सत्र है", इसलिए MIN_ACTIVE_ROWVERSION() नहीं बदलता है। हम सिर्फ गलत मानदंडों के साथ प्रक्रियाओं को देख रहे थे।

अब हम जानते हैं कि कौन सी प्रक्रिया इस तरह से व्यवहार करती है, अगला कदम इसे बेहतर बनाना होगा।

आशा है कि यह परिणाम किसी और के लिए उपयोगी हों। इस तरह के एक अच्छी तरह से लिखित प्रश्न के लिए

संबंधित मुद्दे