Giám sát không gian trống trong tệp dữ liệu SQL Server


9

Tôi đã thay đổi kích thước thủ công các tệp mdf / ndf thành kích thước lớn để tránh các hoạt động tự động phát sinh trên cơ sở dữ liệu SQL Server. Vì các tệp lớn hơn nên có rất ít không gian trống trên các phân vùng đĩa và các hệ thống liên tục cảnh báo tôi rằng tôi sắp hết dung lượng.

Vì tôi đã thay đổi kích thước chúng, có rất nhiều không gian trống trong các tệp dữ liệu nhưng người ta không thể nhận thấy nó đang xem kích thước tệp / dung lượng trống của đĩa.

Làm cách nào tôi có thể theo dõi% sử dụng thực sự của các tệp dữ liệu? Tôi thích sử dụng quầy perfmon. Tôi quan niệm rằng khi tệp thực sự hết dung lượng, SQL Server sẽ không thể phân bổ đủ dung lượng và sẽ bị sập.

Câu trả lời:


11

Không chắc chắn lý do tại sao bạn muốn sử dụng bộ đếm hiệu suất cho việc này khi bạn có thể lấy nó từ một truy vấn đơn giản. Và trên thực tế, trong khi bạn có thể nhận được thông tin này về các tệp nhật ký từ các bộ đếm hiệu suất ( Log File(s) Size (KB)/ Log File(s) Used Size (KB)), thì không có bộ đếm nào như vậy cho bao nhiêu không gian được sử dụng trong một tệp dữ liệu.

;WITH f AS 
(
  SELECT name, size = size/128.0 FROM sys.database_files
),
s AS
(
  SELECT name, size, free = size-CONVERT(INT,FILEPROPERTY(name,'SpaceUsed'))/128.0
  FROM f
)
SELECT name, size, free, percent_free = free * 100.0 / size
FROM s;

Tôi đã hy vọng nó có thể được thực hiện mà không cần sử dụng SQL Server. Chắc chắn tôi có thể truy vấn nó bằng tay và xem không gian trống nhưng tôi cần một giải pháp tự động. Một bộ đếm perfmon sẽ là hoàn hảo bởi vì các hệ thống có thể sử dụng nó với phần mềm giám sát của họ. Tôi có thể sử dụng truy vấn của bạn và thiết lập thông báo email + công việc Tác nhân SQL. Ngoài ra tôi sẽ thử giải pháp của Kin và xem cái nào hoạt động tốt nhất.
BuahahaXD

1
Tôi có một trường hợp sử dụng tương tự. Nếu một giải pháp giám sát ngoài luồng không phải là SQL Server cụ thể, nhưng biết về các cửa sổ, thì bộ đếm hiệu suất sẽ dễ thực hiện và giám sát hơn.
Michael J Swart

7

Tôi có một phương pháp khác để chủ động giám sát không gian tệp dữ liệu và cảnh báo nếu không gian trống giảm xuống dưới một tỷ lệ nhất định bằng SQL Alert.

Những điều cơ bản là

  • Tạo một thông báo lỗi do người dùng xác định trong sys.messages. Điều này sẽ được sử dụng bởi cảnh báo đại lý sql.

    -- User-defined error messages can be an integer between 50001 and 2147483647. 
    EXEC sp_addmessage 
      @msgnum=911421, -- 911DBA
      @severity=1,    -- Informational message not generated by DB Engine       
      @msgtext=N'Data files are %d percent full in database %s.'
  • Bây giờ tạo một công việc SQL Agent. Hãy chắc chắn rằng bạn thay đổi set @threshold = 20 --->>>>>>>>>>>>>>>>> CHANGE HERE <<<<<<<<<<<<<<<<<<<<<---trong kịch bản dưới đây. Tôi đã đặt anh ta như một ngưỡng rất thấp, chỉ để mô phỏng cảnh báo. Lịch trình công việc để chạy cứ sau 30 phút (thay đổi điều này theo nhu cầu của bạn).

        if object_id('tempdb..#dbserversize') is not null
        DROP TABLE #dbserversize;
    
        create table dbo.#dbserversize (
         [id] int identity (1,1)
         ,[databaseName] sysname
        ,[Drive]    varchar(3)
        ,[Logical Name] sysname
        ,[Physical Name]    varchar(max)
        ,[File Size MB] decimal(38, 2)
        ,[Space Used MB]    decimal(38, 2)
        ,[Free Space]   decimal(38, 2)
        ,[%Free Space]  decimal(38, 2)
        ,[Max Size] varchar(max)
        ,[Growth Rate]  varchar(max)
        )
    
        declare @id int
        declare @threshold int
        declare @dbname sysname
    
        declare @sqltext nvarchar(max)
    
        declare @freespacePct int
    
        set @threshold = 20   --->>>>>>>>>>>>>>>>> CHANGE HERE <<<<<<<<<<<<<<<<<<<<<---
    
        select @dbname = min(name) from sys.databases where database_id > 4 and [state] = 0 
    
        while @dbname is not NULL
    
        begin
            select @dbname = name from sys.databases where name = @dbname and database_id > 4 and [state] = 0 
                --- Modified from Erin's blog : Proactive SQL Server Health Checks, Part 1 : Disk Space
                --- source http://sqlperformance.com/2014/12/io-subsystem/proactive-sql-server-health-checks-1
            set @sqltext =  ' use '+@dbname+';'+' 
                insert into dbo.#dbserversize
                select '''+@dbname+''' as [databaseName]
                    ,substring([physical_name], 1, 3) as [Drive]
                    ,[name] as [Logical Name]
                    ,[physical_name] as [Physical Name]
                    ,cast(CAST([size] as decimal(38, 2)) / 128.0 as decimal(38, 2)) as [File Size MB]
                    ,cast(CAST(FILEPROPERTY([name], ''SpaceUsed'') as decimal(38, 2)) / 128.0 as decimal(38, 2)) as [Space Used MB]
                    ,cast((CAST([size] as decimal(38, 0)) / 128) - (CAST(FILEPROPERTY([name], ''SpaceUsed'') as decimal(38, 0)) / 128.) as decimal(38, 2)) as [Free Space]
                    ,cast(((CAST([size] as decimal(38, 2)) / 128) - (CAST(FILEPROPERTY([name], ''SpaceUsed'') as decimal(38, 2)) / 128.0)) * 100.0 / (CAST([size] as decimal(38, 2)) / 128) as decimal(38, 2)) as [%Free Space]
                    ,case 
                        when cast([max_size] as varchar(max)) = - 1
                            then ''UNLIMITED''
                        else cast([max_size] as varchar(max))
                        end as [Max Size]
                    ,case 
                        when is_percent_growth = 1
                            then cast([growth] as varchar(20)) + ''%''
                        else cast([growth] as varchar(20)) + ''MB''
                        end as [Growth Rate]
                    from sys.database_files
                    where type = 0 -- for Rows , 1 = LOG'
                --print @sqltext
                exec (@sqltext)
    
    
                select @dbname = min(name) from sys.databases where name > @dbname and database_id > 4 and [state] = 0 
        end
    
    
        --- delete the entries that do not meet the threshold 
    
        delete from dbo.#dbserversize
        where [%Free Space] < @threshold;
    
    
        --select * from dbo.#dbserversize
    
        --- NOW Raise errors for the databases that we got flagged up
    
        while exists (select null from dbo.#dbserversize)
        begin
    
            select top 1 @id = id,
                        @dbname = databaseName,
                        @freespacePct = [%Free Space]
                    from dbo.#dbserversize;
    
    
                RAISERROR(911421, 10,1,@freespacePct, @dbname) with LOG;
    
                delete from dbo.#dbserversize where id = @id;
    
        end
  • Bây giờ tạo một cảnh báo để đáp ứng với 911421số lỗi.

    USE [msdb]
    GO
    EXEC msdb.dbo.sp_add_alert @name=N'MDF file alert', 
            @message_id=911421, 
            @severity=0, 
            @enabled=1, 
            @delay_between_responses=1800, 
            @include_event_description_in=0, 
            @job_id=N'019c4770-865b-406b-894e-72a1ff34f732'
    GO
    EXEC msdb.dbo.sp_add_notification @alert_name=N'MDF file alert', @operator_name=N'Notify 911 DBA for MDF files getting full', @notification_method = 1
    GO

    nhập mô tả hình ảnh ở đây

    nhập mô tả hình ảnh ở đây

Lưu ý: Có những loại cải tiến khác mà bạn có thể làm với ý tưởng của tôi ở trên.

  • Làm cho công việc tác nhân như một ngưỡng chấp nhận thủ tục được lưu trữ làm giá trị đầu vào.
  • Ghi nhật ký các giá trị vào bảng vật lý trong cơ sở dữ liệu DBA để bạn có thể thực hiện phân tích xu hướng và lập kế hoạch dung lượng.
  • Bất kỳ điều gì khác mà bạn có thể nghĩ .... :-)

Có một vấn đề với truy vấn của bạn. Tôi nghĩ rằng có một vòng lặp vô hạn ở đâu đó. Tôi đã định cấu hình các cảnh báo, tắt thông báo kích hoạt công việc và tôi tiếp tục nhận được rất nhiều thư về các tệp dữ liệu :)
BuahahaXD

1
Bạn nên sử dụng độ trễ giữa các thiết lập phản hồi.
Kin Shah

5

Chỉ cần xây dựng dựa trên câu trả lời của Aaron và Kin, bạn có thể làm điều đó với các bộ đếm hoàn hảo, nhưng một trong những bộ đếm có thể đặt được của người dùng .

Tôi sẽ:

  • tạo một thủ tục được lưu trữ sẽ sử dụng truy vấn của Aaron để có được không gian trống trong một tệp hoặc lặp qua tất cả các tệp và nhận giá trị tối thiểu / tối đa mà bạn quan tâm
  • tạo một công việc sẽ định kỳ chạy Proc được lưu trữ

Trong trường hợp bạn muốn được thông báo chính xác:

  • tạo một nhà điều hành / sử dụng một cái hiện có với một địa chỉ email hợp lệ
  • tạo một cảnh báo dựa trên bộ đếm người dùng sẽ thông báo cho nhà điều hành trước đó (đảm bảo bạn không tự làm ngập email - đặt độ trễ giữa các phản hồi).

Hãy cẩn thận là:

  • bạn chỉ có 10 quầy ổn định
  • họ không có một cái tên ý nghĩa
  • bạn cần phải có công việc rườm rà + Proc + cảnh giác để có một bức ảnh đẹp

Nhưng chúng có thể được sử dụng trong Perfmon hoặc một công cụ tương tự khác.


3

Ngoài ra còn có một cài đặt cảnh báo đơn giản để theo dõi kích thước tệp dữ liệu:

nhập mô tả hình ảnh ở đây

Bổ sung 'Thông báo không gian nhật ký thấp' sẽ giám sát không gian trống cho tệp nhật ký giao dịch (tự động tắt là tắt):

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.