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

प्रोएक्टिव SQL सर्वर स्वास्थ्य जांच, भाग 3:उदाहरण और डेटाबेस सेटिंग्स

आपके डेटाबेस को स्वस्थ रखने वाले सक्रिय कार्यों की हमारी चर्चा इस पोस्ट में जारी है क्योंकि हम सर्वर और डेटाबेस विकल्पों से निपटते हैं। आप पहले से ही सोच रहे होंगे कि यह एक त्वरित पोस्ट होगी - जो अक्सर सर्वर या डेटाबेस विकल्पों को बदलता है? आपको आश्चर्य होगा, खासकर यदि आपके पास बहुत से लोग हैं जिनके पास SQL ​​​​सर्वर तक पहुंच है। सर्वर और डेटाबेस विकल्पों को बार-बार बदलना चाहिए - अधिकांश भाग के लिए ये इंस्टॉलेशन पर सेट होते हैं और अकेले छोड़ दिए जाते हैं। लेकिन हर बार बदलाव करने का एक अच्छा कारण होता है - चाहे वह प्रदर्शन से संबंधित हो, एप्लिकेशन कोड में बदलाव के कारण, या शायद इसलिए कि पहली बार कुछ गलत तरीके से सेट किया गया था। पहले इन परिवर्तनों का परीक्षण करें, और परिवर्तन से पहले और बाद में उपयुक्त मीट्रिक कैप्चर करें। यह बहुत सीधा और स्पष्ट लगता है, है ना? आप ऐसा सोच सकते हैं, लेकिन अगर आपके पास परिवर्तन प्रबंधन प्रक्रिया नहीं है जिसका सख्ती से पालन किया जाता है, तो ऐसा नहीं है।

अधिकांश परिवेशों में, एक से अधिक व्यक्तियों की SQL सर्वर तक पहुँच होती है, और एक से अधिक व्यक्तियों के पास सर्वर या डेटाबेस विकल्पों को बदलने के लिए आवश्यक विशेषाधिकार होते हैं। यदि गलत सेटिंग बदल दी जाती है, तो प्रदर्शन प्रभाव महत्वपूर्ण हो सकता है। (क्या आपने कभी अनजाने में अधिकतम मेमोरी सेटिंग को MB के बजाय GB में मान पर सेट किया है? यदि आप सोच रहे हैं, 128MB SQL सर्वर इंस्टेंस को शुरू करने के लिए पर्याप्त मेमोरी की आवश्यकता नहीं है। इसे ठीक करने के तरीके पर टेड क्रूगर की पोस्ट देखें। , क्या आपको कभी भी वह गलती करनी चाहिए।) अन्य परिवर्तन छोटी समस्याएं पैदा कर सकते हैं जो अभी भी परेशानी वाली हैं और कभी-कभी उन्हें ट्रैक करना मुश्किल होता है (स्वचालित रूप से आंकड़े बनाना अक्षम करना एक अच्छा उदाहरण है)। आप सोच सकते हैं कि ये परिवर्तन अच्छी तरह से संप्रेषित होंगे (कभी-कभी आप आग बुझाने में इतने व्यस्त होते हैं कि आप भूल जाते हैं) या नोटिस करने में आसान (हमेशा नहीं)। इससे बचने के लिए, हम सेटिंग्स को ट्रैक करते हैं और फिर, अपनी नियमित जांच करते समय (या किसी समस्या का निवारण करते समय), हम सत्यापित करते हैं कि कुछ भी नहीं बदला है।

डेटा कैप्चर करना

रखरखाव कार्यों पर पिछली पोस्ट के विपरीत, जहां हम अपने महत्वपूर्ण डेटा को बनाए रखने के लिए msdb पर निर्भर थे, हमें उदाहरण और डेटाबेस सेटिंग्स के लिए डेटा कैप्चर सेट करना होगा। हम अपने बेसलाइन डेटाबेस में टेबल पर प्रतिदिन sys.configurations और sys.database_info को स्नैपशॉट करेंगे, फिर यह देखने के लिए क्वेरी का उपयोग करेंगे कि क्या कुछ बदला है, और कब।

USE [Baselines];
GO
 
IF OBJECT_ID(N'dbo.SQLskills_ConfigData', N'U') IS NULL
BEGIN
  CREATE TABLE [dbo].[SQLskills_ConfigData] 
  (
    [ConfigurationID] [int] NOT NULL ,
    [Name] [nvarchar](35) NOT NULL ,
    [Value] [sql_variant] NULL ,
    [ValueInUse] [sql_variant] NULL ,
    [CaptureDate] [datetime] NOT NULL DEFAULT SYSDATETIME()
  ) ON [PRIMARY];
GO
 
CREATE CLUSTERED INDEX [CI_SQLskills_ConfigData] 
  ON [dbo].[SQLskills_ConfigData] ([CaptureDate],[ConfigurationID]);
GO
 
IF OBJECT_ID(N'dbo.SQLskills_DBData', N'U') IS NULL
BEGIN
  CREATE TABLE [dbo].[SQLskills_DBData]
  (
    [name] [sysname] NOT NULL,
    [database_id] [int] NOT NULL,
    [source_database_id] [int] NULL,
    [owner_sid] [varbinary](85) NULL,
    [create_date] [datetime] NOT NULL,
    [compatibility_level] [tinyint] NOT NULL,
    [collation_name] [sysname] NULL,
    [user_access] [tinyint] NULL,
    [user_access_desc] [nvarchar](60) NULL,
    [is_read_only] [bit] NULL,
    [is_auto_close_on] [bit] NOT NULL,
    [is_auto_shrink_on] [bit] NULL,
    [state] [tinyint] NULL,
    [state_desc] [nvarchar](60) NULL,
    [is_in_standby] [bit] NULL,
    [is_cleanly_shutdown] [bit] NULL,
    [is_supplemental_logging_enabled] [bit] NULL,
    [snapshot_isolation_state] [tinyint] NULL,
    [snapshot_isolation_state_desc] [nvarchar](60) NULL,
    [is_read_committed_snapshot_on] [bit] NULL,
    [recovery_model] [tinyint] NULL,
    [recovery_model_desc] [nvarchar](60) NULL,
    [page_verify_option] [tinyint] NULL,
    [page_verify_option_desc] [nvarchar](60) NULL,
    [is_auto_create_stats_on] [bit] NULL,
    [is_auto_update_stats_on] [bit] NULL,
    [is_auto_update_stats_async_on] [bit] NULL,
    [is_ansi_null_default_on] [bit] NULL,
    [is_ansi_nulls_on] [bit] NULL,
    [is_ansi_padding_on] [bit] NULL,
    [is_ansi_warnings_on] [bit] NULL,
    [is_arithabort_on] [bit] NULL,
    [is_concat_null_yields_null_on] [bit] NULL,
    [is_numeric_roundabort_on] [bit] NULL,
    [is_quoted_identifier_on] [bit] NULL,
    [is_recursive_triggers_on] [bit] NULL,
    [is_cursor_close_on_commit_on] [bit] NULL,
    [is_local_cursor_default] [bit] NULL,
    [is_fulltext_enabled] [bit] NULL,
    [is_trustworthy_on] [bit] NULL,
    [is_db_chaining_on] [bit] NULL,
    [is_parameterization_forced] [bit] NULL,
    [is_master_key_encrypted_by_server] [bit] NOT NULL,
    [is_published] [bit] NOT NULL,
    [is_subscribed] [bit] NOT NULL,
    [is_merge_published] [bit] NOT NULL,
    [is_distributor] [bit] NOT NULL,
    [is_sync_with_backup] [bit] NOT NULL,
    [service_broker_guid] [uniqueidentifier] NOT NULL,
    [is_broker_enabled] [bit] NOT NULL,
    [log_reuse_wait] [tinyint] NULL,
    [log_reuse_wait_desc] [nvarchar](60) NULL,
    [is_date_correlation_on] [bit] NOT NULL,
    [is_cdc_enabled] [bit] NOT NULL,
    [is_encrypted] [bit] NULL,
    [is_honor_broker_priority_on] [bit] NULL,
    [replica_id] [uniqueidentifier] NULL,
    [group_database_id] [uniqueidentifier] NULL,
    [default_language_lcid] [smallint] NULL,
    [default_language_name] [nvarchar](128) NULL,
    [default_fulltext_language_lcid] [int] NULL,
    [default_fulltext_language_name] [nvarchar](128) NULL,
    [is_nested_triggers_on] [bit] NULL,
    [is_transform_noise_words_on] [bit] NULL,
    [two_digit_year_cutoff] [smallint] NULL,
    [containment] [tinyint] NULL,
    [containment_desc] [nvarchar](60) NULL,
    [target_recovery_time_in_seconds] [int] NULL,
    [CaptureDate] [datetime] NOT NULL DEFAULT SYSDATETIME()
) ON [PRIMARY];
GO
 
CREATE CLUSTERED INDEX [CI_SQLskills_DBData] 
  ON [dbo].[SQLskills_DBData] ([CaptureDate],[database_id]);
GO

SQLskills_DBData तालिका बनाने की स्क्रिप्ट SQL Server 2014 के साथ संगत है। पुराने संस्करणों के लिए, आपको आधार तालिका और स्नैपशॉट क्वेरी को संशोधित करने की आवश्यकता हो सकती है (कोड का अगला सेट देखें)।

एक बार जब आप टेबल बना लेते हैं, तो एक नौकरी बनाएं जो निम्नलिखित दो प्रश्नों को प्रतिदिन निष्पादित करेगी। फिर से, हम यह उम्मीद नहीं करेंगे कि ये विकल्प दिन में एक से अधिक बार बदलेंगे, और जब हम आशा करते हैं कि कोई भी सेटिंग नहीं बदलेगा, तो इसे वापस बदल दें (इसलिए यह कैप्चर में दिखाई नहीं देगा), यह हमेशा एक संभावना है . यदि आप पाते हैं कि यह डेटा कैप्चर आपकी आवश्यकताओं के अनुरूप नहीं है, क्योंकि सेटिंग्स बार-बार या अस्थायी रूप से बदलती हैं, तो आप एक ट्रिगर लागू करना या ऑडिटिंग का उपयोग करना चाह सकते हैं।

(sp_configure) के माध्यम से सर्वर विकल्पों को संपादित करने के लिए, एक लॉगिन को ALTER SETTINGS सर्वर-स्तरीय अनुमति की आवश्यकता होती है, जो कि शामिल है यदि आप sysadmin या serveradmin भूमिकाओं के सदस्य हैं। अधिकांश डेटाबेस सेटिंग्स (ALTER DATABASE SET) को संपादित करने के लिए, आपको डेटाबेस में ALTER अनुमति की आवश्यकता होती है, हालाँकि कुछ विकल्पों के लिए अतिरिक्त अधिकारों की आवश्यकता होती है, जैसे कि नियंत्रण सर्वर या सर्वर-स्तरीय विकल्प किसी भी डेटाबेस को बदलें।

/* Statements to use in scheduled job */
 
INSERT INTO [dbo].[SQLskills_ConfigData]
(
  [ConfigurationID] ,
  [Name] ,
  [Value] ,
  [ValueInUse]
)
SELECT 
  [configuration_id] ,
  [name] ,
  [value] ,
  [value_in_use]
FROM [sys].[configurations];
GO
 
INSERT INTO [dbo].[SQLskills_DBData]
(
  [name],
  [database_id],
  [source_database_id],
  [owner_sid],
  [create_date],
  [compatibility_level],
  [collation_name],
  [user_access],
  [user_access_desc],
  [is_read_only],
  [is_auto_close_on],
  [is_auto_shrink_on],
  [state],
  [state_desc],
  [is_in_standby],
  [is_cleanly_shutdown],
  [is_supplemental_logging_enabled],
  [snapshot_isolation_state],
  [snapshot_isolation_state_desc],
  [is_read_committed_snapshot_on],
  [recovery_model],
  [recovery_model_desc],
  [page_verify_option],
  [page_verify_option_desc],
  [is_auto_create_stats_on],
  [is_auto_update_stats_on],
  [is_auto_update_stats_async_on],
  [is_ansi_null_default_on],
  [is_ansi_nulls_on],
  [is_ansi_padding_on],
  [is_ansi_warnings_on],
  [is_arithabort_on],
  [is_concat_null_yields_null_on],
  [is_numeric_roundabort_on],
  [is_quoted_identifier_on],
  [is_recursive_triggers_on],
  [is_cursor_close_on_commit_on],
  [is_local_cursor_default],
  [is_fulltext_enabled],
  [is_trustworthy_on],
  [is_db_chaining_on],
  [is_parameterization_forced],
  [is_master_key_encrypted_by_server],
  [is_published],
  [is_subscribed],
  [is_merge_published],
  [is_distributor],
  [is_sync_with_backup],
  [service_broker_guid],
  [is_broker_enabled],
  [log_reuse_wait],
  [log_reuse_wait_desc],
  [is_date_correlation_on],
  [is_cdc_enabled],
  [is_encrypted],
  [is_honor_broker_priority_on],
  [replica_id],
  [group_database_id],
  [default_language_lcid],
  [default_language_name],
  [default_fulltext_language_lcid],
  [default_fulltext_language_name],
  [is_nested_triggers_on],
  [is_transform_noise_words_on],
  [two_digit_year_cutoff],
  [containment],
  [containment_desc],
  [target_recovery_time_in_seconds]
)
SELECT
  [name],
  [database_id],
  [source_database_id],
  [owner_sid],
  [create_date],
  [compatibility_level],
  [collation_name],
  [user_access],
  [user_access_desc],
  [is_read_only],
  [is_auto_close_on],
  [is_auto_shrink_on],
  [state],
  [state_desc],
  [is_in_standby],
  [is_cleanly_shutdown],
  [is_supplemental_logging_enabled],
  [snapshot_isolation_state],
  [snapshot_isolation_state_desc],
  [is_read_committed_snapshot_on],
  [recovery_model],
  [recovery_model_desc],
  [page_verify_option],
  [page_verify_option_desc],
  [is_auto_create_stats_on],
  [is_auto_update_stats_on],
  [is_auto_update_stats_async_on],
  [is_ansi_null_default_on],
  [is_ansi_nulls_on],
  [is_ansi_padding_on],
  [is_ansi_warnings_on],
  [is_arithabort_on],
  [is_concat_null_yields_null_on],
  [is_numeric_roundabort_on],
  [is_quoted_identifier_on],
  [is_recursive_triggers_on],
  [is_cursor_close_on_commit_on],
  [is_local_cursor_default],
  [is_fulltext_enabled],
  [is_trustworthy_on],
  [is_db_chaining_on],
  [is_parameterization_forced],
  [is_master_key_encrypted_by_server],
  [is_published],
  [is_subscribed],
  [is_merge_published],
  [is_distributor],
  [is_sync_with_backup],
  [service_broker_guid],
  [is_broker_enabled],
  [log_reuse_wait],
  [log_reuse_wait_desc],
  [is_date_correlation_on],
  [is_cdc_enabled],
  [is_encrypted],
  [is_honor_broker_priority_on],
  [replica_id],
  [group_database_id],
  [default_language_lcid],
  [default_language_name],
  [default_fulltext_language_lcid],
  [default_fulltext_language_name],
  [is_nested_triggers_on],
  [is_transform_noise_words_on],
  [two_digit_year_cutoff],
  [containment],
  [containment_desc],
  [target_recovery_time_in_seconds]
FROM [sys].[databases];
GO

परिवर्तनों की जांच कर रहा है

अब जबकि हम इस जानकारी को कैप्चर कर रहे हैं, हम परिवर्तन कैसे ढूंढ़ते हैं? यह जानते हुए कि कई सेटिंग्स बदली जा सकती हैं, और अलग-अलग तिथियों पर, हमें प्रत्येक पंक्ति को देखने वाली विधि की आवश्यकता होती है। यह करना कठिन नहीं है, लेकिन यह सबसे सुंदर कोड उत्पन्न नहीं करता है। सर्वर विकल्पों के लिए, यह बहुत बुरा नहीं है:

;WITH [f] AS
( 
  SELECT
    ROW_NUMBER() OVER (PARTITION BY [ConfigurationID] ORDER BY [CaptureDate] ASC) AS [RowNumber],
    [ConfigurationID] AS [ConfigurationID],
    [Name] AS [Name],
    [Value] AS [Value],
    [ValueInUse] AS [ValueInUse],
    [CaptureDate] AS [CaptureDate]
  FROM [Baselines].[dbo].[ConfigData]
)
SELECT 
  [f].[Name] AS [Setting], 
  [f].[CaptureDate] AS [Date], 
  [f].[Value] AS [Previous Value], 
  [f].[ValueInUse] AS [Previous Value In Use],
  [n].[CaptureDate] AS [Date Changed], 
  [n].[Value] AS [New Value], 
  [n].[ValueInUse] AS [New Value In Use]
FROM [f]
LEFT OUTER JOIN [f] AS [n]
ON [f].[ConfigurationID] = [n].[ConfigurationID]
AND [f].[RowNumber] + 1 = [n].[RowNumber]
WHERE ([f].[Value] <> [n].[Value] OR [f].[ValueInUse] <> [n].[ValueInUse]);
GO

बदली हुई इंस्टेंस सेटिंग

डेटाबेस विकल्पों के लिए, क्वेरी एक संग्रहीत प्रक्रिया में है (क्योंकि यह बहुत बोझिल थी), जिसे आप यहां डाउनलोड कर सकते हैं। संग्रहीत कार्यविधि को चलाने के लिए:

EXEC dbo.usp_FindDBSettingChanges

आउटपुट डेटाबेस और बदली गई सेटिंग, साथ ही दिनांक को सूचीबद्ध करेगा:

डेटाबेस सेटिंग्स बदल दी गई हैं

प्रदर्शन के मुद्दे आने पर आप इन प्रश्नों को चला सकते हैं, यह जांचने के लिए कि क्या कोई सेटिंग बदल गई है, या आप थोड़े अधिक सक्रिय हो सकते हैं और उन्हें नियमित रूप से एक निर्धारित कार्य में चला सकते हैं जो आपको सूचित करता है कि क्या कुछ भी बदल गया है। यदि कोई परिवर्तन होता है तो मैंने डेटाबेस मेल का उपयोग करके ईमेल भेजने के लिए टी-एसक्यूएल कोड शामिल नहीं किया था, लेकिन यहां दिए गए कोड के आधार पर ऐसा करना मुश्किल नहीं होगा।

प्रदर्शन सलाहकार का उपयोग करना

SQL संतरी प्रदर्शन सलाहकार डिफ़ॉल्ट रूप से इस जानकारी को ट्रैक नहीं करता है, लेकिन आप अभी भी डेटाबेस में जानकारी को कैप्चर कर सकते हैं, फिर यह देखने के लिए पीए जांच लें कि क्या कोई सेटिंग बदल गई है, और यदि उनके पास है तो आपको सूचित करें। इसे सेट करने के लिए, SQLskills_ConfigData और SQLskillsDBData तालिकाएँ बनाएँ और नियमित आधार पर उन तालिकाओं में सम्मिलित करने के लिए निर्धारित कार्य सेट करें। SQL संतरी क्लाइंट के भीतर, एक कस्टम स्थिति सेट करें, जैसा कि हमने इस श्रृंखला की पिछली पोस्ट में किया था, प्रोएक्टिव SQL सर्वर स्वास्थ्य जाँच, भाग 1:डिस्क स्थान पोस्ट।

कस्टम कंडीशन में, आपके पास दो विकल्प हैं। सबसे पहले, आप केवल प्रदान किए गए कोड को निष्पादित कर सकते हैं जो यह देखने के लिए ऐतिहासिक डेटा की जांच करता है कि क्या कुछ भी बदल गया है (और यदि ऐसा है तो एक अधिसूचना भेजें)। परिवर्तन के लिए ऐतिहासिक डेटा की जाँच करना कुछ ऐसा है जिसे आप प्रतिदिन चलाते हैं, जैसा कि आप एजेंट जॉब के साथ करते हैं। वैकल्पिक रूप से, आप अधिक सक्रिय हो सकते हैं और अधिक लगातार आधार पर नवीनतम डेटा के विरुद्ध वर्तमान, चल रहे मानों की तुलना कर सकते हैं, उदा। परिवर्तन देखने के लिए घंटे में एक बार। सबसे हाल के कैप्चर के विरुद्ध उदाहरण के लिए वर्तमान सेटिंग्स की जाँच करने के लिए उदाहरण कोड:

;WITH [lc] AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY [ConfigurationID] ORDER BY [CaptureDate] ASC) AS [RowNumber],
    [ConfigurationID] AS [ConfigurationID],
    [Name] AS [Name],
    [Value] AS [Value],
    [ValueInUse] AS [ValueInUse],
    [CaptureDate] AS [CaptureDate]
  FROM [Baselines].[ConfigData]
  WHERE [CaptureDate] = (SELECT MAX([CaptureDate]) FROM [Baselines].[ConfigData])
)
SELECT 
  [lc].[Name] AS [Setting], 
  [lc].[CaptureDate] AS [Date], 
  [lc].[Value] AS [Last Captured Value],
  [lc].[ValueInUse] AS [Last Captured Value In Use], 
  CURRENT_TIMESTAMP AS [Current Time],
  [c].[Value] AS [Current Value], 
  [c].[value_in_use] AS [Current Value In Use]
FROM [sys].[configurations] AS [c]
LEFT OUTER JOIN [lc]
ON [lc].[ConfigurationID] = [c].[configuration_id]
WHERE ([lc].[Value] <> [c].[Value] OR [lc].[ValueInUse] <> [c].[value_in_use]);
GO

सारांश

इंस्टेंस और डेटाबेस विकल्पों की जाँच करना सीधा और स्पष्ट है, और कुछ स्थितियों में यह ऐतिहासिक जानकारी समस्या निवारण के समय आपका महत्वपूर्ण समय बचा सकती है। अगर आप कहीं भी इस जानकारी को कैप्चर नहीं कर रहे हैं, तो मैं आपको शुरू करने के लिए प्रोत्साहित करता हूं; जब आप अग्निशामक और संभावित रूप से तनावग्रस्त हों, इस बात को लेकर अनिश्चित हों कि आपके उत्पादन परिवेश में समस्या किस कारण से आ रही है, तो प्रतिक्रिया करने की तुलना में लगातार मुद्दों की तलाश करना हमेशा बेहतर होता है।


  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. तालिका के सेट पर सीडीसी को अक्षम कैसे करें या SQL सर्वर में डेटाबेस में सभी तालिकाओं पर अक्षम करें - SQL सर्वर ट्यूटोरियल

  3. डायनामिक एसक्यूएल - EXEC(@SQL) बनाम EXEC SP_EXECUTESQL(@SQL)

  4. SQL सर्वर निष्पादन योजना - यह क्या है और यह प्रदर्शन समस्याओं में कैसे मदद करता है?

  5. आपके व्यवसाय के लिए उपलब्ध शीर्ष डेटाबेस निगरानी विकल्प