Memantau ruang kosong dalam file data SQL Server

9

Saya telah secara manual mengubah ukuran file mdf / ndf ke ukuran besar untuk menghindari operasi autogrow pada database SQL Server. Karena file lebih besar, ada sangat sedikit ruang kosong pada partisi disk dan sysadmin terus mengingatkan saya bahwa saya kehabisan ruang.

Karena saya mengubah ukurannya, ada banyak ruang kosong dalam file data tetapi orang tidak dapat melihatnya melihat ukuran file / ruang kosong disk.

Bagaimana saya bisa memantau% nyata penggunaan file data? Saya lebih suka menggunakan penghitung perfmon. Saya prihatin bahwa ketika file benar-benar kehabisan ruang SQL Server tidak akan dapat mengalokasikan ruang yang cukup dan akan crash.

BuahahaXD
sumber

Jawaban:

11

Tidak yakin mengapa Anda ingin menggunakan penghitung kinerja untuk ini ketika Anda bisa mendapatkannya dari permintaan sederhana. Dan bahkan saat Anda bisa mendapatkan informasi ini tentang file log dari penghitung kinerja ( Log File(s) Size (KB)/ Log File(s) Used Size (KB)), tidak ada penghitung seperti itu untuk berapa banyak ruang yang digunakan dalam file data.

;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;
Aaron Bertrand
sumber
Saya berharap itu bisa dilakukan tanpa menggunakan SQL Server. Tentu saya dapat meminta secara manual dan melihat ruang kosong tetapi saya membutuhkan solusi otomatis. Penghitung perfmon akan sempurna karena sysadmin dapat menggunakannya dengan perangkat lunak pemantauan mereka. Saya mungkin menggunakan permintaan Anda dan mengatur tanda SQL pekerjaan + email Agen. Saya juga akan mencoba solusi Kin dan melihat mana yang paling baik.
BuahahaXD
1
Saya memiliki kasus penggunaan yang serupa. Jika solusi pemantauan tidak spesifik SQL Server, tetapi tahu tentang windows, maka penghitung kinerja akan lebih mudah untuk diterapkan dan dipantau.
Michael J Swart
7

Saya punya metode lain untuk secara proaktif memonitor ruang file data dan mengingatkan jika ruang kosong turun di bawah persentase tertentu menggunakan SQL Alert.

Dasar-dasarnya adalah

  • Buat pesan kesalahan yang ditentukan pengguna di sys.messages. Ini akan digunakan oleh peringatan agen 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.'
  • Sekarang buat pekerjaan Agen SQL. Pastikan Anda mengubah set @threshold = 20 --->>>>>>>>>>>>>>>>> CHANGE HERE <<<<<<<<<<<<<<<<<<<<<---skrip di bawah ini. Saya telah menempatkannya sebagai ambang yang sangat rendah, hanya untuk mensimulasikan peringatan. Jadwalkan pekerjaan yang akan dijalankan setiap 30 menit (ubah sesuai kebutuhan Anda).

        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
  • Sekarang buat peringatan untuk menanggapi 911421nomor kesalahan.

    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

    masukkan deskripsi gambar di sini

    masukkan deskripsi gambar di sini

Catatan: Ada beberapa jenis perangkat tambahan yang dapat Anda lakukan dengan ide saya di atas.

  • Jadikan agen pekerjaan sebagai prosedur tersimpan yang menerima ambang sebagai nilai input.
  • Log nilai-nilai ke tabel fisik dalam database DBA sehingga Anda dapat melakukan analisis tren dan perencanaan kapasitas.
  • Apa pun yang bisa Anda pikirkan .... :-)
Kin Shah
sumber
Ada masalah dengan kueri Anda. Saya pikir ada loop tak terbatas di suatu tempat. Saya mengkonfigurasi peringatan, mematikan memicu pekerjaan oleh peringatan dan saya terus mendapatkan banyak email tentang file data :)
BuahahaXD
1
Anda harus menggunakan penundaan di antara pengaturan tanggapan.
Kin Shah
5

Hanya untuk membangun pada jawaban Aaron dan Kin, Anda dapat melakukannya dengan penghitung perf, tetapi salah satu penghitung yang dapat diatur oleh pengguna .

Saya akan:

  • buat prosedur tersimpan yang akan menggunakan kueri Aaron untuk mendapatkan ruang kosong dalam satu file atau loop melalui semua file dan mendapatkan nilai min / maks yang diminati
  • buat pekerjaan yang secara berkala akan menjalankan proc yang disimpan

Jika Anda ingin diberitahukan dengan benar:

  • buat operator / gunakan yang sudah ada dengan alamat email yang valid
  • buat lansiran berdasarkan penghitung pengguna yang akan memberi tahu operator sebelumnya (pastikan Anda tidak membanjiri diri Anda dengan email - tetapkan jeda antar tanggapan).

Peringatan adalah:

  • Anda hanya memiliki 10 konter yang dapat diatur
  • mereka tidak memiliki nama yang berarti
  • Anda harus memiliki pekerjaan rumit + proc + peringatan untuk memiliki gambar yang bagus

Tetapi mereka dapat digunakan dalam Perfmon atau alat serupa lainnya.

Marian
sumber
3

Juga ada pengaturan peringatan sederhana untuk memantau ukuran file data:

masukkan deskripsi gambar di sini

Tambahan 'Peringatan Ruang Log Rendah' ​​akan memonitor ruang kosong untuk file log transaksi (autogrowth tidak aktif):

masukkan deskripsi gambar di sini

Vladislav
sumber