कोई भी SQL सर्वर DBA (बेशक, यह सभी प्लेटफार्मों पर लागू होता है) सहमत होगा कि डेटा पेशेवरों के लिए डेटाबेस बैकअप सबसे आवश्यक चीजें हैं। उन बैकअप की स्थिति की निगरानी करना महत्वपूर्ण है। इस कार्य को और अधिक सरल बनाने के लिए, मैंने एक कस्टम संग्रहित प्रक्रिया बनाई है। यह आपको आपकी देखरेख में सभी आवश्यक डेटाबेस के लिए नवीनतम डेटाबेस बैकअप '(यदि कोई हो) स्थिति प्राप्त करने की अनुमति देगा।
शुरू करने से पहले, इस संग्रहीत प्रक्रिया को निष्पादित करने वाले खाते की जांच करें। संग्रहीत कार्यविधि बनाने के लिए निम्न तालिकाओं पर चयन करने के लिए उसके पास आवश्यक अधिकार होने चाहिए:
- sys.डेटाबेस (मास्टर)
- बैकअपमीडिया परिवार (एमएसडीबी)
- बैकअपसेट (एमएसडीबी)
संग्रहीत प्रक्रिया का उपयोग कैसे करें
इस आलेख में संग्रहित प्रक्रिया टी-एसक्यूएल कोड प्रदान किया गया है। प्रक्रिया 2 मापदंडों की अपेक्षा करती है:
- @डेटाबेस लक्ष्य डेटाबेस का नाम है। यदि कोई निर्दिष्ट नहीं है, तो सभी डेटाबेस मान लिए जाएंगे।
- @backupType बैकअप का प्रकार है जिसे आप जांचना चाहते हैं। आपकी स्थिति के आधार पर, यह हो सकता है:
- एफ - पूर्ण
- डी - डिफरेंशियल
- एल - लेन-देन लॉग
- ए - उपरोक्त सभी
यहां संभावित पैरामीटर संयोजनों का एक मैट्रिक्स है जिसका उपयोग किया जा सकता है, और वह आउटपुट जिसकी आपको अपेक्षा करनी चाहिए। X उस डेटाबेस का नाम है जिसे आप लक्षित करना चाहते हैं।
@database | @backupType | आउटपुट |
सभी | ए | उदाहरण के भीतर सभी डेटाबेस के नवीनतम पूर्ण, विभेदक और लेन-देन लॉग बैकअप प्रदर्शित करता है। |
सभी | एफ | उदाहरण के भीतर सभी डेटाबेस का नवीनतम पूर्ण बैकअप प्रदर्शित करता है। |
सभी | डी | उदाहरण के भीतर सभी डेटाबेस के नवीनतम डिफरेंशियल बैकअप को प्रदर्शित करता है। |
सभी | एल | उदाहरण के भीतर सभी डेटाबेस के नवीनतम लेनदेन लॉग बैकअप प्रदर्शित करता है। |
X | ए | उदाहरण के भीतर X डेटाबेस के नवीनतम पूर्ण, विभेदक और लेन-देन लॉग बैकअप प्रदर्शित करता है। |
X | एफ | उदाहरण के भीतर X डेटाबेस का नवीनतम पूर्ण बैकअप प्रदर्शित करता है। |
X | डी | उदाहरण के भीतर X डेटाबेस का नवीनतम डिफरेंशियल बैकअप प्रदर्शित करता है। |
X | एल | उदाहरण के भीतर X डेटाबेस का नवीनतम लेन-देन लॉग बैकअप प्रदर्शित करता है। |
नोट :यदि लक्ष्य डेटाबेस साधारण पुनर्प्राप्ति मॉडल में है, तो लेन-देन लॉग बैकअप जानकारी NULL के रूप में दिखाई देगी। यह पूर्ण पुनर्प्राप्ति मॉडल के अंतर्गत कभी नहीं रहा है, और इसके लिए लेन-देन लॉग बैकअप कभी नहीं लिया गया है।
निष्पादन परीक्षण
इस संग्रहीत प्रक्रिया से क्या उम्मीद की जाए, इसका अंदाजा लगाने के लिए मैं आपके लिए कुछ स्क्रिप्ट संयोजन प्रदर्शित करने जा रहा हूं:
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'A'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'F'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'D'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'L'
स्क्रीनशॉट में किसी एक डेटाबेस को लक्षित करने वाले SP को कवर नहीं किया जाएगा क्योंकि आउटपुट समान है, केवल अंतर यह है कि यह एक डेटाबेस को प्रदर्शित करता है।
जैसा कि आप देख सकते हैं, "डिफरेंशियल" कॉलम के लिए डेटा NULL है क्योंकि मैंने उनमें से किसी के लिए कभी भी डिफरेंशियल बैकअप नहीं बनाया है। हालाँकि, यह पूरी तरह से प्रदर्शित करने के लिए कि यह समाधान कितना उपयोगी हो सकता है, हमें एक अंतर बैकअप की आवश्यकता है। मैं डीबीए डेटाबेस के लिए एक लूंगा और यह देखने के लिए संग्रहीत प्रक्रिया निष्पादित करूंगा कि यह क्या लौटाता है:
EXEC DBA_DatabaseBackups @database = 'DBA', @backupType = 'D'
डिफरेंशियल बैकअप लेने के बाद, आप देख सकते हैं कि हमारी संग्रहीत प्रक्रिया डिफरेंशियल कॉलम के लिए भी डेटा लौटाती है, ठीक उसी बैकअप का जो मैंने अभी बनाया है।
संपूर्ण संग्रहित प्रक्रिया कोड
स्क्रिप्ट की शुरुआत में, आप डिफ़ॉल्ट मान देखेंगे - यदि प्रत्येक पैरामीटर के लिए कोई मान पास नहीं किया जाता है तो स्क्रिप्ट उन्हें मान लेती है।
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Alejandro Cobar
-- Create date: 2021-05-10
-- Description: SP to retrieve the latest backups information
-- =============================================
CREATE PROCEDURE DBA_DatabaseBackups
@database VARCHAR(256) = 'all',
@backupType CHAR(1) = 'A'
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sqlCommand VARCHAR(MAX);
SET @sqlCommand = '
WITH MostRecentBackups
AS(
SELECT
database_name AS [Database],
MAX(bus.backup_finish_date) AS LastBackupTime,
CASE bus.type
WHEN ''D'' THEN ''Full''
WHEN ''I'' THEN ''Differential''
WHEN ''L'' THEN ''Transaction Log''
END AS Type
FROM msdb.dbo.backupset bus
WHERE bus.type <> ''F''
GROUP BY bus.database_name,bus.type
),
BackupsWithSize
AS(
SELECT
mrb.*,
(SELECT TOP 1 CONVERT(DECIMAL(10,4), b.compressed_backup_size/1024/1024/1024) AS backup_size FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS [Backup Size],
(SELECT TOP 1 DATEDIFF(s, b.backup_start_date, b.backup_finish_date) FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS [Seconds],
(SELECT TOP 1 b.media_set_id FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS media_set_id
FROM MostRecentBackups mrb
)
SELECT
d.name AS [Database],
d.state_desc AS State,
d.recovery_model_desc AS [Recovery Model],'
IF @backupType = 'F' OR @backupType = 'A'
SET @sqlCommand += '
bf.LastBackupTime AS [Last Full],
DATEDIFF(DAY,bf.LastBackupTime,GETDATE()) AS [Time Since Last Full (in Days)],
bf.[Backup Size] AS [Full Backup Size],
bf.Seconds AS [Full Backup Seconds to Complete],
(SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bf.media_set_id AND bmf.device_type = 2) AS [Full Backup Path]
'
IF @backupType = 'A'
SET @sqlCommand += ','
IF @backupType = 'D' OR @backupType = 'A'
SET @sqlCommand += '
bd.LastBackupTime AS [Last Differential],
DATEDIFF(DAY,bd.LastBackupTime,GETDATE()) AS [Time Since Last Differential (in Days)],
bd.[Backup Size] AS [Differential Backup Size],
bd.Seconds AS [Diff Backup Seconds to Complete],
(SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bd.media_set_id AND bmf.device_type = 2) AS [Diff Backup Path]
'
IF @backupType = 'A'
SET @sqlCommand += ','
IF @backupType = 'L' OR @backupType = 'A'
SET @sqlCommand += '
bt.LastBackupTime AS [Last Transaction Log],
DATEDIFF(MINUTE,bt.LastBackupTime,GETDATE()) AS [Time Since Last Transaction Log (in Minutes)],
bt.[Backup Size] AS [Transaction Log Backup Size],
bt.Seconds AS [TLog Backup Seconds to Complete],
(SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bt.media_set_id AND bmf.device_type = 2) AS [Transaction Log Backup Path]
'
SET @sqlCommand += '
FROM sys.databases d
LEFT JOIN BackupsWithSize bf ON (d.name = bf.[Database] AND (bf.Type = ''Full'' OR bf.Type IS NULL))
LEFT JOIN BackupsWithSize bd ON (d.name = bd.[Database] AND (bd.Type = ''Differential'' OR bd.Type IS NULL))
LEFT JOIN BackupsWithSize bt ON (d.name = bt.[Database] AND (bt.Type = ''Transaction Log'' OR bt.Type IS NULL))
WHERE d.name <> ''tempdb'' AND d.source_database_id IS NULL'
IF LOWER(@database) <> 'all'
SET @sqlCommand += ' AND d.name ='+CHAR(39)[email protected]+CHAR(39)
EXEC (@sqlCommand)
END
GO
निष्कर्ष
इस कस्टम संग्रहीत प्रक्रिया के साथ, आप किसी विशेष अवधि के भीतर किसी दिए गए डेटाबेस के लिए एक निश्चित बैकअप प्रकार नहीं होने पर आपको सचेत करने के लिए एक तंत्र का निर्माण कर सकते हैं।
आप इस संग्रहीत कार्यविधि को प्रत्येक SQL सर्वर आवृत्ति में परिनियोजित कर सकते हैं और प्रत्येक एकल डेटाबेस (सिस्टम और उपयोगकर्ता डेटाबेस) के लिए बैकअप जानकारी की जांच कर सकते हैं।
साथ ही, आप बैकअप मैप . बनाने के लिए संग्रहीत कार्यविधि द्वारा दी गई जानकारी का उपयोग कर सकते हैं प्रत्येक डेटाबेस के लिए नवीनतम बैकअप फ़ाइल के लिए स्थान की पहचान करने के लिए। अपनी वर्तमान नौकरी में, मैंने अपने समर्थन के तहत सभी बैकअप के पुनर्स्थापना परीक्षणों को व्यवस्थित करने के लिए एक स्क्रिप्ट बनाने के लिए इसका उपयोग किया है और पुष्टि की है कि वे 100% विश्वसनीय हैं। मेरे लिए, यह अत्यंत उपयोगी रहा है।