मैं देख रहा हूँ व्यावहारिक के लिए मूल्यों की स्थापना के लिए मार्गदर्शन BUFFERCOUNT
, BLOCKSIZE
और MAXTRANSFERSIZE
के BACKUP
आदेश। मैंने थोड़ा अनुसंधान किया है (नीचे देखें), मैंने थोड़ा परीक्षण किया है, और मुझे पूरी तरह से पता है कि कोई भी सही मायने में मूल्यवान उत्तर "खैर, यह निर्भर करता है ..." से शुरू होगा। परीक्षण के बारे में मेरी चिंताएं जो मैंने की हैं और जो भी संसाधन मुझे मिले हैं उनमें परीक्षण दिखाया गया है (नीचे देखें तरीका) यह है कि परीक्षण वैक्यूम में किया जाता है, सबसे अधिक सिस्टम पर कोई अन्य भार नहीं है।
मैं इन तीन विकल्पों के संबंध में उचित मार्गदर्शन / सर्वोत्तम प्रथाओं के बारे में उत्सुक हूं जो दीर्घकालिक अनुभव पर आधारित हैं: कई डेटा बिंदुओं पर सप्ताह या महीनों में। और मैं विशिष्ट मूल्यों की तलाश नहीं कर रहा हूं क्योंकि यह ज्यादातर उपलब्ध हार्डवेयर का एक कार्य है, लेकिन मैं जानना चाहूंगा:
- विभिन्न हार्डवेयर / लोड कारक क्या किया जाना चाहिए को प्रभावित करते हैं।
- क्या ऐसी परिस्थितियां हैं जिनमें इनमें से किसी भी मूल्य को ओवरराइड नहीं किया जाना चाहिए?
- क्या इनमें से किसी को भी ओवरराइड करने के नुकसान हैं जो तुरंत स्पष्ट नहीं हैं? बहुत अधिक मेमोरी और / या डिस्क I / O का उपयोग करना? पुनर्स्थापना कार्यों की शिकायत करना?
- यदि मेरे पास SQL सर्वर के कई इंस्टेंस चल रहे हैं (एक डिफ़ॉल्ट इंस्टेंस और दो नामांकित इंस्टेंस), और अगर मैं सभी 3 इंस्टेंस के बैकअप को समवर्ती रूप से चलाता हूं, तो क्या यह प्रभावित करता है कि मैं इन मूल्यों को कैसे सामूहिक बनाने से परे सेट करता हूं (
BUFFERCOUNT
*MAXTRANSFERSIZE
) उपलब्ध रैम से अधिक नहीं है? संभव I / O विवाद? - एक ही सर्वर पर तीन इंस्टेंसेस होने और फिर तीनों समवर्ती में बैकअप चलाने के एक ही परिदृश्य में, प्रत्येक इंस्टेंस के भीतर एक से अधिक डेटाबेस के लिए बैकअप को कैसे चलाना भी इन मूल्यों की सेटिंग को प्रभावित करेगा? मतलब, अगर तीनों इंस्टैंस में से प्रत्येक में 100 डेटाबेस हैं, तो प्रत्येक इंस्टेंस पर 2 या 3 बैकअप चल रहे हैं जैसे कि 6 और 9 बैकअप के बीच समवर्ती चल रहे हैं। (इस स्थिति में, मेरे पास कुछ बड़े लोगों के बजाय कई छोटे से मध्यम डेटाबेस हैं।)
मैंने अब तक क्या इकट्ठा किया है:
BLOCKSIZE
:- समर्थित आकार 512, 1024, 2048, 4096, 8192, 16384, 32768, और 65536 (64 KB) बाइट्स हैं। [1]
- टेप डिवाइस और 512 अन्यथा के लिए डिफ़ॉल्ट 65536 है [1]
- यदि आप एक बैकअप ले रहे हैं जिसे आप CD-ROM से कॉपी और रिस्टोर करने की योजना बना रहे हैं, तो BLOCKSIZE = 2048 1 को निर्दिष्ट करें।
- जब आप एकल डिस्क पर लिखते हैं, तो 512 का डिफ़ॉल्ट ठीक है; यदि आप RAID सरणियों या SAN का उपयोग करते हैं, तो आपको यह देखने के लिए परीक्षण करना होगा कि क्या डिफ़ॉल्ट या 65536 बेहतर है। [१३ (पृष्ठ १ 13)]
यदि मैन्युअल रूप से सेट किया जाता है, तो मान होना चाहिए> = डेटा फ़ाइल बनाने के लिए उपयोग किया गया ब्लॉक आकार, अन्यथा आपको निम्नलिखित जानकारी मिलेगी:
Msg 3272, स्तर 16, राज्य 0, पंक्ति 3
'C: \ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ Backup \ BackupTest.bak' डिवाइस का हार्डवेयर क्षेत्र आकार 4096 है, लेकिन ब्लॉक आकार पैरामीटर निर्दिष्ट करता है 512 का एक असंगत ओवरराइड मान। संगत ब्लॉक आकार का उपयोग करते हुए कथन को फिर से प्रकाशित करें।
BUFFERCOUNT
:डिफ़ॉल्ट [2], [ : ] :
SQL सर्वर 2005 और बाद के संस्करण:
(NumberofBackupDevices * [mystery_multiplier]) + NumberofBackupDevices + (2 * NumberofVolumesInvolved)[mystery_multiplier]: इस मूल्य के बारे में कुछ असंगतता है। मैंने इसे 3 रूपों में व्यक्त किया है:
3
[2]GetSuggestedIoDepth
[8]GetSuggestedIoDepth + 1
[8]
परीक्षण जो गुणक को दिखाता है वह3
SQL Server 2005 SP2 [9] पर किया गया था ।SQL Server 2008 R2 और 2012 पर मेरा परीक्षण, और SQL Server 2014 [8] के संबंध में एक उपयोगकर्ता टिप्पणी , गुणक को दर्शाता है
4
। मतलब,GetSuggestedIoDepth
(सीधे नीचे) के लिए सूचित मूल्य दिया गया है :GetSuggestedIoDepth
अब है4
, या- गुणक अब है
GetSuggestedIoDepth + 1
GetSuggestedIoDepth
3
DISK उपकरणों के लिए रिटर्न [9]- कोई कड़ी मेहनत से सेट की गई अधिकतम मूल्य है, लेकिन यह देखते हुए कि स्मृति की आवश्यकता = (
BUFFERCOUNT
*MAXTRANSFERSIZE
), यह प्रतीत होता है एक व्यावहारिक अधिकतम मूल्य होगा कि:BUFFERCOUNT <= (available_memory / MAXTRANSFERSIZE)
MAXTRANSFERSIZE
:- संभावित मूल्य 65536 बाइट्स (64 KB) के गुणकों से 4194304 बाइट्स (4 एमबी) तक हैं। [1]
- डिफ़ॉल्ट मान: यदि डिवाइस रीड मोड (रिस्टोर) में है या यह डेस्कटॉप या एक्सप्रेस एडिशन 64K का उपयोग करता है, तो 1 एमबी का उपयोग करें। [9]
- सामान्य / विविध:
- अधिकतम आकार जो उपयोग किया जा सकता है वह है ( बफर पूल की भौतिक मेमोरी / 16 )। GlobalMemoryStatusEx (ullTotalPhys) API कॉल से लौटे । [9]
- ट्रेस ध्वज
3213
बैकअप / पुनर्स्थापना संचालन के दौरान बैकअप / पुनर्स्थापना कॉन्फ़िगरेशन पैरामीटर को3605
आउटपुट करता है , और ERRORLOG फ़ाइल को आउटपुट डंप करता है:DBCC TRACEON (3213, 3605, -1);
- आप कुछ मेट्रिक्स के आसान परीक्षण के लिए (UNIX में
DISK = N'NUL:'
DOS / Windows समतुल्य/dev/null
) का उपयोग कर सकते हैं (लेकिन कुल प्रक्रिया समय का अच्छा बोध नहीं मिलेगा क्योंकि यह I / O लिख रहा है)
साधन
- T-SQL बैकअप आदेश के लिए MSDN पृष्ठ
- KB904804: SQL Server 2000 में डेटाबेस का बैकअप लेने पर आपको धीमी कार्यक्षमता का अनुभव होता है
- SQL सर्वर बैकअप प्रदर्शन में सुधार करने के लिए विकल्प
- बैकअप और पुनर्स्थापना
- SQL सर्वर बैकअप और पुनर्स्थापित का अनुकूलन
- बैकअप प्रदर्शन का अनुकूलन
- कैसे संपीड़न और ठोस राज्य डिस्क का उपयोग कर SQL डेटाबेस पूर्ण बैकअप गति को बढ़ाने के लिए
- गलत BufferCount डेटा ट्रांसफर विकल्प OOM स्थिति को जन्म दे सकता है
- यह कैसे काम करता है: कैसे SQL सर्वर बैकअप और पुनर्स्थापना का चयन करें स्थानांतरण आकार
- यह कैसे काम करता है: SQL सर्वर बैकअप बफर एक्सचेंज (एक वीडीआई फोकस)
- SQL बैकअप बड़े डेटाबेस ट्यूनिंग
- बैकअप बफर के लिए SQL सर्वर मेमोरी
- एक केस स्टडी: नेटवर्क (.docx फ़ाइल) पर VLDB का तेज़ और विश्वसनीय बैकअप और पुनर्स्थापना ।
- बैकअप प्रदर्शन को बेहतर बनाने के लिए कितने बैकअप डिवाइस की सिफारिश की जाती है?
मैंने इसके साथ परीक्षण किया:
--DBCC TRACEON (3213, 3605, -1);
BACKUP DATABASE [Test] TO
DISK = 'NUL:'
--,DISK = 'NUL:'
-- DISK = 'BackupTest1.bak'
-- ,DISK = 'BackupTest2.bak'
WITH
STATS = 5,
FORMAT,
CHECKSUM,
NO_COMPRESSION,
COPY_ONLY
--,BUFFERCOUNT = 40
--,MAXTRANSFERSIZE = 4194304--2097152,
--,BLOCKSIZE = 16384
--DBCC TRACEOFF (3213, 3605, -1);
अद्यतन करें
ऐसा लगता है कि मैं कभी-कभी कुछ जानकारी जोड़ना भूल जाता हूं जो मैं हमेशा दूसरों से पूछ रहा हूं कि मैं एक प्रश्न का उत्तर दे रहा हूं ;-)। मैंने अपनी वर्तमान स्थिति के बारे में कुछ जानकारी दी है, लेकिन मैं और अधिक विवरण प्रदान कर सकता हूं:
मैं एक क्लाइंट के लिए काम कर रहा हूं जो 24/7 / 365.25 SaaS एप्लिकेशन प्रदान करता है। इसलिए उपयोगकर्ताओं के लिए किसी भी बिंदु पर होने की संभावना है, लेकिन वास्तविक रूप से, उपयोगकर्ता सभी यूएसए-आधारित (अभी के लिए) हैं और ज्यादातर "मानक" घंटे काम करने की प्रवृत्ति रखते हैं: 7 बजे प्रशांत (यानी 10 बजे पूर्वी) से शाम 7 बजे तक प्रशांत (यानी 10 पीएम पूर्वी), लेकिन सप्ताह में 7 दिन, न केवल सोमवार - शुक्रवार, हालांकि सप्ताहांत लोड थोड़ा हल्का है।
उन्हें ऐसे सेट किया जाता है कि प्रत्येक ग्राहक का अपना डीबी हो। यह एक आला उद्योग है इसलिए संभावित ग्राहकों के हजारों (या अधिक) नहीं हैं। क्लाइंट डीबी की संख्या प्रति इंस्टेंस में बदलती है, जिसमें सबसे बड़ा इंस्टेंस 206 क्लाइंट्स का होता है। सबसे बड़ा DB लगभग है। 8 जीबी, लेकिन लगभग 30 डीबी 1 जीबी से अधिक हैं। इसलिए, मैं विशेष रूप से वीएलडीबी के प्रदर्शन को अधिकतम करने की कोशिश नहीं कर रहा हूं।
जब मैंने इस क्लाइंट के साथ शुरुआत की, तो उनका बैकअप हमेशा फुल था, प्रति दिन एक बार, और कोई लॉग बैकअप नहीं। उन्होंने MAXTRANSFERSIZE को 4 MB और BUFFERCOUNT में 50 पर सेट किया था। मैंने उस सेटअप को Ola Hallengren के डेटाबेस बैकअप स्क्रिप्ट के थोड़े अनुकूलित संस्करण के साथ बदल दिया । थोड़ा अनुकूलित हिस्सा यह है कि यह एक मल्टी-थ्रेडिंग टूल से चलता है (जो मैंने लिखा है और उम्मीद है कि जल्द ही बेचना शुरू कर देगा) जो गतिशील रूप से डीबी को पता चलता है क्योंकि यह प्रत्येक इंस्टेंस से जुड़ता है, और प्रति इंस्ट्रूमेंट थ्रॉटलिंग की अनुमति देता है (इसलिए मैं वर्तमान में चल रहा हूं तीन उदाहरण समवर्ती, लेकिन क्रमिक रूप से डीबी प्रत्येक क्रमिक रूप से क्योंकि मैं उन्हें समवर्ती चलाने के प्रभाव के बारे में सुनिश्चित नहीं था)।
सेटअप अब प्रति दिन एक पूर्ण बैकअप और अन्य दिनों में DIFF बैकअप करने के लिए है; हर 10 मिनट में लॉग बैकअप लिया जाता है। मैं उन 3 विकल्पों के लिए डिफ़ॉल्ट मानों का उपयोग कर रहा हूं जिनके बारे में मैं यहां पूछताछ कर रहा हूं। लेकिन, यह जानते हुए कि वे कैसे सेट किए गए थे, मैं यह सुनिश्चित करना चाहता था कि मैं एक अनुकूलन को पूर्ववत नहीं कर रहा था (सिर्फ इसलिए कि पुरानी प्रणाली में कुछ प्रमुख दोष थे इसका मतलब यह नहीं है कि सब कुछगलत था)। वर्तमान में, 206 डेटाबेस के लिए, पूर्ण बैकअप के लिए लगभग 62 मिनट लगते हैं (सप्ताह में एक बार) और शेष दिनों में डीआईएफएफ बैकअप के लिए 7 और 20 मिनट के बीच (फुल के बाद पहले दिन, और अंतिम दिन 20 पहले अगले पूर्ण)। और वह उन्हें क्रमिक रूप से (एकल धागा) चला रहा है। लॉग बैकअप प्रक्रिया, कुल मिलाकर (सभी 3 उदाहरणों पर सभी DBs), हर बार (फिर से, हर 10 मिनट में) 50 से 90 सेकंड तक कहीं भी ले जाती है।
मुझे एहसास है कि मैं प्रति डीबी कई फाइलें चला सकता हूं, लेकिन क) मुझे यकीन नहीं है कि डीबी के आकार के मल्टीथ्रेडिंग और छोटे से मध्यम आकार के कितने बेहतर दिए जाएंगे, और बी) मैं पुनर्स्थापना प्रक्रिया को जटिल नहीं करना चाहता हूं ( वहाँ विभिन्न कारणों से क्यों एक फ़ाइल के साथ काम करना पसंद किया जाता है)।
मुझे यह भी एहसास है कि मैं कम्प्रेशन को सक्षम कर सकता हूं (मेरी टेस्ट क्वेरी को जानबूझकर अक्षम कर दिया गया है), और मैंने टीम के लिए सिफारिश की थी, लेकिन यह मेरे ध्यान में लाया गया था कि अंतर्निहित संपीड़न थोड़े बेकार है। पुरानी प्रक्रिया का एक भाग प्रत्येक फ़ाइल को RAR में संपीड़ित करना था, और मैंने अपना परीक्षण किया और पाया कि हाँ, RAR संस्करण मूल रूप से संपीड़ित संस्करण की तुलना में कम से कम 50% छोटा है। मैंने चीजों को गति देने के लिए पहले देशी संपीड़न का उपयोग करने की कोशिश की और फिर फाइलों को RAR किया, लेकिन उन फ़ाइलों को, जबकि केवल मूल संपीड़ित की तुलना में छोटे थे, अभी भी RAR- केवल संकुचित संस्करण की तुलना में थोड़ा बड़ा था, और औचित्य के लिए पर्याप्त अंतर से देशी संपीड़न का उपयोग नहीं। बैकअप को संपीड़ित करने की प्रक्रिया अतुल्यकालिक है और हर X मिनट चलती है। अगर यह एक .bak
या.trn
फ़ाइल, यह इसे संपीड़ित करता है। इस प्रकार, बैकअप प्रक्रिया को प्रत्येक फ़ाइल को संपीड़ित करने में लगने वाले समय तक धीमा नहीं किया जाता है।