Въведение
Важно е администраторът на база данни да знае кога няма място на диска. Затова е по-добре да автоматизирате процеса, за да не го правят ръчно на всеки сървър.
В тази статия ще опиша как да внедря автоматично ежедневно събиране на данни за логически устройства и файлове с база данни.
Решение
Алгоритъм:
1. Създайте таблици за съхранение на данни:
1.1. за файлове на база данни:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[DBFile]( [DBFile_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Server] [nvarchar](25n, char) [nvarchar](25n, char) 255) NOT NULL, [Drive] [nvarchar](10) NOT NULL, [Physical_Name] [nvarchar](255) NOT NULL, [Ext] [nvarchar](255) NOT NULL, [Growth] [int] NOT NULL, [IsPercentGrowth] [int] NOT NULL, [DB_ID] [int] NOT NULL, [DB_Name] [nvarchar](255) NOT NULL, [SizeMb] [float] NOT NULL, [DiffSizeMb] [float] NOT NULL, [InsertUTCDate ] [datetime] NOT NULL, [UpdateUTCdate] [datetime] NOT NULL, [File_ID] [int] НЕ NULL, CONSTRAINT [PK_DBFile] ПЪРВИЧЕН КЛУСТЕР КЛУСТРИРАН ( [DBFile_GUID] ASC) С (PAD_INDEX =OFF, NOD_COMPUSTICS_OFF, STATIKEPUSTICS ИЗКЛЮЧЕНО, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [srv].[DBFile] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_DBFile_DBFile_GUID] ПО ПОДРАЗБИРАНЕ (newid()) FOR [GOIDBFilerv].[GOALTER].[GOALTER].[DBFile] DBFile] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_DBFile_InsertUTCDate] ПО ПОДРАЗБИРАНЕ (getutcdate()) ЗА [InsertUTCDate] ТАБЛИЦА НА GOALTER [srv].[DBFile] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_DBFile_UpdateUTCdate] ПО ПРАВО (getutcdate()) ЗА [Update]1.2. за логически устройства:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Драйвери]( [Driver_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Server] [nvarchar](255,charName) [nvarchar](255,charName) 8) NOT NULL, [TotalSpace] [float] NOT NULL, [FreeSpace] [float] NOT NULL, [DiffFreeSpace] [float] NOT NULL, [InsertUTCDate] [datetime] NOT NULL, [UpdateUTCdate NOT] [date NULLtime] ОГРАНИЧЕНИЕ [PK_Драйвери] ПЪРВИЧЕН КЛУСТРИРОВАН ( [Driver_GUID] ASC) С (PAD_INDEX =ИЗКЛЮЧЕНО, STATISTICS_NORECOMPUTE =ИЗКЛЮЧЕНО, IGNORE_DUP_KEY =ИЗКЛЮЧЕНО, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS_LOCKS =TPRIMAL) [GOSPRIMA] [Драйвери] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_Drivers_Driver_GUID] ПО ПОДРАЗБИРАНЕ (newid()) ЗА [Driver_GUID]GOALTER TABLE [srv].[Drivers] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_Drivers_Server] ПО ПОДРАЗБИРАНЕ (@@servername) ЗА [Server]GOALTER TABLE [srv]GOALTER TABLE [srv] ] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_Drivers_TotalSpace] ПО ПОДРАЗБИРАНЕ ((0)) ЗА [TotalSpace] ТАБЛИЦА НА ГОЛТЪРИТЕ [srv].[Драйвери] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_Drivers_Fr] eeSpace] ПО ПОДРАЗБИРАНЕ ((0)) ЗА [FreeSpace]GOALTER TABLE [srv].[Драйвери] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_Drivers_DiffFreeSpace] ПО ПОДРАЗБИРАНЕ ((0)) ЗА [DiffFreeSpace]GOALTER TABLE [srv].[INTTRARSTE] ADD CORP. ПО ПОДРАЗБИРАНЕ (getutcdate()) ЗА [InsertUTCDate]GOALTER TABLE [srv].[Драйвери] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_Drivers_UpdateUTCdate] ПО ПОДРАЗБИРАНЕ (getutcdate()) ЗА [UpdateUTCdate]GOОсвен това трябва предварително да попълните таблица с логически устройства по следния начин:
Име на сървъра – етикет на тома2. създайте необходим изглед за събиране на данни за файлове с база данни:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE изглед [inf].[ServerDBFileInfo] катоSELECT @@Servername КАТО сървър , File_id ,--file_id в база данни. Основната му стойност винаги е равна на 1 Type_desc ,--описание на файлов тип Име като [FileName] ,--логическо име на файл в база данни LEFT(Physical_Name, 1) AS Drive ,--етикет на тома, където се намира файл на база данни Physical_Name, --пълно име на файл в операционната система НАДЯСНО(physical_name, 3) AS Ext ,--разширение на файла Размер като CountPage, --текущ размер на файла в страници от 8 Kb кръг ((предаване(Size*8 като float) )/1024,3) като SizeMb, --размер на файла в Mb Растеж, --нарастване е_процент_нарастване, --нарастване в % database_id, DB_Name(database_id) като [DB_Name]FROM sys.master_files--database_filesGOТук се използва системният изглед sys.master_files.
3. Създайте съхранена процедура, която връща информация на логическо устройство:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOсъздайте процедура [srv].[sp_DriveSpace] @DrivePath varchar(1024) --устройство (възможно е да зададете етикет на обема 'C:') , @TotalSpace float изход -- общ обем в байтове , @FreeSpace float изход --свободно дисково пространство в bytesasbegin ДЕКЛАРИРАНЕ @fso int , @Drive int , @DriveName varchar(255) , @Folder int , @Drives int , @source varchar(255) , @desc varchar (255) , @ret int , @Object int -- Създайте обект на файлова система exec @ret =sp_OACreate 'Scripting.FileSystemObject', @fso изходен набор @Object =@fso if @ret !=0 отидете на ErrorInfo -- Вземете папка на посочения път exec @ret =sp_OAmethod @fso, 'GetFolder', @Folder изход, @DrivePath set @Object =@fso if @ret !=0 отидете на ErrorInfo -- Вземете устройство exec @ret =sp_OAmethod @ Папка, 'Drive', @Drive изходен набор @Object =@Folder if @ret !=0 goto ErrorInfo -- Определете цялото устройство sto rage space exec @ret =sp_OAGetProperty @Drive, 'TotalSize', @TotalSpace изходен набор @Object =@Drive if @ret !=0 отидете на ErrorInfo -- Определете свободно място на диска exec @ret =sp_OAGetProperty @Drive, 'AvailableSpace ', @FreeSpace изходен набор @Object =@Drive if @ret !=0 отидете на ErrorInfo DestroyObjects:ако @Folder не е null exec sp_OADestroy @Folder ако @Drive не е null exec sp_OADestroy @Drive, ако @fso не е null exestro y fso return (@ret) ErrorInfo:exec sp_OAGetErrorInfo @Object, @source изход, @desc изход print 'Грешка в източника:' + isnull( @source, 'n/a' ) + char(13) + 'Описание:' + isnull ( @desc, 'n/a' ) отидете на DestroyObjects;endGOЗа да получите подробна информация за тази процедура, вижте следната статия:Дисково пространство в T-SQL.
4. Създайте съхранена процедура за събиране на данни:
4.1. за файлове на база данни:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[MergeDBFileInfo]ASBEGIN SET NOCOUNT ON; ЗАДАВАНЕ НА НИВОТО НА ИЗОЛАЦИЯ НА ТРАНЗАКЦИЯТА ПРОЧЕТЕНЕ НЕЗАДЪЛЖЕНО;;сливане [srv].[DBFile] като f с помощта на [inf].[ServerDBFileInfo] като ff на f.File_ID=ff.File_ID и f.DB_ID=ff.[database_id] и f.[Server]=ff.[Server] ] при съвпадение, след това актуализирайте, задайте UpdateUTcDate =getUTCDate() ,[Име] =ff.[Име на файл] ,[Drive] =ff.[Drive] ,[Physical_Name] =ff.[Physical_Name] ,[Ext] =ff.[Ext] ] ,[Растеж] =ff.[Растеж] ,[IsPercentGrowth] =ff.[is_percent_growth] ,[SizeMb] =ff.[SizeMb] ,[DiffSizeMb] =кръг(ff.[SizeMb]-f.[SizeMb], 3) когато не съответства на целта, тогава вмъкнете ( [Server] , [Име] , [Drive] , [Physical_Name] , [Ext] , [Growth] , [IsPercentGrowth] , [DB_ID] , [DB_Name ] ,[SizeMb] ,[File_ID] ,[DiffSizeMb] ) стойности ( ff.[Server] ,ff.[FileName] ,ff.[Drive] ,ff.[Physical_Name] ,ff.[Ext] ,ff.[Растеж] ] ,ff.[is_percent_growth] ,ff.[database_id] ,ff.[DB_Name] ,ff.[SizeMb] ,ff.[File_id] ,0 ) когато не се съвпада от източник и f.[Server][email protected] @SERVERNAME след това изтрийте;ENDGO4.2. за логически устройства:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[MergeDriverInfo]ASBEGIN SET NOCOUNT ON; ЗАДАВАНЕ НА НИВОТО НА ИЗОЛАЦИЯ НА ТРАНЗАКЦИЯТА ПРОЧЕТЕНЕ НЕЗАДЪЛЖЕНО; декларира таблица @Drivers ( [Сървър] nvarchar(255), Име nvarchar(8), TotalSpace float, FreeSpace float, DiffFreeSpace float NULL ); вмъкнете в @Drivers ( [Server], Name, TotalSpace, FreeSpace ) изберете [Server], Name, TotalSpace, FreeSpace от srv.Drivers, където [Server][email protected]@SERVERNAME; декларира @TotalSpace float; декларира @FreeSpace float; декларира @DrivePath nvarchar(8); while(exists(select top(1) 1 from @Drivers where DiffFreeSpace е null)) start select top(1) @DrivePath=Име от @Drivers, където DiffFreeSpace е null; exec srv.sp_DriveSpace @DrivePath =@DrivePath , @TotalSpace =@TotalSpace out , @FreeSpace =@FreeSpace out; update @Drivers set [email protected] ,[email protected] ,DiffFreeSpace=case, когато FreeSpace>0, след това round([email protected],3) else 0 край, където [email protected]; end;сливане [srv].[Драйвери] като d, използвайки @Drivers като dd на d.Name=dd.Name и d.[Server]=dd.[Server] при съвпадение, след което актуализирайте set UpdateUTcDate =getUTCDate() ,[TotalSpace] ,[TotalSpace] ] =dd.[TotalSpace] ,[FreeSpace] =dd.[FreeSpace] ,[DiffFreeSpace]=dd.[DiffFreeSpace];ENDGO5. Създайте изгледи за извеждане на данни:
5.1. за файлове на база данни:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOсъздайте изглед [srv].[vDBFiles] като SELECT [DBFile_GUID] ,[Server] ,[Име] ,[Drive] ,[Physical_Name] ,[Growth] ,[Growth] ,[Growth] IsPercentGrowth] ,[DB_ID] ,[File_ID] ,[DB_Name] ,[SizeMb] ,[DiffSizeMb] ,кръгли ([SizeMb]/1024,3) като [SizeGb] ,кръгли ([DiffSizeMb]/1024,3) като [ DiffSizeGb] ,кръгла([SizeMb]/1024/1024,3) като [SizeTb] ,кръгла([DiffSizeMb]/1024/1024,3) като [DiffSizeTb] ,кръгла([DiffSizeMb]/([SizeMb]/100) , 3) като [DiffSizePercent] ,[InsertUTCDate] ,[UpdateUTCdate] FROM [srv].[DBFile];GO5.2. за логически дискове:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOсъздайте изглед [srv].[vDrivers] изберете [Driver_GUID] , [Server] , [Име] , [TotalSpace] като [TotalSpaceByte, pace [TotalSpaceByte, pace] [SpaceByte, pace] [SpaceByte] DiffFreeSpace] като [DiffFreeSpaceByte] ,кръгли ([TotalSpace]/1024, 3) като [TotalSpaceKb] ,закръглени([FreeSpace]/1024, 3) като [FreeSpaceKb] ,закръглени([DiffFree10bSpa, [Sce]/DiffFree10b2pa ] ,закръглете([TotalSpace]/1024/1024, 3) като [TotalSpaceMb] ,кръглете([FreeSpace]/1024/1024, 3) като [FreeSpaceMb] ,закръглете([DiffFreeSpace]/1024/102 като [1024/102) DiffFreeSpaceMb] ,кръгли([TotalSpace]/1024/1024/1024, 3) като [TotalSpaceGb] ,кръгли([FreeSpace]/1024/1024/1024, 3) като [FreeSpaceGb] ,re102pa[FreeSpaceGb] ,re102pa( /1024, 3) като [DiffFreeSpaceGb] ,кръгли ([TotalSpace]/1024/1024/1024/1024, 3) като [TotalSpaceTb] ,кръгли ([FreeSpace]/1024/1024/1024/1024/1024/3eSpace) ] ,round([DiffFreeSpace]/1024/1024/1024/1024, 3) като [DiffFreeSp aceTb] ,закръглете([FreeSpace]/([TotalSpace]/100), 3) като [FreeSpacePercent] ,закръглете([DiffFreeSpace]/([TotalSpace]/100), 3) като [DiffFreeSpacePercent] ,[te]Insert[Da, UTC UpdateUTCdate] ОТ [srv].[Drivers]GO6. Създайте задача в агента на SQL Server и я стартирайте веднъж на ден:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME];GOexec srv.MergeDBFileInfo;exec srv.MergeDriverInfo;7. Съберете всички изходни данни от сървърите. Можете да го направите с помощта на SQL Server Agent, например.
8. Създайте съхранена процедура за генериране на отчет и изпращането му до администраторите. Тъй като е възможно да го приложим по различни начини, ще го разгледам на този конкретен пример:
ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetHTMLTableShortInfoDrivers] @body nvarchar(max) OUTPUTASBEGIN SET NOCOUNT ON; ЗАДАВАНЕ НА НИВОТО НА ИЗОЛАЦИЯ НА ТРАНЗАКЦИЯТА ПРОЧЕТЕНЕ НЕЗАДЪЛЖЕНО; декларира @tbl таблица ( Driver_GUID уникален идентификатор , [Име] nvarchar(255) , [TotalSpaceGb] float , [FreeSpaceGb] float , [DiffFreeSpaceMb] float , [FreeSpacePercent] float , [FreeSpacePercent] daffFreeSpacePercent] daffFreeSpacePercent] daffFreeSpacePercent] daffFreeSpacePercent] daffFreeSpacePercent [FreeSpacePercent] daffFreeSpacePercent] daffFreeSpacePercent [FreeSpacePercent] daffFreeSpaceGb] float [FreeSpacePercent] daffFreeSpaceGb] float ) ,ID int identity(1,1) ); декларира @Driver_GUID уникален идентификатор ,@Name nvarchar(255) ,@TotalSpaceGb float ,@FreeSpaceGb float ,@DiffFreeSpaceMb float ,@FreeSpacePercent float ,@DiffFreePercent float,@DiffFreePercent float,@DiffFreePercent float,@DiffFreePercent float,@DiffFreePercent ,@DiffFreecenterDa,@DiffFreecenterDa,@DiffFreeSpaceGb float,@DiffFreeCenterDa in. вмъкнете в @tbl( Driver_GUID ,[Име] ,[TotalSpaceGb] ,[FreeSpaceGb] ,[DiffFreeSpaceMb] ,[FreeSpacePercent] ,[DiffFreeSpacePercent] ,UpdateUTCDate ,[SerceGbFreeSpacePercent] ,UpdateUTCDate ,[SergBFreeSpacePercent] ,[SergbFreeSpacePercent] ,[SergbFreeSpacePercent],[SerGbFreeSpacePercent],[SergbFreeSpacePercent],[SergbFreeGb]me [SerGbFreeGb]me ] ,[DiffFreeSpaceMb] ,[FreeSpacePercent] ,[DiffFreeSpacePercent] ,UpdateUTCDate ,[Server] от srv.vDrivers където [DiffFreeSpacePercent]<=-5 или [Free<=15%] подреждане по [Server] asc, [Name] asc; if(exists(select top(1) 1 from @tbl)) begin set @body='Когато анализирам, имам устройства за съхранение на данни, които или имат свободно дисково пространство по-малко от 15%, или свободното пространство намалява с над 5% на ден :
'+'<ГРАНИЦА НА ТАБЛИЦА=5>'; set @[email protected]+''; set @[email protected]+' '; while((изберете топ 1 1 от @tbl)>0) започнете набор @[email protected]+''; set @[email protected]+'№ p/p'; set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+'GUID'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'SEVER'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'TOM'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'ОБЕМ, ГБ.'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'БЕЗПЛАТНО, GB.'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'СМЯНА НА СВОБОДНО МЯСТО, МБ.'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'БЕЗПЛАТНО, %'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'ПРОМЕНА СВОБОДНО ПРОСТРАНСТВО, %'; set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+'ВРЕМЕ НА ОТКРИВАНЕ UTC'; set @[email protected]+' '; set @[email protected]+''; select top 1 @Driver_GUID =Driver_GUID ,@Name =Name ,@TotalSpaceGb =TotalSpaceGb ,@FreeSpaceGb =FreeSpaceGb ,@DiffFreeSpaceMb =DiffFreeSpaceMb ,@FreeSpacePercent =FreeSpacePercent ,@DiffFreeSpacePercent =DiffFreeSpacePercent ,@UpdateUTCDate =UpdateUTCDate ,@Server =[Server] , @ID =[ID] от @tbl; set @[email protected]+' '; краен набор @[email protected]+''; задайте @[email protected]+''; задайте @[email protected]+cast(@ID като nvarchar(max)); set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+cast(@Driver_GUID като nvarchar(255)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+coalesce(@Server,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+coalesce(@Name,''); set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+cast(@TotalSpaceGb като nvarchar(255)); set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+cast(@FreeSpaceGb като nvarchar(255)); set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+cast(@DiffFreeSpaceMb като nvarchar(255)); set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+cast(@FreeSpacePercent като nvarchar(255)); set @[email protected]+' '; set @[email protected]+''; задайте @[email protected]+cast(@DiffFreeSpacePercent като nvarchar(255)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+rep.GetDateFormat(@UpdateUTCDate, по подразбиране)+' '+rep.GetTimeFormat(@UpdateUTCDate, по подразбиране); set @[email protected]+' '; изтрийте от @tbl, където [email protected]; set @[email protected]+'
'; За да получите подробна информация, вижте изгледа SRV.srv.vDrivers
За да видите информацията за файловете на базата данни, вижте изгледа DATABASE_NAME.srv.vDBFiles'; крайENDGOТази съхранена процедура генерира HTML-отчет за логически устройства, които или имат свободно дисково пространство по-малко от 15%, или свободното пространство намалява с над 5% на ден. Последният показва странна активност на записи, което означава, че някой много често съхранява твърде много информация на този диск. Това може да се случи поради следните причини:
- Време е да разширите диск;
- Необходимо е да изтриете неизползваните файлове на логическо устройство;
- Изтрийте и намалете регистрационните файлове, както и файловете с информация и други таблици.
Решение
В тази статия анализирах пример за внедряване на система за ежедневно автоматично събиране на данни за локални дискове и файлове с база данни. Тази информация ви позволява да разберете предварително кой диск има по-малко свободно място, както и кои файлове на базата данни нарастват драстично. Позволява да се избегне случай, когато няма място на диск, и да се открие причината, поради която процесът заема много място на диска.
Прочетете също:
Автоматично събиране на данни за промени в схемата на базата данни в MS SQL Server
Автоматично събиране на данни за изпълнени задачи в MS SQL Server