Monitoring du serveur

Sur un deuxième écran, j'ai toujours l'état du serveur principal. J'ai créé deux fenêtres Performance Monitor, l'une avec les CP Us? individuels, et la moyenne des CP Us? en gras. Les indicateurs sont processor\% Processor Time. Pour diminuer la charge du serveur, j'ai baissé la fréquence de récupération d'infos à trois secondes. Cette fenêtre s'affiche en graph. Dans l'autre fenêtre, j'affiche les indicateurs de mémoire et de disque, en l'occurence :

 LogicalDisk
	% Disk Read Time
	% Disk Write Time
	Avg. Disk Queue Length
 Memory
	Cache Faults/sec
 SQLServer:Buffer Manager
	Buffer cache hit ratio
	Page Reads/sec

Le Avg. Disk Queue Length est un bon indicateur pour déterminer si les IO physiques (donc le disque) sont réellement un goulot d'étranglement. Si cet indicateur est constamment élevé, vous avez un problème. Le regarder avec le Buffer cache hit ratio vous donne une bonne indication de la source du problème : disque physique ou RAM.

Pour lancer facilement les deux fenêtres en un seul click, voici l'exemple d'un script WSH:

 Option Explicit
 
 Dim oWsh : Set oWsh = CreateObject("WScript.Shell")
 oWsh.Run "mmc ""C:\mypath\CPU.msc"""
 oWsh.Run "mmc ""C:\mypath\SQL MEMORY AND DISK.msc"""
 Set oWsh = Nothing

Monitoring des situations de blocage

Pour être informé quand des situations de blocage se produisent sur un laps de temps trop long, vous pouvez tourner régulièrement (dans un job) le code suivant.

IF EXISTS (SELECT 1 FROM master.dbo.sysprocesses WITH (readuncommitted)
WHERE blocked > 0 AND waittime > 60000)
BEGIN
        DECLARE @strSQL varchar(2000)
 
        SET @strSQL = '
        select
        blocked,
        LEFT(rtrim(loginame) + '' - '' + rtrim(hostname), 30) as login,
        LEFT(rtrim(program_name), 20) as program,
        kpid,
        spid
        from master.dbo.sysprocesses with (readuncommitted)
        where kpid > 0
        order by kpid'
 
        exec master.dbo.xp_sendmail
        @recipients = 'dba',
        @message    = 'somes processes are blocked',
        @query      = @strSQL,
        @subject    = 'WARNING : blocked processes',
        --@attach_results = 'true',
        --@separator  = ',',
        @dbuse      = 'master'
END

Monitoring le log de transaction de tempdb

Ce code surveille de log de transaction de TempDB, et envoie un message d'alerte quand le log atteint une certaine taille. A mettre dans un job.

SET nocount ON
 
declare @logspaceused int, @logsize int
 
CREATE TABLE #junk( a varchar(30), logsize float, logspaceused float, status
int )
INSERT #junk
exec( 'DBCC sqlperf(logspace)' )
 
SELECT
@logsize = round(logsize, 0),
@logspaceused = round(logspaceused, 0)
FROM #junk where a = 'tempdb'
DROP TABLE #junk
 
IF ( (@logsize > 500) AND (@logspaceused > 70) ) begin
        declare @msg varchar(4000)
 
        SET @msg = 'the tempdb translog is now ' + cast(@logsize AS varchar) + ' mb. Find below a list of
        open transactions if any (result of
        DBCC OPENTRAN (''tempdb'') WITH TABLERESULTS, NO_INFOMSGS
        ).
        an open transaction can be identified (by obtaining the system process ID from
        the sp_who output) and terminated, if necessary.' + Char(013) + replicate('-',50) + Char(013)
 
        EXEC master.dbo.xp_sendmail
        @recipients = 'dba'
        @subject = 'warning : tempdb transaction log growing',
        @message = @msg,
        @query = 'DBCC OPENTRAN (''tempdb'') WITH TABLERESULTS, NO_INFOMSGS',
        @dbuse = 'tempdb'
end

création de compte

SET STATISTICS IO OFF
GO
 
--EXEC sp_droplogin 'mylogin'
 
EXEC sp_addlogin 'mylogin', '***'
go
 
USE MyDB
GO
 
DECLARE @rolename sysname
SET @rolename = 'MyDb_default' 
 
EXEC sp_addrole @rolename = @rolename
 
EXEC sp_adduser @loginame = 'link_mylogin', @name_in_db = 'mylogin', @grpname = @rolename
 
-- grant to all sprocs
SELECT 'GRANT EXEC ON ' + name + ' TO ' + @rolename
FROM sysobjects 
WHERE 	xtype = 'P' AND
	name NOT LIKE 'dt_%'
ORDER BY name
GO
 
EXEC sp_addrolemember @rolename = 'db_datareader' , @membername = 'mylogin' 
GO
EXEC sp_addrolemember @rolename = 'db_datawriter' , @membername = 'mylogin' 
GO

création de serveur lié

EXEC sp_helpserver
 
EXEC sp_addlinkedserver 
	@server     = 'MyServer',
    	@srvproduct = '', -- SQL Server
    	@provider = 'SQLOLEDB',
	@datasrc  = 'MyServer'
GO
 
EXEC master..sp_addlinkedsrvlogin 
	@rmtsrvname = 'MyServer',
    	@useself = 'false',
    	@locallogin = NULL, -- le login à mapper, ou NULL pour tous
    	@rmtuser = 'link_MyLogin',
    	@rmtpassword = '***'
 
/*
EXEC master..sp_droplinkedsrvlogin
	@rmtsrvname = 'MyServer' , 
    	@locallogin = NULL
*/
 
/* -- test 
SELECT * FROM MyServer.msdb.dbo.sysobjects
*/
 
sql_server/administration/index.txt · Dernière modification: 2008/01/15 17:31 par rudi