Database
 sql >> Datenbank >  >> RDS >> Database

Gespeicherte Prozedur zum Abrufen von Serverspeicherinformationen im Server

So beliebt die Cloud-Dienste heutzutage auch sind, es gibt immer noch einen guten Teil der lokalen Bereitstellungen von SQL Server, die immer noch unsere Dienste benötigen, um sie zu unterstützen. Einer der Bereiche der lokalen Einrichtung, den wir im Auge behalten müssen, ist die Speicherung, genau dort, wo die Daten gespeichert werden.

Ich werde Ihnen eine gespeicherte Prozedur vorstellen, um wichtige Speicherplatzinformationen in Ihrer SQL Server-Instanz zu visualisieren.

Erste Überlegungen

  • Stellen Sie sicher, dass das Konto, das diese gespeicherte Prozedur ausführt, über ausreichende Berechtigungen verfügt.
  • Die Datenbankobjekte (Datenbanktabelle und gespeicherte Prozedur) werden innerhalb der Datenbank erstellt, die zum Zeitpunkt der Ausführung des Skripts ausgewählt wurde, wählen Sie sie also sorgfältig aus.
  • Das Skript ist so gestaltet, dass es mehrmals ausgeführt werden kann, ohne dass Ihnen eine Fehlermeldung angezeigt wird. Für die gespeicherte Prozedur habe ich die CREATE OR ALTER PROCEDURE-Anweisung verwendet, die seit SQL Server 2016 SP1 verfügbar ist.
  • Sie können den Namen der erstellten Datenbankobjekte gerne ändern.
  • Wenn Sie sich dafür entscheiden, von der gespeicherten Prozedur zurückgegebene Daten beizubehalten, wird die Zieltabelle zuerst abgeschnitten, sodass nur die neueste Ergebnismenge gespeichert wird.
  • Denken Sie daran, dass diese Lösung in Cloud-Bereitstellungen keinen Sinn macht, wo der Cloud-Anbieter Dinge für Sie verwaltet und Sie keinen Zugriff auf das Dateisystem haben.

Wie verwende ich gespeicherte Prozeduren?

  1. Kopieren Sie den TSQL-Code und fügen Sie ihn ein (verfügbar in diesem Artikel).
  2. Der SP erwartet 2 Parameter:
    1. @persistData:„Y“, wenn der DBA die Ausgabe in einer Zieltabelle speichern möchte, und „N“, wenn der DBA die Ausgabe nur direkt sehen möchte.
    2. @driveDetail:Obwohl optional, hat der Parameter @persistData keinerlei Auswirkung, wenn Sie einen Laufwerksbuchstaben übergeben.

Vorgestellte Felder und ihre Bedeutung

  • Laufwerk: der Laufwerksbuchstabe, der Datendateien für die aktuelle Instanz enthält.
  • total_space: die Größe des Laufwerks in GB.
  • free_space: die Menge an GBs, die auf dem Laufwerk verbleiben.
  • used_space: die Menge an GB, die von allen Datenbanken in der Instanz belegt wird.
  • data_collection_timestamp: nur sichtbar, wenn „Y“ an den @persistData-Parameter übergeben wird, und es wird verwendet, um zu wissen, wann der SP ausgeführt und die Informationen erfolgreich in der DBA_Storage-Tabelle gespeichert wurden.

Ausführungstests

Ich werde einige Ausführungen der gespeicherten Prozedur demonstrieren, damit Sie sich ein Bild davon machen können, was Sie davon erwarten können:

EXEC GetStorageData @persistData = 'N'

Da ich dies in einer Testinstanz ausgeführt habe, in der ich alles im Laufwerk C:\ gespeichert habe (ich weiß, die schlechteste Praxis aller Zeiten), wurde nur eine Zeile zurückgegeben. Lassen Sie mich Ihnen nun einen Screenshot der Nutzung meines Laufwerks C:\ zeigen, wie von Windows gemeldet, nur um zu sehen, ob der SP nicht herumblufft:

Es sieht größtenteils gut aus. Wenn Sie jedoch genauer hinschauen, werden Sie feststellen, dass der „Verwendete Speicherplatz“ in der Grafik 25 GB und der SP „0,170 GB“ anzeigt, das ist seltsam, oder? Nun, der Grund dafür ist, dass die Bedeutung im SP etwas anders ist:Hier wird die Menge an GB angegeben, die nur von Datenbankdateien belegt wird, also denken Sie daran.

Nun, diese Ausgabe scheint ein bisschen trocken zu sein, nicht wahr? Ich meine, wir wissen nicht, was genau den gemeldeten belegten Speicherplatz belegt. Hier kommt der andere Parameter ins Spiel, also schauen wir ihn uns an:

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

Wenn Sie es so ausführen, erhalten Sie die Liste bestimmter Datenbanken, die mindestens 1 Datenbankdatei auf dem als Parameter übergebenen Laufwerk haben. Wenn Sie die Spalte „Gesamtraum“ summieren, erhalten Sie genau den gleichen Wert wie die vorherige zusammengefasste Ausgabe.

Lassen Sie mich noch etwas versuchen, um zu sehen, was der SP zurückgibt. Ich werde eine neue Datenbank erstellen, aber ich werde die Datenbankdateien auf einem anderen Laufwerk ablegen, das ich herumliegen habe. Ich nenne die Datenbank „test“ und lege sie auf Laufwerk S:\.

Jetzt gibt der SP also auch dieses Laufwerk in der Ergebnismenge aus. Aber sehen wir uns noch einmal an, was passiert, wenn wir den @driveDetail-Parameter mit „S“ als Wert werfen:

Bingo, es meldet die von mir erstellte „Test“-Datenbank mit der von mir gewählten Größe (1 GB für die Datendatei und 8 MB für die Transaktionsprotokolldatei).

Nebenabfragen

Um dem DBA einen Mehrwert zu bieten, habe ich einige Abfragen vorbereitet, die Ihnen helfen können, nützliche Informationen aus den Daten zu erhalten, die in der Tabelle gespeichert sind.

*Abfrage, um Datenbanken mit mindestens 1 Datendatei zu finden, die auf Laufwerk C:\ gehostet wird.

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

*Abfrage, um die Liste der Laufwerke sortiert nach free_space anzuzeigen, vom niedrigsten zum höchsten. Damit wissen Sie so schnell wie möglich, welche Laufwerke Ihre Aufmerksamkeit erfordern.

SELECT * FROM DBA_Storage ORDER BY free_space;

*Abfrage, um die Liste der Laufwerke anzuzeigen, sortiert nach used_space, vom höchsten zum niedrigsten. Damit können Sie erkennen, welche mehr Daten haben als die anderen.

SELECT * FROM DBA_Storage ORDER BY used_space DESC;

Hier ist der vollständige Code der Stored Procedure:

*Ganz am Anfang des Skripts sehen Sie den Standardwert, den die gespeicherte Prozedur annimmt, wenn für jeden Parameter kein Wert übergeben wird.

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

Schlussfolgerung

  • Sie können diesen SP in jeder von Ihnen unterstützten SQL Server-Instanz bereitstellen und einen Warnmechanismus für Ihren gesamten Stapel unterstützter Instanzen implementieren.
  • Wenn Sie einen Agent-Job implementieren, der diese Informationen relativ häufig abfragt, können Sie in Bezug auf die Schritte zur Verwaltung des Speichers immer auf dem Laufenden bleiben, wenn bestimmte Schwellenwerte innerhalb Ihrer unterstützten Umgebung(en) erreicht werden. .
  • Sehen Sie sich weitere Tools an, die hier bei CodingSight veröffentlicht werden.