<?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; SQLNexus</title>
	<atom:link href="http://blog.capdata.fr/index.php/tag/sqlnexus/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 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.290 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>

