Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Автоматично събиране на данни:файлове с бази данни и логически устройства в MS SQL Server

Въведение

Важно е администраторът на база данни да знае кога няма място на диска. Затова е по-добре да автоматизирате процеса, за да не го правят ръчно на всеки сървър.

В тази статия ще опиша как да внедря автоматично ежедневно събиране на данни за логически устройства и файлове с база данни.

Решение

Алгоритъм:

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 след това изтрийте;ENDGO

4.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];ENDGO

5. Създайте изгледи за извеждане на данни:

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];GO

5.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]GO

6. Създайте задача в агента на 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]+''; 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]+''; while((изберете топ 1 1 от @tbl)>0) започнете набор @[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]+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]+''; краен набор @[email protected]+''; задайте @[email protected]+'

'; За да получите подробна информация, вижте изгледа SRV.srv.vDrivers

За да видите информацията за файловете на базата данни, вижте изгледа DATABASE_NAME.srv.vDBFiles'; крайENDGO

Тази съхранена процедура генерира HTML-отчет за логически устройства, които или имат свободно дисково пространство по-малко от 15%, или свободното пространство намалява с над 5% на ден. Последният показва странна активност на записи, което означава, че някой много често съхранява твърде много информация на този диск. Това може да се случи поради следните причини:

  1. Време е да разширите диск;
  2. Необходимо е да изтриете неизползваните файлове на логическо устройство;
  3. Изтрийте и намалете регистрационните файлове, както и файловете с информация и други таблици.

Решение

В тази статия анализирах пример за внедряване на система за ежедневно автоматично събиране на данни за локални дискове и файлове с база данни. Тази информация ви позволява да разберете предварително кой диск има по-малко свободно място, както и кои файлове на базата данни нарастват драстично. Позволява да се избегне случай, когато няма място на диск, и да се открие причината, поради която процесът заема много място на диска.

Прочетете също:

Автоматично събиране на данни за промени в схемата на базата данни в MS SQL Server

Автоматично събиране на данни за изпълнени задачи в MS SQL Server


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Лесното ръководство за това как да използвате подзаявки в SQL Server

  2. Филтрирайте по изходна клауза sql

  3. Как да създам стъпка в моята задача за агент на SQL Server, която ще изпълнява моя SSIS пакет?

  4. Разбиране на анализатора на работното натоварване за картографиране на тесните места в производителността

  5. Функции, дефинирани от потребителя на SQL Server