Database
 sql >> डेटाबेस >  >> RDS >> Database

नवीनतम डेटाबेस बैकअप स्थिति प्राप्त करने के लिए एक समर्पित संग्रहीत प्रक्रिया

कोई भी 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% विश्वसनीय हैं। मेरे लिए, यह अत्यंत उपयोगी रहा है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. नियमित सामग्री बैकअप अनुशंसाएँ

  2. एसक्यूएल देखें

  3. समूहीकृत माध्यिका के लिए सर्वोत्तम दृष्टिकोण

  4. माइनिंग प्लान :सिर्फ प्लान कैश के लिए नहीं

  5. SQL में अवधारण दर की गणना कैसे करें?