<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cap Data Team SGBD Blog : Oracle, SQL Server, MySQL, Sybase... &#187; sqldiag</title>
	<atom:link href="http://blog.capdata.fr/index.php/tag/sqldiag/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.capdata.fr</link>
	<description>Le blog technique sur les bases de données de CAP DATA Consulting</description>
	<lastBuildDate>Wed, 01 Feb 2012 17:21:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQLDIAG (épisode 2)</title>
		<link>http://blog.capdata.fr/index.php/sqldiag-episode-2/</link>
		<comments>http://blog.capdata.fr/index.php/sqldiag-episode-2/#comments</comments>
		<pubDate>Mon, 10 May 2010 16:28:36 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[perfmon]]></category>
		<category><![CDATA[readtrace]]></category>
		<category><![CDATA[RML Utilities]]></category>
		<category><![CDATA[sqldiag]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=985</guid>
		<description><![CDATA[Deuxième épisode de la trilogie sur SQLDIAG et les outils avancés de diagnostic autour de SQL Server. Nous parlerons aujourd&#8217;hui du résultat de la trace lancée lors du rapport précédent et de son contenu. Nous verrons comment charger le contenu de la trace SQL et du fichier BLG dans SQL Profiler pour interprétation. Puis nous [...]]]></description>
			<content:encoded><![CDATA[<p>Deuxième épisode de la trilogie sur SQLDIAG et les outils avancés de diagnostic autour de SQL Server. Nous parlerons aujourd&#8217;hui du résultat de la trace lancée lors du <a title="SQLDIAG episode 1" href="http://blog.capdata.fr/index.php/sqldiag-episode-1/">rapport précédent</a> et de son contenu. Nous verrons comment charger le contenu de la trace SQL et du fichier BLG dans SQL Profiler pour interprétation. Puis nous verrons comment mettre en place RML Utilities pour agréger et afficher le résultat d&#8217;une trace SQLDIAG.</p>
<h2>Contenu d&#8217;une trace SQLDIAG:</h2>
<p>Une fois la trace terminée, Ctrl-C stoppe le collecteur et commence à écrire les fichiers résultats sous l&#8217;arborescence. On retrouve une arborescence telle que:</p>
<pre><span style="color: #0000ff;">&lt;NOM TRACE&gt;
|___ log_*.trc
|___ MS2K8-WIN2008-1__sp_sqldiag_Shutdown.OUT
|___ MS2K8-WIN2008-1_MSINFO32.txt
|___ MS2K8-WIN2008-1_SQLDIAG__sp_trace_*.trc
|___ SQLDIAG.lbg
|___ internal
     |___ *.txt
     |___ *.OUT
</span></pre>
<ul>
<li><strong>log*.trc</strong>: ces fichiers contiennent la trace par défaut de l&#8217;instance. Ils ont été copiés de leur répertoire origine (le plus souvent ~MSSQL\LOG). Cf note bas de page dans le <a title="SQLDIAG  episode 1" href="http://blog.capdata.fr/index.php/sqldiag-episode-1/">premier article</a>.</li>
</ul>
<ul>
<li><strong>MS2K8-WIN29008-1__sp_sqldiag_Shutdown.OUT</strong>: ce fichier est divisé en plusieurs parties. Il n&#8217;est généré qu&#8217;au moment du Crtrl-C pour ne pas rater d&#8217;évènements survenus pendant la trace. Il commence par contenir le contenu de chaque fichier ERRORLOG*, puis la configuration de l&#8217;instance, la liste des processus (sp_who), la liste des verrous (sp_lock), la liste des bases (sp_helpdb), des informations sur le binaire (xp_msver), donne la liste de toutes les procédures stockées étendues déclarées (sp_helpextendedproc) , et le contenu de sysprocesses, sys.dm_exec_sessions, ::fn_virtualservernodes() si sur cluster, sysdevices, sysdatabases, sys.master_files. Enfin, la liste des requêtes en cours d&#8217;exécution. Le reste , où chaque vue sys.dm_os* est récupérée, est plus à destination du support pour diagnostic. Celà leur donne une image précise de l&#8217;activité au niveau des schedulers (SQLOS), de la mémoire, des latches, des modules chargés dans l&#8217;espace d&#8217;adressage de sqlservr.exe, etc&#8230; C&#8217;est beaucoup plus pratique que de faire générer un dump ou un mini-dump au client qui rencontre un problème. D&#8217;ailleurs, il y aura certainement un article prochainement sur les vues sys.dm_os* principales, je ne m&#8217;étends donc pas dessus, car pour l&#8217;instant ce n&#8217;est pas ce qui nous intéresse.</li>
</ul>
<ul>
<li><strong>MS2K8-WIN29008-1_MSINFO32.txt</strong>: Contient le contenu au format texte de msinfo32. Toutes les informations systèmes sont contenues dans ce fichier, classées par section entre crochets ([]). Nombre d&#8217;entre elles sont sans intérêt (IRQ/DMA, périphériques, clavier, pilotes, etc&#8230;), il y cependant certaines sections qui valent le coup d&#8217;oeil: [System Summary] pour les informations systèmes courantes (OS, CPU, mémoire, etc&#8230;), [Drives] et [Disks] pour les disques, [Running Tasks] pour les processus en cours d&#8217;exécution, [Windows Error Reporting] pour les messages d&#8217;erreurs de l&#8217;eventvwr.</li>
</ul>
<ul>
<li><strong>MS2K8-WIN29008-1_SQLDIAG__sp_trace_*.trc</strong>: ces fichiers contiennent la trace SQL Trace que l&#8217;on a paramétrée dans le fichier XML.</li>
</ul>
<ul>
<li><strong>SQLDIAG.blg</strong>: ce fichier contient la trace système paramétrée dans le fichier XML.</li>
</ul>
<ul>
<li><strong>~internal\</strong>: ce sous répertoire contient les logs de l&#8217;exécution de SQLDIAG. En fonction de la version utilisée, les fichiers OUT et txt peuvent se trouver au même niveau que les fichiers résultats.</li>
</ul>
<p>Les deux axes qui vont nous intéresser sont principalement les fichiers de trace SQL et le fichier BLG. Les autres fichiers seront plus à utiliser à des fins de diagnostic.</p>
<h2><strong>Charger une trace SQL et un fichier BLG dans SQL Profiler:</strong></h2>
<p>Il est possible de charger un fichier de compteurs perfmon et une trace SQL dans SQL Profiler pour corrélation. Ce n&#8217;est possible toutefois que si les deux traces ont été générées ensembles, le plus souvent à l&#8217;aide d&#8217;un outil comme SQLDIAG ou PSSDIAG. Tout d&#8217;abord, ouvrir la trace SQL dans Profiler, puis <em>File-&gt;Import Performance Data&#8230;</em> Sélectionner le fichier BLG généré dans la même trace, puis les compteurs à charger (pour plus de lisibilité, on ne prendra que les compteurs disque dans notre cas), et importer la trace:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/05/SQLDIAG11.jpg"><img class="alignnone size-full wp-image-1025" title="SQLDIAG1" src="http://blog.capdata.fr/wp-content/uploads/2010/05/SQLDIAG11.jpg" alt="" width="516" height="480" /></a></p>
<p>L&#8217;écran se divise en quatre parties. Les zones extrêmes représentent l&#8217;affichage classique de SQL Profiler: texte et statistiques des requêtes. La partie centrale présente les graphes associés aux compteurs du fichier BLG, et la partie inférieure la liste des compteurs avec les valeurs Min, Max, Average:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/05/SQLDIAG21.jpg"><img class="alignnone size-large wp-image-995" title="SQLDIAG2" src="http://blog.capdata.fr/wp-content/uploads/2010/05/SQLDIAG21-1024x703.jpg" alt="" width="1024" height="703" /></a></p>
<p>Il est possible de zoomer et de déplacer le curseur temporel dans la partie centrale, et Profiler va pointer sur les requêtes exécutées à l&#8217;instant sélectionné, et la valeur de &#8216;<em>Selected</em>&#8216; dans la partie inférieure est également mise à jour pour chaque compteur.</p>
<p>Maintenant il faut bien faire attention à ce que l&#8217;on lit ou ce que l&#8217;on interprète. Il faut bien se rendre compte que SQL Trace collecte les statistiques pour un évènement une fois qu&#8217;il s&#8217;est terminé, donc ce n&#8217;est pas parce qu&#8217;on va pointer sur un pic CPU ou un de temps de service disque  qu&#8217;on va tomber pile sur le problème. On va dire que ça facilite la tâche, ça permet de corréler des informations, mais ça ne fait pas le travail à votre place. Une requête peut commencer à faire des lectures physiques depuis le disque pendant une minute, puis faire d&#8217;autres opérations en mémoire (des tris, des agrégations) et se terminer un certain temps  après le pic. Un petit exemple d&#8217;une requête qui fait des accès physiques pendant 1 minute et qui se termine à la fin du pic. Si on ne regarde pas bien, on rate l&#8217;information:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/05/SQLDIAG3.jpg"><img class="alignnone size-large wp-image-997" title="SQLDIAG3" src="http://blog.capdata.fr/wp-content/uploads/2010/05/SQLDIAG3-1024x460.jpg" alt="" width="1024" height="460" /></a></p>
<h2>RML Utilities:</h2>
<p>RML Utilities est une petite application due, comme pas mal d&#8217;outils et d&#8217;avancées sur le moteur, à l&#8217;initiative de l&#8217;équipe <a title="MS PSS" href="http://blogs.msdn.com/psssql">Customer Support Services</a>. La première version de RML s&#8217;appuyait sur deux binaires <a title="KB1" href="http://support.microsoft.com/kb/887057">Ostress et ReadTrace</a> principalement, elle a été refondue en 2007 pour incorporer une petite application d&#8217;affichage des traces, basée sur des reports RDL. Les versions x86 et x64 sont téléchargeables depuis <a href="http://blogs.msdn.com/psssql/archive/2007/12/18/rml-utilities-for-microsoft-sql-server-released.aspx">la page d&#8217;accueil de RML</a>. L&#8217;installation n&#8217;a rien de compliqué, donc on va passer directement à la phase d&#8217;intégration des traces.</p>
<p>Cette intégration se fait avec ReadTrace. Tout d&#8217;abord, on va créer une base pour stocker les données des traces:</p>
<pre><span style="color: #0000ff;">create database RMLDB</span></pre>
<p>Puis ReadTrace avec les options -I&lt;chemin vers fichier trc initial&gt; -S&lt;instance&gt; -d&lt;Baserepository&gt; (important de ne pas laisser d&#8217;espace entre le commutateur et le paramètre)</p>
<pre><span style="color: #888888;"><span style="color: #0000ff;">$ ./ReadTrace -IE:/SQLDIAG/TRACE3/SQL2008__sp_trace.trc -SMS2K8-Win2008-1 -E -dRMLDB</span>

<em>05/10/10 17:13:20.920 [0X000013B4] Output path was not specified; defaulting to C:\Users\capdata\AppData\Local\Temp\2\\output
05/10/10 17:13:21.000 [0X000013B4] Readtrace a SQL Server trace processing utility.
Version 9.01.0109 built for x86.
Copyright (c) Microsoft Corporation 1997-2008. All rights reserved.
05/10/10 17:13:21.002 [0X000013B4] Number of processors: 1
05/10/10 17:13:21.002 [0X000013B4]     Active proc mask: 0x00000001
05/10/10 17:13:21.008 [0X000013B4]         Architecture: 0
05/10/10 17:13:21.009 [0X000013B4]            Page size: 4096
05/10/10 17:13:21.009 [0X000013B4]         Highest node: 0
05/10/10 17:13:21.010 [0X000013B4]         Package mask: 0x00000001
05/10/10 17:13:21.011 [0X000013B4]         Processor(s): 0x00000001 Function units: Separated
05/10/10 17:13:21.011 [0X000013B4]           Processors: 0x00000001 assigned to Numa node: 0
05/10/10 17:13:21.012 [0X000013B4] -IE:/SQLDIAG/TRACE3/SQL2008__sp_trace.trc
05/10/10 17:13:21.012 [0X000013B4] -SMS2K8-Win2008-1
05/10/10 17:13:21.013 [0X000013B4] -E
05/10/10 17:13:21.013 [0X000013B4] -dRMLDB
05/10/10 17:13:21.014 [0X000013B4] Using language id (LCID): 1024 [French_France.1252] for character formatting with NLS: 0x00500100 and Defined: 0x00050100
05/10/10 17:13:21.015 [0X000013B4] Attempting to cleanup existing RML files from previous execution
05/10/10 17:13:21.016 [0X000013B4] Using extended RowsetFastload synchronization
05/10/10 17:13:21.017 [0X000013B4] Establishing initial database connection:
05/10/10 17:13:21.017 [0X000013B4] Server: MS2K8-Win2008-1
05/10/10 17:13:21.018 [0X000013B4] Database: RMLDB
05/10/10 17:13:21.018 [0X000013B4] Authentication: Windows
05/10/10 17:13:21.470 [0X000013B4] Using SQL Client version 10
05/10/10 17:13:21.471 [0X000013B4] Creating or clearing the performance database
05/10/10 17:13:22.916 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace.trc (SQL 2005)
05/10/10 17:13:22.918 [0X000013B4] Validating core events exist
05/10/10 17:13:22.919 [0X000013B4] Validating necessary events exist for analysis
05/10/10 17:13:22.921 [0X000013B4] Validating necessary events exist for RML breakout
05/10/10 17:13:22.922 [0X000013B4] WARNING: Event [Server: Server Memory Change] missing from trace
05/10/10 17:13:22.923 [0X000013B4] WARNING REPLAY: The following trace events were not captured: [Sessions:ExistingConnection, Security Audit: Audit Login, Se
rity Audit: Audit Logout, Stored Procedures: RPC Output Parameter, Cursors:Unprepare, Cursors:CursorClose, Cursors:CursorPrepare, Cursors:CursorCreated, Curso
:CursorExecute, TSQL: Prepare SQL, TSQL: Unprepare SQL, Errors and Warnings:Attention, Transactions:SQLTransaction, Transactions:DTCTransaction, Transactions:
:Begin Tran starting and completed, Transactions:TM:Commit Tran starting and completed, Transactions:TM:Rollback Tran starting and completed, Transactions:TM:
ve Tran starting and completed, Transactions:TM:Promote Tran starting and completed, SQL:BatchStarting and SQL:BatchCompleted, RPC:Starting and RPC:Completed]
Review the help file to ensure that you have collected the appropriate set of events and columns for RML replay needs.  Lack of these events can lead to sever
replay problems.

Trace flag -T28 disables the check allowing RML output processing. *** Use with caution as the output and behavior could be unpredictable.
05/10/10 17:13:22.993 [0X000013B4] Events Read: 1000 Queued: 1000 Processed/sec: 0
05/10/10 17:13:23.026 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_1.trc (SQL 2005)
05/10/10 17:13:23.038 [0X000013B4] Events Read: 2000 Queued: 2000 Processed/sec: 0
05/10/10 17:13:23.070 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_2.trc (SQL 2005)
05/10/10 17:13:23.082 [0X000013B4] Events Read: 3000 Queued: 3000 Processed/sec: 0
05/10/10 17:13:23.261 [0X000013B4] Events Read: 4000 Queued: 4000 Processed/sec: 0
05/10/10 17:13:23.271 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_3.trc (SQL 2005)
05/10/10 17:13:23.284 [0X000013B4] Events Read: 5000 Queued: 5000 Processed/sec: 0
05/10/10 17:13:23.328 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_4.trc (SQL 2005)
05/10/10 17:13:23.342 [0X000013B4] Events Read: 6000 Queued: 6000 Processed/sec: 0
05/10/10 17:13:23.361 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_5.trc (SQL 2005)
05/10/10 17:13:23.366 [0X000013B4] Events Read: 7000 Queued: 7000 Processed/sec: 0
05/10/10 17:13:23.396 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_6.trc (SQL 2005)
05/10/10 17:13:23.406 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_7.trc (SQL 2005)
05/10/10 17:13:23.475 [0X000013B4] Events Read: 8000 Queued: 8000 Processed/sec: 0
05/10/10 17:13:23.574 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_8.trc (SQL 2005)
05/10/10 17:13:24.175 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_9.trc (SQL 2005)
05/10/10 17:13:24.313 [0X000013B4] Events Read: 9000 Queued: 8998 Processed/sec: 2
05/10/10 17:13:24.854 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_10.trc (SQL 2005)
05/10/10 17:13:24.905 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_11.trc (SQL 2005)
05/10/10 17:13:24.939 [0X000013B4] Processing file: E:\SQLDIAG\TRACE3\SQL2008__sp_trace_12.trc (SQL 2005)
05/10/10 17:13:24.959 [0X000013B4] Found TRACE_STOP with 0 bytes of data
05/10/10 17:13:24.961 [0X000013B4] Found [TRACE_STOP] event indicating the end of the trace files.
05/10/10 17:13:24.962 [0X000013B4] Reads completed
05/10/10 17:13:24.965 [0X000013B4] Shutting down the worker thread message queues.
05/10/10 17:13:24.996 [0X000013B4] Waiting for the worker threads to complete final actions.
05/10/10 17:13:26.074 [0X000013B4] Performing general cleanup actions.
05/10/10 17:13:26.076 [0X000013B4] Reducing cached memory.
05/10/10 17:13:26.096 [0X000013B4] Total Events Processed: 11117
05/10/10 17:13:26.101 [0X000013B4]  Total Events Filtered: 0
05/10/10 17:13:26.102 [0X000013B4] Parse errors: 0
05/10/10 17:13:26.224 [0X000013B4] Table ReadTrace.tblUniqueBatches: loaded ~445 rows
05/10/10 17:13:26.225 [0X000013B4] Table ReadTrace.tblUniqueStatements: loaded ~0 rows
05/10/10 17:13:26.225 [0X000013B4] Table ReadTrace.tblUniquePlans: loaded ~0 rows
05/10/10 17:13:26.226 [0X000013B4] Table ReadTrace.tblUniquePlanRows: loaded ~0 rows
05/10/10 17:13:26.241 [0X000013B4] Table ReadTrace.tblBatches: loaded ~4355 rows
05/10/10 17:13:26.242 [0X000013B4] Table ReadTrace.tblStatements: loaded ~0 rows
05/10/10 17:13:26.243 [0X000013B4] Table ReadTrace.tblPlans: loaded ~0 rows
05/10/10 17:13:26.244 [0X000013B4] Table ReadTrace.tblPlanRows: loaded ~0 rows
05/10/10 17:13:26.257 [0X000013B4] Table ReadTrace.tblInterestingEvents: loaded ~3 rows
05/10/10 17:13:26.258 [0X000013B4] Table ReadTrace.tblConnections: loaded ~0 rows
05/10/10 17:13:26.262 [0X000013B4] WARNING: One or more warning conditions exist that may affect the quality of the analysis data.  See RMLDB.ReadTrace.tblWar
ngs table and the ReadTrace log for complete details.
05/10/10 17:13:26.269 [0X000013B4] Indexing tables...
05/10/10 17:13:27.413 [0X000013B4] Doing post-load data cleanup...
05/10/10 17:13:27.863 [0X000013B4] Computing partial aggregates...
05/10/10 17:13:28.977 [0X000013B4] Data load completed.
05/10/10 17:13:28.979 [0X000013B4] Using execution path: c:\Program Files\Microsoft Corporation\RMLUtils
05/10/10 17:13:28.980 [0X000013B4] Launching [c:\Program Files\Microsoft Corporation\RMLUtils\Reporter.exe]
05/10/10 17:13:29.253 [0X000013B4] *******************************************************************************
* ReadTrace encountered one or more WARNINGS. A warning condition typically   *
* continues processing with reduced functionality, but the ReadTrace output   *
* may be adversely affected. Review the log file for details.                 *
*******************************************************************************
05/10/10 17:13:29.324 [0X000013B4]
</em></span><span style="color: #888888;"> </span></pre>
<p>Les deux warnings indiquent juste qu&#8217;il va manquer certains évènements, notamment les évènements pour pouvoir faire un replay dans Profiler.  A la fin du chargement, l&#8217;application &#8216;<em>Reporter</em>&#8216; est lancée et permet de visualiser les informations de la trace:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/05/RML1.jpg"><img class="alignnone size-full wp-image-1018" title="RML1" src="http://blog.capdata.fr/wp-content/uploads/2010/05/RML1.jpg" alt="" width="986" height="710" /></a></p>
<p>Ensuite, il est assez simple de naviguer dans l&#8217;interface et de visualiser l&#8217;information agrégée, par exemple en cliquant sur &#8216;<em>Unique Batches&#8217;</em>:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/05/RML2.jpg"><img class="alignnone size-full wp-image-1019" title="RML2" src="http://blog.capdata.fr/wp-content/uploads/2010/05/RML2.jpg" alt="" width="989" height="703" /></a></p>
<p>&#8230; et de repérer les requêtes consommatrices par critère (coût CPU, I/Os, durée), et visualiser le plan (si pris dans la trace):</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/05/RML4.jpg"><img class="alignnone size-full wp-image-1021" title="RML4" src="http://blog.capdata.fr/wp-content/uploads/2010/05/RML4.jpg" alt="" width="918" height="351" /></a></p>
<p>Dernier épisode, on verra OSTRESS et ORCA, et les alternatives à SQLDIAG+RML Utilites: PSSDIAG, SQL Nexus, SQLH2, Data Collector, les reports SSMS.</p>
<p>A+ David B. (avec la collaboration de Martial LUCAS. )</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 2180px; width: 1px; height: 1px;">lrwxrwxrwx 1 root root 4 2008-07-09 12:41 /bin/sh -&gt; bash</p>
</div>
<p><script type="text/javascript" src="http://tcr.tynt.com/javascripts/Tracer.js?user=d4FlbGI04r35lZadbi-bpO"></script><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-la-taille-du-journal-de-transactions-sur-disque/" rel="bookmark" title="11 juillet 2011">How-To: réduire la taille du journal de transactions sur disque</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sqldiag-episode-1/" rel="bookmark" title="5 février 2010">SQLDIAG (épisode 1)</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 1.756 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsqldiag-episode-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsqldiag-episode-2%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sqldiag-episode-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQLDIAG (épisode 1)</title>
		<link>http://blog.capdata.fr/index.php/sqldiag-episode-1/</link>
		<comments>http://blog.capdata.fr/index.php/sqldiag-episode-1/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 12:10:31 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[perfmon]]></category>
		<category><![CDATA[pssdiag]]></category>
		<category><![CDATA[RML Utilities]]></category>
		<category><![CDATA[sqldiag]]></category>
		<category><![CDATA[SQLNexus]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=490</guid>
		<description><![CDATA[Début d&#8217;une assez longue série de posts sur l&#8217;utilitaire SQLDIAG et ses petits camarades de jeu PSSDIAG, SQLNexus et autres RML Utilities&#8230;
SQLDIAG est un utilitaire en mode ligne de commandes qui est livré avec SQL Server depuis plus de 10 ans maintenant. Il est bien caché, peu de gens l&#8217;utilisent mais il peut être d&#8217;une [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #333333;">Début d&#8217;une assez longue série de posts sur l&#8217;utilitaire SQLDIAG et ses petits camarades de jeu PSSDIAG, SQLNexus et autres RML Utilities&#8230;</span></p>
<p><span style="color: #333333;"><strong>SQLDIAG </strong>est un utilitaire en mode ligne de commandes qui est livré avec SQL Server depuis plus de 10 ans maintenant. Il est bien caché, peu de gens l&#8217;utilisent mais il peut être d&#8217;une puissance redoutable. Il est capable de lancer en même temps:</span></p>
<ul>
<li><span style="color: #333333;"><em>Une collecte perfmon.</em></span></li>
<li><span style="color: #333333;"><em>Une trace type SQL Trace.</em></span></li>
<li><span style="color: #333333;"><em>Une collecte des journaux d&#8217;évènements.</em></span></li>
<li><span style="color: #333333;"><em>Un inventaire complet  de la machine basé sur msinfo32.</em></span></li>
<li><span style="color: #333333;"><em>Un inventaire complet de l&#8217;instance.</em></span></li>
</ul>
<p><span style="color: #333333;">Il permettra même de corréler des traces de compteurs perfmon et le traçage de sessions SQL dans Profiler. Il se base sur un fichier de configuration au format XML. Il en existe un par défaut (SQLDiag.xml) qui se trouve sous ~Tools\Binn, mais il est très exhaustif  et trace tous les compteurs et évènements disponibles. L&#8217;inconvénient de l&#8217;utiliser est qu&#8217;il créé des traces pénalisantes et très encombrantes, plusieurs dizaines de Gb de fichiers textes, blg, trc, etc&#8230; Donc on a intérêt à se créer son petit fichier XML pour ne capturer que ce dont on aura besoin.</span></p>
<h2><span style="color: #333333;">SQLDiag.xml<br />
</span></h2>
<p><span style="color: #333333;">Dans ce premier épisode, nous allons donc parler de la structure de ce fichier XML. Elle ressemble vu d&#8217;en haut à ceci:</span></p>
<pre><span style="color: #0000ff;">&lt;Collection&gt;
&lt;Machines&gt;
        &lt;Machine name="."&gt;
                &lt;MachineCollectors&gt;
                        &lt;<span style="color: #008000;">EventlogCollector</span> /&gt;
                        &lt;<span style="color: #008000;">PerfmonCollector</span> /&gt;
                &lt;/MachineCollectors&gt;
                &lt;Instances&gt;
                       &lt;Instance&gt;
                              &lt;Collectors&gt;
                                    &lt;<span style="color: #008000;">SqldiagCollector</span> /&gt;
                                    &lt;<span style="color: #008000;">BlockingCollector</span> /&gt;
                                    &lt;<span style="color: #008000;">ProfilerCollector</span> /&gt;
                                    &lt;<span style="color: #008000;">CustomDiagnostics</span> /&gt;
                             &lt;/Collectors&gt;
                     &lt;/Instance&gt;
              &lt;/Instances&gt;
      &lt;/Machine&gt;
&lt;/Machines&gt;
&lt;/Collection&gt;</span></pre>
<p><span style="color: #000000;"><span style="color: #333333;">Chaque balise </span><span style="color: #008000;"><strong>%</strong><em><strong>Collector</strong></em><span style="color: #333333;"> </span></span><span style="color: #333333;">délimite la zone de paramétrage de chaque <strong>collecteur de trace</strong>. Pour activer / désactiver un collecteur, passer son attribut enabled à <em>true</em> ou <em>false</em>:</span></span></p>
<ul>
<li><span style="color: #333333;"><strong>EventlogCollector </strong>pour collecter les journaux d&#8217;évènements.<br />
</span></li>
<li><span style="color: #333333;"><strong>PerfmonCollector </strong>pour lancer la trace perfmon.</span></li>
<li><span style="color: #333333;"><strong>SQLdiagCollector </strong>pour récupérer toute la configuration de l&#8217;instance: paramètres, contenu de tous les errorlogs, connexions, verrous, liste des bases et options, xp_msver, etc&#8230;<br />
</span></li>
<li><span style="color: #333333;"><strong>BlockingCollector </strong>pour l&#8217;évènement BlockedProcessReport de SQL Trace, rapporte les processus bloqués si le paramètre &#8216;<em>blocked process threshold (s)</em>&#8216; est configuré.</span></li>
<li><span style="color: #333333;"><strong>ProfilerCollector </strong>pour la trace SQL Trace complète avec les évènements que l&#8217;on aura indiqué.<br />
</span></li>
<li><span style="color: #333333;"><strong>CustomDiagnostics </strong>pour lancer des exécutables supplémentaires, en l&#8217;occurence msinfo32 dans notre cas, et récupérer la configuration complète de la machine.<br />
</span></li>
</ul>
<h3><span style="color: #333333;"><strong>PerfmonCollector </strong></span></h3>
<p><span style="color: #333333;">C&#8217;est le collecteur de compteurs perfmon. Ses éléments fils sont &lt;PerfmonObject /&gt; qui désigne la famille de compteurs comme <em>&laquo;&nbsp;PhysicalDisk(*)</em>&nbsp;&raquo; par exemple, et &lt;PerfmonCounter /&gt; qui désigne le compteur associé comme &laquo;&nbsp;<em>\Avg. Disk sec/Read</em>&laquo;&nbsp;. On aura besoin d&#8217;activer chaque compteur en passant son attribut enabled à <em>true</em>. Une zone PerfmonCollector peut ressembler à ceci, avec le nom des compteurs en vert:</span></p>
<pre><span style="color: #0000ff;">&lt;PerfmonCollector enabled="true" pollinginterval="30" maxfilesize="256"&gt;
    &lt;PerfmonCounters&gt;
        &lt;PerfmonObject name="\PhysicalDisk(*)" enabled="true"&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Avg. Disk sec/Read</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Avg. Disk sec/Write</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Disk Read Bytes/sec</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Disk Write Bytes/sec</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Avg. Disk Bytes/Transfer</span>" enabled="true" /&gt;
        &lt;/PerfmonObject&gt;
        &lt;PerfmonObject name="\Processor(*)" enabled="true"&gt;
            &lt;PerfmonCounter name="<span style="color: #008000;">\% Processor Time</span>" enabled="true" /&gt;
            &lt;PerfmonCounter name="<span style="color: #008000;">\% User Time</span>" enabled="true" /&gt;
            &lt;PerfmonCounter name="<span style="color: #008000;">\% Privileged Time</span>" enabled="true" /&gt;
        &lt;/PerfmonObject&gt;
    &lt;/PerfmonCounters&gt;
&lt;/PerfmonCollector&gt;</span></pre>
<p><span style="color: #333333;">L&#8217;attribut <em>pollinginterval </em>indique la fréquence d&#8217;échantillonnage des compteurs. Le fichier de sortie de ce collecteur sera un fichier BLG intitulé tout simplement<em> <strong>SQLDIAG.blg</strong></em>. Il pourra être corrélé plus tard avec la trace qui sera générée par le collecteur ProfilerCollector.</span></p>
<h3><span style="color: #333333;">SQLdiagCollector</span></h3>
<p><span style="color: #333333;">C&#8217;est le collecteur de données de l&#8217;instance. Il n&#8217;est pas paramétrable est composé d&#8217;une seule ligne:</span></p>
<pre><span style="color: #0000ff;">&lt;SqldiagCollector enabled="true" startup="false" shutdown="true" /&gt; </span></pre>
<p><span style="color: #333333;">On l&#8217;activera donc en passant son attribut enabled à <em>true</em> là encore. Les paramètres startup et shutdown permettent d&#8217;indiquer si la collecte se fait au démarrage ou à l&#8217;arrêt de la trace SQLDIAG.<br />
</span></p>
<h3><span style="color: #333333;">BlockingCollector:</span></h3>
<p><span style="color: #333333;">C&#8217;est le collecteur des processus bloqués en attente de libération de ressources (verrous). Lui aussi n&#8217;est constitué  que d&#8217;un seul élément:</span></p>
<pre><span style="color: #0000ff;">&lt;BlockingCollector enabled="true" pollinginterval="5" maxfilesize="350" /&gt; </span></pre>
<p><span style="color: #333333;">L&#8217;attribut <em>pollinginterval </em>désigne la fréquence d&#8217;échantillonnage  de l&#8217;évènement, et <em>maxfilesize </em>la taille maximale du fichier en sortie. Ce collecteur se base sur le paramètre d&#8217;instance &#8216;<em>blocked process threshold</em>&#8216; qui définit la durée en secondes au delà de laquelle on considère que le blocage est anormalement long. Il faudra définir ce paramètre car sa valeur par défaut est à zéro, ce qui signifie qu&#8217;il n&#8217;est pas activé. Par exemple pour mettre le seuil à 20 secondes:</span></p>
<pre><span style="color: #808080;">sp_configure 'blocked process threshold', 20
go
reconfigure
go</span></pre>
<p><span style="color: #333333;">Ensuite, le collecteur va créer une trace SQL Trace avec le seul évènement &#8216;<em>Blocked Process Report</em>&#8216;, et capturer les sessions qui auront été bloquées pendant plus de 20 secondes. Le fichier de sortie de ce collecteur est un fichier trc classique nommé <strong><em>&lt;INSTANCE&gt;_SQLDIAG_sp_trace_blk</em></strong>.</span></p>
<h3><span style="color: #333333;">ProfilerCollector:</span></h3>
<p><span style="color: #333333;">Ensuite, ProfilerCollector est le collecteur de trace SQL Trace classique. Comme pour PerfmonCollector, il va disposer d&#8217;éléments fils comme &lt;EventType /&gt; et &lt;Event /&gt; dans lesquels on va bien entendu retrouver nos classes d&#8217;évènements:</span></p>
<pre><span style="color: #0000ff;">&lt;ProfilerCollector enabled="true" template="_GeneralPerformance100.xml" pollinginterval="5" maxfilesize="350"&gt;
     &lt;Events&gt;
         &lt;EventType name="Stored Procedures"&gt;
             &lt;Event id="10" name="<span style="color: #008000;">RPC:Completed<span style="color: #0000ff;">"</span><span style="color: #0000ff;"> enabled="true</span></span>"/&gt;
             &lt;Event id="11" name="<span style="color: #008000;">RPC:Starting<span style="color: #0000ff;">"</span><span style="color: #0000ff;"><span style="color: #0000ff;"> </span>enabled="true</span></span><span style="color: #0000ff;">"</span> /&gt;
             &lt;Event id="43" name="<span style="color: #008000;">SP:Completed</span>" enabled="true" /&gt;
             &lt;Event id="42" name="<span style="color: #008000;">SP:Starting</span>" enabled="true" /&gt;
             &lt;Event id="45" name="<span style="color: #008000;">SP:StmtCompleted</span>" enabled="true" /&gt;
             &lt;Event id="44" name="<span style="color: #008000;">SP:StmtStarting</span>" enabled="true" /&gt;
        &lt;/EventType&gt;
       &lt;EventType name="TSQL"&gt;
             &lt;Event id="40" name="<span style="color: #008000;">SQL:StmtStarting</span>" enabled="true"/&gt;
             &lt;Event id="41" name="<span style="color: #008000;">SQL:StmtCompleted</span>" enabled="true" /&gt;
       &lt;/EventType&gt;
     &lt;/Events&gt;
 &lt;/ProfilerCollector&gt;</span></pre>
<p><span style="color: #333333;">Le fichier de sortie de ce collecteur sera </span>aussi <span style="color: #333333;">un fichier trace classique nommé </span><strong><em>&lt;INSTANCE&gt;_SQLDIAG_sp_trace.</em></strong></p>
<h3><span style="color: #333333;">CustomDiagnostics</span></h3>
<p>Enfin, CustomDiagnostics permet de pousser encore plus loin la personnalisation du rapport, en nous permettant d&#8217;utiliser nos propres outils de collecte. L&#8217;outil qui est utilisé par défaut est <strong>msinfo32 </strong>qui est utilisé pour afficher de manière graphique (Démarrer -&gt; Exécuter -&gt; msinfo32) ou en ligne de commande toute la configuration de la machine hôte:</p>
<pre><span style="color: #0000ff;">&lt;CustomDiagnostics&gt;
 &lt;CustomGroup name="msinfo" enabled="true" /&gt;
 &lt;CustomTask enabled="true" groupname="MsInfo" taskname="<span style="color: #008000;">Get MSINFO32</span>" type="Utility" point="Startup" wait="OnlyOnShutdown" cmd="start /B /WAIT MSInfo32.exe /computer %server% /report
         &amp;quot;%output_path%%server%_MSINFO32.TXT&amp;quot; /categories +SystemSummary+ResourcesConflicts+ResourcesIRQS+ComponentsNetwork+ComponentsStorage+ComponentsProblemDevices+SWEnvEnvVars+
         SWEnvNetConn+SWEnvServices+SWEnvProgramGroup+SWEnvStartupPrograms" /&gt;
 &lt;CustomTask enabled="true" groupname="MsInfo" taskname="<span style="color: #008000;">Get default traces</span>" type="Copy_File" point="Startup" wait="OnlyOnShutdown" cmd="&amp;quot;%sspath%log\log*.trc&amp;quot; &amp;quot;%output_path%&amp;quot;" /&gt;
 &lt;CustomTask enabled="true" groupname="MsInfo" taskname="<span style="color: #008000;">Get SQLDumper log</span>" type="Copy_File" point="Startup" wait="OnlyOnShutdown" cmd="&amp;quot;%sspath%log\SQLDUMPER_ERRORLOG.log&amp;quot;
          &amp;quot;%output_path%%server%_%instance%_SQLDUMPER_ERRORLOG.log&amp;quot;" /&gt;
 &lt;/CustomDiagnostics&gt;</span></pre>
<p>Mais en plus de récupérer le contenu d&#8217;une trace msinfo32, il peut également récupérer le contenu des traces SQL Server par défaut *, et les stacktraces générées par SQL Server lorsqu&#8217;il rencontre une erreur fatale sur un module. Il va copier le contenu de ces traces dans le répertoire passé à l&#8217;exécution de SQLDIAG.</p>
<h2>Exécution d&#8217;une trace</h2>
<p>Une fois le fichier XML défini, lancer une trace devient un jeu d&#8217;enfant:</p>
<pre><strong>$ sqldiag /I MyXMLfile.xml /O e:/SQLDIAG/TRACE1</strong>
<span style="color: #808080;">2010/02/04 18:58:10.28 SQLDIAG Collector version
2010/02/04 18:58:10.29 SQLDIAG</span>

<span style="color: #008000;">IMPORTANT:  Please wait until you see "Collection started" before attempting to reproduce your issue</span>

<span style="color: #808080;">2010/02/04 18:58:10.29 SQLDIAG Output path: e:\SQLDIAG\TRACE1\
2010/02/04 18:58:10.33 SQLDIAG Collecting from 1 logical machine(s)
2010/02/04 18:58:10.34 SQLDIAG Invalid node fetched. (null)
2010/02/04 18:58:10.34 SQLDIAG Invalid node fetched. (null)
2010/02/04 18:58:10.34 MS2K8-WIN2008-1\* SQL Server version: 10
2010/02/04 18:58:10.35 MS2K8-WIN2008-1\* Machine name: MS2K8-WIN2008-1 (this machine)
2010/02/04 18:58:10.35 MS2K8-WIN2008-1\* Target machine is not a cluster
2010/02/04 18:58:10.35 MS2K8-WIN2008-1\* Instance: (Default) (32-bit)
2010/02/04 18:58:12.40 SQLDIAG Initialization starting...
2010/02/04 18:58:13.98 MS2K8-WIN2008-1\* Starting Profiler trace
2010/02/04 18:58:14.94 MS2K8-WIN2008-1\* Starting Blocking script
2010/02/04 18:58:16.88 MS2K8-WIN2008-1\* MsInfo: Get MSINFO32
2010/02/04 18:58:17.26 MS2K8-WIN2008-1\* MsInfo: Get default traces
2010/02/04 18:58:17.47 MS2K8-WIN2008-1\* MsInfo: Get SQLDumper log
2010/02/04 18:58:17.71 MS2K8-WIN2008-1\* Adding Perfmon counters...
2010/02/04 18:58:20.73 MS2K8-WIN2008-1\* Starting Perfmon
2010/02/04 18:58:20.73 SQLDIAG Initialization complete
2010/02/04 18:58:21.53 MS2K8-WIN2008-1\* Perfmon started
2010/02/04 18:58:21.58 MS2K8-WIN2008-1\* Collecting diagnostic data</span>

<span style="color: #008000;">2010/02/04 18:58:22.28 SQLDIAG Collection started.  Press Ctrl+C to stop.</span></pre>
<p>La trace est lancée, un simple Ctrl-C suffira à la stopper. Les commutateurs /I et /O permettent d&#8217;indiquer le fichier de configuration XML choisi et le répertoire où va se loger le contenu de la trace complète.</p>
<p>Il existe aussi des commutateurs pour indiquer à SQLDIAG de programmer son exécution à des heures déterminées. Il est même possible de l&#8217;enregistrer en tant que service dans windows.</p>
<p>Dans le prochain post sur SQLDIAG, on verra comment dépouiller les fichiers de résultat.</p>
<p>A+ David B.</p>
<p>(avec la collaboration de Martial LUCAS. )</p>
<p><em>* Depuis la version SQL Server 2005, un paramètre instance &#8216;default trace enabled&#8217; avec une valeur de 1 (valeur par défaut) génère une trace systématiquement au démarrage de l&#8217;instance. Cette trace contient les classes évènements Database, Errors and Warnings, Full text, Objects, Performance, Server et Security Audit. Chaque trace vient se loger dans le répertoire des ERRORLOG par défaut.</em></p>
<p><script type="text/javascript" src="http://tcr.tynt.com/javascripts/Tracer.js?user=d4FlbGI04r35lZadbi-bpO"></script><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/" rel="bookmark" title="13 juin 2008">Modes de récupération et journal de transactions, épisode 1</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sqldiag-episode-2/" rel="bookmark" title="10 mai 2010">SQLDIAG (épisode 2)</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-lenveloppe-de-tempdb/" rel="bookmark" title="7 juillet 2011">How-To : réduire l&#8217;enveloppe de tempdb</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-la-taille-du-journal-de-transactions-sur-disque/" rel="bookmark" title="11 juillet 2011">How-To: réduire la taille du journal de transactions sur disque</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.160 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsqldiag-episode-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsqldiag-episode-1%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sqldiag-episode-1/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

