इस लेख में, हम SQL सर्वर चौकियों के बारे में बात करेंगे।
प्रदर्शन बढ़ाने के लिए, SQL सर्वर स्मृति में डेटाबेस पृष्ठों में संशोधन लागू करता है। अक्सर, इस मेमोरी को बफर कैश या बफर पूल कहा जाता है। SQL सर्वर प्रत्येक परिवर्तन के बाद इन पृष्ठों को डिस्क पर फ़्लश नहीं करता है। इसके बजाय, डेटाबेस इंजन समय-समय पर प्रत्येक डेटाबेस पर चेकपॉइंट ऑपरेशन करता है। चेकपॉइंट ऑपरेशन गंदे पेज (वर्तमान इन-मेमोरी संशोधित पेज) लिखता है और लेनदेन लॉग के बारे में विवरण भी लिखता है।
SQL सर्वर चार प्रकार की चौकियों का समर्थन करता है:
<मजबूत>1. स्वचालित — इस प्रकार की चौकियां परदे के पीछे होती हैं और पुनर्प्राप्ति अंतराल सर्वर कॉन्फ़िगरेशन पर निर्भर करती हैं। मान मिनटों में मापा जाता है, और डिफ़ॉल्ट मान 1 मिनट है (कम सेट नहीं किया जा सकता)। चेकपॉइंट उस समय में पूरा हो जाएगा जो प्रदर्शन पर प्रभाव को कम करता है।
EXEC sp_configure 'recovery interval', 'seconds'
SIMPLE पुनर्प्राप्ति मॉडल के तहत, लेन-देन लॉग 70% पूर्ण होने पर एक स्वचालित चेकपॉइंट भी चालू हो जाता है।
<मजबूत>2. अप्रत्यक्ष - इस प्रकार की चौकियां उपयोगकर्ता द्वारा निर्दिष्ट डेटाबेस पुनर्प्राप्ति समय सेटिंग्स के अनुसार पर्दे के पीछे भी होती हैं। SQL सर्वर 2016 CTP2 से प्रारंभ होकर इस प्रकार के चेकपॉइंट के लिए डिफ़ॉल्ट मान 1 मिनट है। इसका मतलब है कि एक डेटाबेस अप्रत्यक्ष चौकियों का उपयोग करेगा। पुराने SQL सर्वर संस्करणों के लिए डिफ़ॉल्ट 0 है। इसका मतलब है कि एक डेटाबेस स्वचालित चौकियों का उपयोग करेगा, जिसकी आवृत्ति SQL सर्वर आवृत्ति की पुनर्प्राप्ति अंतराल सेटिंग पर निर्भर करती है। Microsoft अधिकांश सिस्टमों के लिए 1 मिनट की अनुशंसा करता है।
ALTER DATABASE … SET TARGET_RECOVERY_TIME = target_recovery_time { SECONDS | MINUTES }
इसे सेट करते समय, अंतर्निहित I/O सबसिस्टम की क्षमताओं पर विचार करें। तेज़ I/O सबसिस्टम (जैसे SSDs) के लिए इसे कम करने के लिए सेट करने का कोई मतलब हो सकता है। सावधान रहें, यह सेटिंग बैकअप के माध्यम से बनी रहती है और धीमी हार्डवेयर को पुनर्स्थापित करने से बहुत अधिक I/O लोड चलाने से प्रदर्शन समस्याएं हो सकती हैं।
<मजबूत>3. मैनुअल - T-SQL CHECKPOINT कमांड को निष्पादित करते समय होता है।
CHECKPOINT [ checkpoint_duration ]
चेकपॉइंट_अवधि एक पूर्णांक है जिसका उपयोग उस समय की मात्रा को परिभाषित करने के लिए किया जाता है जिसमें एक चौकी को पूरा करना चाहिए। यह पैरामीटर यह भी नियंत्रित करता है कि चेकपॉइंट ऑपरेशन के लिए कितने संसाधन असाइन किए गए हैं। यदि पैरामीटर निर्दिष्ट नहीं है, तो चेकपॉइंट उस समय में पूरा हो जाएगा जो प्रदर्शन पर प्रभाव को कम करता है।
<मजबूत>4. आंतरिक — कुछ SQL सर्वर ऑपरेशन इस प्रकार की चौकियों को जारी करते हैं ताकि यह सुनिश्चित हो सके कि डिस्क छवियाँ वर्तमान लेनदेन लॉग स्थिति से मेल खाती हैं। ये वे चौकियां हैं जो एक निश्चित ऑपरेशन होने पर की जाती हैं:
- एक डेटा फ़ाइल जोड़ी या हटाई जाती है
- डेटाबेस शटडाउन होता है (किसी भी कारण से)
- एक बैकअप या डेटाबेस स्नैपशॉट बनाया जाता है
- एक DBCC कमांड चलाया जाता है जो एक छिपा हुआ डेटाबेस स्नैपशॉट (या जैसे DBCC_CHECKDB, DBCC_CHECKTABLE) बनाता है।
चौकियां क्यों उपयोगी हैं?
चेकपॉइंट क्रैश-पुनर्प्राप्ति समय को कम करते हैं। ऐसा इसलिए होता है क्योंकि डेटा फ़ाइल पृष्ठ लॉग रिकॉर्ड के समान समय पर डिस्क पर नहीं लिखे जाते हैं। स्मृति में डेटा फ़ाइल पृष्ठ हैं जो डिस्क पर डेटा फ़ाइल पृष्ठों की तुलना में अधिक अद्यतित हैं।
चेकप्वाइंट डिस्क पर I/O को कम करते हैं और प्रदर्शन में सुधार करते हैं। लेन-देन के समय डेटा फ़ाइल पृष्ठ डिस्क पर नहीं लिखे जाने का कारण I/O संचालन की संख्या को कम करना है। एक डेटा पृष्ठ पर कई हज़ार अद्यतन लेनदेन की कल्पना करें। प्रत्येक परिवर्तन के बजाय, चेकपॉइंट के दौरान, केवल एक बार डिस्क पर डेटा पृष्ठ लिखना अधिक कुशल होता है।
स्वच्छ और गंदे पृष्ठ
बफ़र पूल कई डेटा पेजों को इन-मेमोरी में रखता है। डेटा पृष्ठ दो प्रकार के होते हैं:साफ़ और गंदा . एक साफ पृष्ठ वह है जिसे बदला नहीं गया है क्योंकि यह डिस्क से आखिरी बार पढ़ा गया था या डिस्क पर लिखा गया था। एक गंदा पृष्ठ एक ऐसा पृष्ठ है जिसे बदल दिया गया है और परिवर्तन डिस्क पर नहीं लिखे गए हैं। चेकपॉइंट "गंदे पृष्ठ" को संदर्भित करते हैं।
पृष्ठ के बारे में जानकारी sys.dm_os_buffer_descriptors का उपयोग करके देखी जा सकती है . आइए देखें कि यह फ़ंक्शन क्या लौटाता है:
SELECT * FROM sys.dm_os_buffer_descriptors dobd; GO
प्रत्येक पृष्ठ में एक नियंत्रण संरचना जुड़ी होती है जो पृष्ठ स्थिति को ट्रैक करती है:
- एक डेटाबेस जिसमें datdabase_id 32767 . है केवल पढ़ने के लिए संसाधन डेटाबेस है जिसमें सभी सिस्टम ऑब्जेक्ट शामिल हैं।
- file_id , पेज_आईडी , आवंटन_इकाई_आईडी वह पृष्ठ संबंधित है।
- यह किस प्रकार का पृष्ठ है:या तो डेटा पृष्ठ या अनुक्रमणिका पृष्ठ।
- पृष्ठ पर पंक्तियों की संख्या।
- पेज पर खाली जगह
- पेज गंदा है या नहीं
- वह numa_node जिससे वह विशेष पृष्ठ संबंधित है
- पिछले-हाल ही में उपयोग किए गए एल्गोरिथम के बारे में कुछ जानकारी
आइए निम्नलिखित कोड का उपयोग करके इस जानकारी को डेटाबेस द्वारा एकत्रित करें:
SELECT *, [DirtyPageCount] * 8 / 1024 AS [DirtyPageMB], [CleanPageCount] * 8 / 1024 AS [CleanPageMB] FROM (SELECT (CASE WHEN ([database_id] = 32767) THEN N'Resource Database' ELSE DB_NAME([database_id]) END) AS [DatabaseName], SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) AS [DirtyPageCount], SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) AS [CleanPageCount] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id]) AS [buffers] ORDER BY [DatabaseName] GO
चेकपॉइंट तंत्र
जब चेकपॉइंट होता है तो यह डिस्क पर सभी गंदे पेज लिखता है। जैसे ही कुछ परिवर्तन होते हैं, पृष्ठों को गंदा के रूप में चिह्नित किया जाता है। इससे कोई फर्क नहीं पड़ता कि लेन-देन जिसने परिवर्तन किया है वह चेकपॉइंट के समय प्रतिबद्ध या अप्रतिबद्ध है। डिस्क पर पेज लिखे जाने के बाद, "डर्टी" बिट को साफ कर दिया जाता है। जब चेकपॉइंट होता है, तो निम्नलिखित क्रियाएं होती हैं:
- एक नया लॉग रिकॉर्ड एक चेकपॉइंट की शुरुआत दर्शाता है
- अतिरिक्त लॉग रिकॉर्ड चेकपॉइंट जानकारी के साथ दिखाई देते हैं (जैसे चेकपॉइंट शुरू होने पर लेन-देन लॉग की स्थिति)
- सभी गंदे पृष्ठ डिस्क पर लिखे गए हैं
- डेटाबेस बूट पेज (dbi_checkptLSN में) में चेकपॉइंट के LSN को चिह्नित करें, यह क्रैश रिकवरी के लिए महत्वपूर्ण है
- यदि SIMPLE पुनर्प्राप्ति मॉडल का उपयोग किया जाता है, तो लॉग को साफ़ करने का प्रयास करें
- एक अंतिम लॉग रिकॉर्ड इंगित करता है कि चेकपॉइंट हो गया है
समानांतर में कई डेटाबेस की चौकियों का होना संभव है। SQL Server 2000 एक समय में एक चेकपॉइंट तक सीमित था। जब बफ़र प्रबंधक एक पृष्ठ लिखता है, तो यह आसन्न गंदे पृष्ठों की खोज करता है जिन्हें एकल संग्रह-लेखन ऑपरेशन में शामिल किया जा सकता है। साथ ही, बफ़र पूल यह सुनिश्चित करने का प्रयास करेगा कि यह I/O उप-प्रणाली को अधिभारित न करे। यह ट्रैक करता है कि I/O को पूरा होने में कितना समय लगता है। यदि चेकपॉइंट के दौरान लेखन विलंबता 20 एमएस से अधिक है, तो यह स्वयं को थ्रॉटल करता है। शटडाउन के दौरान, थ्रॉटलिंग थ्रेशोल्ड बढ़कर 100 ms हो जाता है। आप यहां अधिक विस्तृत स्पष्टीकरण पा सकते हैं। आप चेकपॉइंट I/O दर को XX MB/s पर सेट करने के लिए अनिर्दिष्ट “-kXX” स्टार्टअप विकल्प का उपयोग कर सकते हैं।
जब डेटा फ़ाइल पृष्ठ को चेकपॉइंट द्वारा डिस्क पर लिखा जाता है, तो राइट-फ़ॉरवर्ड लॉगिंग गारंटी देता है कि उस पृष्ठ को प्रभावित करने वाले सभी लॉग रिकॉर्ड पहले डिस्क पर लेन-देन लॉग में लिखे जाने चाहिए। पृष्ठ को प्रभावित करने वाले अंतिम रिकॉर्ड तक के सभी लॉग रिकॉर्ड लिखे गए हैं, चाहे वे किसी भी लेन-देन का हिस्सा हों। लॉग रिकॉर्ड तीन तरह से लिखे जाते हैं:
- जब कोई लेन-देन होता है या बंद हो जाता है
- जब डेटा-फ़ाइल पृष्ठ डिस्क पर लिखा जाता है
- जब कोई लॉग ब्लॉक 60KB के अधिकतम आकार को हिट करता है और जबरन समाप्त हो जाता है
चेकपॉइंट लॉग रिकॉर्ड
लेन-देन लॉग में चेकपॉइंट कई लॉग रिकॉर्ड लिखते हैं:
- LOP_BEGIN_CKPT — यह दर्शाता है कि चौकी शुरू हो गई है
- LOP_XACT_CKPT NULL संदर्भ के साथ (केवल तभी जब चेकपॉइंट शुरू होने पर अनकमिटेड ट्रांजेक्शन होते हैं) - इसमें अनकमिटेड ट्रांजेक्शन की संख्या होती है। यह अप्रतिबद्ध लेनदेन के LOP_BEGIN_XACT लॉग रिकॉर्ड के एलएसएन को भी सूचीबद्ध करता है।
- LOP_BEGIN_CKPT LOP_BOOT_PAGE_CKPT (केवल SQL सर्वर 2012) के संदर्भ के साथ — यह दर्शाता है कि बूट पृष्ठ को अद्यतन किया गया है।
- LOP_END_CKPT — चेकपॉइंट के अंत का प्रतीक है।
चेकपॉइंट निगरानी
I/O में स्पाइक्स के साथ होने वाली चौकियों को सहसंबंधित करना उपयोगी हो सकता है ताकि I/O स्पाइक को कम करने के लिए विशिष्ट डेटाबेस (I/O सबसिस्टम के लिए) में परिवर्तन किए जा सकें यदि यह I/O सबसिस्टम को ओवरलोड करता है। उदाहरण के लिए, अधिक बार-बार, मैन्युअल चेकपॉइंट्स करना, या SQL सर्वर 2012 पर अप्रत्यक्ष चेकपॉइंट्स के साथ कम पुनर्प्राप्ति अंतराल को कॉन्फ़िगर करना। यह उच्च स्पाइक्स के बिना अधिक स्थिर I/O लोड उत्पन्न करेगा जो I/O सबसिस्टम को अधिभारित करता है। हालांकि, मूल कारण कहीं अधिक परिवर्तन के कारण अधिक I/O प्रदर्शन किया जा सकता है, इसलिए यह जांच किए बिना कि यह क्यों हुआ, चेकपॉइंट गतिविधि में अचानक वृद्धि को स्वीकार न करें।
बफर मैनेजर/चेकपॉइंट पेज/सेकंड काउंटर डेटाबेस विशिष्ट नहीं है, इसलिए यह पहचानने के लिए कि कौन सा डेटाबेस शामिल है, ट्रेस फ़्लैग या विस्तारित ईवेंट की आवश्यकता है।
ट्रेस फ़्लैग 3502 त्रुटि लॉग में संदेश लिखता है कि किस डेटाबेस चेकपॉइंट के लिए हो रहा है।
ट्रेस फ़्लैग 3504 कितने पृष्ठ लिखे गए और औसत लेखन विलंबता के बारे में अधिक विस्तृत जानकारी लिखता है।
ये ट्रेस फ़्लैग सीमित चूने के उत्पादन में उपयोग करने के लिए सुरक्षित हैं। वे केवल त्रुटि लॉग में संदेश प्रिंट करते हैं।
यदि आप विस्तारित ईवेंट का उपयोग करना चाहते हैं, तो आप दो ईवेंट का उपयोग कर सकते हैं:checkpoint_begin और checkpoint_end।
सारांश
इस लेख में, हमने SQL सर्वर में चौकियों के बारे में बात की है - डेटा फ़ाइल पृष्ठों को डिस्क में बदलने के बाद लिखने के लिए मुख्य तंत्र।