Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Kiểm tra tình trạng máy chủ SQL chủ động, Phần 3:Cài đặt phiên bản và cơ sở dữ liệu

Cuộc thảo luận của chúng tôi về các nhiệm vụ chủ động giúp cơ sở dữ liệu của bạn hoạt động tốt sẽ tiếp tục trong bài đăng này khi chúng tôi giải quyết các tùy chọn máy chủ và cơ sở dữ liệu. Bạn có thể đã nghĩ rằng đây sẽ là một bài đăng nhanh - ai thường xuyên thay đổi các tùy chọn máy chủ hoặc cơ sở dữ liệu? Bạn sẽ ngạc nhiên, đặc biệt nếu bạn có nhiều người có quyền truy cập vào SQL Server. Các tùy chọn máy chủ và cơ sở dữ liệu sẽ không thường xuyên thay đổi - đối với hầu hết các tùy chọn này được thiết lập khi cài đặt và để yên. Nhưng thường xuyên có lý do chính đáng để thực hiện thay đổi - có thể là liên quan đến hiệu suất, do thay đổi trong mã ứng dụng hoặc có thể do lần đầu tiên đặt điều gì đó không chính xác. Trước tiên, hãy kiểm tra những thay đổi này và nắm bắt các chỉ số thích hợp trước và sau khi thay đổi. Nó có vẻ khá đơn giản và rõ ràng, phải không? Bạn có thể nghĩ như vậy, nhưng nếu bạn không có quy trình quản lý thay đổi được tuân thủ chặt chẽ, thì không phải vậy.

Trong phần lớn các môi trường, nhiều người có quyền truy cập vào SQL Server và nhiều người có các đặc quyền cần thiết để thay đổi tùy chọn máy chủ hoặc cơ sở dữ liệu. Nếu thay đổi cài đặt sai, tác động đến hiệu suất có thể rất đáng kể. (Bạn đã bao giờ vô tình đặt cài đặt bộ nhớ tối đa thành giá trị tính bằng GB thay vì MB chưa? Trong trường hợp bạn đang thắc mắc, 128MB không đủ bộ nhớ cần thiết để phiên bản SQL Server khởi động. Hãy xem bài đăng của Ted Krueger về cách khắc phục điều này , bạn có bao giờ mắc phải sai lầm đó không.) Các thay đổi khác có thể tạo ra các vấn đề nhỏ hơn mà vẫn gây rắc rối và đôi khi khó theo dõi (tắt Tự động Tạo Thống kê là một ví dụ điển hình). Bạn có thể nghĩ rằng những thay đổi này sẽ được truyền đạt tốt (đôi khi bạn quá bận rộn với việc dập lửa mà quên mất) hoặc dễ nhận thấy (không phải lúc nào cũng vậy). Để tránh điều này, chúng tôi theo dõi các cài đặt và sau đó, khi chạy kiểm tra thường xuyên (hoặc khi khắc phục sự cố), chúng tôi xác minh rằng không có gì thay đổi.

Thu thập dữ liệu

Không giống như bài trước về các tác vụ bảo trì, nơi chúng tôi dựa vào msdb để giữ dữ liệu mà chúng tôi quan tâm, chúng tôi phải thiết lập thu thập dữ liệu cho ví dụ và cài đặt cơ sở dữ liệu. Chúng tôi sẽ chụp nhanh sys.configurations và sys.database_info hàng ngày vào các bảng trong cơ sở dữ liệu Cơ sở của chúng tôi, sau đó sử dụng các truy vấn để xem có gì thay đổi không và khi nào.

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

Tập lệnh để tạo bảng SQLskills_DBData tương thích với SQL Server 2014. Đối với các phiên bản cũ hơn, bạn có thể cần sửa đổi bảng cơ sở và truy vấn ảnh chụp nhanh (xem bộ mã tiếp theo).

Khi bạn đã tạo các bảng, hãy tạo một công việc sẽ thực hiện hai truy vấn sau hàng ngày. Một lần nữa, chúng tôi sẽ không mong đợi rằng các tùy chọn này sẽ thay đổi nhiều hơn một lần mỗi ngày và trong khi chúng tôi hy vọng không ai thay đổi cài đặt, sau đó thay đổi lại (do đó nó sẽ không hiển thị trong ảnh chụp), đó luôn là một khả năng . Nếu bạn thấy rằng việc thu thập dữ liệu này không phù hợp với nhu cầu của bạn, vì cài đặt thay đổi thường xuyên hoặc tạm thời, bạn có thể muốn triển khai trình kích hoạt hoặc sử dụng kiểm tra.

Để chỉnh sửa các tùy chọn máy chủ qua (sp_configure), đăng nhập cần có quyền cấp máy chủ ALTER SETTINGS, quyền này được bao gồm nếu bạn là thành viên của vai trò sysadmin hoặc serveradmin. Để chỉnh sửa hầu hết các cài đặt cơ sở dữ liệu (ALTER DATABASE SET), bạn cần có quyền ALTER trong cơ sở dữ liệu, mặc dù một số tùy chọn yêu cầu quyền bổ sung, chẳng hạn như CONTROL SERVER hoặc tùy chọn cấp máy chủ ALTER BẤT KỲ CƠ SỞ DỮ LIỆU nào.

/* 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

Kiểm tra các thay đổi

Bây giờ chúng tôi đang nắm bắt thông tin này, làm thế nào để chúng tôi tìm thấy các thay đổi? Biết rằng có thể có nhiều cài đặt được thay đổi và vào các ngày khác nhau, chúng tôi cần một phương pháp xem xét từng hàng. Điều này không khó thực hiện, nhưng nó không tạo ra mã đẹp nhất. Đối với các tùy chọn máy chủ, nó không quá tệ:

;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

Cài đặt phiên bản đã thay đổi

Đối với các tùy chọn cơ sở dữ liệu, truy vấn nằm trong một thủ tục được lưu trữ (vì nó rất khó sử dụng), bạn có thể tải xuống tại đây. Để chạy thủ tục đã lưu trữ:

EXEC dbo.usp_FindDBSettingChanges

Đầu ra sẽ liệt kê cơ sở dữ liệu và cài đặt đã thay đổi, cũng như ngày:

Cài đặt cơ sở dữ liệu đã thay đổi

Bạn có thể chạy các truy vấn này khi có vấn đề về hiệu suất, để nhanh chóng kiểm tra xem có cài đặt nào đã thay đổi hay không, hoặc bạn có thể chủ động hơn một chút và chạy chúng thường xuyên trong một công việc đã lên lịch để thông báo cho bạn nếu có bất kỳ điều gì thay đổi. Tôi không bao gồm mã T-SQL để gửi email bằng thư cơ sở dữ liệu nếu có thay đổi, nhưng điều đó sẽ không khó thực hiện dựa trên mã được cung cấp tại đây.

Sử dụng Cố vấn Hiệu suất

SQL Sentry Performance Advisor không theo dõi thông tin này theo mặc định, nhưng bạn vẫn có thể nắm bắt thông tin trong cơ sở dữ liệu, sau đó yêu cầu PA kiểm tra xem có cài đặt nào đã thay đổi hay không và thông báo cho bạn nếu có. Để thiết lập điều này, hãy tạo các bảng SQLskills_ConfigData và SQLskillsDBData và thiết lập công việc đã lên lịch để chèn vào các bảng đó một cách thường xuyên. Trong máy khách SQL Sentry, hãy thiết lập Điều kiện tùy chỉnh, như chúng tôi đã làm trong bài đăng trước đó của loạt bài này, Kiểm tra sức khỏe máy chủ SQL chủ động, Phần 1:Bài đăng về Dung lượng đĩa.

Trong Điều kiện tùy chỉnh, bạn có hai tùy chọn. Đầu tiên, bạn chỉ có thể thực thi mã được cung cấp để kiểm tra dữ liệu lịch sử để xem liệu có gì thay đổi hay không (và sau đó gửi thông báo nếu có). Kiểm tra dữ liệu lịch sử để biết sự thay đổi là công việc mà bạn sẽ thực hiện hàng ngày, giống như khi bạn làm với Công việc đại lý. Ngoài ra, bạn có thể chủ động hơn và so sánh các giá trị hiện tại, đang chạy với dữ liệu gần đây nhất trên cơ sở thường xuyên hơn, ví dụ:mỗi giờ một lần, để tìm kiếm các thay đổi. Mã ví dụ để kiểm tra cài đặt hiện tại cho phiên bản so với lần chụp gần đây nhất:

;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

Tóm tắt

Việc kiểm tra các tùy chọn phiên bản và cơ sở dữ liệu rất đơn giản và rõ ràng, và trong một số tình huống, thông tin lịch sử này có thể giúp bạn tiết kiệm đáng kể thời gian khi khắc phục sự cố. Nếu bạn không nắm bắt được thông tin này ở bất kỳ đâu, tôi khuyến khích bạn nên bắt đầu; tốt hơn hết là bạn nên chủ động tìm kiếm các vấn đề hơn là phản ứng khi bạn đang chữa cháy và có khả năng bị căng thẳng, không chắc chắn về điều gì đang gây ra sự cố trong môi trường sản xuất của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách đổi tên tên cột hoặc tên bảng trong SQL Server - Hướng dẫn SQL Server / T-SQL Phần 36

  2. Thoát một chuỗi trong SQL Server để an toàn khi sử dụng trong biểu thức LIKE

  3. SQL động - EXEC (@SQL) so với EXEC SP_EXECUTESQL (@SQL)

  4. Thuật toán để tránh SQL injection trên MSSQL Server từ mã C #?

  5. Phân tích cú pháp chuỗi được phân tách bằng dấu phẩy để tạo IN Danh sách các chuỗi trong mệnh đề Where