Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Getting info across several servers
Message
From
12/09/2006 12:17:43
Keith Payne
Technical Marketing Solutions
Florida, United States
 
 
To
12/09/2006 12:00:44
General information
Forum:
Microsoft SQL Server
Category:
Database management
Miscellaneous
Thread ID:
01153070
Message ID:
01153075
Views:
12
>I have put together the procedure included. It is not quite finished yet. Right now it collects the DB size info for all of the databases on a given server and puts the info into a table. It only gets the info for the current server. It would be more effort than it’s worth to put it on servers with only a few production DBs. I would like it to run across a given set of servers, but I have not found a way to do that yet.
>
>Please note that much of the key ideas in this code came from (thanks Sergey):
>http://www.databasejournal.com/features/mssql/article.php/1467771
>
>
>/**************************************************************
>Name: sGetDBMaintInfo
>Description:
>   Gather the data and log space for all databases on the system
>and insert the information into DBMaintInfo. The following databases
>are not added to DBMaintInfo:
>	pubs
>	Northwind
>	model
>	tempdb
>
>Author: Rollin Burr
>**************************************************************/
>CREATE PROCEDURE sGetDBMaintInfo AS
>
>-- IF DBMaintInfo table does not yet exist, create it.
>IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[DBMaintInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
>BEGIN
>	CREATE TABLE [dbo].[DBMaintInfo] (
>		[DatabaseName] [varchar] (80) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
>		[DataSpaceUsed_MB] [real] NULL ,
>		[DataSpaceFree_MB] [real] NULL ,
>		[TLogSpaceUsed_MB] [real] NULL ,
>		[TLogSpaceFree_MB] [real] NULL ,
>		[LastFullBackup] [datetime] NULL ,
>		[LastDiffBackup] [datetime] NULL ,
>		[LastTransBackup] [datetime] NULL ,
>		[EntryDate] [datetime] NOT NULL
>	) ON [PRIMARY]
>
>	ALTER TABLE [dbo].[DBMaintInfo] WITH NOCHECK ADD
>		CONSTRAINT [PK_DBMaintInfo] PRIMARY KEY  CLUSTERED
>		(
>			[DatabaseName],
>			[EntryDate]
>		)  ON [PRIMARY]
>
>	ALTER TABLE [dbo].[DBMaintInfo] ADD
>		CONSTRAINT [DF_DBMaintInfo_EntryDate] DEFAULT (getdate()) FOR [EntryDate]
>END  --IF NOT EXISTS
>
>-- Set up error check
>SET NOCOUNT ON
>DECLARE @err INT
>SET @err = 0
>
>--Create the temp tables to hold the results of DBCC commands until the information is entered into DBMaintInfo.
>CREATE TABLE #logspace (
>	DBName	VARCHAR( 100),
>	LogSize		FLOAT,
>	PrcntUsed	FLOAT,
>	status 		INT
>   )
>
>CREATE TABLE #dataspace (	
>	FileID 		INT,
>	FileGrp 		INT,
>	TotExt		INT,
>	UsdExt 		INT,
>	LFileNm		VARCHAR( 100),
>	PFileNm		VARCHAR( 100)
>   )
>
>--Get the log space
>INSERT INTO #logspace
>   EXEC ('DBCC SQLPERF( LOGSPACE)')
>
>/*
>Get the data space
>Use a cursor to loop through the results from DBCC
>since you have to run this command from each database
>with a USE command.
>*/
>DECLARE
>	@DBName	VARCHAR( 100),
>	@LogSize	FLOAT,
>	@PrcntUsed	FLOAT,
>	@cmd 		VARCHAR( 500),
>	@DBMIID	INT
>DECLARE dbname CURSOR
>FOR SELECT DBName, LogSize, PrcntUsed FROM #logspace
>OPEN dbname
>FETCH NEXT FROM dbname INTO @DBName, @LogSize, @PrcntUsed	
>WHILE @@fetch_status = 0
>BEGIN
>	SELECT @cmd = 'use ' + rtrim( @DBName) + ' dbcc showfilestats'
>	INSERT #dataspace
>	EXEC( @cmd)
>	IF @DBName NOT IN ('model','tempdb','pubs','Northwind')
>	BEGIN
>		INSERT INTO DBMaintInfo (DatabaseName, DataSpaceUsed_MB, DataSpaceFree_MB,
>			TLogSpaceUsed_MB, TLogSpaceFree_MB, EntryDate)
>		SELECT @DBName,
>			((cast( UsdExt AS NUMERIC( 10, 4))* 32) / 512),
>			((cast( TotExt - UsdExt AS NUMERIC( 10, 4))* 32) / 512),
>			@LogSize * (@PrcntUsed/100),
>			@LogSize * ((100-@PrcntUsed)/100),
>			GETDATE()
>		FROM #dataspace
>	END
>
>	FETCH NEXT FROM dbname INTO @DBName, @LogSize, @PrcntUsed
>	DELETE #dataspace
>END
>CLOSE dbname
>DEALLOCATE dbname
>
>-- Drop the temporary tables
>DROP TABLE #logspace
>DROP TABLE #dataspace
>
>-- Remove all data from table that is older than 90 days
>DELETE FROM DBMaintInfo WHERE EntryDate < GETDATE() - 90
>
>RETURN @err
>
>GO
>
Rollin,

How about creating a system stored procedure on each server that returns as a result set what would normally get inserted into DBMaintInfo? Then you can insert the results of the stored proc on each server into the real DBMaintInfo table.
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform