sql >> Databáze >  >> RDS >> Database

Uložená procedura pro získání informací o úložišti serveru na serveru

Jakkoli jsou cloudové služby v dnešní době populární, stále existuje velká část místních nasazení SQL Serveru, která stále vyžadují naše služby, aby je podporovaly. Jednou z oblastí místního nastavení, na kterou musíme dávat pozor, je úložiště, přímo tam, kde se ukládají data.

Představím vám uloženou proceduru pro vizualizaci klíčových informací o úložném prostoru ve vaší instanci SQL Server.

Počáteční úvahy

  • Ujistěte se, že účet spouštějící tuto uloženou proceduru má dostatečná oprávnění.
  • Databázové objekty (databázová tabulka a uložená procedura) budou vytvořeny uvnitř databáze vybrané v době, kdy je skript spuštěn, takže vybírejte pečlivě.
  • Skript je vytvořen tak, že jej lze spustit vícekrát, aniž by se vám zobrazila chyba. Pro uloženou proceduru jsem použil příkaz CREATE OR ALTER PROCEDURE, který je k dispozici od SQL Server 2016 SP1.
  • Neváhejte změnit název vytvořených databázových objektů.
  • Pokud se rozhodnete zachovat data vrácená uloženou procedurou, cílová tabulka bude nejprve zkrácena, takže bude uložena pouze nejnovější sada výsledků.
  • Mějte na paměti, že toto řešení nedává smysl v cloudových nasazeních, kde poskytovatel cloudu spravuje věci za vás a vy nemáte přístup k systému souborů.

Jak používat uloženou proceduru?

  1. Zkopírujte a vložte kód TSQL (k dispozici v tomto článku).
  2. SP očekává 2 parametry:
    1. @persistData:„Y“, pokud si DBA přeje uložit výstup do cílové tabulky, a „N“, pokud chce DBA pouze přímo vidět výstup.
    2. @driveDetail:Ačkoli je volitelný, pokud předáte písmeno jednotky, parametr @persistData nebude mít žádný vliv.

Prezentovaná pole a jejich význam

  • Drive: písmeno jednotky, které obsahuje datové soubory pro aktuální instanci.
  • total_space: velikost disku v GB.
  • free_space: množství GB zbývajících na disku.
  • used_space: množství GB obsazených všemi databázemi v instanci.
  • data_collection_timestamp: viditelné pouze v případě, že je parametru @persistData předáno „Y“ a používá se ke zjištění, kdy byl SP proveden a informace byly úspěšně uloženy do tabulky DBA_Storage.

Testy provedení

Předvedu několik provedení uložené procedury, abyste si mohli udělat představu, co od ní očekávat:

EXEC GetStorageData @persistData = 'N'

Vzhledem k tomu, že jsem to spustil v testovací instanci, kde mám všechno nacpané na disku C:\ (vím, nejhorší praxe vůbec), vrátil se pouze jeden řádek. Nyní mi dovolte, abych vám ukázal snímek obrazovky využití mého disku C:\, jak je hlášeno systémem Windows, abych zjistil, zda SP neblbne:

Z velké části to vypadá dobře. Pokud se však podíváte blíže, všimnete si, že „Použité místo“ na obrázku říká 25 GB a SP říká „0,170 GB“, to je zvláštní, že? Důvodem je, že význam v SP je trochu jiný:zde hlásí množství GB obsazené pouze databázovými soubory, takže na to pamatujte.

Teď se ten výstup zdá trochu suchý, že? Myslím, že nevíme, co přesně zabírá hlášený použitý prostor. Zde vstupuje do hry další parametr, takže se na to pojďme podívat:

EXEC GetStorageData @persistData = 'N', @driveDetail = 'C'

Spuštěním tímto způsobem získáte seznam konkrétních databází, které mají alespoň 1 databázový soubor na jednotce předaný jako parametr. Pokud sečtete sloupec „celkový prostor“, dostanete přesně stejnou hodnotu jako předchozí souhrnný výstup.

Dovolte mi zkusit ještě jednu věc, abych viděl, co SP vrátí. Chystám se vytvořit novou databázi, ale soubory databáze umístím na jiný disk, který mám položený. Říkám databázi „test“ a umístím ji na jednotku S:\.

Nyní tedy SP také vydává výstupy, které jsou součástí výsledné sady. Ale znovu se podívejme, co se stane, když vyhodíme parametr @driveDetail s hodnotou ‚S‘:

Bingo, hlásí „testovací“ databázi, kterou jsem vytvořil, s velikostí, kterou jsem zvolil (1 GB pro datový soubor a 8 MB pro soubor protokolu transakcí).

Postranní dotazy

Nyní, abych DBA dodal větší hodnotu, připravil jsem několik dotazů, které vám mohou pomoci získat užitečné informace z dat uložených v tabulce.

*Dotaz na nalezení databází s alespoň 1 datovým souborem hostovaným na jednotce C:\.

SELECT * FROM DBA_Storage WHERE drive = 'C:\';

*Dotaz k zobrazení seznamu jednotek seřazených podle volného_prostoru, od nejnižší po nejvyšší. Díky tomu můžete co nejdříve vědět, které jednotky vyžadují vaši pozornost.

SELECT * FROM DBA_Storage ORDER BY free_space;

*Dotaz k zobrazení seznamu jednotek seřazených podle used_space, od nejvyšší po nejnižší. Díky tomu můžete vědět, které z nich mají více dat než ostatní.

SELECT * FROM DBA_Storage ORDER BY used_space DESC;

Zde je úplný kód uložené procedury:

*Na úplném začátku skriptu uvidíte výchozí hodnotu, kterou uložená procedura předpokládá, pokud není pro každý parametr předána žádná hodnota.

CREATE OR ALTER PROCEDURE [dbo].[GetStorageData] 
	@persistData   CHAR(1) = 'Y',
	@driveDetail   CHAR(1) = NULL
AS
BEGIN
	SET NOCOUNT ON

	DECLARE @command NVARCHAR(MAX)    
	
	DECLARE @Tmp_StorageInformation TABLE(       
	[drive]                     [CHAR](3) NOT NULL,
	[total_space]               [DECIMAL](10,3) NOT NULL,
	[free_space]                [DECIMAL](10,3) NOT NULL,
	[used_space]                [DECIMAL](10,3) NOT NULL
	)
	
	IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'DBA_Storage') and OBJECTPROPERTY(id, N'IsTable') = 1)
	BEGIN
		CREATE TABLE DBA_Storage(
		[drive]                     [CHAR](3) NOT NULL,
		[total_space]               [DECIMAL](10,3) NOT NULL,
		[free_space]                [DECIMAL](10,3) NOT NULL,
		[used_space]                [DECIMAL](10,3) NOT NULL,
		[data_collection_timestamp] [DATETIME] NOT NULL
		)
	END

	
	IF(@driveDetail IS NOT NULL)
	BEGIN
		SELECT DB_NAME(mf.database_id) AS 'database',CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024.0) AS 'total space'
		FROM sys.master_files mf
		WHERE SUBSTRING(mf.physical_name,0,4) = CONCAT(@driveDetail,':\')
		GROUP BY mf.database_id
		
		RETURN 
	END
	
	INSERT INTO @Tmp_StorageInformation   
	SELECT 
		   drives.drive,
		   drives.total_space,
		   drives.free_space,
		   (SELECT CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024) FROM sys.master_files WHERE SUBSTRING(physical_name,0,4) = drives.drive) AS 'used_space'
	FROM(
		 SELECT DISTINCT vs.volume_mount_point AS 'drive',CONVERT(DECIMAL(10,3),(vs.available_bytes/1048576)/1024.0) AS 'free_space',CONVERT(DECIMAL(10,3),(vs.total_bytes/1048576)/1024.0) AS 'total_space'
		 FROM sys.master_files mf
		 CROSS APPLY sys.dm_os_volume_stats(mf.database_id,mf.file_id) vs
		) AS drives      
	  
	IF @persistData = 'N'
		SELECT * FROM @Tmp_StorageInformation 
	ELSE 
	BEGIN
		TRUNCATE TABLE DBA_Storage
		
		INSERT INTO DBA_Storage
		SELECT *,GETDATE() FROM @Tmp_StorageInformation ORDER BY [drive] 
	END
END

Závěr

  • Tento SP můžete nasadit v každé instanci SQL Serveru pod vaší podporou a implementovat výstražný mechanismus napříč celou vaší hromadou podporovaných instancí.
  • Pokud implementujete úlohu agenta, která se dotazuje na tyto informace relativně často, můžete zůstat na vrcholu hry, pokud jde o podniknutí kroků k péči o úložiště, kdykoli jsou splněny určité prahové hodnoty v rámci podporovaných prostředí. .
  • Nezapomeňte se podívat na další nástroje, které jsou publikovány zde na CodingSight.

  1. Použití pivotu na více sloupcích řádku Oracle

  2. Dynamický pivot T-SQL

  3. WHERE IN (pole ID)

  4. Jak otestovat připojení k databázi PHP MySQL pomocí skriptu