ये दोनों SQL सर्वर रोलबैक कैसे भिन्न हैं?


13

SQL Server 2008 R2 में, ये दो रोलबैक अलग कैसे हैं:

  1. ALTERकुछ मिनटों के लिए एक स्टेटमेंट चलाएं और फिर 'कैंसल एक्सक्यूजिंग' को हिट करें। पूरी तरह से रोलबैक करने में कुछ मिनट लगते हैं।

  2. एक ही ALTERस्टेटमेंट को चलाएं , लेकिन यह सुनिश्चित करें कि यह LDFफ़ाइल इतनी बड़ी नहीं है कि इसे सफलतापूर्वक पूरा किया जा सके। एक बार LDFसीमा पूरी हो जाने के बाद और 'ऑटोग्रॉथ' की अनुमति नहीं है, इस त्रुटि के साथ क्वेरी निष्पादन तुरंत बंद हो जाता है (या रोलबैक होता है):

The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full. 
To find out why space in the log cannot be reused, see the 
log_reuse_wait_desc column in sys.databases

निम्नलिखित बिंदुओं पर ये दोनों कैसे भिन्न हैं?

  1. दूसरा 'रोलबैक' तात्कालिक क्यों है? मुझे पूरी तरह से यकीन नहीं है कि इसे रोलबैक कहा जा सकता है। मेरा अनुमान है, लेन-देन लॉग को निष्पादन की प्रगति के रूप में लिखा गया है और एक बार यह पता चलता है कि कार्य को पूरी तरह से पूरा करने के लिए पर्याप्त जगह नहीं है, यह बस कुछ 'अंत' संदेश के साथ बंद हो जाता है, बिना प्रतिबद्ध।

  2. क्या होता है जब पहला रोलबैक इतना समय लेता है (एक रोलबैक सिंगल थ्रेडेड है)?
    2.1। क्या SQL सर्वर वापस जाता है और LDFफ़ाइल में बनी प्रविष्टियों को पूर्ववत करता है ?
    2.2। LDFफ़ाइल आकार रोलबैक के अंत में छोटे हो जाता है (से DBCC SQLPERF(LOGSPACE))

  3. एक अतिरिक्त प्रश्न: दूसरे परिदृश्य के दौरान, SQL सर्वर LDFबहुत जल्दी फ़ाइल का उपभोग करना शुरू कर देता है। मेरे मामले में, पहले कुछ मिनटों (<4 मिनट) में यह 18% उपयोग से बढ़कर 90% उपयोग हो गया। लेकिन 99% तक पहुंचने के बाद, यह 99.1% से 99.8% के बीच उतार-चढ़ाव का उपयोग करते हुए एक और 8 मिनट के लिए वहाँ रहा। यह (99.8%) ऊपर और नीचे (99.2%) और फिर से (99.7%) और नीचे (99.5%) कुछ समय पहले त्रुटि को फेंक दिया जाता है। पर्दे के पीछे क्या हो रहा है?

कोई भी MSDN लिंक जो इसे और अधिक समझाने में मदद कर सकता है की सराहना की जाती है।

अली रज़ेगी सुझाव पर, मैं परफ्यूम जोड़ रहा हूं: Disk Bytes/sec

दृष्टांत 1:

दृष्टांत 1

परिदृश्य 2:

दृश्य २


बस एक त्वरित टिप्पणी: फ़ाइल का आकार! = एक फ़ाइल के भीतर प्रयोग किया जाने वाला स्थान।
हारून बर्ट्रेंड

@ ऐरॉन हां, मैं इससे परिचित हूं। मैंने उपयोग को मापने के लिए DBCC SQLPERF (LOGSPACE) का उपयोग किया। एलडीएफ फ़ाइल पूरी अवधि के दौरान समान रही, क्योंकि मैंने फ़ाइल का आकार 10 जीबी तक सीमित कर दिया था। आंतरिक उपयोग भिन्न होता है।
toc

1
मुझे संदेह है कि दूसरा रोलबैक तात्कालिक प्रतीत होता है , क्योंकि रोलबैक पूरा होने के बाद त्रुटि की सूचना दी जाती है । ये संभवत: 8 मिनट हैं जो आप 3 में देखते हैं। जहां एलडीएफ का उपयोग काफी स्थिर रहता है।
mustaccio

@mustaccio मैं आपसे सहमत होगा लेकिन कलाकृतियों को अलग दिशा में इंगित कर रहे हैं। यदि वास्तव में, रोलबैक हुआ, तो लॉग फ़ाइल का उपयोग कम संख्या में होना चाहिए; और त्रुटि संदेश फेंके जाने पर 99.3% पर न रहें।
toc

1
मेरा मानना ​​है कि रोलबैक लॉग स्पेस लेता है। जब रोलबैक के दौरान लॉग फुल हो जाता है तो DB संदिग्ध हो जाता है। इसे और नहीं छुआ जाता है। यह तात्कालिक रोलबैक की तरह दिखता है लेकिन जब तक आप डेटाबेस को ऑनलाइन वापस लेने में सक्षम नहीं होते हैं तब तक रोलबैक को स्थगित कर दिया जाता है (जब डिस्क स्थान उपलब्ध होता है) ;; इसके अलावा, जब लॉग फुल हो जाता है तो SQL सर्वर चेकपॉइंटिंग द्वारा कमरा बनाने की कोशिश कर सकता है जो IO गतिविधि में स्पाइक्स की व्याख्या कर सकता है।
usr

जवाबों:


1

जैसा कि ऊपर बताया गया है, अधिक परीक्षण चलाने के बाद, मैं एक गणना निष्कर्ष पर पहुंचा। मैंने उन सभी को यहां एक ब्लॉग पोस्ट में संक्षेप में प्रस्तुत किया है , लेकिन मैं इस पोस्ट के लिए कुछ सामग्री को पोस्टरिटी के लिए कॉपी करूंगा।

अनुमान (कुछ परीक्षणों पर आधारित)

अभी तक, मेरे पास स्पष्ट स्पष्टीकरण नहीं है कि ऐसा क्यों है। लेकिन परीक्षणों के दौरान एकत्रित कलाकृतियों के आधार पर मेरे अनुमान निम्नलिखित हैं।

रोलबैक दोनों परिदृश्यों में होता है। एक स्पष्ट रोलबैक है (उपयोगकर्ता को रद्द करना बटन), दूसरा अंतर्निहित है (आंतरिक रूप से उस निर्णय को बनाने वाला एसक्यूएल सर्वर)।

दोनों परिदृश्यों में, लॉग फ़ाइल पर जाने वाला ट्रैफ़िक सुसंगत है। नीचे दिए गए चित्र देखें:

दृष्टांत 1:

दृष्टांत 1:

परिदृश्य 2:

दृश्य २

  • एक विरूपण साक्ष्य जिसने इस विचारधारा को सुदृढ़ किया है, दोनों परिदृश्यों के दौरान Sql Trace पर कब्जा कर रहा है।

    • जब हम 'रद्द' हिट करते हैं, तो परिदृश्य 1 स्वयं स्पष्ट उर्फ ​​है।
    • परिदृश्य 2 में, त्रुटि संदेश 'रोलबैक' को स्पष्ट रूप से प्रदर्शित करने के बाद प्रदर्शित किया जाता है। Sql Trace में, हम त्रुटि संदेश "डेटाबेस लॉग इन के लिए नमूना नमूना 'पूर्ण है" संदेश को स्क्रीन पर प्रदर्शित होने से काफी समय पहले देखते हैं। तो, मेरा अनुमान है कि रोलबैक दोनों परिदृश्यों में होता है, लेकिन त्रुटि संदेश परिदृश्य 2 सफलतापूर्वक और पूरी तरह से रोलबैक प्रदर्शन करने के बाद प्रदर्शित होता है।
  • परिदृश्य 2 को अधिक समय लगता है क्योंकि यह बहुत आगे बढ़ता है, इसलिए रोलबैक में अधिक समय लगता है।

अस्पष्टीकृत व्यवहार:

  • लॉग फ़ाइल का उपयोग इतना भिन्न क्यों होता है?
    • यह 90% तक बढ़ जाता है, फिर नीचे 85% हो जाता है, फिर 99% तक बढ़ जाता है और लंबे समय तक वहां रहता है। मैं इसे कई बार इस तरह ऊपर-नीचे होते देखता हूं: 99.2%, 99.8%, 99.1%, 99.7%। ऐसा क्यों होता है?
    • एक संभावित व्याख्या यह है कि, पृष्ठभूमि प्रक्रिया (लॉग फ्लश जैसी कोई चीज) हो सकती है जो हर कुछ मिनट में लॉग फाइल को साफ करती है। और हर बार यह अंदर घुसता है, कुछ प्रविष्टियों को हटा दिया जाता है, जिसके परिणामस्वरूप अधिक खाली स्थान उपलब्ध होता है।

इस व्यवहार को बेहतर तरीके से समझाने में मदद करने के लिए कोई भी विचार स्वागत योग्य है।


2
पॉल रैंडल के साथ जांच की गई , उन्होंने पुष्टि की कि आप सही निष्कर्ष पर आए हैं - रोलबैक दोनों मामलों में समान है।
पॉल व्हाइट 9

0

मैंने निम्नलिखित प्रयोग की कोशिश की और इसी तरह के परिणाम मिले। दोनों मामलों में, fn_dblog () रोलबैक घटित होता है और यह परिदृश्य 1 की तुलना में परिदृश्य 2 में तेज़ी से घटित होता है।

वैसे, मैंने एमडीएफ और एलडीएफ दोनों को एक ही बाहरी (यूएसबी 2.0) डिस्क पर रखा।

मेरा प्रारंभिक निष्कर्ष यह है कि इस मामले में रोलबैक के संचालन में कोई अंतर नहीं है, और शायद किसी भी स्पष्ट गति का अंतर I / O संबंधित है। वह इस समय मेरी कामकाजी परिकल्पना है।

दृष्टांत 1:

  • एक लॉग फ़ाइल के साथ एक डेटाबेस बनाएं जो 1 एमबी से शुरू होता है, 4 एमबी चंक में बढ़ता है, और इसका अधिकतम आकार 100 एमबी है।
  • एक स्पष्ट लेनदेन खोलें, इसे 10 सेकंड के लिए चलाएं, और फिर SSMS के भीतर इसे मैन्युअल रूप से रद्द करें
  • Fn_dblog () को देखें और आरक्षित आकार को गिनें और DBCC SQLPERF (LOGSPACE) देखें।

परिदृश्य 2:

  • एक लॉग फ़ाइल के साथ एक डेटाबेस बनाएं जो 1 एमबी से शुरू होता है, 4 एमबी चंक में बढ़ता है, और इसका अधिकतम आकार 100 एमबी है।
  • एक स्पष्ट लेन-देन खोलें, इसे तब तक चलाएं जब तक कि लॉग पूर्ण त्रुटि न दिखाई दे
  • Fn_dblog () को देखें और आरक्षित आकार को गिनें और DBCC SQLPERF (LOGSPACE) देखें।

प्रदर्शन की निगरानी के परिणाम:

दृष्टांत 1: ***दृष्टांत 1***

परिदृश्य 2: *** परिदृश्य 2 ***

कोड:

उपयोग [मास्टर];
जाओ

यदि DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
शुरू
    DATABASE [नमूनाबडी] SINGLE_USER सेट करें
        रोलबैक IMMEDIATE के साथ;
    DROP DATABASE [सैंपलबीडी];
समाप्त;
जाओ

PRATARY पर DATABASE [नमूनाबडी] बनाएं 
( 
      NAME = N'SampleDB '
    , FILENAME = N'E: \ data \ SampleDB.mdf ' 
    , आकार = 3 एमबी 
    , FILEGROWTH = 1MB 
)
पर लॉग ऑन करें 
( 
      NAME = N'SampleDB_log '
    , FILENAME = N'E: \ data \ SampleDB_log.ldf '
    , आकार = 1 एमबी 
    , MAXSIZE = 100MB 
    , FILEGROWTH = 4MB 
);
जाओ

उपयोग [नमूना];
जाओ

- एक तालिका जोड़ें
बनाएँ तालिका dbo.test
(
    c1 CHAR (8000) पूरी तरह से निर्धारित नहीं है ('a', 8000)
) पर [प्राथमिक];
जाओ

- सुनिश्चित करें कि हम छद्म सरल वसूली मॉडल नहीं हैं
बैकपैक डाटाबेस नमूना
TO DISK = 'NUL';
जाओ

- लॉग फाइल का बैकअप लें
बैकअप लॉग नमूना
TO DISK = 'NUL';
जाओ

- इस्तेमाल किए गए लॉग स्पेस को चेज करें
DBCC SQLPERF (LOGSPACE);
जाओ

- fn_dblog () के साथ कितने रिकॉर्ड दिखाई दे रहे हैं?
चयन करें * fn_dblog (NULL, NULL) से; - मेरे मामले में लगभग 9

/ **********************************
             दृष्टांत 1
********************************** /
- एक नया लेनदेन खोलें और फिर इसे वापस रोल करें
BEGIN परिवहन

    INSERT INTO dbo.test DEFAULT VALUES;
    10000 जाओ - चलो 10 सेकंड के लिए चलाया जाता है और फिर SSMS क्वेरी विंडो में हिट रद्द करें

    - लेन-देन रद्द करें
    - इसे खत्म करने में कुछ सेकंड लगने चाहिए


- लेन-देन को रोलबैक करने की आवश्यकता नहीं है, क्योंकि रद्द पहले से ही आपके लिए है।
-- कर के देखो। आपको यह त्रुटि मिलेगी
- संदेश 3903, स्तर 16, राज्य 1, पंक्ति 1
- रोलबैक परिवहन अनुरोध में कोई संगत लेन-देन नहीं है।
रोलबैक परिवहन;

- प्रयुक्त लॉग स्पेस क्या है? 100% से ऊपर।
DBCC SQLPERF (LOGSPACE);
जाओ

- fn_dblog () के साथ कितने रिकॉर्ड दिखाई दे रहे हैं?
चुनते हैं * 
Fn_dblog (NULL, NULL) से; - मेरे मामले में लगभग 91,926

- fn_dblog () द्वारा दिखाया गया कुल लॉग रिजर्व?
SUM ([लॉग रिजर्व]) का चयन करें [कुल लॉग रिजर्व]
Fn_dblog (NULL, NULL) से; - 88.72MB के आसपास


/ **********************************
             SCENARIO 2
********************************** /
- डीबी को उड़ा दें और शुरू करें
उपयोग [मास्टर];
जाओ

यदि DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
शुरू
    DATABASE [नमूनाबडी] SINGLE_USER सेट करें
        रोलबैक IMMEDIATE के साथ;
    DROP DATABASE [सैंपलबीडी];
समाप्त;
जाओ

PRATARY पर DATABASE [नमूनाबडी] बनाएं 
( 
      NAME = N'SampleDB '
    , FILENAME = N'E: \ data \ SampleDB.mdf ' 
    , आकार = 3 एमबी 
    , FILEGROWTH = 1MB 
)
पर लॉग ऑन करें 
( 
      NAME = N'SampleDB_log '
    , FILENAME = N'E: \ data \ SampleDB_log.ldf '
    , आकार = 1 एमबी 
    , MAXSIZE = 100MB 
    , FILEGROWTH = 4MB 
);
जाओ

उपयोग [नमूना];
जाओ

- एक तालिका जोड़ें
बनाएँ तालिका dbo.test
(
    c1 CHAR (8000) पूरी तरह से निर्धारित नहीं है ('a', 8000)
) पर [प्राथमिक];
जाओ

- सुनिश्चित करें कि हम छद्म सरल वसूली मॉडल नहीं हैं
बैकपैक डाटाबेस नमूना
TO DISK = 'NUL';
जाओ

- लॉग फाइल का बैकअप लें
बैकअप लॉग नमूना
TO DISK = 'NUL';
जाओ

- अब, हमारे लेनदेन के भीतर लॉग फ़ाइल को उड़ा दें
BEGIN परिवहन
    INSERT INTO dbo.test DEFAULT VALUES;
    10000 जाओ

- रोलबैक कभी फायर नहीं करता। कोशिश करो। आपको एक त्रुटि मिलेगी।
- संदेश 3903, स्तर 16, राज्य 1, पंक्ति 1
- रोलबैक परिवहन अनुरोध में कोई संगत लेन-देन नहीं है।
रोलबैक परिवहन;

- लॉग फ़ाइल 100% पूर्ण है? 
DBCC SQLPERF (LOGSPACE);

- fn_dblog () के साथ कितने रिकॉर्ड दिखाई दे रहे हैं?
चुनते हैं * 
Fn_dblog (NULL, NULL) से; - मेरे मामले में लगभग 91,926
जाओ

- fn_dblog () द्वारा दिखाया गया कुल लॉग रिजर्व?
SUM ([लॉग रिजर्व]) का चयन करें [कुल लॉग रिजर्व]
Fn_dblog (NULL, NULL) से; - 88.72MB
जाओ

विस्तृत परीक्षणों के लिए धन्यवाद। अधिक परीक्षण चलाने के बाद, मैं एक समान निष्कर्ष पर आया। इसके अलावा, मैंने एक ब्लॉग पोस्ट लिखा । मेरे लिए परिदृश्य 2 को रोलबैक में अधिक समय लगता है क्योंकि एसक्यूएल सर्वर को रोलबैक की आवश्यकता का एहसास होने से पहले परिदृश्य 2 में प्रदर्शन किया गया कार्य परिदृश्य 1 से अधिक है।
ToC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.