sql >> Databáze >  >> RDS >> Sqlserver

Automatický sběr dat:Databázové soubory a logické jednotky na MS SQL Server

Úvod

Pro správce databáze je důležité vědět, kdy na disku není místo. Proto je lepší zautomatizovat proces, aby to neprováděli ručně na každém serveru.

V tomto článku popíšu, jak implementovat automatický denní sběr dat o logických jednotkách a databázových souborech.

Řešení

Algoritmus:

1. Vytvořte tabulky úložiště dat:
1.1. pro databázové soubory:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[DBFile]( [DBFile_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Server] [nvarchar](255)me] NOT NULL 255) NOT NULL, [Drive] [nvarchar](10) NOT NULL, [Physical_Name] [nvarchar](255) NOT NULL, [Ext] [nvarchar](255) NOT NULL, [Růst] [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] NENÍ NULL, [UpdateUTCdate] [datetime] NENÍ NULL, [ID_souboru] [int] NENÍ NULL, OMEZENÍ [PK_DBFile] PRIMÁRNÍ KLÍČ V CLUSTERU ( [DBFile_GUID] ASC)WITH (PAD_INDEX =OFF, STATISTICS_NOREGNUPPUTE =STATISTICS_NOREGNUPPUTE VYPNUTO, ALLOW_ROW_LOCKS =ZAPNUTO, ALLOW_PAGE_LOCKS =ZAPNUTO) ZAPNUTO [PRIMÁRNÍ]) NA [PRIMÁRNÍ] TABULKA BRANKÁŘŮ [srv].[DBFile] PŘIDAT OMEZENÍ [DF_DBFile_DBFile_GUID] VÝCHOZÍ (newid()_rv) [GUID]GOALSOUBOR [DBFile [DBFile] DBFile] PŘIDAT OMEZENÍ [DF_DBFile_InsertUTCDate] VÝCHOZÍ (getutcdate()) PRO [InsertUTCDate]TABULKA BRANKŮ [srv].[DBFile] PŘIDAT OMEZENÍ [DF_DBFile_UpdateUTCdate] VÝCHOZÍ (getutcdate()) PRO [UpdatepreUTCdate] 

1.2. pro logické jednotky:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Drivers]( [Driver_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Server] [nvarchar](255) NOT NULL, [Name] 8) NOT NULL, [TotalSpace] [float] NOT NULL, [FreeSpace] [float] NOT NULL, [DiffFreeSpace] [float] NOT NULL, [InsertUTCDate] [datetime] NOT NULL, [UpdateUTCdate] [datetime] NOT NULL, OMEZENÍ [PK_Drivers] PRIMÁRNÍ KLÍČ SE SLUSTROVANÝ ( [Driver_GUID] ASC) S (PAD_INDEX =VYPNUTO, STATISTICS_NORECOMPUTE =VYPNUTO, IGNORE_DUP_KEY =VYPNUTO, ALLOW_ROW_LOCKS =ZAPNUTO, ALLOW_PAGE_LOCKS =ZAPNUTO. ALLOW_PAGE_LOCKS] GOTERMARY) ONBLEPRIMARY [PTArv [Ovladače] PŘIDAT OMEZENÍ [DF_Drivers_Driver_GUID] VÝCHOZÍ (newid()) PRO [Driver_GUID]TABULKA BRANKŮ [srv].[Ovladače] PŘIDAT OMEZENÍ [DF_Drivers_Server] VÝCHOZÍ (@@název_serveru) PRO [Server]TABULKA BRANKŮ [srv].[Ovladače ] PŘIDAT OMEZENÍ [DF_Drivers_TotalSpace] VÝCHOZÍ ((0)) PRO [TotalSpace]TABULKA BRANKŮ [srv].[Řidiči] PŘIDAT OMEZENÍ [DF_Drivers_Fr eeSpace] VÝCHOZÍ ((0)) PRO [FreeSpace]TABULKA BRANKŮ [srv].[Ovladače] PŘIDAT OMEZENÍ [DF_Drivers_DiffFreeSpace] VÝCHOZÍ ((0)) PRO [DiffFreeSpace]TABULKA BRANKA [srv].[Ovladače] PŘIDAT OMEZENÍ [sDF_Drivers_Insert]CDate VÝCHOZÍ (getutcdate()) PRO [InsertUTCDate]TABULKA BRANKA [srv].[Drivers] PŘIDAT OMEZENÍ [DF_Drivers_UpdateUTCdate] VÝCHOZÍ (getutcdate()) PRO [UpdateUTCdate]PŘEJÍT

Kromě toho musíte předem vyplnit tabulku s logickými jednotkami následujícím způsobem:
Název serveru – jmenovka svazku

2. vytvořte potřebný pohled pro sběr dat o databázových souborech:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE zobrazení [inf].[ServerDBFileInfo] jako SELECT @@Servername AS Server , File_id ,--file_id v databázi. Jeho hlavní hodnota se vždy rovná 1 Type_desc ,--popis typu souboru Název jako [název_souboru] ,--název logického souboru v databázi LEFT(Physical_Name, 1) AS Drive ,--název svazku, kde je umístěn databázový soubor Fyzický_název , --úplný název souboru v operačním systému RIGHT(fyzické_jméno, 3) AS Ext ,--přípona souboru Velikost jako CountPage, --aktuální velikost souboru na stránkách 8 kB zaokrouhlení((cast(Velikost*8 jako plovoucí) )/1024,3) jako SizeMb, --velikost souboru v Mb Růst, --growth is_percent_growth, --growth in % database_id, DB_Name(database_id) as [DB_Name]FROM sys.master_files--database_filesGO

Zde je použit systémový pohled sys.master_files.

3. Vytvořte uloženou proceduru, která vrací informace na logické jednotce:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOvytvořit proceduru [srv].[sp_DriveSpace] @DrivePath varchar(1024) --device (je možné nastavit jmenovku svazku 'C:') , plovoucí výstup @TotalSpace -- celkový objem v bajtech , plovoucí výstup @FreeSpace -- volné místo na disku v bytesasbegin DECLARE @fso int , @Drive int , @DriveName varchar(255) , @Folder int , @Drives int , @source varchar(255) , @desc varchar (255) , @ret int , @Object int -- Vytvořte objekt souborového systému exec @ret =sp_OACreate 'Scripting.FileSystemObject', @fso výstupní sada @Object =@fso if @ret !=0 goto ErrorInfo -- Získejte složku na zadané cestě exec @ret =sp_OAmethod @fso, 'GetFolder', @Výstup složky, @DrivePath set @Object =@fso if @ret !=0 goto ErrorInfo -- Získejte exec zařízení @ret =sp_OAmethod @ Složka, 'Drive', @Drive výstupní sada @Object =@Folder if @ret !=0 goto ErrorInfo -- Určení celého zařízení sto rage space exec @ret =sp_OAGetProperty @Drive, 'TotalSize', @TotalSpace výstupní sada @Object =@Drive if @ret !=0 goto ErrorInfo -- Určení volného místa na disku exec @ret =sp_OAGetProperty @Drive, 'AvailableSpace ', @FreeSpace výstupní sada @Object =@Drive if @ret !=0 goto ErrorInfo DestroyObjects:if @Folder není null exec sp_OADestroy @Folder pokud @Drive není null exec sp_OADestroy @Drive pokud @fso není null exec sp_OADestroy fso return (@ret) ErrorInfo:exec sp_OAGetErrorInfo @Object, @source output, @desc output print 'Chyba zdroje:' + isnull( @source, 'n/a' ) + char(13) + 'Description:' + isnull ( @desc, 'n/a' ) goto DestroyObjects;endGO

Podrobné informace o tomto postupu naleznete v následujícím článku:Místo na disku v T-SQL.

4. Vytvořte uloženou proceduru pro sběr dat:

4.1. pro databázové soubory:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER POSTUP PŘI VYTVOŘENÍ [srv].[MergeDBFileInfo]ASBEGIN SET NOCOUNT ON; NASTAVIT ÚROVEŇ IZOLACE TRANSAKCE PŘEČTENÁ NEZÁVAZNĚ;;sloučit [srv].[DBFile] jako f pomocí [inf].[ServerDBFileInfo] jako ff na f.File_ID=ff.File_ID a f.DB_ID=ff.[database_id] a f.[Server]=ff.[Server ] při shodě aktualizujte sadu UpdateUTcDate =getUTCDate() ,[Jméno] =ff.[Název souboru] ,[Jednotka] =ff.[Jednotka] ,[Physical_Name] =ff.[Physical_Name] ,[Ext] =ff.[Ext.[Ext] ] ,[Růst] =ff.[Growth] ,[IsPercentGrowth] =ff.[is_percent_growth] ,[SizeMb] =ff.[SizeMb] ,[DiffSizeMb] =round(ff.[SizeMb]-f.[SizeMb], 3) pokud se neshoduje s cílem, vložte ( [Server] ,[Name] ,[Drive] ,[Physical_Name] ,[Ext] ,[Growth] ,[IsPercentGrowth] ,[DB_ID] ,[DB_Name ] ,[SizeMb] ,[ID_souboru] ,[DiffSizeMb] ) hodnoty ( ff.[Server] ,ff.[Název souboru] ,ff.[Jednotka] ,ff.[Physical_Name] ,ff.[Ext] ,ff.[Growth.[Růst] ] ,ff.[is_percent_growth] ,ff.[id_databáze] ,ff.[Název_DB] ,ff.[SizeMb] ,ff.[ID_souboru] ,0 ), pokud se neshoduje se zdrojem a f.[Server][email protected] @SERVERNAME a poté smazat;ENDGO

4.2. pro logické jednotky:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[MergeDriverInfo]ASBEGIN SET NOCOUNT ON; NASTAVIT ÚROVEŇ IZOLACE TRANSAKCE PŘEČTENÁ NEZÁVAZNĚ; deklarovat tabulku @Drivers ( [Server] nvarchar(255), Jméno nvarchar(8), TotalSpace float, FreeSpace float, DiffFreeSpace float NULL ); vložte do @Drivers ( [Server], Název, TotalSpace, FreeSpace ) vyberte [Server], Název, TotalSpace, FreeSpace ze srv.Drivers kde [Server][email protected]@NÁZEV SERVERU; deklarovat plovoucí @TotalSpace; deklarovat plovoucí @FreeSpace; deklarovat @DrivePath nvarchar(8); while(exists(select top(1) 1 from @Drivers kde DiffFreeSpace je null)) begin vybrat top(1) @DrivePath=Name z @Drivers kde DiffFreeSpace je null; exec srv.sp_DriveSpace @DrivePath =@DrivePath , @TotalSpace =@TotalSpace out , @FreeSpace =@FreeSpace out; aktualizovat @Drivers set [email protected] ,[email protected] ,DiffFreeSpace=případ, když FreeSpace>0 pak zaokrouhlit([email protected],3) jinak 0 konec kde [email protected]; end;sloučit [srv].[Drivers] jako d pomocí @Drivers jako dd na d.Name=dd.Name a d.[Server]=dd.[Server] při shodě pak aktualizovat sadu UpdateUTcDate =getUTCDate() ,[TotalSpace ] =dd.[TotalSpace] ,[FreeSpace] =dd.[FreeSpace] ,[DiffFreeSpace]=dd.[DiffFreeSpace];ENDGO

5. Vytvořte pohledy pro výstup dat:

5.1. pro databázové soubory:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOvytvořit zobrazení [srv].[vDBFiles] jako SELECT [DBFile_GUID] ,[Server] ,[Jméno] ,[Jednotka] ,[Physical_Name] ,[Grow Ext] ,[ IsPercentGrowth] ,[DB_ID] ,[File_ID] ,[DB_Name] ,[SizeMb] ,[DiffSizeMb] ,round([SizeMb]/1024,3) jako [SizeGb] ,kulatý([DiffSizeMb]/1024,3) jako DiffSizeGb] ,kulatý([SizeMb]/1024/1024,3) jako [SizeTb] ,kulatý([DiffSizeMb]/1024/1024,3) jako [DiffSizeTb] ,kulatý([DiffSizeMb]/([SizeMb]/100) , 3) jako [DiffSizePercent] ,[InsertUTCDate] ,[UpdateUTCdate] FROM [srv].[DBFile];GO

5.2. pro logické disky:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOvytvořit zobrazení [srv].[vDrivers] jako vybrat [Driver_GUID] ,[Server] ,[Název] ,[TotalSpace] jako [TotalSpaceByte] ,[FreeSpace] jako [FreeSpace] jako [FreeSpace] DiffFreeSpace] jako [DiffFreeSpaceByte] ,round([TotalSpace]/1024, 3) jako [TotalSpaceKb] ,round([FreeSpace]/1024, 3) jako [FreeSpaceKb] ,kolo([DiffFreepace]/1024, 1024, 3 ] ,round([TotalSpace]/1024/1024, 3) jako [TotalSpaceMb] ,round([FreeSpace]/1024/1024, 3) jako [FreeSpaceMb] ,round([DiffFreeSpace]/1024/1024, 3) jako [ DiffFreeSpaceMb] ,kolo([TotalSpace]/1024/1024/1024, 3) jako [TotalSpaceGb] ,kolo([FreeSpace]/1024/1024/1024, 3) jako [FreeSpaceGb] ,kolo([Diff120Space]/1020Space /1024, 3) jako [DiffFreeSpaceGb] ,round([TotalSpace]/1024/1024/1024/1024, 3) jako [TotalSpaceTb] ,round([FreeSpace]/1024/1024/1024/1024,Volný [TbSpace ] ,round([DiffFreeSpace]/1024/1024/1024/1024, 3) jako [DiffFreeSp aceTb] ,round([FreeSpace]/([TotalSpace]/100), 3) jako [FreeSpacePercent] ,round([DiffFreeSpace]/([TotalSpace]/100), 3) jako [DiffFreeSpacePercent] ,[InsertUTCDate] ,[ UpdateUTCdate] OD [srv].[Drivers]GO

6. Vytvořte úlohu v SQL Server Agent a spusťte ji jednou denně:

USE [DATABASE_NAME];GOexec srv.MergeDBFileInfo;exec srv.MergeDriverInfo;

7. Shromážděte všechna data ze serverů. Můžete to udělat například pomocí SQL Server Agent.

8. Vytvořte uloženou proceduru pro generování zprávy a její odeslání správcům. Protože je možné jej implementovat různými způsoby, zvážím to na tomto konkrétním příkladu:

POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetHTMLTableShortInfoDrivers] @body nvarchar(max) OUTPUTASBEGIN SET NOCOUNT ON; NASTAVIT ÚROVEŇ IZOLACE TRANSAKCE PŘEČTENÁ NEZÁVAZNĚ; deklarovat tabulku @tbl ( Driver_GUID uniqueidentifier ,[Name] nvarchar(255) ,[TotalSpaceGb] float ,[FreeSpaceGb] float ,[DiffFreeSpaceMb] float ,[FreeSpacePercent] float ,[DiffFreeSpacePercent] floattime ,UpdatenServercharate 25,aktualizace UTCDcharate ),ID int identity(1,1) ); deklarovat @Driver_GUID uniqueidentifier ,@Name nvarchar(255) ,@TotalSpaceGb float ,@FreeSpaceGb float ,@DiffFreeSpaceMb float ,@FreeSpacePercent float ,@DiffFreeSpacePercent float ,@UpdateUTCDate datetimet ,@Server in5 vložit do @tbl( Driver_GUID ,[Name] ,[TotalSpaceGb] ,[FreeSpaceGb] ,[DiffFreeSpaceMb] ,[FreeSpacePercent] ,[DiffFreeSpacePercent] ,UpdateUTCDate ,[Server] ) vyberte Driver_GUID,[FreeSpaceGbace],[SGPMeGb ] ,[DiffFreeSpaceMb] ,[FreeSpacePercent] ,[DiffFreeSpacePercent] ,UpdateUTCDate ,[Server] ze srv.vDrivers kde [DiffFreeSpacePercent]<=-5 nebo [FreeSpacePercent]<=15 pořadí podle [Server] asc, [Název] asc; if(exists(select top(1) 1 from @tbl)) begin set @body='Při analýze mám zařízení pro ukládání dat, která mají buď volné místo na disku méně než 15 %, nebo volné místo klesá o více než 5 % za den :

'+''; set @[email protected]+''; set @[email protected]+''; set @[email protected]+'№ p/p'; set @[email protected]+''; set @[email protected]+''; set @[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]+'VOLUME, GB.'; set @[email protected]+''; set @[email protected]+''; set @[email protected]+'ZDARMA, GB.'; set @[email protected]+''; set @[email protected]+''; set @[email protected]+'ZMĚNA VOLNÉHO MÍSTA, MB.'; set @[email protected]+''; set @[email protected]+''; set @[email protected]+'ZDARMA, %'; set @[email protected]+''; set @[email protected]+''; set @[email protected]+'ZMĚNA VOLNÉHO MÍSTA, %'; set @[email protected]+''; set @[email protected]+''; nastavit @[email protected]+'ČAS DETEKCE UTC'; set @[email protected]+''; set @[email protected]+''; while((vyberte top 1 1 z @tbl)>0) begin set @[email protected]+''; vybrat top 1 @Driver_GUID =Driver_GUID ,@Name =Název ,@TotalSpaceGb =TotalSpaceGb ,@FreeSpaceGb =FreeSpaceGb ,@DiffFreeSpaceMb =DiffFreeSpaceMb ,@DiffFreeSpaceMb =DiffFreeSpaceMb ,@FreeSpacePercent =Server] Aktualizace FreeSpace,Percent zdarma,DatePercent DiffCD@UTS @ID =[ID] z @tbl; set @[email protected]+''; nastavit @[email protected]+cast(@ID jako nvarchar(max)); set @[email protected]+''; set @[email protected]+''; nastavit @[email protected]+cast(@Driver_GUID jako 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]+''; nastavit @[email protected]+cast(@TotalSpaceGb jako nvarchar(255)); set @[email protected]+''; set @[email protected]+''; nastavit @[email protected]+cast(@FreeSpaceGb jako nvarchar(255)); set @[email protected]+''; set @[email protected]+''; nastavit @[email protected]+cast(@DiffFreeSpaceMb jako nvarchar(255)); set @[email protected]+''; set @[email protected]+''; nastavit @[email protected]+cast(@FreeSpacePercent jako nvarchar(255)); set @[email protected]+''; set @[email protected]+''; nastavit @[email protected]+cast(@DiffFreeSpacePercent jako nvarchar(255)); set @[email protected]+''; set @[email protected]+''; set @[email protected]+rep.GetDateFormat(@UpdateUTCDate, výchozí)+' '+rep.GetTimeFormat(@UpdateUTCDate, výchozí); set @[email protected]+''; odstranit z @tbl kde [email protected]; set @[email protected]+''; koncová sada @[email protected]+''; set @[email protected]+'

'; Chcete-li získat podrobné informace, podívejte se na zobrazení SRV.srv.vDrivers

Informace o databázových souborech naleznete v zobrazení DATABASE_NAME.srv.vDBFiles'; endENDGO

Tato uložená procedura generuje HTML zprávu o logických jednotkách, které mají volné místo na disku méně než 15 %, nebo se volné místo snižuje o více než 5 % denně. Ten ukazuje podivnou aktivitu záznamů, což znamená, že někdo na tento disk velmi často ukládá příliš mnoho informací. Může k tomu dojít z následujících důvodů:

  1. Je čas rozšířit disk;
  2. Je nutné smazat nepoužívané soubory na logické jednotce;
  3. Vymažte a zmenšete soubory protokolu, stejně jako soubory s informacemi a další tabulky.

Řešení

V tomto článku jsem rozebral příklad implementace systému každodenního automatického sběru dat o lokálních discích a databázových souborech. Tyto informace umožňují předem zjistit, který disk má méně volného místa, a také jaké databázové soubory drasticky rostou. Umožňuje vyhnout se případu, kdy na disku není místo, a zjistit důvod, proč proces zabírá na disku mnoho místa.

Přečtěte si také:

Automatický sběr dat změn databázového schématu na MS SQL Server

Automatický sběr dat o dokončených úlohách na MS SQL Server


  1. Vyhněte se těmto 4 běžným chybám DBA

  2. Chyba při mapování postgresových polí v Spring JPA

  3. Důrazně zadejte tyto parametry s hodnotou tabulky

  4. při vložení perského znaku do Oracle db vidím otazník