परिचय
डेटाबेस व्यवस्थापक के लिए यह जानना महत्वपूर्ण है कि डिस्क पर कोई स्थान नहीं है। इस प्रकार, प्रक्रिया को स्वचालित करना बेहतर है ताकि वे इसे प्रत्येक सर्वर पर मैन्युअल रूप से न करें।
इस लेख में, मैं वर्णन करने जा रहा हूं कि तार्किक ड्राइव और डेटाबेस फ़ाइलों के बारे में स्वचालित दैनिक डेटा संग्रह को कैसे कार्यान्वित किया जाए।
समाधान
एल्गोरिथम:
1. डेटा संग्रहण की तालिकाएँ बनाएँ:
1.1. डेटाबेस फ़ाइलों के लिए:
उपयोग [डेटाबेस_नाम] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। 255) नॉट न्यूल, [ड्राइव] [नवरचर] (10) नॉट न्यूल, [फिजिकल_नाम] [नवरचर] (255) नॉट न्यूल, [एक्सट] [नवरचर] (255) नॉट न्यूल, [ग्रोथ] [इंट] नॉट न्यूल, [IsPercentGrowth] [int] न्यूल नहीं, [DB_ID] [int] नॉट न्यूल, [DB_Name] [nvarchar] (255) नॉट न्यूल, [SizeMb] [फ्लोट] नॉट न्यूल, [DiffSizeMb] [फ्लोट] नॉट न्यूल, [InsertUTCDate ] [डेटाटाइम] न्यूल नहीं, [अपडेटयूटीसीडेट] [डेटाटाइम] नॉट न्यूल, [फाइल_आईडी] [इंट] नॉट न्यूल, कॉन्स्ट्रेंट [पीके_डीबीफाइल] प्राथमिक कुंजी क्लस्टर ([डीबीफाइल_जीयूआईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DIGNORE_D बंद, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक]) ऑन [प्राथमिक]गोलटर टेबल [srv]। डीबीफाइल] [InsertUTCDate] GOALTER TABLE [srv] के लिए CONSTRAINT [DF_DBFile_InsertUTCDate] डिफ़ॉल्ट (getutcdate ()) जोड़ें।1.2. तार्किक ड्राइव के लिए:
[DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv] का उपयोग करें। [ड्राइवर] ([ड्राइवर_GUID] [अद्वितीय पहचानकर्ता] ROWGUIDCOL नॉट न्यूल, [सर्वर] [nvarchar] (255) न्यूल नहीं, [नाम] [nvarchar] 8) न्यूल नहीं, [टोटलस्पेस] [फ्लोट] न्यूल नहीं, [फ्रीस्पेस] [फ्लोट] न्यूल नहीं, [डिफफ्रीस्पेस] [फ्लोट] न्यूल नहीं, [इन्सर्टयूटीसीडेट] [डेटाटाइम] न्यूल नहीं, [अपडेटयूटीसीडेट] [डेटाटाइम] न्यूल नहीं, CONSTRAINT [PK_Drivers] प्राथमिक कुंजी क्लस्टर ([Driver_GUID] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS] PRIY_PAGE_LOCKS [PRIY_PAGE_LOCKS] ONMARY] PRIY_LOCKS] PRIY] [ड्राइवर] बाधा जोड़ें [DF_Drivers_Driver_GUID] डिफ़ॉल्ट (newid ()) [Driver_GUID] GOALTER TABLE [srv] के लिए। ] बाधा जोड़ें [DF_Drivers_TotalSpace] [TotalSpace]GOALTER TABLE [srv] के लिए डिफ़ॉल्ट ((0))। ईस्पेस] [फ्रीस्पेस] गोल्टर टेबल [एसआरवी] के लिए डिफ़ॉल्ट ((0))। [InsertUTCDate]GOALTER TABLE [srv] के लिए डिफ़ॉल्ट (getutcdate())।इसके अलावा, आपको निम्न तरीके से पहले से तार्किक ड्राइव वाली तालिका में भरने की आवश्यकता है:
सर्वर का नाम - वॉल्यूम लेबल2. डेटाबेस फ़ाइलों के बारे में डेटा संग्रह के लिए एक आवश्यक दृश्य बनाएँ:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [inf]। [ServerDBFileInfo] asSELECT @@ Servername AS Server , File_id ,--file_id एक डेटाबेस में। इसका मुख्य मान हमेशा 1 Type_desc के बराबर होता है, -- एक फ़ाइल प्रकार का विवरण [FileName] के रूप में नाम , -- डेटाबेस में तर्क फ़ाइल नाम LEFT(Physical_Name, 1) AS Drive , --वॉल्यूम लेबल जहां डेटाबेस फ़ाइल स्थित है Physical_Name , - ऑपरेटिंग सिस्टम में फ़ाइल का पूरा नाम राइट (भौतिक_नाम, 3) एएस एक्सट, - फ़ाइल एक्सटेंशन आकार काउंटपेज के रूप में, - 8 केबी राउंड के पृष्ठों में वर्तमान फ़ाइल आकार ((कास्ट (आकार * 8 फ्लोट के रूप में) )/1024,3) साइजएमबी के रूप में, --एमबी ग्रोथ में फाइल साइज, --ग्रोथ is_percent_growth, -% डेटाबेस_आईडी में ग्रोथ, डीबी_नाम (डेटाबेस_आईडी) [डीबी_नाम] से sys.master_files--database_filesGOयहाँ sys.master_files सिस्टम दृश्य का उपयोग किया जाता है।
3. एक संग्रहीत कार्यविधि बनाएं जो तार्किक ड्राइव पर जानकारी लौटाए:
[DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOcreate प्रक्रिया [srv]। [sp_DriveSpace] @DrivePath varchar(1024) --device (वॉल्यूम लेबल 'C:' सेट करना संभव है), @TotalSpace फ्लोट आउटपुट बाइट्स में कुल वॉल्यूम, @ फ्रीस्पेस फ्लोट आउटपुट - बाइट्स में फ्री डिस्क स्पेस, DECLARE @fso int, @Drive int, @DriveName varchar (255), @Folder int, @Drives int, @source varchar (255) @desc varchar (255) , @ret int , @Object int -- फ़ाइल सिस्टम का एक ऑब्जेक्ट बनाएँ exec @ret =sp_OACreate 'Scripting.FileSystemObject', @fso आउटपुट सेट @Object =@fso if @ret !=0 goto ErrorInfo -- निर्दिष्ट पथ पर एक फ़ोल्डर प्राप्त करें exec @ret =sp_OAmethod @fso, 'GetFolder', @Folder आउटपुट, @DrivePath set @Object =@fso if @ret!=0 goto ErrorInfo -- एक डिवाइस प्राप्त करें exec @ret =sp_OAmethod @ फ़ोल्डर, 'ड्राइव', @ ड्राइव आउटपुट सेट @ऑब्जेक्ट =@ फ़ोल्डर अगर @ret!=0 गोटो एररइन्फो - पूरे डिवाइस को निर्धारित करें रेज स्पेस निष्पादन @ret =sp_OAGetProperty @Drive, 'TotalSize', @TotalSpace आउटपुट सेट @Object =@Drive if @ret!=0 goto ErrorInfo -- डिस्क पर एक खाली स्थान निर्धारित करें exec @ret =sp_OAGetProperty @Drive, 'AvailableSpace ', @ फ्रीस्पेस आउटपुट सेट @ऑब्जेक्ट =@ ड्राइव अगर @ret! =0 गोटो एररइन्फो डिस्ट्रॉयऑब्जेक्ट्स:यदि @Folder शून्य निष्पादन नहीं है तो sp_OADestroy @Folder यदि @ ड्राइव शून्य निष्पादन नहीं है तो sp_OADestroy @Drive यदि @fso शून्य निष्पादन नहीं है sp_OADestroy @ fso वापसी (@ret) ErrorInfo:exec sp_OAGetErrorInfo @Object, @source आउटपुट, @desc आउटपुट प्रिंट 'सोर्स एरर:' + isnull(@source, 'n/a') + char(13) + 'विवरण:' + isnull (@desc, 'n/a') गोटो DestroyObjects;endGO
इस प्रक्रिया के बारे में विस्तृत जानकारी प्राप्त करने के लिए, निम्न आलेख देखें:टी-एसक्यूएल में डिस्क स्थान।
4. डेटा संग्रह के लिए एक संग्रहीत कार्यविधि बनाएँ:
4.1. डेटाबेस फ़ाइलों के लिए:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]।[MergeDBFileInfo]ASBEGIN SET NOCOUNT ON; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; [srv]। [DBFile] को [inf] का उपयोग करके f के रूप में मर्ज करें। ] मिलान होने पर अपडेट सेट करें UpdateUTcDate =getUTCDate() ,[Name] =ff.[FileName] ,[Drive] =ff.[Drive] ,[Physical_Name] =ff.[Physical_Name] ,[Ext] =ff। ] , [ग्रोथ] =एफएफ। [ग्रोथ] , [IsPercentGrowth] =ff। 3) जब लक्ष्य से मेल नहीं खाता है तो डालें ( [सर्वर] ,[नाम] ,[ड्राइव] ,[Physical_Name] ,[Ext] ,[Growth] ,[IsPercentGrowth] ,[DB_ID] ,[DB_Name ] ,[SizeMb] ,[File_ID] ,[DiffSizeMb] ) मान (ff.[सर्वर] ,ff.[FileName] ,ff.[Drive] ,ff.[Physical_Name] ,ff.[Ext] ,ff. ] ,ff.[is_percent_growth] ,ff.[database_id] ,ff.[DB_Name] ,ff.[SizeMb] ,ff.[File_id] ,0 ) जब स्रोत और f.[सर्वर][email protected] से मेल नहीं खाते हैं। @SERVERNAME फिर हटाएं;ENDGO
4.2. तार्किक ड्राइव के लिए:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]।[MergeDriverInfo]ASBEGIN SET NOCOUNT ON; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; @ ड्राइवर तालिका घोषित करें ( [सर्वर] nvarchar (255), नाम nvarchar (8), टोटलस्पेस फ्लोट, फ्रीस्पेस फ्लोट, डिफफ्रीस्पेस फ्लोट न्यूल); @ड्राइवर्स में डालें ( [सर्वर], नाम, टोटलस्पेस, फ्रीस्पेस ) srv.Drivers से [सर्वर], नाम, टोटलस्पेस, फ्रीस्पेस चुनें जहां [सर्वर] [email protected]@SERVERNAME; @TotalSpace फ्लोट घोषित करें; @ फ्रीस्पेस फ्लोट घोषित करें; @DrivePath nvarchar(8) घोषित करें; जबकि (मौजूद है (शीर्ष का चयन करें (1) @ ड्राइवर्स से जहां डिफफ्रीस्पेस शून्य है)) शीर्ष चुनें (1) @ ड्राइवपाथ =@ ड्राइवर से नाम जहां डिफफ्रीस्पेस शून्य है; निष्पादन srv.sp_DriveSpace @DrivePath =@DrivePath, @TotalSpace =@TotalSpace out, @FreeSpace =@FreeSpace out; अपडेट @ड्राइवर सेट [email protected] ,[email protected] ,DiffFreeSpace=case जब फ्रीस्पेस>0 फिर राउंड ([email protected],3) और 0 अंत जहां [email protected]; अंत;मर्ज [srv]। ] =dd.[TotalSpace] ,[FreeSpace] =dd.[FreeSpace] ,[DiffFreeSpace]=dd.[DiffFreeSpace];ENDGO
5. डेटा आउटपुट के लिए दृश्य बनाएं:
5.1. डेटाबेस फ़ाइलों के लिए:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOक्रिएट व्यू [srv]। IsPercentGrowth], [DB_ID], [File_ID], [DB_Name], [SizeMb], [DiffSizeMb], राउंड ([SizeMb]/1024,3) [SizeGb], राउंड ([DiffSizeMb]/1024,3) के रूप में [ DiffSizeGb], राउंड ([SizeMb]/1024/1024,3) [SizeTb], राउंड ([DiffSizeMb]/1024/1024,3) के रूप में [DiffSizeTb], राउंड ([DiffSizeMb]/([SizeMb]/100) , 3) के रूप में [DiffSizePercent] ,[InsertUTCDate] ,[UpdateUTCdate] FROM [srv]।[DBFile];GO
5.2. तार्किक डिस्क के लिए:
[DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO का उपयोग करें [srv] देखें। DiffFreeSpace] [DiffFreeSpaceByte] के रूप में, गोल ([TotalSpace]/1024, 3) [TotalSpaceKb] के रूप में, गोल ([FreeSpace]/1024, 3) के रूप में [FreeSpaceKb], गोल ([DiffFreeSpace]/1024, 3) के रूप में [DiffFreeSpaceKb ] ,राउंड([TotalSpace]/1024/1024, 3) as [TotalSpaceMb], राउंड([FreeSpace]/1024/1024, 3) as [FreeSpaceMb] , Round([DiffFreeSpace]/1024/1024, 3) as [ DiffFreeSpaceMb] , Round([TotalSpace]/1024/1024/1024, 3) as [TotalSpaceGb] , Round([FreeSpace]/1024/1024/1024, 3) as [FreeSpaceGb] , Round([DiffFreeSpace]/1024/1024 /1024, 3) [DiffFreeSpaceGb], राउंड ([TotalSpace]/1024/1024/1024/1024, 3) के रूप में [TotalSpaceTb], राउंड ([FreeSpace]/1024/1024/1024/1024, 3) के रूप में [FreeSpaceTb] के रूप में ] ,राउंड([DiffFreeSpace]/1024/1024/1024/1024, 3) as [DiffFreeSp aceTb] , Round([FreeSpace]/([TotalSpace]/100), 3) as [FreeSpacePercent] , Round([DiffFreeSpace]/([TotalSpace]/100), 3) as [DiffFreeSpacePercent] ,[InsertUTCDate] ,[ UpdateUTCdate] [srv] से।[ड्राइवर]जाएं6. SQL सर्वर एजेंट में एक कार्य बनाएं और इसे दिन में एक बार चलाएं:
उपयोग [DATABASE_NAME];GOexec srv.MergeDBFileInfo;exec srv.MergeDriverInfo;
7. सर्वर से सभी डेटा आउटपुट एकत्र करें। उदाहरण के लिए, आप इसे SQL सर्वर एजेंट का उपयोग करके कर सकते हैं।
8. एक रिपोर्ट तैयार करने और उसे प्रशासकों को भेजने के लिए एक संग्रहीत कार्यविधि बनाएँ। चूंकि इसे विभिन्न तरीकों से लागू करना संभव है, इसलिए मैं इस विशेष उदाहरण पर विचार करूंगा:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]।[GetHTMLTableShortInfoDrivers] @body nvarchar(max) OUTPUTASBEGIN SET NOCOUNT ON; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; @tbl तालिका घोषित करें ( Driver_GUID अद्वितीय पहचानकर्ता, [नाम] nvarchar (255), [TotalSpaceGb] फ्लोट, [FreeSpaceGb] फ्लोट, [DiffFreeSpaceMb] फ्लोट, [FreeSpacePercent] फ्लोट, [DiffFreeSpacePercent] फ्लोट, UpdateUTCDate डेटाटाइम, [सर्वर] nvar ), आईडी इंट पहचान (1,1)); @Driver_GUID अद्वितीय पहचानकर्ता, @ नाम nvarchar (255), @ TotalSpaceGb फ्लोट, @ FreeSpaceGb फ्लोट, @ DiffFreeSpaceMb फ्लोट, @ FreeSpacePercent फ्लोट, @ DiffFreeSpacePercent फ्लोट, @ UpdateUTCDate डेटाटाइम, @ सर्वर nvarchar (255), @ ID int की घोषणा करें। @tbl( Driver_GUID ,[Name] ,[TotalSpaceGb] ,[FreeSpaceGb] ,[DiffFreeSpaceMb] ,[FreeSpacePercent] ,[DiffFreeSpacePercent] ,UpdateUTCDate,[Server] ) में डालें। ] ,[DiffFreeSpaceMb] ,[FreeSpacePercent] ,[DiffFreeSpacePercent] ,UpdateUTCDate ,[Server] srv.vDrivers से जहां [DiffFreeSpacePercent]<=-5 या [FreeSpacePercent]<=15 [सर्वर] एएससी, [नाम] एएससी द्वारा आदेश; अगर (मौजूद है (@tbl से शीर्ष (1) 1 चुनें)) शुरू करें @body=' विश्लेषण करते समय मुझे डेटा स्टोरेज डिवाइस मिले हैं जिनमें या तो 15% से कम डिस्क स्थान है, या खाली स्थान 5% से अधिक घट जाता है एक दिन :
'+'<टेबल बॉर्डर=5>'; @[email protected]+'' सेट करें; @[email protected]+' ' सेट करें; जबकि((@tbl से शीर्ष 1 1 का चयन करें)>0) @[email protected]+'' सेट करें; @[email protected]+'№ p/p' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'GUID' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'SEVER' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'TOM' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'वॉल्यूम, जीबी' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'मुफ़्त, जीबी' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'फ्री स्पेस चेंज, एमबी' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'मुफ़्त, %' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'मुक्त स्थान परिवर्तन, %' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'UTC डिटेक्शन टाइम' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करना शुरू करें; शीर्ष 1 @Driver_GUID =Driver_GUID, @ नाम =नाम, @TotalSpaceGb =TotalSpaceGb, @ FreeSpaceGb =FreeSpaceGb, @DiffFreeSpaceMb =DiffFreeSpaceMb, @ FreeSpacePercent =FreeSpacePercent =का चयन करें। @आईडी =[आईडी] @tbl से; @[email protected]+' ' सेट करें; अंतिम सेट @[email protected]+''; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@ID as nvarchar(max)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@Driver_GUID as nvarchar(255)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+coalesce(@Server,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+coalesce(@Name,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@TotalSpaceGb as nvarchar(255)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@FreeSpaceGb as nvarchar(255)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@DiffFreeSpaceMb as nvarchar(255)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@FreeSpacePercent as nvarchar(255)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@DiffFreeSpacePercent as nvarchar(255)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+rep.GetDateFormat(@UpdateUTCDate, default)+' '+rep.GetTimeFormat(@UpdateUTCDate, default); @[email protected]+' ' सेट करें; @tbl से हटाएं जहां [email protected]; @[email protected]+'
' सेट करें; विस्तृत जानकारी प्राप्त करने के लिए, देखें SRV.srv.vDrivers
डेटाबेस फ़ाइलों की जानकारी देखने के लिए, DATABASE_NAME.srv.vDBFiles' देखें; endENDGO
यह संग्रहीत कार्यविधि लॉजिकल ड्राइव के बारे में एक HTML-रिपोर्ट उत्पन्न करती है जिसमें या तो खाली डिस्क स्थान 15% से कम होता है, या खाली स्थान 5% से अधिक घट जाता है। उत्तरार्द्ध रिकॉर्ड की एक अजीब गतिविधि दिखाता है जिसका अर्थ है कि कोई व्यक्ति इस डिस्क पर बहुत अधिक जानकारी संग्रहीत करता है। ऐसा निम्न कारणों से हो सकता है:
- डिस्क का विस्तार करने का समय है;
- लॉजिकल ड्राइव पर अप्रयुक्त फ़ाइलों को हटाना आवश्यक है;
- लॉग फ़ाइलें, साथ ही जानकारी और अन्य तालिकाओं की फ़ाइलें मिटाएं और कम करें।
समाधान
इस लेख में, मैंने स्थानीय ड्राइव और डेटाबेस फ़ाइलों के बारे में दैनिक स्वचालित डेटा संग्रह की एक प्रणाली को लागू करने के एक उदाहरण का विश्लेषण किया है। यह जानकारी अग्रिम रूप से यह पता लगाने की अनुमति देती है कि किस डिस्क में कम खाली स्थान है, साथ ही साथ कौन सी डेटाबेस फाइलें तेजी से बढ़ती हैं। यह एक ऐसे मामले से बचने की अनुमति देता है जब डिस्क पर कोई स्थान नहीं होता है और एक कारण का पता लगाता है कि एक प्रक्रिया डिस्क पर अधिक जगह क्यों लेती है।
यह भी पढ़ें:
MS SQL सर्वर में डेटाबेस स्कीमा परिवर्तन का स्वचालित डेटा संग्रह
MS SQL सर्वर में पूर्ण किए गए कार्यों के बारे में स्वचालित डेटा संग्रह