- Utilisation du profiler
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 */



