डुप्लिकेट के रूप में तुरंत चिह्नित करने से पहले , मैंने पढ़ा है कि माइक वाल्श का व्हाट्सएप ट्रांजैक्शन लॉग ग्रोइंग या रन आउट ऑफ स्पेस है? , लेकिन मुझे नहीं लगता कि इसने मेरी स्थिति का जवाब दिया। मैंने एक दर्जन या इतने ही प्रश्नों के माध्यम से देखा, लेकिन प्रासंगिक लोगों ने ज्यादातर "डुप्लिकेट" कहा और माइक के प्रश्न की ओर इशारा किया।
विवरण: मेरे पास SQL Server 2008 R2 पर ~ 500MB डेटाबेस, सभी SIMPLE रिकवरी मोड (मेरी पसंद नहीं), रात में पूर्ण बैकअप, ~ 200MB डेटा फ़ाइलों और ~ 300MB लॉग फ़ाइलों के साथ है। लॉग तुरंत 300 एमबी तक नहीं बढ़ता है, लेकिन धीरे-धीरे कुछ महीनों के दौरान। उनमें से किसी पर कोई खुला लेनदेन नहीं है, कम से कम sp_who2 और गतिविधि की निगरानी के अनुसार। अगर मैं डेटाबेस पर राइट-क्लिक करता हूं और संपत्तियों का चयन करता हूं, तो यह मुझे बताता है कि ~ 50 एमबी मुफ्त है। विशेष रूप से एक बैकअप के ठीक बाद, पूरे लॉग को मुफ्त नहीं होना चाहिए? जब तक कोई खुला लेन-देन न हो, तब तक SIMPLE मोड में लॉग फ्री नहीं होना चाहिए?
log_reuse_wait_desc
से sys.databases
कहते हैं कहते हैं, "कुछ नहीं" है, जो सवाल पर आधारित है और ऊपर संदर्भित जवाब यह अंतरिक्ष का पुन: उपयोग करने के लिए कुछ पर प्रतीक्षा नहीं करना चाहिए।
अगर मैं 'DBCC SHRINKFILE' करता हूं, तो लॉग फ़ाइल 1MB तक सिकुड़ जाती है, इसलिए यह स्थान को पुनः प्राप्त करने के लिए तैयार है। मैं कुछ सेट कर सकता हूं जो लॉग को साप्ताहिक रूप से सिकोड़ता है और चीजों को नियंत्रण से बाहर रखता है, लेकिन मैं उलझन में हूं कि एसक्यूएल सर्वर मुझे ऐसा क्यों बना देगा।
मैं समझ सकता हूं कि क्या कुछ पागल लेनदेन था जिसे इसे लॉग करने के लिए 300MB की आवश्यकता थी, लेकिन हम कुछ भी चरम नहीं कर रहे हैं, बस मूल OLTP। माइक के सवाल / जवाब से:
सिंपल रिकवरी मॉडल - तो उपरोक्त परिचय के साथ, पहले सिंपल रिकवरी मॉडल के बारे में बात करना सबसे आसान है। इस मॉडल में, आप SQL सर्वर को बता रहे हैं - क्रैश और रिस्टार्ट रिकवरी के लिए अपनी ट्रांजेक्शन लॉग फाइल का उपयोग करके मैं आपके साथ ठीक हूं (आपके पास वास्तव में कोई विकल्प नहीं है .. ACID प्रॉपर्टीज देखें और यह समझ में जल्दी आना चाहिए), लेकिन एक बार आप नहीं उस क्रैश / पुनर्प्राप्ति उद्देश्य को पुन: प्रारंभ करने के लिए इसकी आवश्यकता है, आगे बढ़ें और लॉग फ़ाइल का पुन: उपयोग करें।
SQL सर्वर सिंपल रिकवरी में इस रिक्वेस्ट को सुनता है और यह केवल उन जानकारियों को रखता है जिन्हें क्रैश / रिस्टार्ट रिकवरी करने की आवश्यकता होती है। एक बार SQL सर्वर सुनिश्चित हो जाता है कि यह पुनर्प्राप्त हो सकता है क्योंकि डेटा को डेटा फ़ाइल (अधिक या कम) तक कठोर किया जाता है, जो डेटा कठोर किया गया है वह लॉग में अब आवश्यक नहीं है और ट्रंकेशन के लिए चिह्नित है - जिसका अर्थ है कि इसका पुनः उपयोग किया जाता है।
यह कहता है कि लॉग स्पेस का पुन: उपयोग किया जाना चाहिए, लेकिन महीनों के दौरान इस धीमी वृद्धि के साथ, ऐसा नहीं लगता है कि यह है।
मुझे किसकी याद आ रही है? क्या SQL सर्वर डेटा को "हार्ड" के रूप में पहचानने और लॉग को मुक्त करने से कुछ रखता है?
(संपादित करें) एक्शन रिपोर्ट के बाद - AKA थोड़ा ज्ञान खतरनाक है
यह पता लगाने के बाद कि यह एक "लोकप्रिय प्रश्न" है, मुझे ऐसा लगा जैसे मैंने 7 महीने पहले जो कुछ भी किया था, उस पर स्पष्टीकरण दिया और जो मैंने कुछ अन्य लोगों को कुछ दुःखों से बचाने के लिए उम्मीद की थी।
सबसे पहले, SSMS में आपके द्वारा देखा गया स्थान उपलब्ध होता है जब आप किसी डेटाबेस के गुणों को देखते हैं तो डेटा फ़ाइल में उपलब्ध स्थान है। आप इसे डेटाबेस पर निम्नलिखित चलाकर देख सकते हैं, और आप पाएंगे कि SSMS द्वारा रिपोर्ट की गई जगह FileSizeMB और UsedSpaceMB के बीच अंतर है:
SELECT
DB.name,
MF.physical_name,
MF.type_desc AS FileType,
MF.size * 8 / 1024 AS FileSizeMB,
fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB,
mf.name LogicalName
FROM
sys.master_files MF
JOIN sys.databases DB ON DB.database_id = MF.database_id
WHERE DB.name = 'yourdatabasename'
यह पुष्टि करता है कि सामान्य परिस्थितियों में हम बहुत कम लॉग स्पेस (20MB या उससे कम) का उपयोग कर रहे थे, लेकिन यह दूसरी वस्तु में ले जाता है ...
दूसरा, लॉग्स बढ़ने की मेरी धारणा धीरे-धीरे समय के साथ बढ़ती गई। हालांकि, वास्तव में रातों में लॉग तेजी से बढ़ रहे थे, इस 3 पार्टी एप्लिकेशन के लिए पैच लगाने के लिए जिम्मेदार व्यक्ति पैच लागू कर रहा था। पैच को एकल लेनदेन के रूप में किया गया था, इसलिए पैच के आधार पर 200MB डेटा को 300MB लॉग की आवश्यकता थी। ट्रैकिंग में महत्वपूर्ण यह है कि नीचे हारून बर्ट्रेंड से https://sqlblog.org/2007/01/11/reviewing-autogrow-events-from-the-default-trace पर क्वेरी थी
DECLARE @path NVARCHAR(260);
SELECT
@path = REVERSE(SUBSTRING(REVERSE([path]),
CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
FROM sys.traces
WHERE is_default = 1;
SELECT
DatabaseName,
[FileName],
SPID,
Duration,
StartTime,
EndTime,
FileType = CASE EventClass
WHEN 92 THEN 'Data'
WHEN 93 THEN 'Log'
END
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE
EventClass IN (92,93)
ORDER BY
StartTime DESC;
इससे पता चला कि लॉग कुछ शाम को बढ़ रहा था, जब ग्राहक डेटाबेस का उपयोग नहीं कर रहा था। जिसके कारण पैच लगाने वाले व्यक्ति से बातचीत हुई और रहस्य का जवाब मिला।
उन लोगों के लिए फिर से धन्यवाद जिन्होंने मुझे उत्तर देने के लिए सहायता प्रदान की।