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

इंस्टेंस सेटिंग्स प्राप्त करने के लिए संग्रहीत प्रक्रिया

SQL सर्वर एक व्यवसाय मॉडल के बैकएंड स्टैक के लिए डेटा, या विशेष अनुप्रयोगों के लिए कॉन्फ़िगरेशन डेटा वाले हाउस डेटाबेस को इंस्टेंस करता है। उपयोग के मामले के बावजूद, एक इंस्टेंस में मूल्यों/सेटिंग्स का एक सेट होता है जिसे सर्वोत्तम प्रथाओं का पालन करने के लिए ट्यून किया जाना चाहिए।

संग्रहीत प्रक्रिया का उद्देश्य जो मैं इस लेख में दिखा रहा हूं, वह डीबीए को महत्वपूर्ण सेटिंग्स / मूल्यों का एक सेट प्रस्तुत करना है जिसे अनदेखा नहीं किया जाना चाहिए। इसके अलावा, मैं एक अच्छी सुविधा साझा करूंगा जो डीबीए को किसी विशेष सेटिंग/मूल्य को नियंत्रित करने में मदद करती है जिसे हाल ही में बदला/संशोधित किया गया है।

प्रारंभिक विचार

सुनिश्चित करें कि इस संग्रहीत प्रक्रिया को निष्पादित करने के लिए आप जिस खाते का उपयोग करेंगे, उसके पास पर्याप्त विशेषाधिकार हैं। मुझे पता है कि sysadmin विशेषाधिकार वाले उपयोगकर्ता के लिए पूछना बहुत अधिक लगता है, लेकिन इसे ठीक से चलाने का यह सबसे आसान तरीका है, क्योंकि SP xp_cmdshell का उपयोग करता है और अन्य विशेष सिस्टम संग्रहीत कार्यविधियाँ कार्य प्राप्त करने के लिए। या, आप कम से कम विशेषाधिकार सिद्धांत का पालन करने के लिए उपयोगकर्ता के अधिकारों को ट्यून कर सकते हैं।

SQL संग्रहीत कार्यविधि का उपयोग कैसे करें?

  1. इस आलेख में दिए गए SP TSQL कोड को कॉपी और पेस्ट करें।
  2. एसपी केवल 1 पैरामीटर की अपेक्षा करता है:@ storeValuesInTable

वाई यदि DBA लक्ष्य तालिका में आउटपुट को सहेजना चाहता है, और N अगर डीबीए केवल आउटपुट को सीधे देखना चाहता है।

प्रस्तुत फ़ील्ड और उनके अर्थ

  • sql_version उदाहरण का वर्तमान SQL सर्वर संस्करण।
  • sql_edition उदाहरण का वर्तमान SQL सर्वर संस्करण।
  • बिल्ड_नंबर - उदाहरण की वर्तमान बिल्ड संख्या।
  • min_server_memory वर्तमान मान (एमबी में) मिन सर्वर मेमोरी को सौंपा गया है।
  • max_server_memory वर्तमान मान (एमबी में) मैक्स सर्वर मेमोरी को सौंपा गया है।
  • सर्वर_मेमोरी - वर्तमान मान (एमबी में) जो सर्वर SQL सर्वर इंस्टेंस को होस्ट करने के लिए उपलब्ध है।
  • सर्वर_कोर vCPU कोर की मात्रा जो SQL सर्वर इंस्टेंस को होस्ट करने वाले सर्वर के पास है।
  • sql_cores vCPU कोर की मात्रा जिसे SQL सर्वर इंस्टेंस ने इसके उपयोग के लिए निर्दिष्ट किया है।
  • cost_threshold_for_parallelism समांतरता सेटिंग के लिए लागत सीमा के लिए असाइन किया गया वर्तमान मान।
  • max_degree_of_parallelism समांतरता की अधिकतम डिग्री सेटिंग के लिए असाइन किया गया वर्तमान मान।
  • lpim_enabled 0 अगर मेमोरी में पेज लॉक करें सेटिंग अक्षम है और 1 सक्षम होने पर।
  • ifi_enabled 0 अगर तत्काल फ़ाइल आरंभीकरण अक्षम है और 1 सक्षम होने पर।
  • इंस्टॉल_डेट दिनांक और समय जब SQL सर्वर इंस्टेंस स्थापित किया गया था।
  • sql_service_account सेवा खाता जो डीबी इंजन सेवा चलाएगा।
  • sql_agent_service_account वह सेवा खाता जो एजेंट सेवा चलाएगा।
  • स्टार्टअप_टाइम दिनांक और समय मान जब SQL सर्वर आवृत्ति हाल ही में प्रारंभ हुई है।
  • data_collection_timestamp केवल तभी दिखाई देता है जब Y एसपी को दिया जाता है। इसका उपयोग यह परिभाषित करने के लिए किया जाता है कि SP कब निष्पादित किया गया था और सफलतापूर्वक InstanceValues में जानकारी को सहेजा गया था। टेबल.

निष्पादन परीक्षण SQL में संग्रहीत कार्यविधि का

मैं संग्रहीत प्रक्रिया के कुछ निष्पादन प्रदर्शित करूंगा ताकि आपको यह पता चल सके कि इससे क्या उम्मीद की जाए।

EXEC DBA_InstanceValues @storeValuesInTable = 'N'
EXEC DBA_InstanceValues @storeValuesInTable = 'Y'

इस विशेष निष्पादन के लिए, आउटपुट InstanceValues . नामक तालिका में सहेजा जाएगा . यदि यह मौजूद नहीं है तो इसे लक्ष्य डेटाबेस में बनाया जाएगा।

तालिका में लगभग वही संरचना है जो ऊपर दिए गए स्क्रीनशॉट में है, जिसमें बहुत अंतर है:इसमें data_collection_timestamp नामक फ़ील्ड शामिल है। तालिका के बिल्कुल अंत में।

data_collection_timestamp फ़ील्ड कई उद्देश्यों के लिए सहायक है:

  • आपको यह बताने के लिए कि सहेजे गए डेटा को एकत्र करने के लिए SP को कब निष्पादित किया गया था (बिल्कुल स्पष्ट)।
  • किसी विशेष सेटिंग फ़ील्ड के लिए किसी विशेष समय सीमा के भीतर किसी भी अंतर की तलाश करने के लिए।

यह साबित करने के लिए कि यह उपयोगी है, मैं एक त्वरित उदाहरण प्रस्तुत करता हूं।

मैंने Y . पास करते हुए एक बार SP को मार डाला है पैरामीटर। संबंधित रिकॉर्ड InstanceValues . में डाला गया है टेबल। फिर मैं cost_threshold_for_parallelism . को बदलता हूं मेरे उदाहरण के भीतर मान 50 , फिर स्क्रिप्ट को फिर से निष्पादित करें।

जैसा कि आप देख सकते हैं, संशोधन को InstanceValues . में सफलतापूर्वक लॉग किया गया था टेबल। अब, यह कैसे उपयोगी हो सकता है?

यदि आप एक एजेंट जॉब बनाते हैं जो इस संग्रहित प्रक्रिया को दैनिक आधार पर निष्पादित करता है, तो आप एक आंतरिक ऑडिट तंत्र बना सकते हैं। किसी विशेष सेटिंग मान को संशोधित किए जाने पर नज़र रखने के लिए, जैसा कि मैंने प्रदर्शित किया। इस प्रकार, आप अपने SQL सर्वर इंस्टेंस पर पूर्ण नियंत्रण रख सकते हैं। अगर आप मुझसे पूछें, तो यह कुछ बहुत ही उपयोगी है।

संग्रहीत प्रक्रिया का पूरा कोड

स्क्रिप्ट की शुरुआत में, आप डिफ़ॉल्ट मान देखेंगे। यदि पैरामीटर को कोई मान पास नहीं किया जाता है तो संग्रहीत प्रक्रिया इसे मान लेती है।

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author     : Alejandro Cobar
-- Create date: 2021-05-15
-- Description: SP to retrieve important instance settings/values
-- =============================================
CREATE PROCEDURE [dbo].[DBA_InstanceValues]
	@storeValuesInTable CHAR(1) = 'N'
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @sqlCommand VARCHAR(4096)
	SET @sqlCommand = ''

	IF(@storeValuesInTable = 'Y')
	BEGIN
		IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'[InstanceValues]') and OBJECTPROPERTY(id, N'IsTable') = 1)
		BEGIN
			CREATE TABLE InstanceValues(
			[sql_version]					[VARCHAR](32) NOT NULL,
			[sql_edition]					[VARCHAR](64) NOT NULL,
			[build_number]					[VARCHAR](32) NOT NULL,
			[min_server_memory]				[DECIMAL](15,2) NOT NULL,
			[max_server_memory]				[DECIMAL](15,2) NOT NULL,
			[server_memory]					[DECIMAL](15,2) NOT NULL,
			[server_cores]					[SMALLINT] NOT NULL,
			[sql_cores]						[SMALLINT] NOT NULL,
			[cost_threshold_for_parallelism][SMALLINT] NOT NULL,
			[max_degree_of_parallelism]		[SMALLINT] NOT NULL,
			[lpim_enabled]					[TINYINT] NOT NULL, 
			[ifi_enabled]					[TINYINT] NOT NULL,
			[installed_date]				[DATETIME] NOT NULL,
			[sql_service_account]			[VARCHAR](64) NOT NULL,
			[sql_agent_service_account]		[VARCHAR](64) NOT NULL,
			[startup_time]					[DATETIME] NOT NULL,
			[data_collection_timestamp]		[DATETIME] NOT NULL
			) ON [PRIMARY]
		END
	END

	CREATE TABLE #CPUValues(
	[index]        SMALLINT,
	[description]  VARCHAR(128),
	[server_cores] SMALLINT,
	[value]        VARCHAR(5) 
	)

	CREATE TABLE #MemoryValues(
	[index]         SMALLINT,
	[description]   VARCHAR(128),
	[server_memory] DECIMAL(10,2),
	[value]         VARCHAR(64) 
	)

	INSERT INTO #CPUValues
	EXEC xp_msver 'ProcessorCount'

	INSERT INTO #MemoryValues 
	EXEC xp_msver 'PhysicalMemory'

	CREATE TABLE #IFI_Value(DataOut VarChar(2000))

	DECLARE @show_advanced_options INT
	DECLARE @xp_cmdshell_enabled INT
	DECLARE @xp_regread_enabled INT

	SELECT @show_advanced_options = CONVERT(INT, ISNULL(value, value_in_use))
	FROM master.sys.configurations
	WHERE name = 'show advanced options'

	IF @show_advanced_options = 0 
	BEGIN
		EXEC sp_configure 'show advanced options', 1
		RECONFIGURE WITH OVERRIDE 
	END 

	SELECT @xp_cmdshell_enabled = CONVERT(INT, ISNULL(value, value_in_use))
	FROM master.sys.configurations
	WHERE name = 'xp_cmdshell'

	IF @xp_cmdshell_enabled = 0 
	BEGIN
		EXEC sp_configure 'xp_cmdshell', 1
		RECONFIGURE WITH OVERRIDE 
	END 

	INSERT INTO #IFI_Value
	EXEC xp_cmdshell 'whoami /priv | findstr `"SeManageVolumePrivilege`"'

	IF @xp_cmdshell_enabled = 0 
	BEGIN
		EXEC sp_configure 'xp_cmdshell', 0
		RECONFIGURE WITH OVERRIDE 
	END 

	IF @show_advanced_options = 0 
	BEGIN
		EXEC sp_configure 'show advanced options', 0
		RECONFIGURE WITH OVERRIDE 
	END

	IF (SELECT CONVERT(INT, (REPLACE(SUBSTRING(CONVERT(NVARCHAR, SERVERPROPERTY('ProductVersion')), 1, 2), '.', '')))) > 10
	BEGIN
		IF(@storeValuesInTable = 'Y')
		BEGIN
			SET @sqlCommand = '
			INSERT INTO InstanceValues
			'
		END
		SET @sqlCommand += '
		SELECT 
			v.sql_version,
			(SELECT SUBSTRING(CONVERT(VARCHAR(255),SERVERPROPERTY(''EDITION'')),0,CHARINDEX(''Edition'',CONVERT(VARCHAR(255),SERVERPROPERTY(''EDITION'')))) + ''Edition'') AS sql_edition,
			CONVERT(VARCHAR,SERVERPROPERTY(''ProductVersion'')) AS build_number,
			(SELECT CONVERT(DECIMAL(10,2),[value]) FROM sys.configurations WHERE name LIKE ''%min server memory%'') min_server_memory,
			(SELECT CONVERT(DECIMAL(10,2),[value]) FROM sys.configurations WHERE name LIKE ''%max server memory%'') max_server_memory,
			(SELECT ROUND(CONVERT(DECIMAL(10,2),server_memory/1024.0),1) FROM #MemoryValues) AS server_memory,			
			server_cores, 
			(SELECT COUNT(*) AS ''sql_cores'' FROM sys.dm_os_schedulers WHERE status = ''VISIBLE ONLINE'') AS sql_cores,
			(SELECT CONVERT(SMALLINT,[value]) FROM sys.configurations WHERE name LIKE ''%cost threshold for parallelism%'') AS cost_threshold_for_parallelism,
			(SELECT CONVERT(SMALLINT,[value]) FROM sys.configurations WHERE name LIKE ''%max degree of parallelism%'') AS max_degree_of_parallelism,
			(SELECT CASE locked_page_allocations_kb WHEN 0 THEN 0 ELSE 1 END FROM sys.dm_os_process_memory) AS lpim_enabled,
			(SELECT COUNT(1) FROM #IFI_Value WHERE DataOut LIKE ''%SeManageVolumePrivilege%Enabled%'') AS ifi_enabled,
			(SELECT create_date FROM sys.server_principals WHERE sid = 0x010100000000000512000000) AS installed_date,
			(SELECT service_account FROM sys.dm_server_services WHERE servicename = {fn CONCAT({fn CONCAT(''SQL Server ('',CONVERT(VARCHAR(32),ISNULL(SERVERPROPERTY(''INSTANCENAME''),''MSSQLSERVER'')))},'')'')}) AS sql_service_account,
			(SELECT service_account FROM sys.dm_server_services WHERE servicename = {fn CONCAT({fn CONCAT(''SQL Server Agent ('',CONVERT(VARCHAR(32),ISNULL(SERVERPROPERTY(''INSTANCENAME''),''MSSQLSERVER'')))},'')'')}) AS sql_agent_service_account,
			(SELECT login_time FROM sys.sysprocesses WHERE spid = 1) AS startup_time'
		IF(@storeValuesInTable = 'Y')
		BEGIN
			SET @sqlCommand += '
			,GETDATE() AS data_collection_timestamp
			'
		END
		SET @sqlCommand += '
		FROM #CPUValues
		LEFT JOIN (
			SELECT
				CASE 
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''8%''    THEN ''SQL Server 2000''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''9%''    THEN ''SQL Server 2005''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''10.0%'' THEN ''SQL Server 2008''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''10.5%'' THEN ''SQL Server 2008 R2''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''11%''   THEN ''SQL Server 2012''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''12%''   THEN ''SQL Server 2014''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''13%''   THEN ''SQL Server 2016''    
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''14%''   THEN ''SQL Server 2017''
					WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''15%''   THEN ''SQL Server 2019'' 
					ELSE ''UNKNOWN''
				END AS sql_version
		) AS v ON 1 = 1
		'
		EXECUTE(@sqlCommand)
	END

	ELSE
	BEGIN
		DECLARE @instanceName VARCHAR(100)
		SET @instanceName = CONVERT(VARCHAR,SERVERPROPERTY ('InstanceName'))
		IF (@instanceName) IS NULL
		BEGIN
			DECLARE @agentAccount NVARCHAR(128);
			EXEC master.dbo.xp_regread
			'HKEY_LOCAL_MACHINE',
			'SYSTEM\CurrentControlSet\services\SQLSERVERAGENT',
			'ObjectName', 
			@agentAccount  OUTPUT;

			DECLARE @engineAccount NVARCHAR(128);
			EXEC master.dbo.xp_regread
			'HKEY_LOCAL_MACHINE',
			'SYSTEM\CurrentControlSet\services\MSSQLSERVER',
			'ObjectName', 
			@engineAccount  OUTPUT;
		END
	ELSE
	BEGIN
		DECLARE @SQL NVARCHAR (500)
		SET @SQL  = 'EXEC master.dbo.xp_regread ''HKEY_LOCAL_MACHINE'', ''SYSTEM\CurrentControlSet\services\SQLAgent$'[email protected]+''',''ObjectName'', @serviceAccount OUTPUT;'
		EXECUTE sp_executesql @SQL,N'@serviceAccount NVARCHAR(128) OUTPUT',@[email protected] OUTPUT

		SET @SQL  = 'EXEC master.dbo.xp_regread ''HKEY_LOCAL_MACHINE'', ''SYSTEM\CurrentControlSet\services\MSSQL$'[email protected]+''',''ObjectName'', @serviceAccount OUTPUT;'
		EXECUTE sp_executesql @SQL,N'@serviceAccount NVARCHAR(128) OUTPUT',@[email protected] OUTPUT
	END

	IF(@storeValuesInTable = 'Y')
	BEGIN
		SET @sqlCommand = '
		INSERT INTO InstanceValues
		'
	END
	SET @sqlCommand += '
    SELECT 
        v.sql_version,
        (SELECT SUBSTRING(CONVERT(VARCHAR(255),SERVERPROPERTY(''EDITION'')),0,CHARINDEX(''Edition'',CONVERT(VARCHAR(255),SERVERPROPERTY(''EDITION'')))) + ''Edition'') AS sql_edition,
        CONVERT(VARCHAR,SERVERPROPERTY(''ProductVersion'')) AS build_number,
        (SELECT CONVERT(DECIMAL(10,2),[value]) FROM sys.configurations WHERE name LIKE ''%min server memory%'') min_server_memory,
        (SELECT CONVERT(DECIMAL(10,2),[value]) FROM sys.configurations WHERE name LIKE ''%max server memory%'') max_server_memory,
        (SELECT ROUND(CONVERT(DECIMAL(10,2),server_memory/1024.0),1) FROM #MemoryValues) AS server_memory,
        server_cores, 
        (SELECT COUNT(*) AS sql_cores FROM sys.dm_os_schedulers WHERE status = ''VISIBLE ONLINE'') AS sql_cores,
		(SELECT CONVERT(SMALLINT,[value]) FROM sys.configurations WHERE name LIKE ''%cost threshold for parallelism%'') AS cost_threshold_for_parallelism,
        (SELECT CONVERT(SMALLINT,[value]) FROM sys.configurations WHERE name LIKE ''%max degree of parallelism%'') AS max_degree_of_parallelism,
		(SELECT CASE locked_page_allocations_kb WHEN 0 THEN 0 ELSE 1 END FROM sys.dm_os_process_memory) AS lpim_enabled,
        (SELECT COUNT(1) FROM #IFI_Value WHERE DataOut LIKE ''%SeManageVolumePrivilege%Enabled%'') AS ifi_enabled,
        (SELECT create_date FROM sys.server_principals WHERE sid = 0x010100000000000512000000) AS installed_date,
        (SELECT '+CHAR(39)[email protected]+CHAR(39)+' AS sql_service_account) AS sql_service_account,
        (SELECT '+CHAR(39)[email protected]+CHAR(39)+' AS sql_agent_service_account) AS sql_agent_service_account,
        (SELECT login_time FROM sys.sysprocesses WHERE spid = 1) AS startup_time'
	IF(@storeValuesInTable = 'Y')
	BEGIN
		SET @sqlCommand += '
		,GETDATE() AS data_collection_timestamp
		'
	END
	SET @sqlCommand += '
    FROM #CPUValues
    LEFT JOIN (
		SELECT
			CASE 
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''8%''    THEN ''SQL Server 2000''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''9%''    THEN ''SQL Server 2005''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''10.0%'' THEN ''SQL Server 2008''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''10.5%'' THEN ''SQL Server 2008 R2''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''11%''   THEN ''SQL Server 2012''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''12%''   THEN ''SQL Server 2014''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''13%''   THEN ''SQL Server 2016''    
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''14%''   THEN ''SQL Server 2017''
				WHEN CONVERT(VARCHAR(128), SERVERPROPERTY (''PRODUCTVERSION'')) LIKE ''15%''   THEN ''SQL Server 2019'' 
				ELSE ''UNKNOWN''
			END AS sql_version
	) AS v ON 1 = 1
	'
	EXECUTE(@sqlCommand)
	--SELECT @sqlCommand
	END

	DROP TABLE #CPUValues
	DROP TABLE #MemoryValues
	DROP TABLE #IFI_Value
END

निष्कर्ष

इस आलेख में प्रस्तुत कस्टम संग्रहीत प्रक्रिया आपको समय के साथ किसी विशेष फ़ील्ड के किसी भी मान के परिवर्तनों के बारे में सूचित करने के लिए एक चेतावनी तंत्र बनाने की अनुमति देती है।

आप अपने समर्थन के तहत प्रत्येक SQL सर्वर इंस्टेंस में इस SP को परिनियोजित कर सकते हैं और समर्थित इंस्टेंस के अपने पूरे स्टैक में ऑडिट तंत्र को लागू कर सकते हैं।

प्रस्तुत जानकारी का प्राथमिक महत्व यह जांचना होगा कि क्या SQL सर्वर इंस्टेंस में वे मान हैं जो अनुशंसित सर्वोत्तम प्रथाओं का पालन करते हैं। यह आपको यह जांचने में भी मदद करता है कि क्या किसी भी सेटिंग को अपडेट करने के लिए हाल ही में कोई गतिविधि/परिवर्तन हुआ है (या तो जानबूझकर, या गलती से)।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CTE जटिल, शक्तिशाली प्रश्नों को लिखने में कैसे सहायता कर सकता है:एक प्रदर्शन परिप्रेक्ष्य

  2. Kubeadm का उपयोग करके Kubernetes कैसे स्थापित करें

  3. SQL तालिका में डुप्लिकेट मान कैसे खोजें

  4. समुच्चय और विभाजन

  5. TimescaleDB के लिए प्रदर्शन निगरानी