क्लाउड सेवाओं के रूप में आजकल लोकप्रिय हैं, SQL सर्वर के ऑन-प्रिमाइसेस परिनियोजन का एक अच्छा हिस्सा अभी भी है जिसे अभी भी हमारी सेवाओं का समर्थन करने की आवश्यकता है। ऑन-प्रिमाइसेस सेटअप के क्षेत्रों में से एक जिस पर हमें नज़र रखनी चाहिए, वह है भंडारण, ठीक वहीं जहाँ डेटा सहेजा गया है।
मैं आपको आपके SQL सर्वर इंस्टेंस के भीतर प्रमुख संग्रहण स्थान जानकारी की कल्पना करने के लिए एक संग्रहीत कार्यविधि प्रस्तुत करने जा रहा हूँ।
प्रारंभिक विचार
- सुनिश्चित करें कि इस संग्रहीत प्रक्रिया को निष्पादित करने वाले खाते में पर्याप्त विशेषाधिकार हैं।
- डेटाबेस ऑब्जेक्ट (डेटाबेस तालिका और संग्रहीत कार्यविधि) स्क्रिप्ट निष्पादित होने के समय चयनित डेटाबेस के अंदर बनाए जाएंगे, इसलिए सावधानी से चुनें।
- स्क्रिप्ट को इस तरह से तैयार किया गया है कि आप पर कोई त्रुटि डाले बिना इसे कई बार निष्पादित किया जा सकता है। संग्रहीत प्रक्रिया के लिए, मैंने SQL Server 2016 SP1 के बाद से उपलब्ध क्रिएट या ALTER PROCEDURE स्टेटमेंट का उपयोग किया।
- बनाए गए डेटाबेस ऑब्जेक्ट का नाम बदलने के लिए स्वतंत्र महसूस करें।
- जब आप संग्रहित प्रक्रिया द्वारा लौटाए गए डेटा को जारी रखना चुनते हैं, तो लक्ष्य तालिका को पहले छोटा कर दिया जाएगा, इसलिए केवल सबसे हाल के परिणाम सेट को संग्रहीत किया जाएगा।
- ध्यान रखें कि इस समाधान का क्लाउड परिनियोजन में कोई मतलब नहीं है जहां क्लाउड प्रदाता आपके लिए चीजों का प्रबंधन करता है और आपके पास फ़ाइल सिस्टम तक पहुंच नहीं है।
संग्रहीत कार्यविधि का उपयोग कैसे करें?
- TSQL कोड को कॉपी और पेस्ट करें (इस लेख में उपलब्ध)।
- एसपी को 2 मापदंडों की उम्मीद है:
- @पर्सिस्टडेटा:'Y' यदि DBA किसी लक्ष्य तालिका में आउटपुट को सहेजना चाहता है, और 'N' यदि DBA केवल आउटपुट को सीधे देखना चाहता है।
- @driveDetail:हालांकि वैकल्पिक है, यदि आप एक ड्राइव अक्षर पास करते हैं, तो @persistData पैरामीटर का कोई प्रभाव नहीं पड़ेगा।
प्रस्तुत किए गए फ़ील्ड और उनके अर्थ
- ड्राइव: ड्राइव अक्षर जिसमें वर्तमान उदाहरण के लिए डेटा फ़ाइलें शामिल हैं।
- कुल_स्थान: ड्राइव का आकार, जीबी में।
- free_space: ड्राइव में बचे GB की मात्रा.
- प्रयुक्त_स्थान: उदाहरण में सभी डेटाबेस द्वारा कब्जा किए गए जीबी की मात्रा।
- data_collection_timestamp: केवल तभी दिखाई देता है जब 'Y' @persistData पैरामीटर को पास किया जाता है, और इसका उपयोग यह जानने के लिए किया जाता है कि SP कब निष्पादित किया गया था और जानकारी सफलतापूर्वक DBA_Storage तालिका में सहेजी गई थी।
निष्पादन परीक्षण
मैं संग्रहीत प्रक्रिया के कुछ निष्पादन प्रदर्शित करूंगा ताकि आप यह जान सकें कि इससे क्या उम्मीद की जा सकती है:
EXEC GetStorageData @persistData = 'N'
चूंकि मैंने इसे एक परीक्षण उदाहरण में चलाया था, जहां मेरे पास सी:\ ड्राइव में सब कुछ भरा हुआ है (मुझे पता है, अब तक का सबसे खराब अभ्यास), केवल एक पंक्ति लौटा दी गई थी। अब, मैं आपको अपने C:\ ड्राइव के उपयोग का एक स्क्रीनशॉट दिखाता हूं, जैसा कि विंडोज द्वारा रिपोर्ट किया गया है, बस यह देखने के लिए कि क्या एसपी कोई झांसा नहीं दे रहा है:
यह अच्छा लग रहा है, अधिकांश भाग के लिए। हालाँकि, यदि आप करीब से देखते हैं, तो आप देखेंगे कि ग्राफिक में "यूज्ड स्पेस" 25GB कहता है और SP "0.170GB" कहता है, यह अजीब है? खैर, इसका कारण यह है कि एसपी में अर्थ थोड़ा अलग है:यहां यह केवल डेटाबेस फाइलों द्वारा कब्जा किए गए जीबी की मात्रा की रिपोर्ट करता है, इसलिए इसे ध्यान में रखें।
अब, वह आउटपुट थोड़ा सूखा लगता है, है ना? मेरा मतलब है, हम नहीं जानते कि रिपोर्ट किए गए स्थान को वास्तव में क्या ले रहा है। यहीं पर दूसरा पैरामीटर काम आता है, तो आइए इसे देखें:
EXEC GetStorageData @persistData = 'N', @driveDetail = 'C'
इसे इस तरह निष्पादित करने से आपको उन विशिष्ट डेटाबेस की सूची मिल जाएगी जिनके पास ड्राइव में कम से कम 1 डेटाबेस फ़ाइल है जो पैरामीटर के रूप में पारित हुई है। यदि आप "कुल स्थान" कॉलम का योग करते हैं, तो यह आपको पिछले सारांशित आउटपुट के समान ही मान देगा।
एसपी क्या लौटाता है, यह देखने के लिए मैं एक और कोशिश करता हूं। मैं एक नया डेटाबेस बनाने जा रहा हूं, लेकिन मैं डेटाबेस फ़ाइलों को किसी अन्य ड्राइव में रखूंगा जिसे मैंने चारों ओर बिछाया है। मैं डेटाबेस को "परीक्षण" कह रहा हूं और मैं इसे ड्राइव S:\ में रखूंगा।
तो अब SP उस ड्राइव को परिणाम सेट में भी आउटपुट करता है। लेकिन फिर, देखते हैं कि क्या होता है यदि हम @driveDetail पैरामीटर को 'S' के साथ एक मान के रूप में फेंकते हैं:
बिंगो, यह मेरे द्वारा चुने गए आकार के साथ बनाए गए 'परीक्षण' डेटाबेस की रिपोर्ट करता है (डेटा फ़ाइल के लिए 1GB और लेनदेन लॉग फ़ाइल के लिए 8MB)।
साइड क्वेरी
अब, डीबीए को अधिक मूल्य प्रदान करने के लिए, मैंने कुछ प्रश्न तैयार किए हैं जो तालिका में मौजूद डेटा से उपयोगी जानकारी प्राप्त करने में आपकी सहायता कर सकते हैं।
*C:\ ड्राइव में होस्ट की गई कम से कम 1 डेटा फ़ाइल वाले डेटाबेस खोजने की क्वेरी।
SELECT * FROM DBA_Storage WHERE drive = 'C:\';
*फ्री_स्पेस द्वारा क्रमबद्ध ड्राइव की सूची की कल्पना करने के लिए क्वेरी, निम्नतम से उच्चतम तक। इससे आप जान सकते हैं कि किन ड्राइव्स पर आपका ध्यान जल्द से जल्द चाहिए।
SELECT * FROM DBA_Storage ORDER BY free_space;
* उच्चतम से निम्नतम तक, उपयोग किए गए_स्पेस द्वारा क्रमबद्ध ड्राइव की सूची की कल्पना करने के लिए क्वेरी। इससे आप जान सकते हैं कि किन लोगों के पास दूसरों की तुलना में अधिक डेटा है।
SELECT * FROM DBA_Storage ORDER BY used_space DESC;
यहाँ संग्रहीत प्रक्रिया का पूरा कोड है:
*स्क्रिप्ट की शुरुआत में, आप डिफ़ॉल्ट मान देखेंगे जिसे संग्रहीत प्रक्रिया मानती है यदि प्रत्येक पैरामीटर के लिए कोई मान पास नहीं किया जाता है।
CREATE OR ALTER PROCEDURE [dbo].[GetStorageData]
@persistData CHAR(1) = 'Y',
@driveDetail CHAR(1) = NULL
AS
BEGIN
SET NOCOUNT ON
DECLARE @command NVARCHAR(MAX)
DECLARE @Tmp_StorageInformation TABLE(
[drive] [CHAR](3) NOT NULL,
[total_space] [DECIMAL](10,3) NOT NULL,
[free_space] [DECIMAL](10,3) NOT NULL,
[used_space] [DECIMAL](10,3) NOT NULL
)
IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'DBA_Storage') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE DBA_Storage(
[drive] [CHAR](3) NOT NULL,
[total_space] [DECIMAL](10,3) NOT NULL,
[free_space] [DECIMAL](10,3) NOT NULL,
[used_space] [DECIMAL](10,3) NOT NULL,
[data_collection_timestamp] [DATETIME] NOT NULL
)
END
IF(@driveDetail IS NOT NULL)
BEGIN
SELECT DB_NAME(mf.database_id) AS 'database',CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024.0) AS 'total space'
FROM sys.master_files mf
WHERE SUBSTRING(mf.physical_name,0,4) = CONCAT(@driveDetail,':\')
GROUP BY mf.database_id
RETURN
END
INSERT INTO @Tmp_StorageInformation
SELECT
drives.drive,
drives.total_space,
drives.free_space,
(SELECT CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024) FROM sys.master_files WHERE SUBSTRING(physical_name,0,4) = drives.drive) AS 'used_space'
FROM(
SELECT DISTINCT vs.volume_mount_point AS 'drive',CONVERT(DECIMAL(10,3),(vs.available_bytes/1048576)/1024.0) AS 'free_space',CONVERT(DECIMAL(10,3),(vs.total_bytes/1048576)/1024.0) AS 'total_space'
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id,mf.file_id) vs
) AS drives
IF @persistData = 'N'
SELECT * FROM @Tmp_StorageInformation
ELSE
BEGIN
TRUNCATE TABLE DBA_Storage
INSERT INTO DBA_Storage
SELECT *,GETDATE() FROM @Tmp_StorageInformation ORDER BY [drive]
END
END
निष्कर्ष
- आप इस SP को अपने समर्थन के तहत प्रत्येक SQL सर्वर इंस्टेंस में परिनियोजित कर सकते हैं और समर्थित इंस्टेंस के अपने पूरे स्टैक में एक चेतावनी तंत्र लागू कर सकते हैं।
- यदि आप एक एजेंट की नौकरी लागू करते हैं जो अपेक्षाकृत बार-बार इस जानकारी को क्वेरी कर रहा है, तो आप अपने समर्थित वातावरण के भीतर, जब भी कुछ थ्रेशोल्ड पूरी होती हैं, तो भंडारण की देखभाल के लिए कदम उठाने के मामले में आप खेल में शीर्ष पर रह सकते हैं। ।
- यहां कोडिंगसाइट पर प्रकाशित होने वाले अधिक टूल को देखना सुनिश्चित करें।