<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2frenchfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Cap Data Team SGBD Blog : Oracle, SQL Server, MySQL, Sybase...</title>
	
	<link>http://blog.capdata.fr</link>
	<description>Le blog technique sur les bases de données de CAP DATA Consulting</description>
	<lastBuildDate>Wed, 02 May 2012 11:50:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CapDataTeamBlog" /><feedburner:info uri="capdatateamblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=fr&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/bn/intatm_fr_1.gif">Subscribe with Mon Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/CapDataTeamBlog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FCapDataTeamBlog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:browserFriendly>Copyright © 2010  www.capdata.fr. All Rights Reserved</feedburner:browserFriendly><item>
		<title>Production SQL Server: Suivi et Contrôle du parc</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/8zLH0tNaD44/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/#comments</comments>
		<pubDate>Wed, 02 May 2012 11:48:37 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3542</guid>
		<description><![CDATA[Huitième article de la série Une approche pragmatique de la production SQL Server, il est question ici de suivre le parc d’instances SQL Server.
Ce sujet est bien trop vaste pour un billet de blog, je me contenterai donc d’aborder le sujet.
Que suivre ?
L’objectif du suivi est double : s’assurer que le Service « disponibilité de la base de [...]]]></description>
			<content:encoded><![CDATA[<p>Huitième article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, il est question ici de suivre le parc d’instances SQL Server.</p>
<p>Ce sujet est bien trop vaste pour un billet de blog, je me contenterai donc d’aborder le sujet.</p>
<p><strong>Que suivre ?</strong></p>
<p>L’objectif du suivi est double : s’assurer que le Service « disponibilité de la base de données » est offert à l’utilisateur, et Maîtriser les instances du parc afin que leur exploitation reste simple. Les points à suivre sont donc disponibilité et performance pour la partie Service, et maintient de la configuration pour la partie Maîtrise.<br />
<em>Disponibilité :</em></p>
<ul>
<li>L’instance tourne et accepte les connexions des utilisateurs sur les différentes bases</li>
<li>Les bases utilisateurs sont pleinement opérationnelles (pas de corruption de données, pas de problème de saturation d’espace)</li>
<li>Le temps de réponse des requêtes est satisfaisant (performances acceptables)</li>
</ul>
<p><em>Maîtrise :</em></p>
<ul>
<li>La configuration de chaque instance/machine est connue, ainsi que son évolution dans le temps</li>
<li>Chaque instance déployée est suivie</li>
</ul>
<p>Pour répondre à ces besoins, il existe, entre autres, deux approches : Le développement interne, et les outils Microsoft.</p>
<p><strong>Le développement interne</strong><br />
Il est possible et relativement simple de mettre en place une gestion centralisée de votre parc.<br />
Une base de données sur une instance SQL Server, une dizaine de tables, et vous disposez d’un référentiel contenant les informations de chaque instance déployée.<br />
Via l’utilisation de serveurs liés, vous pouvez simplement depuis votre instance de gestion consulter les données de chaque instance du parc, donc récupérer les informations de configuration, volumétrie et performance de ces instances.<br />
Via les rapports SQL Server (construits graphiquement avec <a href="http://www.microsoft.com/downloads/fr-fr/details.aspx?FamilyID=d3173a87-7c0d-40cc-a408-3d1a43ae4e33">report Builder 3</a>), vous avez la possibilité de générer des tableaux de bord reprenant les informations collectées.</p>
<p><em>Avantages : </em></p>
<ul>
<li>le référencement peut être scripté dans votre procédure de déploiement, ce qui le rend automatique.</li>
<li>Votre base de gestion peut être hébergée par une instance en édition Express de SQL Server, donc pas de coût de licence.</li>
<li>Puisqu’il s’agit d’un développement interne, l’ajout de fonctionnalités (gestionnaire de sauvegardes/restaurations, rapports personnalisés, ) est possible. Vous disposez en outre d’un référentiel unique, donc pas de problème de redondance d&#8217;information et de maintient de cohérence entre sources différentes.</li>
</ul>
<p><em>Inconvénients : </em></p>
<ul>
<li>Outre la partie base de données, cette méthode requiert des connaissances de programmation (php, asp), ne serait-ce que pour obtenir une interface graphique descente.</li>
</ul>
<p><strong>Outils Microsoft</strong><br />
Plusieurs outils de Microsoft, intégrables à la console Management Studio, offrent des fonctionnalités intéressantes pour le suivi :</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ee210548.aspx">SQL Server Utilities</a> permet de collecter et d’historiser les compteurs de performance de vos instances SQL Server.  Il offre en outre un tableau de bord orienté « état de santé de l’utilisation des instances » donnant une vue synthétique de l’utilisation des ressources de vos instances.  Plusieurs rapports fournis donnent une vue historique des performances d’une instance. SQL Server Utilities fonctionne pour des instances en version 2008R2 et supérieure.</p>
<p>Avec <a href="http://msdn.microsoft.com/en-us/library/bb510667.aspx">Management Policies</a>, un modèle de  configuration est créé et peut être évalué régulièrement sur les instances du parc. Lorsque des différences entre le modèle et l’instance sont trouvées, elles peuvent être notifiée ou corrigée automatiquement. Plusieurs modèles (en fonction des versions de SQL Server, par exemple) peuvent être définis.<br />
Le modèle peut contenir des conditions sur une instance(paramètres de configuration),  ses objets (logins, serveurs liés, endpoints, …), une base et ses objets (options de la base, tables, procédures stockées, indexes,…).<br />
Il est donc possible par exemple de vérifier qu’aucun login autre que ceux des DBAs ne dispose du privilège sysadmin, que le nom des tables et procédures stockées des bases utilisateurs suit la politique de nommage, et qu’il existe bien une clé primaire pour chaque  table utilisateur.</p>
<p>Dans un  <a href="http://msdn.microsoft.com/en-us/library/bb895144.aspx">Central Management Server</a>, vous enregistrez la chaîne de connexion vers une instance SQL Server. Dans Management Studio, la liste des instances SQL Server référencées (panneau Registered Servers) peut inclure un ou plusieurs Central Management Servers. Donc lorsqu’une nouvelle instance SQL Server est déployée, il suffit de la référencer dans l’un de ces Servers pour que tous les DBAs de l’équipe puissent s’y connecter.</p>
<p>Le mécanisme de <a href="http://msdn.microsoft.com/fr-fr/library/ms180992.aspx">Job Multi Serveurs MSX/TSX</a> vous permettra de créer un job unique par type de tâche et de le « pousser » sur toutes les instances de votre parc. Les jobs sont automatiquement mis à jour sur les instances du parc lorsque vous modifiez le job de référence, et déployer les jobs sur une nouvelle instance consiste simplement à référencer cette instance dans MSX.</p>
<p><em>Avantages :</em></p>
<ul>
<li>Ces mécanismes s’interfacent avec SQL Server Management Studio, leur utilisation est donc simplifiée.</li>
</ul>
<p><em>Inconvénients :</em></p>
<ul>
<li>Vous multipliez les référentiels, il peut être délicat de les maintenir tous à jour.</li>
</ul>
<p><strong>Comment gérer les déploiements/suppressions d’instances ?</strong></p>
<p>Que ce soit via un développement interne ou avec les outils Microsoft, si votre référentiel n’est pas à jour, le suivi n’est pas complet. Il faut donc que toute nouvelle instance soit incluse au plus tôt dans le réferentiel, et que toute instance supprimée n’y apparaisse plus.</p>
<p>Si vous avez industralisé le déploiement (voir article précédent <a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/">Banalisation des instances</a>), il suffit de créer un script Transact-SQL de post installation qui ajoute l’instance au référentiel (votre développement interne doit idéalement fournir une procédure stockée d’ajout d’instance, et tous les outils Microsoft présentés ci-dessus ont une interface Transact-SQL pour gérer l’ajout d’une instance).</p>
<p>Si le déploiement  n’est pas industralisé, il faut penser à ajouter l’instance manuellement…</p>
<p>La suppression doit suivre le même principe, même si dans les faits une suppression d’instance n’est pas nécessairement gérée correctement. Il est donc utile de vérifier régulièrement les instances apparaissant comme « non joignables » dans les différents outils et de les dé-référencer au plus vite.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/" rel="bookmark" title="7 mars 2012">Production SQL Server : Ordonnancement</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-lapproche/" rel="bookmark" title="27 février 2012">Production SQL Server : L&#8217;approche</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/" rel="bookmark" title="26 mars 2012">Production SQL Server : Les Statistiques</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/" rel="bookmark" title="16 avril 2012">Production SQL Server : banalisation des instances</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.653 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%2Fproduction-sql-server-suivi-et-controle-du-parc%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-suivi-et-controle-du-parc%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/8zLH0tNaD44" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server : banalisation des instances</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/oXwPPq-iBKo/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 09:37:10 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3500</guid>
		<description><![CDATA[Septième article de la série Une approche pragmatique de la production SQL Server, c’est le couple normalisation/banalisation qui est abordé ici.
(On me glisse à l’oreillette que le terme « banalisation » n’est jamais employé dans le domaine de la base de données, mais puisque je le trouve assez bien adapté au concept que j’aborde ici, je l’utiliserai [...]]]></description>
			<content:encoded><![CDATA[<p>Septième article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, c’est le couple normalisation/banalisation qui est abordé ici.</p>
<p><em>(On me glisse à l’oreillette que le terme « banalisation » n’est jamais employé dans le domaine de la base de données, mais puisque je le trouve assez bien adapté au concept que j’aborde ici, je l’utiliserai quand même !)</em></p>
<p>Par instance normalisée, j’entends instance installée selon un ensemble de règles définissant :</p>
<ul>
<li>L’édition et la version de SQL Server,</li>
<li>l’emplacement des différents fichiers,</li>
<li>le nommage de l’instance,</li>
<li>le port TCP de l’instance,</li>
<li>Le mot de passe du login sa et la liste des logins disposant de forts privilèges,</li>
<li>La Collation de l’instance</li>
<li>Le nom et le contenu de la base contenant les scripts d’exploitation,</li>
<li>Le compte de service qui lance SQL Server et SQL Agent, et les privilèges de ce compte sur la machine</li>
</ul>
<p>Par instance banalisée, j’entends instance configurée avec des valeurs fixes pour certains paramètres :</p>
<ul>
<li>Mémoire allouée</li>
<li>Masque CPU</li>
<li>Paramètres de configuration tels que xp_cmdshell, backup compression default, clr enabled, cross db ownership, cost threshold for parallelism, max degree of parallelism</li>
</ul>
<p>L’idée est donc de mettre à disposition une instance qui aura une configuration correspondant à peu près à tous les types d’utilisation.</p>
<p><strong>Pourquoi banaliser ?</strong></p>
<ul>
<li>Déployer une instance banalisée est très simple. Il suffit de lancer un script de post installation pour fixer les valeurs des paramètres, qui peut être facilement inclus dans le processus de déploiement.</li>
<li>Mettre en place la supervision d’une instance banalisée est aussi très simple, puisque les seuils de consommation de ressources sont les mêmes.</li>
<li>Puisque les instances sont les mêmes, le DBA est toujours en environnement connu pour tout ce qui est tâches courantes d’exploitation et gestion d’incidents.</li>
</ul>
<p><strong>Faut-il tout banaliser ?</strong></p>
<p>Bien sûr que non !</p>
<p>Une instance banalisée, par définition, n’est pas optimisée pour l’usage qui en est fait. Mais en nous basant sur la règle dite des 80/20, il semble réaliste de banaliser 80% des instances, ce qui permettra de concentrer la charge de travail du DBA sur les 20% des instances restantes (a priori les 20% les plus critiques).</p>
<p><strong>Et concrêtement ?</strong></p>
<p>Une fois vos règles de normalisation définies, utilisez l’option  « <a href="http://msdn.microsoft.com/en-us/library/dd239405.aspx">configuration file </a>» de SQL Server Installation Center pour faciliter l’installation :</p>
<ol>
<li>Lancez une installation classique en vous arrêtant à la dernière étape. Rien ne sera installé, mais un fichier de configuration sera généré.</li>
<li>Editez ce fichier en remplaçant certaines valeurs par des variables (nom d’instance, chemin des fichiers de données et de journaux, compte de service, …), afin d’en faire un modèle.</li>
<p><em> Exemple de fichier &laquo;&nbsp;configurationfile.modele&nbsp;&raquo; issu d&#8217;une installation de SQL Server 2012:</em><br />
<code>[OPTIONS]<br />
ACTION="Install"<br />
ENU="True"<br />
UIMODE="Normal"<br />
QUIET="False"<br />
QUIETSIMPLE="False"<br />
UpdateEnabled="False"<br />
FEATURES=SQLENGINE<br />
UpdateSource="MU"<br />
HELP="False"<br />
INDICATEPROGRESS="False"<br />
INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"<br />
INSTANCENAME="%INSTANCE%"<br />
INSTANCEID="%INSTANCE%"<br />
SQMREPORTING="False"<br />
ERRORREPORTING="False"<br />
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"<br />
AGTSVCACCOUNT="%COMPTESERVICE%"<br />
AGTSVCPASSWORD="%MDPCOMPTESERVICE%"<br />
AGTSVCSTARTUPTYPE="Automatic"<br />
COMMFABRICPORT="0"<br />
COMMFABRICNETWORKLEVEL="0"<br />
COMMFABRICENCRYPTION="0"<br />
MATRIXCMBRICKCOMMPORT="0"<br />
SQLSVCSTARTUPTYPE="Automatic"<br />
FILESTREAMLEVEL="0"<br />
ENABLERANU="False"<br />
SQLCOLLATION="French_CI_AS"<br />
SQLSVCACCOUNT="%COMPTESERVICE%"<br />
SQLSVCPASSWORD="%MDPCOMPTESERVICE%"<br />
SQLSYSADMINACCOUNTS="%GROUPESYSADMIN%"<br />
SECURITYMODE="SQL"<br />
SQLBACKUPDIR="D:\BACKUP\%INSTANCE%"<br />
SQLUSERDBDIR="D:\DATA\%INSTANCE%"<br />
SQLUSERDBLOGDIR="D:\TLOG\%INSTANCE%"<br />
SQLTEMPDBDIR="D:\DATA\%INSTANCE%"<br />
SQLTEMPDBLOGDIR="D:\TLOG\%INSTANCE%"<br />
ADDCURRENTUSERASSQLADMIN="False"<br />
TCPENABLED="1"<br />
NPENABLED="0"<br />
BROWSERSVCSTARTUPTYPE="Automatic"</code></p>
<li>Créez un fichier de commandes qui valorise les variables, génère à la volée un fichier de configuration puis appelle le setup.exe de SQL Server en utilisant le fichier de configuration généré.</li>
<p><em>Exemple de script d&#8217;installation &laquo;&nbsp;install_sql.cmd&nbsp;&raquo;</em><br />
<code>@echo off<br />
del configurationfile.ini<br />
echo Nom de l'instance à installer:<br />
set /p INSTANCE=<br />
echo Compte de Service windows:<br />
set /p COMPTESERVICE=<br />
echo Mot de passe du compte de Service windows<br />
set /p MDPCOMPTESERVICE=<br />
echo Groupe(s) Sysadmin:<br />
set /p GROUPESYSADMIN=</code></p>
<p><code>for /f "delims=" %%i in ('type configurationfile.modele') do (<br />
call echo %%i&gt;&gt;configurationfile.ini<br />
)</code></p>
<p><code> </code></p>
<p><code>I:\setup.exe /configurationfile=configurationfile.ini<br />
</code></p>
<li>Créez un script sql contenant toutes les modifications de configuration correspondant à votre banalisation, et lancez le après chaque installation (le lancement peut bien entendu être inclus dans le script d&#8217;installation&#8230;)</li>
</ol>
<p><em>Exemple de script de banalisation &laquo;&nbsp;banalisation.sql&nbsp;&raquo;</em></p>
<pre name="code" class="sql">
/***************************************************************************
   ^
  / \
 / ! \	ATTENTION
/_____\

Les modifications proposées dans ce script auront un impact
sur le fonctionnement de votre instance SQL Server (performances, sécurité).
Il est donc impératif de prendre connaissance des modifications proposées et
de ne les mettre en place que lorsque les impacts sont maîtrisés.

Cap Data consulting ne saurait être tenue responsable des conséquences du
lancement de ce script sur un système.
**************************************************************************/
set nocount on
declare @commande varchar(200), @cpus int, @memoire_physique int, @MAX_DOP int, @MEMOIRE_INSTANCE int, @chemin_fichiers_tempdb nvarchar(520), @compteur int
select @cpus=cpu_count, @memoire_physique=physical_memory_in_bytes/1048576 from sys.dm_os_sys_info

SELECT	 @MAX_DOP=4				--Degré max de parallélisme
		,@MEMOIRE_INSTANCE=512 --Mémoire à allouer à l'instance

IF (@MAX_DOP&gt;@cpus)select @MAX_DOP=@cpus
IF (@MEMOIRE_INSTANCE &gt; @memoire_physique - 512)select @MEMOIRE_INSTANCE = @memoire_physique - 512 

-- Paramètres de l'instance
EXEC sp_configure 'show advanced options', 1
reconfigure
create table #parametres(nom nvarchar(35), valeur int)
insert into #parametres values	('max degree of parallelism', @MAX_DOP),
								('min server memory (MB)', @MEMOIRE_INSTANCE),
								('max server memory (MB)', @MEMOIRE_INSTANCE),
								('remote admin connections',1 ),
								('xp_cmdshell', 1),
								('backup compression default', 1)

DECLARE CURSEUR_PARAMETRES INSENSITIVE CURSOR FOR
select 'sp_configure '''+nom+''', '+cast(valeur as varchar(10)) from #parametres P
inner join sys.configurations C ON P.nom=C.name
WHERE P.valeur !=cast(C.value as int)
and P.valeur between cast(C.minimum as int) and cast(C.maximum as int)
order by nom 

OPEN CURSEUR_PARAMETRES
FETCH NEXT FROM CURSEUR_PARAMETRES  into @commande
WHILE(@@FETCH_STATUS=0)
BEGIN
	PRINT @commande
	EXEC(@commande)
	FETCH NEXT FROM CURSEUR_PARAMETRES  into @commande
END
CLOSE CURSEUR_PARAMETRES
DEALLOCATE CURSEUR_PARAMETRES
drop table #parametres

--Modification de TempDB
alter database tempdb modify file(name='tempdev', SIZE=128 MB, MAXSIZE = UNLIMITED, FILEGROWTH= 128 MB)
select @chemin_fichiers_tempdb=replace(physical_name,'tempdb.mdf','') from tempdb.sys.database_files where file_id=1
select @compteur=count(1)+1 FROM tempdb.sys.database_files where type_desc='ROWS'
WHILE(@compteur &lt; =@cpus)
BEGIN
	set @commande='ALTER DATABASE tempdb ADD FILE (NAME=''tempdev_'+cast(@compteur as varchar(3))+''', FILENAME='''+@chemin_fichiers_tempdb+'tempdb_'+cast(@compteur as varchar(3))+'.ndf'', SIZE=128 MB, MAXSIZE=UNLIMITED, FILEGROWTH=128 MB)'
	PRINT @commande
	select @compteur = @compteur + 1
END

--Modification de Model
alter database model modify file(name='modeldev', MAXSIZE = UNLIMITED, FILEGROWTH= 128 MB)
alter database model modify file(name='modellog', MAXSIZE = UNLIMITED, FILEGROWTH= 128 MB)
alter database model set recovery SIMPLE</pre>
<p>Enfin, sachez que grâce au mécanisme de &laquo;&nbsp;<a href="http://technet.microsoft.com/en-us/library/bb510667.aspx">Policy Management</a>&nbsp;&raquo; de SQL Server, vous disposez d&#8217;un moyen simple de vérifier régulièrement que la configuration des instances est toujours celle que vous avez défini à l&#8217;installation.<br />
<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<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/production-sql-server-lapproche/" rel="bookmark" title="27 février 2012">Production SQL Server : L&#8217;approche</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/" rel="bookmark" title="7 mars 2012">Production SQL Server : Ordonnancement</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/" rel="bookmark" title="2 avril 2012">Production SQL Server: Réorganisation des objets</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.828 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%2Fproduction-sql-server-banalisation-des-instances%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-banalisation-des-instances%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/oXwPPq-iBKo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server : Contrôle de cohérence</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/uOr708pA2ig/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 12:40:56 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3287</guid>
		<description><![CDATA[Sixième  article de la série Une approche pragmatique de la production SQL Server, c’est le contrôle de cohérence des objets d’une base qui est abordé ici.
Cohérence d’un objet ?
Un fichier de données est constitué de pages (ensembles contigu de 8 k. octets). Lorsque SQL Server écrit une page sur disque, il calcule une signature [...]]]></description>
			<content:encoded><![CDATA[<p>Sixième  article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, c’est le contrôle de cohérence des objets d’une base qui est abordé ici.</p>
<p><strong>Cohérence d’un objet ?</strong><br />
Un fichier de données est constitué de pages (ensembles contigu de 8 k. octets). Lorsque SQL Server écrit une page sur disque, il calcule une signature (CHECKSUM) sur quelques octets et l’écrit dans l’entête de la page. Cette signature est recalculée lors d’une lecture et comparée à la valeur stockée dans l’entête pour garantir la cohérence.</p>
<p>Cet entête contient aussi plusieurs informations comme l’objet auquel elle appartient, la page qui la précède dans le chaînage de l’objet et la page qui la suit. Certaines pages spécifiques (pages IAM) listent l’ensemble des pages d’un objet.</p>
<p><strong>Problème de cohérence ?</strong><br />
Lors de la lecture d’une page depuis le disque, la signature est calculée et comparée à la signature stockée. Si les deux valeurs sont différentes, la page est considérée non cohérente.<br />
Si la page IAM d’un objet référence une page, et que cette page référence un autre objet, il y a incohérence.<br />
Si une page A désigne une page B comme « suivante » dans le chaînage et que cette page B ne désigne  pas la page A comme « précédente », il y a incohérence.<br />
SQL Server refusera de lire une page incohérente et renverra une erreur (que cette lecture corresponde à un « select » ou un « backup database » par exemple…).</p>
<p><strong>Et concrêtement ?</strong><br />
Lorsqu’une page est incohérente, certains objets ne seront plus consultables, et les tâches de maintenance critiques comme la sauvegarde ne fonctionneront plus. Il est donc important de détecter au plus vite un problème de cohérence.</p>
<p>Il est possible de récupérer une page corrompue sans perdre de données sous certaines conditions :<br />
•	Soit la page corrompue appartient à un indexe non clustérisé. La page ne contient donc aucune donnée, l’indexe peut être reconstruit sans risque (option REPAIR_REBUILD de la commande DBCC CHECKDB)<br />
•	Soit la base est en miroir. Le mécanisme <a href="http://msdn.microsoft.com/en-us/library/bb677167.aspx">Automatic Page Repair</a> (à partir de SQL Server 2008 ) utilisera la base miroir pour récupérer la page corrompue.<br />
•	Soit la base est en mode de recouvrement COMPLET. Il est possible de restaurer une ou plusieurs pages (à partir de la dernière sauvegarde de base) puis de réappliquer les modifications sur ces pages (restauration des sauvegardes transactionnelles). Cette opération entraine une indisponibilité, mais elle est minime.</p>
<p>Donc si vos bases sont en miroir ou qu’elles sont en mode de recouvrement COMPLET, la fréquence de lancement du contrôle de cohérence peut être plus faible. Pour les autres bases, la fréquence de lancement dépend de la perte de données acceptable.</p>
<p><strong>En pratique</strong><br />
Le lancement du contrôle est simple, puisqu’il consiste simplement à lancer la commande DBCC CHECKDB.<br />
Le script suivant permet de lancer DBCC CHECKDB sur toutes les bases, à l’exception des Snapshots, de tempdb et des bases en lecture seule, et ne remonte que les messages d’erreur :<br />
<code>EXEC sp_msforeachdb 'IF (CAST(DATABASEPROPERTYEX(''?'',''Updateability'') as varchar(15)) = ''READ_WRITE'' AND ''?'' NOT IN (''tempdb''))<br />
DBCC CHECKDB(''?'')  WITH  NO_INFOMSGS, ALL_ERRORMSGS<br />
'</code></p>
<p>Un fichier de dump est créé chaque fois que DBCC CHECKDB rencontre une erreur de cohérence. La remonté d’alertes lors de corruption peut donc correspondre à l’arrivée d’un nouveau fichier SQLDUMP&lt;Id&gt;.txt ( où &lt;Id&gt; est un nombre à 4 chiffres qui s’incrémente automatiquement).<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/" rel="bookmark" title="26 mars 2012">Production SQL Server : Les Statistiques</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/msg-2508-level-16-state-1-the-in-row-data-for-object-is-incorrect/" rel="bookmark" title="10 mai 2011">Msg 2508, Level 16, State 1: the In-Row data %% for object %% is incorrect</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/" rel="bookmark" title="2 avril 2012">Production SQL Server: Réorganisation des objets</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.509 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%2Fproduction-sql-server-controle-de-coherence%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-controle-de-coherence%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/uOr708pA2ig" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/</feedburner:origLink></item>
		<item>
		<title>Oracle Text pour DBA Oracle : Partie 2</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/qOxp1hJITTo/</link>
		<comments>http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-partie-2-3/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 15:04:00 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[ctxsys]]></category>
		<category><![CDATA[Oracle TEXT]]></category>
		<category><![CDATA[REBUILD ONLINE PARAMETERS]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-partie-2-3/</guid>
		<description><![CDATA[Contrairement à des index relationnels, les index Oracle Text ne sont généralement pas maintenus en temps réel.      Il faut donc en tenir compte pour une activité transactionnelle.
Même s’il est possible de le faire, cela procure un travail considérable et un souci de fragmentation.
Lorsque l’on effectue des inserts/update, il est nécessaire [...]]]></description>
			<content:encoded><![CDATA[<p><font color="#000000" size="3">Contrairement à des index relationnels, les index Oracle Text ne sont généralement pas maintenus en temps réel.      <br />Il faut donc en tenir compte pour une activité transactionnelle.</font></p>
<p><font color="#000000" size="3">Même s’il est possible de le faire, cela procure un travail considérable et un souci de fragmentation.</font></p>
<p><font color="#000000" size="3">Lorsque l’on effectue des inserts/update, il est nécessaire de synchroniser la table $I.</font></p>
<p><font color="#000000" size="3">Un article intéressant : </font><a href="http://www.oracle.com/technetwork/database/enterprise-edition/text-dml-processing-092316.html"><font color="#0000ff" size="3">http://www.oracle.com/technetwork/database/enterprise-edition/text-dml-processing-092316.html</font></a></p>
<h6><font size="3"></font><font face="Times New Roman"></font><font color="#000000">1</font><font size="3">) Activité DML</font></h6>
<h6><font color="#000000"></font><font style="font-weight: normal" size="3"><em>a)&#160; Lors de l’INSERT</em></font></h6>
<p><font color="#000000" size="3">Lorsque qu’une ligne est ajoutée dans la table utilisateur, une ligne contenant INDEX_ID et ROWID est ajoutée dans la table CTXSYS.DR$PENDING.</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt;  insert <span class="kwrd">into</span> test_tab <span class="kwrd">values</span> (<span class="str">'ef'</span>);
<span class="kwrd">SQL</span>&gt; <span class="kwrd">select</span> * <span class="kwrd">from</span> CTXSYS.DR$PENDING;
PND_CID    PND_PID PND_ROWID          PND_TIMES P
--------<span class="rem">-- ---------- ------------------ --------- -</span>
1080          0 AAARvbAAFAAAADMAAA 29-MAR-12 N <span class="rem">-- valeur précédente</span>
1080          0 AAARvbAAFAAAADMAAB 29-MAR-12 N <span class="rem">-- valeur précédente</span>
1080          0 AAARvbAAFAAAADMAAC 30-MAR-12 N -- nouvelle valeur</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">Rem : si une modification est faite sur la même ligne, la ligne est placée dans CTXSYS.DR$WAITING</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt; <span class="kwrd">update</span> test_tab <span class="kwrd">set</span> CLOB_COL=<span class="str">'fg'</span> <span class="kwrd">where</span> ROWID=<span class="str">'AAARvbAAFAAAADMAAC'</span>;
<span class="kwrd">SQL</span>&gt; <span class="kwrd">select</span> * <span class="kwrd">from</span> CTXSYS.DR$WAITING ;
WTG_CID WTG_ROWID             WTG_PID
--------<span class="rem">-- ------------------ ----------</span>
1080 AAARvbAAFAAAADMAAC          0
<span class="kwrd">SQL</span>&gt; <span class="kwrd">commit</span>;</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">En conclusion :</font></p>
<p><font color="#000000" size="3">- aucune synchronisation de l’index Oracle n’est effectuée lors du COMMIT qui clôt l’INSERT</font></p>
<p><font color="#000000" size="3">- même si la valeur de la colonne indexée est nulle, la ligne est ajoutée dans CTXSYS.DR$PENDING</font></p>
<p><font color="#000000" size="3">- si la ligne est déjà en traitement dans CTXSYS.DR$PENDING, celle-ci est ajoutée dans CTXSYS.DR$WAITING</font></p>
<h6><font color="#000000"></font><font style="font-weight: normal" size="3"><em>b) Lors d’un DELETE&#160; :</em></font></h6>
<p><font color="#000000" size="3">Lors du commit qui clôt le DELETE:</font></p>
<p><font color="#000000" size="3">- la ligne correspondante avec le ROWID est immédiatement supprimée de DR$&lt;index_name&gt;$K :</font></p>
<p><font color="#000000" size="3">- une recherche sur ROWID en utilisant&#160;&#160; DR$&lt; index_name&gt;$K ne trouve plus la ligne</font></p>
<p><font color="#000000" size="3">- une ligne avec ROWID et INDEX_ID est insérée dans CTXSYS.DR$DELETE</font></p>
<p><font color="#000000" size="3">- un SELECT dans la session courante ne voit plus la ligne avant le commit</font></p>
<p><font color="#000000" size="3">- permet lors du « commit callback » de supprimer les lignes correspondantes de&#160; DR$&lt; index_name&gt;$R</font></p>
<p><font color="#000000" size="3">- une ligne avec ROWID est insérée dans DR$&lt;index_name&gt;$N</font></p>
<p><font color="#000000" size="3">- permet la suppression des DOCID dans la table&#160; DR$&lt;index_name&gt;$I lors d’une optimisation</font></p>
<p><font color="#000000" size="3">En conclusion :</font></p>
<p><font color="#000000" size="3">Un DELETE est immédiatement pris en compte :</font></p>
<p><font color="#000000" size="3">- dans la session courante : on ne voit plus la ligne</font></p>
<p><font color="#000000" size="3">- dans une autre session : on ne voit plus la ligne au commit</font></p>
<h6><font color="#000000" size="3"><em><font style="font-weight: normal">c) Lors d’un UPDATE</font></em></font></h6>
<p><font color="#000000" size="3">Il agit comme un DELETE suivi d’un INSERT.</font></p>
<p><font color="#000000" size="3">En conclusion :</font></p>
<p><font color="#000000" size="3">- seule la partie DELETE sera visible après le commit</font></p>
<p><font color="#000000" size="3">- tout UPDATE sur la colonne entraine la non visibilité du document</font></p>
<h6><font color="#000000" size="3"></font><font style="font-weight: normal"><em>d) Lors du COMMIT</em></font></h6>
<p><font color="#000000" size="3">Au commit , un « commit callback » est généré :</font></p>
<p><font color="#000000" size="3">- pour chaque DOCID de DR$DELETE, une mise à jour de la colonne LOB de&#160; DR$&lt; index_name&gt;$R est effectuée pour le ROWID</font></p>
<p><font color="#000000" size="3">- la ligne est ensuite effacée de DR$DELETE</font></p>
<h5><font color="#000000" size="3" face="Times New Roman">2) Mise en place de la synchronisation Oracle TEXT</font></h5>
<p><font color="#000000" size="3">Lorsque l’on effectue des inserts/update, il est nécessaire de synchroniser la table $I.</font></p>
<p><font color="#000000" size="3">Il existe plusieurs possibilités&#160; :</font></p>
<p><font color="#000000" size="3"><em>1) En manuel via ctx_ddl.sync_index</em></font></p>
<p><font color="#000000" size="3">– utilisation d’une mémoire de 256M avec un parallélisme 2</font></p>
<pre class="csharpcode"><span class="kwrd">exec</span> ctx_ddl.sync_index(<span class="str">'TEST_IDX'</span>,<span class="str">'256M'</span>,<span class="kwrd">NULL</span>,2);</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">Rem : ne pas utiliser Alter Index … Rebuild Online Parameters (’sync’)</font></p>
<p><font color="#000000" size="3">2) Sinon, il est possible à partir de la 10g de placer les paramètres SYNC EVERY ‘interval’ (via DBMS_SCHEDULER)</font></p>
<pre class="csharpcode"><font size="1"><span class="kwrd">SQL</span>&gt; <span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> test_idx REBUILD ONLINE  <span class="kwrd">PARAMETERS</span> (<span class="str">' REPLACE sync (every &quot;sysdate+(1/24)&quot; MEMORY 64M PARALLEL 2)'</span>) PARALLEL 2 ;</font></pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">ou mieux via METADATA car évite le rebuild de l’index</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt; <span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> test_idx REBUILDPARAMETERS (<span class="str">' REPLACE METADATA sync (every &quot;sysdate+(1/24)&quot; MEMORY 64M PARALLEL 2)'</span>) ;
<span class="rem">-- création d'un job via DBMS_SCHEDULER</span>
<span class="kwrd">SQL</span>&gt; <span class="kwrd">select</span> JOB_ACTION <span class="kwrd">from</span> USER_SCHEDULER_JOBS <span class="kwrd">where</span> job_name=<span class="str">'DR$TEST_IDX$J'</span>;
JOB_ACTION
-------------------------------------------------------------------------------------------------------------------</pre>
<pre class="csharpcode">ctxsys.drvdml.auto_sync_index(<span class="str">'TEST_IDX'</span>, 67108864, <span class="kwrd">NULL</span>, 2, <span class="kwrd">NULL</span>, 0);</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">3) Une synchronisation peut avoir lieu au COMMIT</font></p>
<p><font color="#000000" size="3">Peut être intéressant pour un commit de plusieurs milliers de lignes</font></p>
<p><font color="#000000" size="3">Le COMMIT est envoyé une fois que la synchronisation est effectuée.</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt;<span class="kwrd">create</span> <span class="kwrd">index</span> test_idx <span class="kwrd">on</span> test_tab (clob_col) indextype <span class="kwrd">is</span> ctxsys.context <span class="kwrd">parameters</span> (<span class="str">'sync (on commit)'</span>);
<span class="rem">-- ou</span>

<span class="kwrd">SQL</span>&gt;<span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> test_idx REBUILD ONLINE  <span class="kwrd">PARAMETERS</span> (<span class="str">'REPLACE METADATA MEMORY 64M sync (on commit)'</span>) PARALLEL 2 ;</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000"></font><font size="3">4) Sinon il est possible d’utiliser le paramètre <strong>TRANSACTIONAL</strong></font></p>
<p><font color="#000000" size="3">Ce paramètre permet de voir les INSERT/DELETE validées en utilisant les tables DR$PENDING DR$WAITING </font><font color="#000000" size="3">et en effectuant une indexation à la volée</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt;<span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> test_idx REBUILD ONLINE  <span class="kwrd">PARAMETERS</span> (<span class="str">'REPLACE METADATA transactional'</span>);
<span class="kwrd">SQL</span>&gt; <span class="kwrd">select</span> * <span class="kwrd">from</span> test_tab <span class="kwrd">where</span> <span class="kwrd">CONTAINS</span>(clob_col,<span class="str">'ab'</span>) &gt; 0;
<span class="kwrd">no</span> <span class="kwrd">rows</span> selected
<span class="kwrd">SQL</span>&gt; insert <span class="kwrd">into</span> test_tab <span class="kwrd">values</span> (<span class="str">'ab'</span>);
<span class="kwrd">SELECT</span> pnd_index_name, pnd_rowid , TO_CHAR(pnd_timestamp, <span class="str">'dd-mon-yyyyhh24:mi:ss'</span>) <span class="kwrd">timestamp</span>
<span class="kwrd">FROM</span> ctx_user_pending;
PND_INDEX_NAME                 PND_ROWID          <span class="kwrd">TIMESTAMP</span>
----------------------------<span class="rem">-- ------------------ -------------------</span>
TEST_IDX                       AAARvbAAFAAAADPAAA 03-apr-201216:40:11
<span class="kwrd">SQL</span>&gt; <span class="kwrd">select</span> * <span class="kwrd">from</span> test_tab <span class="kwrd">where</span> <span class="kwrd">CONTAINS</span>(clob_col,<span class="str">'ab'</span>) &gt; 0;
CLOB_COL
------------------------------------------------------------------------------<span class="rem">--</span>
ab</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">Il est possible pour des questions de performances de désactiver cette fonctionnalité dans la session par une variable PL/SQL :</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt; <span class="kwrd">exec</span> ctx_query.disable_transactional_query := <span class="kwrd">TRUE</span>;
<span class="kwrd">SQL</span>&gt; <span class="kwrd">select</span> * <span class="kwrd">from</span> test_tab <span class="kwrd">where</span> <span class="kwrd">CONTAINS</span>(clob_col,<span class="str">'ab'</span>) &gt; 0;
<span class="kwrd">no</span> <span class="kwrd">rows</span> selected
Pour la résactiver :
<span class="kwrd">SQL</span>&gt; <span class="kwrd">exec</span> ctx_query.disable_transactional_query := <span class="kwrd">FALSE</span>;</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">Sinon, il est possible de modifier l’index Oracle Text :</font></p>
<pre class="csharpcode"><span class="kwrd">SQL</span>&gt; <span class="kwrd">ALTER</span> <span class="kwrd">INDEX</span> test_idx REBUILD ONLINE <span class="kwrd">PARAMETERS</span> (<span class="str">'REPLACE METADATA nontransactional'</span>);</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<h5><font color="#000000" size="3">2) Gérer la synchronisation</font></h5>
<p><font color="#000000" size="3">a) Pour optimiser la synchronisation, vous pouvez utiliser :</font></p>
<p><font color="#000000" size="3">- le parallélisme en Entreprise Edition</font></p>
<p><font color="#000000" size="3">- la clause memory avec une limite à 1 Go en 11gR2</font></p>
<p><font color="#000000" size="3">–&#160; modification possible de la valeur maximale :</font></p>
<pre class="csharpcode"><span class="kwrd">exec</span> ctxsys.ctx_adm.set_parameter(<span class="str">'MAX_INDEX_MEMORY'</span>,<span class="str">'2147483647'</span>);</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><font color="#000000" size="3">b) la clause </font><font color="#000000"><strong>transactional</strong></font> a un surcout en performance</p>
<p><font color="#000000" size="3">- nécessité de lire la table dr$unindexed</font></p>
<p><font color="#000000" size="3">c) le mot clé REBUILD METADATA évite la reconstruction de l’index</font></p>
<p><font color="#000000" size="3">Dans la troisième partie, nous allons continuer la gestion d’un index Oracle TEXT.</font></p>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-part-1/" rel="bookmark" title="2 avril 2012">Oracle Text pour DBA Oracle : Partie 1</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/creation-d%e2%80%99une-physical-standby-database/" rel="bookmark" title="8 mars 2010">Création d’un Dataguard physique</a> (Guillaume DEFENDINI) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/" rel="bookmark" title="2 avril 2012">Production SQL Server: Réorganisation des objets</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/oracle-les-rpms-et-les-dependances-avec-yum/" rel="bookmark" title="6 novembre 2009">Oracle, les Rpms plus de souci avec YUM</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/suppression-accidentelle-de-ligne-comment-retrouver-le-coupable/" rel="bookmark" title="6 octobre 2011">Suppression accidentelle de ligne : comment retrouver le coupable ?</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.161 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%2Foracle-text-pour-dba-oracle-partie-2-3%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Foracle-text-pour-dba-oracle-partie-2-3%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/qOxp1hJITTo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-partie-2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-partie-2-3/</feedburner:origLink></item>
		<item>
		<title>Oracle Text pour DBA Oracle : Partie 1</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/ZUNw3Rw0cLs/</link>
		<comments>http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-part-1/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 11:13:00 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Oracle TEXT]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3423</guid>
		<description><![CDATA[Nous allons explorer Oracle Text et son son administration en tant que DBA.
La premi&#232;re partie concerne l&#8217;installation et l&#8217;impl&#233;mentation.
Oracle est une base de donn&#233;es relationnelles, les donn&#233;es sont donc g&#233;r&#233;es en deux dimensions sous forme de table.
Certains types de donn&#233;es (g&#233;ographique, audio, vid&#233;o et texte) sont difficiles voire impossibles &#224; normaliser.
Historiquement des solutions non relationelles [...]]]></description>
			<content:encoded><![CDATA[<p>Nous allons explorer Oracle Text et son son administration en tant que DBA.</p>
<div id="_mcePaste">La premi&egrave;re partie concerne l&#8217;installation et l&#8217;impl&eacute;mentation.</div>
<div id="_mcePaste">Oracle est une base de donn&eacute;es relationnelles, les donn&eacute;es sont donc g&eacute;r&eacute;es en deux dimensions sous forme de table.</div>
<div id="_mcePaste">Certains types de donn&eacute;es (g&eacute;ographique, audio, vid&eacute;o et texte) sont difficiles voire impossibles &agrave; normaliser.</div>
<div id="_mcePaste">Historiquement des solutions non relationelles existaient avec Adabas ou Objectivity DB par exemple.</div>
<div id="_mcePaste">Oracle a am&eacute;lior&eacute; sa gestion des donn&eacute;es non relationnelles avec :</div>
<div id="_mcePaste" style="padding-left: 30px;">- Oracle Spatial : pour les donn&eacute;es g&eacute;ographiques</div>
<div id="_mcePaste" style="padding-left: 30px;">- Oracle Intermedia : pour les donn&eacute;es audio-vid&eacute;os</div>
<div id="_mcePaste" style="padding-left: 30px;">- Oracle Text : pour les donn&eacute;es textes</div>
<div id="_mcePaste">Ces fonctionnalit&eacute;s reposent essentiellement sur des colonnes de type LOB pour stocker les donn&eacute;es et un ensemble de proc&eacute;dures pour les g&eacute;rer.</div>
<div id="_mcePaste">Oracle Text est utilisable dans toutes les distibutions d&#8217;Oracle (SE, SE One, PE, EE) et ignorer son existence est une erreur.</div>
<div id="_mcePaste">Elle permet d&#8217;effectuer des recherches et de g&eacute;n&eacute;rer des rapports sur une vari&eacute;t&eacute; de format (html, xml, pdf, word..).</div>
<div id="_mcePaste">Son interface est ouverte et peut &ecirc;tre utilis&eacute;e par des logiciels tiers.</div>
<div id="_mcePaste">Sa compr&eacute;hension est indispensable &agrave; tout DBA Oracle.</div>
<p><span style="font-weight: bold;"> 1) V&eacute;rification de l&#8217;installation d&#8217; Oracle Text</span></p>
<div id="_mcePaste">- V&eacute;rifier la pr&eacute;sence du &nbsp;sch&eacute;ma&nbsp;&nbsp;ctxsys (mot de passe par d&eacute;faut ctxsys).</div>
<div id="_mcePaste">Attention le compte peut &ecirc;tre verrouill&eacute; (et doit le rester en production)</div>
<pre><em> SELECT * FROM ctxsys.ctx_version;</em></pre>
<div id="_mcePaste">-Son installation est faite en standard.</div>
<div id="_mcePaste">N&eacute;anmoins si l&#8217;option n&#8217;a pas &eacute;t&eacute; install&eacute;e vous pouvez utiliser la d&eacute;marche suivante :</div>
<pre>&nbsp; conn SYS/syspasswd AS SYSDBA
&nbsp; @?/ctx/admin/catctx.sql mypasswd SYSAUX TEMP NOLOCK</pre>
<div id="_mcePaste">&#8211;pour le langage de pr&eacute;f&eacute;rence par d&eacute;faut drdefxx.sql (English(us),French(f),..)</div>
<pre>conn CTXSYS/mypasswd
@?/ctx/admin/defaults/drdefus.sql</pre>
<div id="_mcePaste">- Par d&eacute;faut le sh&eacute;ma se trouve sur le tablespace SYSAUX</div>
<pre>select space_used_kbytes from v$sysaux_occupants where occupant_name='TEXT';</pre>
<div id="_mcePaste">Il est possible de modifier le tablespace, par exemple vers le tablespace TBS_CONTEXT &nbsp;:</div>
<pre>execute ctxsys.dri_move_ctxsys(tbs_name=&gt;'TBS_CONTEXT');</pre>
<p><span style="font-weight: normal;"><strong>2) Cr&eacute;ation d&#8217;un index Oracle Text simple</strong></span></p>
<pre>create tablespace TBS_TEXT datafile '+DATA' size 10M autoextend on maxsize 200M</pre>
<pre style="padding-left: 180px;">&nbsp;extent management local uniform size &nbsp;64K;</pre>
<pre>CREATE USER user_text IDENTIFIED BY text DEFAULT TABLESPACE TBS_TEXT</pre>
<pre style="padding-left: 90px;">TEMPORARY TABLESPACE temp PROFILE default QUOTA UNLIMITED ON TBS_TEXT;</pre>
<div id="_mcePaste">&#8211; droits n&eacute;cessaires</div>
<pre>GRANT EXECUTE ON ctxsys.ctx_ddl TO user_text;
GRANT CTXAPP TO user_text;
GRANT CREATE PROCEDURE TO user_text;
GRANT CREATE SESSION TO user_text;
GRANT CREATE TABLE TO user_text;
GRANT SELECT ANY DICTIONARY TO user_text;
GRANT CREATE JOB to user_text;
GRANT CREATE TRIGGER to user_text;</pre>
<div id="_mcePaste">&#8211; jeu de test</div>
<pre>CONNECT user_text/text
create table test_tab (clob_col clob);
create index test_idx on test_tab (clob_col) indextype is ctxsys.context;
commit;
insert into test_tab values ('c a b d');
insert into test_tab values ('ab');
commit;</pre>
<div id="_mcePaste">&#8211; requ&ecirc;te de test de filtre</div>
<pre>select * from test_tab where CONTAINS(clob_col,'ab') &gt; 0;</pre>
<h3><span style="font-weight: normal;">3) Structure interne</span></h3>
<div id="_mcePaste">Un index Oracle Text utilise &nbsp;l&#8217;environnement &laquo;&nbsp;Extensibility Framework&nbsp;&raquo; appel&eacute; parfois cartouche.</div>
<div id="_mcePaste">L&#8217;objectif est de donner aux d&eacute;v&eacute;loppeurs la possibilit&eacute; de cr&eacute;er leurs propres types d&#8217;index.</div>
<div id="_mcePaste">Un index doit ramener un ensemble de ROWID, il est n&eacute;cessaire de g&eacute;rer la mise &agrave; jour de l&#8217;index et toutes les op&eacute;rations associ&eacute;es.</div>
<div id="_mcePaste">La cr&eacute;ation d&#8217;un index Oracle Text repose sur des objets Oracle et sur des routines de mises &agrave; jour contenues dans le noyau.</div>
<div id="_mcePaste">Regardons ce que la cr&eacute;ation d&#8217;un index de domaine simple a cr&eacute;e :</div>
<p><span style="font-weight: normal;"><span style="text-decoration: underline;">Au niveau table :</span></span></p>
<pre>select table_name,IOT_TYPE, tablespace_name from USER_TABLES ;
TABLE_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IOT_TYPE &nbsp; &nbsp; TABLESPACE_NAME
------------------------------ ------------ ------------------------------
DR$TEST_IDX$K &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IOT
DR$TEST_IDX$N &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IOT
DR$TEST_IDX$R &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TBS_TEXT
DR$TEST_IDX$I &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TBS_TEXT
TEST_TAB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TBS_TEXT</pre>
<div id="_mcePaste">- 4 tables ont et&eacute; cr&eacute;es, elles se nomment DR&lt;index_text_name&gt;&lt;K,N,R,I&gt;</div>
<div id="_mcePaste">- 2 tables sont des IOTs</div>
<p><span style="font-weight: normal;"><span style="text-decoration: underline;">Au niveau des index :</span></span></p>
<pre>select index_name,table_name, tablespace_name,INDEX_TYPE from user_indexes
where INDEX_TYPE in ('DOMAIN','NORMAL','IOT - TOP')
INDEX_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TABLE_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TABLESPACE_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INDEX_TYPE
------------------------------ ------------------------------ ------------------------------ ----------
TEST_IDX &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TEST_TAB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DOMAIN
SYS_IOT_TOP_72679 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DR$TEST_IDX$N &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TBS_TEXT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IOT - TOP
SYS_IOT_TOP_72674 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DR$TEST_IDX$K &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TBS_TEXT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IOT - TOP
DR$TEST_IDX$X &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DR$TEST_IDX$I &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TBS_TEXT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NORMAL</pre>
<div id="_mcePaste">Nous avons la structure des 2 IOTS &lt;SYS_IOT_TOP_&gt;.. et un index DR$TEST_IDX$X sur la table DR$TEST_IDX$I</div>
<p><span style="font-weight: normal;"><span style="text-decoration: underline;">Au niveau des colonnes LOB :</span></span></p>
<pre>SELECT table_name "Table", column_name "Column", segment_name "Segment" , index_name "Index"
FROM user_lobs
WHERE table_name like 'DR$%';
Table &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Column &nbsp; &nbsp; &nbsp; Segment &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Index
------------------------------ ------------ ------------------------------ ---------------------
DR$TEST_IDX$I &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOKEN_INFO &nbsp; SYS_LOB0000072671C00006$ &nbsp; &nbsp; &nbsp;SYS_IL0000072671C00006$
DR$TEST_IDX$R &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DATA &nbsp; &nbsp; &nbsp; &nbsp; SYS_LOB0000072676C00002$ &nbsp; &nbsp; &nbsp;SYS_IL0000072676C00002$</pre>
<div id="_mcePaste">Nous avons 2 colonnes de types LOB sur TOKEN_INFO et DATA sur les tables DR$TEST_IDX$I et DR$TEST_IDX$R</div>
<p><span style="font-weight: normal;"><span style="text-decoration: underline;">Conclusion :</span></span></p>
<div>Pour le DBA, la cr&eacute;ation d&#8217;un index Oracle Text entraine la cr&eacute;ation d&#8217;un ensemble d&#8217;objets &nbsp;:</div>
<div id="_mcePaste">- D&lt;index_name&gt;$I : Token table</div>
<div id="_mcePaste" style="padding-left: 30px;">- table des mots &#8216;Token&#8217;</div>
<div id="_mcePaste" style="padding-left: 30px;">- liste des mots avec position dans le document</div>
<div id="_mcePaste" style="padding-left: 30px;">- contient une colonne LOB token_info (repr&eacute;sentation binaire des documents les contenant)</div>
<div id="_mcePaste" style="padding-left: 30px;">- chaque document est repr&eacute;sent&eacute; par la valeur DOCID</div>
<div id="_mcePaste">- DR&lt;index_name&gt;$X :</div>
<div id="_mcePaste" style="padding-left: 30px;">- index B-tree sur la table $I, toutes les colonnes sauf la colonne lob</div>
<div id="_mcePaste">- DR&lt;index_name&gt;$N : Negative Row Table</div>
<div id="_mcePaste" style="padding-left: 30px;">- contient les DOCID supprim&eacute;s</div>
<div id="_mcePaste" style="padding-left: 30px;">- supprim&eacute; par le processus d&#8217;optimisation</div>
<div id="_mcePaste">- DR&lt;index_name&gt;$K : Table de mapping ROWID -&gt; DOCID</div>
<div id="_mcePaste" style="padding-left: 30px;">- Table IOT , recherche de DOCID &agrave; partir d&#8217;un rowid</div>
<div id="_mcePaste">- DR&lt;index_name&gt;$R : Table de mapping DOCID -&gt; ROWID</div>
<div id="_mcePaste" style="padding-left: 30px;">- Table IOT , recherche de rowid &agrave; partir d&#8217;un DOCID</div>
<div id="_mcePaste">- DR&lt;index_name&gt;$P : Optionnel ,IOT pour recherche rapide sur liste de mots (wordlist preference)</div>
<div id="_mcePaste">- DR&lt;index_name&gt;$R : Optionnel,si utilisation de param&egrave;tres FILTER BY ou ORDER BY</div>
<div>La deuxi&egrave;me partie concerne le comportement d&#8217;un index Oracle TEXT avec du DML</div>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-partie-2-3/" rel="bookmark" title="5 avril 2012">Oracle Text pour DBA Oracle : Partie 2</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/" rel="bookmark" title="12 octobre 2011">Regénérer le DDL des indexes FULL TEXT</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/bench-avec-netapp-datacore-esx/" rel="bookmark" title="26 avril 2011">Bench avec NetApp / Datacore / ESX</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/msg-2508-level-16-state-1-the-in-row-data-for-object-is-incorrect/" rel="bookmark" title="10 mai 2011">Msg 2508, Level 16, State 1: the In-Row data %% for object %% is incorrect</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.193 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%2Foracle-text-pour-dba-oracle-part-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Foracle-text-pour-dba-oracle-part-1%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/ZUNw3Rw0cLs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-part-1/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server: Réorganisation des objets</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/zh82v4a3ImU/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 08:01:29 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3268</guid>
		<description><![CDATA[Cinquième article de la série Une approche pragmatique de la production SQL Server, il s’agit ici de la défragmentation des objets.
Qu’est-ce que la fragmentation ?
Lorsqu’un objet (table ou indexe) subit des modifications, ses pages peuvent se vider partiellement (on parle de fragmentation interne) et certaines pages, voire certaines extensions (groupes de 8 pages contigües) peuvent se [...]]]></description>
			<content:encoded><![CDATA[<p>Cinquième article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, il s’agit ici de la défragmentation des objets.</p>
<p><strong>Qu’est-ce que la fragmentation ?</strong></p>
<p>Lorsqu’un objet (table ou indexe) subit des modifications, ses pages peuvent se vider partiellement (on parle de fragmentation interne) et certaines pages, voire certaines extensions (groupes de 8 pages contigües) peuvent se vider complètement (il s’agit alors de fragmentation externe).</p>
<p><strong>Quel est l’impact sur les performances ?</strong></p>
<p><em>Sur disque</em><br />
Pour lire une donnée sur disque physique, il faut :</p>
<p>Déplacer la tête de lecture du disque. Cette opération est longue, de l’ordre de 5 millisecondes en moyenne</p>
<p>Attendre que le secteur de données à lire passe sous la tête. Cette opération prend en moyenne entre 2 et 6 millisecondes (un demi-tour du disque, à une vitesse de rotation entre 5000 et 15000 tr/min)</p>
<p>Lorsque les secteurs à lire sont contigus (c.-à-d. placés physiquement à la suite les uns des autres), la tête de lecture n’a plus à se déplacer ; lire 100 secteurs contigus prend donc à peine plus de temps que d’en lire un seul (disons 5ms pour la tête+ 4ms pour le demi tour + 1ms pour la lecture des 100 secteurs=10ms contre 100x(6 + 4)=1000ms pour des secteurs non contigus).</p>
<p>Si l’objet est fragmenté, les déplacements de la tête de lecture seront plus fréquents, les temps de lecture seront donc (beaucoup) plus longs.</p>
<p><em>En mémoire</em><br />
Lorsqu’un objet n’est pas fragmenté, ses pages sont pleines. L’objet occupe donc moins de place que s’il était fragmenté. Un objet fragmenté occupera donc plus de place en mémoire qu’un objet non fragmenté, au détriment des autres objets.</p>
<p><em>Pour l&#8217;Optimizer</em><br />
Lorsque SQL Server calcule le coût d&#8217;une opération, il distingue une lecture séquentielle (considérée peu coûteuse) et une lecture aléatoire (considérée très coûteuse). Si un objet est fortement fragmenté, les lectures séquentielles deviennent plus coûteuses que ce qu&#8217;a estimé SQL Server, le plan d&#8217;exécution choisi n&#8217;est donc potentiellement plus optimal.</p>
<p><strong>Mesurer la fragmentation</strong></p>
<p>Depuis la version 2005 de SQL Server, le taux de fragmentation est directement consultable via une vue dynamique de gestion.</p>
<pre name="code" class="sql">
select object_name(I.object_id) 'Table', I.name 'Indexe', IPS.avg_fragmentation_in_percent 'Taux de Fragmentation'

FROM sys.dm_db_index_physical_stats(DB_ID(),DEFAULT, DEFAULT, DEFAULT,DEFAULT) IPS

inner join sys.indexes I ON I.object_id = IPS.object_id AND I.index_id = IPS.index_id

where IPS.index_level=0

and IPS.index_id !=0

order by 1,IPS.index_id,2
</pre>
<p><strong>Comment défragmenter ?</strong></p>
<p>Défragmenter un objet consiste à le compacter et à déplacer ses pages de manière à ce qu’elles soient contigües. L’action de défragmenter est la réorganisation, elle est gérée dans SQL Server par deux ordres :</p>
<pre name="code" class="sql">
ALTER INDEX REBUILD
--et
ALTER INDEX REORGANIZE
</pre>
<p>Lorsqu’une table ne contient pas d’indexe clusterisé, il faut soit l’exporter, la vider puis la réimporter (attention aux contraintes référentielles qui pourraient empêcher ces opérations), soit créer un indexe clusterisé puis le supprimer.</p>
<p>Lorsqu’elle en contient un, la méthode de défragmentation dépendra du taux de fragmentation observé.</p>
<p>(les valeurs ci-dessous sont relativement empiriques)</p>
<p>Taux &lt;5% Pas de défragmentation. La consommation des ressources liée à la défragmentation serait a priori supérieure au gain en performance résultant.</p>
<p>Taux compris entre 5 et 25% ALTER INDEX &lt;nom de l&#8217;indexe&gt; ON &lt;nom de la table&gt; REORGANIZE . La défragmentation s’opérera uniquement au niveau des feuilles de l’indexe/la table, mais sera relativement peu consommatrice en ressources.</p>
<p>Taux supérieur à 25% ALTER INDEX &lt;nom de l&#8217;indexe&gt; ON &lt;nom de la table&gt; REBUILD.</p>
<p>Cette méthode va reconstruire intégralement l’indexe/la table, opération consommatrice mais aboutissant à une table complètement défragmentée.</p>
<p>A noter que :</p>
<ul>
<li>La défragmentation est un processus très consommateur en ressources (disque et mémoire), il est donc à lancer en dehors des fortes périodes d’activité.</li>
<li>La défragmentation via ALTER INDEX REBUILD va mettre automatiquement à jour les statistiques. Inutile donc d’effectuer à nouveau cette mise à jour dans votre tâche de maintenance de mise à jour des stats (cf article 4).</li>
<li>En édition Enterprise, il est possible de réduire l’impact de la défragmentation en utilisant l’option ONLINE.</li>
<li>Le taux de fragmentation des tables de très petite volumétrie ne pourra être réduit à 0 (cf <a href="http://blog.capdata.fr/index.php/fragmentation-sur-des-tables-stockees-en-s-gam/">cet article</a>), c’est tout à fait normal !</li>
</ul>
<p>Voici un exemple de procédure stockée permettant de défragmenter les indexes d’une base :</p>
<pre name="code" class="sql">USE outils_dba

GO

IF OBJECT_ID('defragmente_base') IS NOT NULL

DROP PROCEDURE defragmente_base

GO

CREATE PROCEDURE defragmente_base (	@nom_base sysname,

@online varchar(3)='NON'

)

AS

/***************************************************************************************

B. Vesan, Cap Data Consulting, Février 2012

Cette procedure permet de défragmenter les indexes d'une base.

0&lt;Taux&lt;5	Pas de défragmentation

5&lt;=Taux&lt;25	REORGANIZE

25&lt;=Taux	REBUILD

Si la valeur du paramètre @online vaut 'OUI', la reconstruction sera effectuée avec l'

option ONLINE=ON

La procédure retournera 0 en cas de succès, 1 en cas d'échec.

***************************************************************************************/

BEGIN

SET NOCOUNT ON

DECLARE @cmd varchar(4000),@msg varchar(1000), @option varchar(100), @erreur int

CREATE TABLE #table_defrag(commande varchar(4000))

IF DB_ID(@nom_base) IS NULL

BEGIN

SET @msg = 'Echec de l'' exécution de defragmente_base : La base '+ISNULL(@nom_base,'(valeur nulle)')+' n''existe pas'

RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG

return 1

END

IF ( DATABASEPROPERTYEX(@nom_base,'Status ')!='ONLINE' OR EXISTS (select 1 FROM sys.databases WHERE name=@nom_base AND source_database_id IS NOT NULL))

BEGIN

SET @msg = 'La base '+@nom_base+' n''est pas disponible ou il s''agit d''un snapshot'

PRINT @msg

return 0

END

set @option = (CASE UPPER(@online) WHEN 'OUI' THEN ' WITH ( ONLINE = ON )' ELSE '' END)

set @cmd='USE ['+@nom_base+']

select ''ALTER INDEX [''+I.name+''] ON ['+@nom_base+'].[''+S.name+''].[''+T.name+''] ''+

(CASE WHEN IPS.avg_fragmentation_in_percent &gt;= 25 THEN ''REBUILD '+@option+''' ELSE ''REORGANIZE '' END)

FROM sys.dm_db_index_physical_stats(DB_ID(),DEFAULT, DEFAULT, DEFAULT,DEFAULT) IPS

inner join sys.indexes I ON I.object_id = IPS.object_id AND I.index_id = IPS.index_id

inner join sys.tables T ON T.object_id = I.object_id

inner join sys.schemas S ON S.schema_id = T.schema_id

where IPS.index_level=0

and IPS.index_id !=0

and IPS.avg_fragmentation_in_percent &gt;=5

AND alloc_unit_type_desc NOT IN(''LOB_DATA'')

order by object_name(I.object_id),IPS.index_id'

--PRINT @cmd

INSERT INTO #table_defrag

EXECUTE(@cmd)

DECLARE CURSEUR_INDEXES INSENSITIVE CURSOR FOR

select commande from #table_defrag

OPEN CURSEUR_INDEXES

FETCH NEXT FROM CURSEUR_INDEXES INTO @cmd

WHILE(@@FETCH_STATUS=0)

BEGIN

--	PRINT @cmd

EXECUTE(@cmd)

select @erreur=@@ERROR

IF @erreur !=0

BEGIN

SET @msg = 'Echec de l'' exécution de defragmente_base : Erreur '+CAST(@erreur as varchar(5))+' lors de l''appel à la commande "'+@cmd+'"'

RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG

CLOSE CURSEUR_INDEXES

DEALLOCATE CURSEUR_INDEXES

DROP TABLE #table_defrag

return 1

END

FETCH NEXT FROM CURSEUR_INDEXES INTO @cmd

END

CLOSE CURSEUR_INDEXES

DEALLOCATE CURSEUR_INDEXES

DROP TABLE #table_defrag

END

GO</pre>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/" rel="bookmark" title="26 mars 2012">Production SQL Server : Les Statistiques</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/" rel="bookmark" title="10 avril 2012">Production SQL Server : Contrôle de cohérence</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/" rel="bookmark" title="16 avril 2012">Production SQL Server : banalisation des instances</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/" rel="bookmark" title="12 octobre 2011">Regénérer le DDL des indexes FULL TEXT</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.383 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%2Fproduction-sql-server-reorganisation-des-objets%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-reorganisation-des-objets%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/zh82v4a3ImU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/</feedburner:origLink></item>
		<item>
		<title>SQL Server 2012 Developper Training Kit</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/MpKI5XY6HAo/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-2012-developper-training-kit/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 13:26:28 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[vidéos]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3396</guid>
		<description><![CDATA[Un wiki essentiel pour tous les développeurs désireux de monter en compétence sur SQL Server 2012: http://social.technet.microsoft.com/wiki/contents/articles/6982.sql-server-2012-developer-training-kit-bom.aspx. Des tonnes de ressources, liens vers les vidéos sur channel9, etc&#8230;
A+. David.Continuez votre lecture sur le blog :

Journées SQL Server à Paris les 12 et 13 décembre 2011 ! (David BAFFALEUF) [SQL Server]
How-To : réduire l&#8217;enveloppe de tempdb [...]]]></description>
			<content:encoded><![CDATA[<p>Un wiki essentiel pour tous les développeurs désireux de monter en compétence sur SQL Server 2012: <a href="http://social.technet.microsoft.com/wiki/contents/articles/6982.sql-server-2012-developer-training-kit-bom.aspx">http://social.technet.microsoft.com/wiki/contents/articles/6982.sql-server-2012-developer-training-kit-bom.aspx</a>. Des tonnes de ressources, liens vers les vidéos sur channel9, etc&#8230;</p>
<p>A+. David.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-a-paris-les-12-et-13-decembre-2011/" rel="bookmark" title="25 octobre 2011">Journées SQL Server à Paris les 12 et 13 décembre 2011 !</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/une-approche-pragmatique-de-la-production-sql-server/" rel="bookmark" title="27 février 2012">Une approche pragmatique de la production SQL Server</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/" rel="bookmark" title="2 mai 2012">Production SQL Server: Suivi et Contrôle du parc</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/" rel="bookmark" title="27 décembre 2011">Journées SQL Server 12/13 décembre (suite)</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.697 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%2Fsql-server-2012-developper-training-kit%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsql-server-2012-developper-training-kit%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/MpKI5XY6HAo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sql-server-2012-developper-training-kit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sql-server-2012-developper-training-kit/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server : Les Statistiques</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/hmIl-ZWChFg/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 12:46:15 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3222</guid>
		<description><![CDATA[Quatrième article de la série Une approche pragmatique de la production SQL Server, nous voyons ici la mise à jour des statistiques.
Quand SQL Server met-il à jour les statistiques ?

Lors de la réorganisation d’un indexe. Les statistiques sont dans ce cas mises à jour à partir de l’intégralité des pages de l’indexe (mode FULLSCAN)
Lorsque la [...]]]></description>
			<content:encoded><![CDATA[<p>Quatrième article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, nous voyons ici la mise à jour des statistiques.</p>
<p><strong>Quand SQL Server met-il à jour les statistiques ?</strong></p>
<ul>
<li>Lors de la réorganisation d’un indexe. Les statistiques sont dans ce cas mises à jour à partir de l’intégralité des pages de l’indexe (mode FULLSCAN)</li>
<li>Lorsque la base est en mode “auto_update_statistics”, que le seuil d’obsolescence d’une statistique a été atteint (<a href="http://technet.microsoft.com/en-us/library/dd535534(SQL.100).aspx">article MSDN sur le sujet</a>) et que la compilation d’une requête a besoin de cette statistique.</li>
</ul>
<p><strong>Faut-il mettre à jour les statistiques manuellement ?</strong><br />
Oui et Non !</p>
<p>Non, lorsque les bases sont de faible volumétrie et que l’activité transactionnelle n’est pas élevée; la gestion automatique des statistiques suffit amplement.</p>
<p>Oui, lorsque l’on sait que les statistiques ne sont plus représentatives bien avant le seuil des 20% (données réparties de manière  non homogène dans certaines tables), ou lorsque l’on ne peut pas se permettre d’ajouter à une compilation le temps mis à mettre à jour les statistiques.<br />
Dans le cadre d’un parc d’instances SQL Server, il est intéressant de disposer d’une tâche de gestion des statistiques exécutée sur toutes les instances qui mettra à jour ou non les statistiques selon quelques règles.</p>
<p><strong>Quelles statistiques mettre à jour ?</strong><br />
Chaque base de données peut contenir des données très volatiles et d’autres statiques, comme par exemple des tables d’historique, souvent volumineuses. Certaines tables peuvent être des tables de travail, régulièrement purgées, pour lesquelles les statistiques ne seront jamais pertinentes.<br />
Il faut donc trouver un mécanisme capable d’identifier les tables de travail et les tables qui n’ont pas subi de modification de données (depuis la dernière mise à jour).</p>
<p>Lorsqu’une donnée est mise à jour dans une table, la valeur de la colonne rowmdctr de la table système sysindexes s’incrémente(<a href="http://msdn.microsoft.com/fr-fr/library/ms190283.aspx">MSDN: sysindexes</a>). Cette colonne est remise à zéro lorsque les statistiques sont mises à jour. Récupérer la liste des statistiques qui ne sont pas totalement à jour consiste donc simplement à remonter les lignes de sysindexes à l’exception de celles pour lesquelles rowmodctr vaut 0 !<br />
(Comme son nom ne l’indique pas, sysindexes contient une entrée pour chaque indexe mais aussi pour chaque statistique de la base).</p>
<p>La mise à jour peut s’effectuer sur l’intégralité de l’objet (FULLSCAN) ou sur un échantillon (SAMPLE). La première méthode est plus longue que la seconde puisque les pages balayées sont plus nombreuses. Il existe un risque, même s’il est faible, qu’une statistique créée à partir d’un échantillon ne soit pas représentative (le mécanisme de statistiques filtrées de SQL Server 2008 peut aider à contourner ce problème). Pour les tables de faible volumétrie, la mise à jour en FULLSCAN est préférable. Pour les plus gros objets, le mode SAMPLE peut être utilisé, mais tâchez d’être toujours au moins à 20% de pages balayées.</p>
<p><strong>Attention, la mise à jour des statistiques a un double impact sur les performances:</strong><br />
La lecture des pages de chaque objet s’accompagne d’une pose de verrous partagés, ils entrent donc en concurrence avec les accès en modification sur l’objet.<br />
Les plans d’exécution en cache qui utilisent les statistiques mis à jour sont invalidés. Les prochaines exécutions de requêtes passeront donc nécessairement par la phase de compilation.<br />
il est donc préférable d’effectuer cette mise à jour lors d’une période de faible activité.</p>
<p>Voici un exemple de procédure stockée de mise à jour de statistiques qui repose sur ces quelques règles :</p>
<pre name="code" class="sql">USE outils_dba
GO
IF OBJECT_ID('maj_statistiques_base') IS NOT NULL
DROP PROCEDURE maj_statistiques_base
GO
CREATE PROCEDURE maj_statistiques_base ( @nom_base sysname,
@complet varchar(3)='NON'
)
AS
/***************************************************************************************
B. Vesan, Cap Data Consulting, Mars 2012
Cette procedure permet de mettre à jour les statistiques d'une base.

Si la valeur du paramètre @complet vaut 'OUI', l'intégralité des statistiques sera mise à jour.
Sinon, seules les statistiques sur les tables ayant reçu des mouvements seront mises à jour.

La procédure retournera 0 en cas de succès, 1 en cas d'échec.

***************************************************************************************/
BEGIN
SET NOCOUNT ON
DECLARE @cmd varchar(4000),@msg varchar(1000), @erreur int
CREATE TABLE #table_stats(commande varchar(4000))

IF DB_ID(@nom_base) IS NULL
BEGIN
SET @msg = 'Echec de l'' exécution de maj_statistiques_base : La base '+ISNULL(@nom_base,'(valeur nulle)')+' n''existe pas'
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END

IF ( DATABASEPROPERTYEX(@nom_base,'Status ')!='ONLINE' OR EXISTS (select 1 FROM sys.databases WHERE name=@nom_base AND source_database_id IS NOT NULL))
BEGIN
SET @msg = 'La base '+@nom_base+' n''est pas disponible ou il s''agit d''un snapshot'
PRINT @msg
return 0
END

set @cmd = 'USE ['+@nom_base+']
select ''UPDATE STATISTICS ['+@nom_base+'].[''+SCH.name+''].[''+T.name+''](''+SI.name+'') WITH RESAMPLE''
from sysindexes SI
inner join sys.tables T ON T.object_id = SI.id
inner join sys.stats S ON (S.object_id = SI.id AND S.stats_id=SI.indid)
inner join sys.schemas SCH ON (T.schema_id = SCH.schema_id)'
if UPPER(@complet) ='NON' set @cmd = @cmd + ' WHERE SI.rowmodctr 0'

--PRINT @cmd
INSERT INTO #table_stats
EXECUTE(@cmd)

DECLARE CURSEUR_INDEXES INSENSITIVE CURSOR FOR
select commande from #table_stats 

OPEN CURSEUR_INDEXES
FETCH NEXT FROM CURSEUR_INDEXES INTO @cmd

WHILE(@@FETCH_STATUS=0)
BEGIN
PRINT @cmd
EXECUTE(@cmd)
select @erreur=@@ERROR
IF @erreur !=0
BEGIN
SET @msg = 'Echec de l'' exécution de maj_statistiques_base : Erreur '+CAST(@erreur as varchar(5))+' lors de l''appel à la commande "'+@cmd+'"'
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
CLOSE CURSEUR_INDEXES
DEALLOCATE CURSEUR_INDEXES
DROP TABLE #table_stats
return 1
END
FETCH NEXT FROM CURSEUR_INDEXES INTO @cmd
END
CLOSE CURSEUR_INDEXES
DEALLOCATE CURSEUR_INDEXES
DROP TABLE #table_stats
END
GO</pre>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/" rel="bookmark" title="2 avril 2012">Production SQL Server: Réorganisation des objets</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/" rel="bookmark" title="16 avril 2012">Production SQL Server : banalisation des instances</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/" rel="bookmark" title="10 avril 2012">Production SQL Server : Contrôle de cohérence</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/" rel="bookmark" title="12 octobre 2011">Regénérer le DDL des indexes FULL TEXT</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.369 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%2Fproduction-sql-server-les-statistiques%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-les-statistiques%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/hmIl-ZWChFg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/</feedburner:origLink></item>
		<item>
		<title>Web Séminaire « Haute Disponibilité avec SQL Server »</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/6IuOmdYLMew/</link>
		<comments>http://blog.capdata.fr/index.php/web-seminaire-haute-disponibilite-avec-sql-server/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 08:32:05 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Haute Disponibilité]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3359</guid>
		<description><![CDATA[Bonjour,
Pour information, j'animerai un Web Séminaire mardi 3 avril. N'hésitez pas à vous inscrire si le sujet vous intéresse.]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.capdata.fr/wp-content/uploads/2012/03/blanc.png"><img src="http://blog.capdata.fr/wp-content/uploads/2012/03/blanc.png" alt="" title="blanc" width="1" height="1" class="alignnone size-full wp-image-3384" /></a>Bonjour,<br />
Pour information, j&#8217;animerai un Web Séminaire mardi 3 avril. N&#8217;hésitez pas à vous inscrire si le sujet vous intéresse.</p>
<table>
<tbody>
<tr>
<td width="41px"></td>
<td style="background: url(http://www.capdata.fr/images/cgwebsemsqls.gif); background-position: 0px 15px; background-repeat: no-repeat; text-align: left; vertical-align: top;" width="180px">
<p style="margin-left: 30px; margin-top: 200px; margin-bottom: 0px; margin-right: 0px; background-color: #f0f0f1; font-family: arial; font-size: 22px; color: #ec7211; font-weight: bold;">SÉMINAIRE<br />
INTERNET</p>
<p style="margin: 3px 0px 0px 30px; padding: 0px 0px 5px 0px; border-bottom: 1px solid #ccc; background-color: #f0f0f1; font-family: arial; font-size: 18px; color: #2c2e54; font-weight: bold; width: 150px;">Le 3 Avril 2012 à 10H00 depuis votre PC<br />
<span style="font-weight: normal;">Durée: 1H15</span></p>
<p><img alt="Web Séminaire" src="http://www.capdata.fr/images/cgwebsemsqls.gif" title="Web Séminaire" class="alignnone" width="1" height="1" />
</td>
<td style="background-image: url(http://www.capdata.fr/images/c2b.gif); background-position: right 3px; background-repeat: no-repeat; text-align: left; vertical-align: top; margin: 0px; padding: 0px;" width="318px">
<div style="background: #f0f0f1; margin: 30px 15px 0px 28px; padding: 0px;">
<table style="margin: 35px 0px 10px 0px;" width="275">
<tbody>
<tr>
<td style="background: #f0f0f1;" valign="top"><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="0" vspace="0" align="right" /></td>
<td class="tdc2">Concepts et notions de base de haute disponibilité</td>
</tr>
<tr>
<td style="background: #f0f0f1;" valign="top"><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="0" vspace="0" align="right" /></td>
<td class="tdc2">Présentation des solutions de Haute Disponibilité :</p>
<ul style="list-style: none; margin-top: 0px; padding-top: 8px; margin-left: 8px; padding-left: 8px; margin-bottom: 0px;">
<li><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="6" vspace="0" />Réplication,</li>
<li><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="6" vspace="0" />Cluster,</li>
<li><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="6" vspace="0" />Virtualisation,</li>
<li><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="6" vspace="0" />Cloud (SQL Azure),</li>
<li><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="6" vspace="0" />HADR-AG SQL Server 2012.</li>
</ul>
</td>
</tr>
<tr>
<td style="background: #f0f0f1;" valign="top"><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="0" vspace="0" align="right" /></td>
<td class="tdc2">Quelle solution pour quelle utilisation&#8230;Avec quels avantages et inconvénients ?</td>
</tr>
<tr>
<td style="background: #f0f0f1;" valign="top"><img src="http://www.capdata.fr/images/flpg.gif" alt="" hspace="0" vspace="0" align="right" /></td>
<td class="tdc2">Profitez gratuitement de notre retour d&#8217;expérience terrain et de notre éclairage technique objectif !</td>
</tr>
</tbody>
</table>
</div>
</td>
<td width="51px"></td>
</tr>
<tr>
<td style="margin: 0px; padding: 0px;" colspan="4" width="600" height="50"><a style="border: none; text-decoration: none; margin: 0px; padding: 0px;" href="http://www.capdata.fr/evenements.htm#ev1" target="blank"><img style="border: none; margin: 0px; padding: 0px;" src="http://www.capdata.fr/images/boutonbas.gif" alt="" hspace="0" vspace="0" width="600" height="57" align="left" /></a></td>
</tr>
</tbody>
</table>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/" rel="bookmark" title="2 mai 2012">Production SQL Server: Suivi et Contrôle du parc</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/" rel="bookmark" title="27 décembre 2011">Journées SQL Server 12/13 décembre (suite)</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/reunion-guss-le-1er-juillet/" rel="bookmark" title="23 juin 2010">Réunion GUSS le 1er juillet !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/" rel="bookmark" title="23 juin 2010">Abonnez-vous au blog de la CapData team !</a> (Cédric PEINTRE) [GénéralMySQLOracleSQL ServerSybase]</li>
</ul>
<p><!-- Similar Posts took 6.011 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%2Fweb-seminaire-haute-disponibilite-avec-sql-server%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fweb-seminaire-haute-disponibilite-avec-sql-server%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/6IuOmdYLMew" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/web-seminaire-haute-disponibilite-avec-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/web-seminaire-haute-disponibilite-avec-sql-server/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server : Sauvegardes</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/WOdAlD6cDMU/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 14:24:46 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3187</guid>
		<description><![CDATA[Troisième article de la série Une approche pragmatique de la production SQL Server, il est question ici de la gestion des sauvegardes du parc.
Petit rappel, en plus des bases utilisateurs, toutes vos bases systèmes doivent être sauvegardées:
Pourquoi il faut sauvegarder les bases système
L’idée est de trouver une politique applicable à toutes les instances du parc [...]]]></description>
			<content:encoded><![CDATA[<p>Troisième article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, il est question ici de la gestion des sauvegardes du parc.<br />
Petit rappel, en plus des bases utilisateurs, toutes vos bases systèmes doivent être sauvegardées:<br />
<a href="http://blog.capdata.fr/index.php/pourquoi-il-faut-sauvegarder-les-bases-systemes">Pourquoi il faut sauvegarder les bases système</a></p>
<p>L’idée est de trouver une politique applicable à toutes les instances du parc SQL Server.</p>
<p><strong><em>Quel type de sauvegardes ?</em></strong><br />
Le parc pouvant être composé de bases à vocations diverses, il est nécessaire de couvrir les activités principales: forte activité transactionnelle, forte volumétrie, bases d’archive, bases en miroir.<br />
D’expérience, une politique de type “Sauvegarde complète hebdomadaire + Sauvegarde différentielle quotidienne + Sauvegarde de journaux de transactions toutes les demi heures” convient en général très bien.<br />
L’emplacement et le nom des fichiers de sauvegarde suivront idéalement la règle établie (cf Article 1). La politique de nommage &lt;nom de la base&gt;_&lt;type de sauvegarde&gt;_&lt;date&gt;_&lt;heure&gt;.BAK permet d’identifier facilement un fichier de sauvegarde.</p>
<p><strong><em>Quelles options pour la sauvegarde ?</em></strong><br />
Depuis la version 2008 R2, la compression de sauvegardes est disponible pour les éditions Enterprise et Standard. Vous gagnerez du temps et de l’espace disque en utilisant cette option, elle est donc fortement recommandée.<br />
Profitez de la sauvegarde pour vérifier l’intégrité de vos pages. C’est automatiquement le cas lors des sauvegardes compressées.<br />
Préférez l’utilisation des fichiers uniques aux Media Sets (qui permettent de stocker plusieurs sauvegardes dans un même fichier), ces derniers peuvent être problématiques lors du passage sur bande des fichiers (le mediaset entier sera passé sur bande intégralement dès qu&#8217;une sauvegarde sera ajoutée).</p>
<p>Pour une utilisation simplifiée, créez un unique script (ou procédure stockée) pour gérer les différents types de sauvegarde d’une base. Ce script doit permettre la sauvegarde complète, différentielle et de journaux, et gérer les cas de bases non disponibles et de bases fraîchement créées (sur lesquelles une sauvegarde différentielle ou de journaux est impossible tant qu’une sauvegarde complète n’a pas été effectuée). Idéalement, le script proposera la sauvegarde de type “COPY_ONLY”, très pratique lorsqu’il s’agit de recopier les bases d’une instance sur une autre instance.</p>
<p>Voici un exemple de procédure stockée de sauvegarde qui prend en charge ces fonctionnalités:</p>
<pre name="code" class="sql">EXEC sp_configure 'show advanced options',1
reconfigure

EXEC sp_configure 'xp_cmdshell',1
reconfigure
GO

IF OBJECT_ID('sauvegarde_base') IS NOT NULL
DROP PROCEDURE sauvegarde_base
GO

CREATE PROCEDURE sauvegarde_base (
@nom_base sysname,
@type_sauvegarde varchar(50) = 'COMPLET',
@repertoire_destination varchar(500) = 'DEFAULT'
)
AS
/***************************************************************************************
B. Vesan, Cap Data Consulting, Février 2012
Cette procedure permet de sauvegarder une base de données ou son journal transactionnel.
@type_sauvegarde (type de la sauvegarde ) peut valoir:
COMPLET pour une sauvegarde complète, option par défaut
COPY_ONLY pour une sauvegarde complète sans interrompre la séquence des sauvegardes
DIFFERENTIEL pour une sauvegarde différentielle
LOG pour une sauvegarde du journal de transactions.
@repertoire_destination contient le chemin accueillant la sauvegarde.
un répertoire est créé dans le chemin spécifié
Lorsque sa valeur n'est pas précisée, la sauvegarde s'effectuera sur l'emplacement spécifié dans
la table "parametre", dont la définition peut être trouvée ici:

http://blog.capdata.fr/index.php/table_parametre

Le format des fichiers est:
&lt;nom de la base&gt;_&lt;type de sauvegarde&gt;_&lt;date&gt;_&lt;heure&gt;.BAK
ex: RMLBD_COMPLET_20120201_131738.BAK
La procédure retournera 0 en cas de succès, 1 en cas d'échec.
***************************************************************************************/
BEGIN
SET NOCOUNT ON
DECLARE @cmd varchar(4000),@prefixe_fichier varchar(100),@destination varchar(4000),/*@compteur int,*/@code_retour int,@msg varchar(1000),@fichier_source varchar(500)
CREATE TABLE #TABLE_OUTPUT(ligne varchar(500))
CREATE TABLE #TABLE_SOURCE (source varchar(500),cpt int)
CREATE TABLE #TABLE_DESTINATION (destination varchar(500),cpt int)

IF upper(@type_sauvegarde) NOT IN ('COMPLET','DIFFERENTIEL','COPY_ONLY','LOG')
BEGIN
SET @msg = 'Echec de l'' exécution de sauvegarde_base : le type de sauvegarde '+ISNULL(@type_sauvegarde,'(valeur nulle)')+' n''est pas reconnu'
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END

IF DB_ID(@nom_base) IS NULL
BEGIN
SET @msg = 'Echec de l'' exécution de sauvegarde_base : La base '+ISNULL(@nom_base,'(valeur nulle)')+' n''existe pas'
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END

IF ( DATABASEPROPERTYEX(@nom_base,'Status ')!='ONLINE' OR EXISTS (select 1 FROM sys.databases WHERE name=@nom_base AND source_database_id IS NOT NULL))
BEGIN
SET @msg = 'La base '+@nom_base+' n''est pas disponible ou il s''agit d''un snapshot'
PRINT @msg
return 0
END

IF @repertoire_destination = 'DEFAULT'
BEGIN
IF EXISTS (SELECT * FROM outils_dba.sys.tables where name='parametres')
BEGIN
SELECT @repertoire_destination = CAST( valeur AS varchar(500)) FROM dbo.parametres WHERE nom_parametre='repertoire_sauvegarde' AND cible=@nom_base
IF @repertoire_destination = 'DEFAULT' SELECT @repertoire_destination = CAST( valeur AS varchar(500)) FROM dbo.parametres WHERE nom_parametre='repertoire_sauvegarde' AND cible IS NULL
END
ELSE
BEGIN
SET @msg = 'Echec de l'' exécution de sauvegarde_base : Aucune destination n''est définie pour la base '+ @nom_base
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END
END

----------- Si aucune sauvegarde complète n'existe pour la base et que la sauvegarde demandée est une Diff ou TLog, il faut demander une sauvegarde complète:

IF ((upper(@type_sauvegarde) NOT IN ('COMPLET','COPY_ONLY')) AND NOT EXISTS (select 1 from msdb.dbo.backupset where database_name=@nom_base and type='D' and is_copy_only = 0))

EXEC sauvegarde_base @nom_base, 'COMPLET', @repertoire_destination

----------- Gérération de la chaîne de caractères correspondant à la destination
set @prefixe_fichier = REPLACE(@nom_base,' ','_') + '_' + upper(@type_sauvegarde) + '_'+ convert(varchar(8),getdate(),112) + '_' + RIGHT('0'+CONVERT(varchar(2),datepart(hh,getdate())),2)+ RIGHT('0'+CONVERT(varchar(2),datepart(mi,getdate())),2)+RIGHT('0'+CONVERT(varchar(2),datepart(ss,getdate())),2)
set @cmd = 'mkdir "'+@repertoire_destination + '\'+REPLACE(@nom_base,' ','_')+'"'

-- Le répertoire est créé à la volée
TRUNCATE TABLE #TABLE_OUTPUT
INSERT INTO #TABLE_OUTPUT
EXECUTE @code_retour=master.dbo.xp_cmdshell @cmd

-- Si le répertoire ne peut être créé pour une cause autre que le fait qu'il existe déjà, on sort en erreur
IF (@code_retour !=0 AND NOT EXISTS (select * from #TABLE_OUTPUT WHERE ligne like '%already exists%' OR ligne like '%existe d%'))
BEGIN
SELECT @msg = 'Echec de l'' exécution de sauvegarde_base lors de l''appel à '+ISNULL(@cmd,'?')+':'+ligne FROM #TABLE_OUTPUT WHERE ligne IS NOT NULL
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END
SET @destination = 'DISK='''+LTRIM(RTRIM(@repertoire_destination)) + '\'+REPLACE(@nom_base,' ','_')+'\'+@prefixe_fichier+'.BAK'''

-- Génération de la commande BACKUP DATABASE ou BACKUP LOG en fonction du type de sauvegarde demandé
IF (upper(@type_sauvegarde)='LOG')
BEGIN
IF databasepropertyex(@nom_base,'Recovery')='SIMPLE'
BEGIN
SET @msg = 'Echec de l'' exécution de sauvegarde_base : La base '+ISNULL(@nom_base,'(valeur nulle)')+' est en mode de recouvrement SIMPLE, les sauvegardes de LOG sont donc impossibles'
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END
SET @cmd = 'BACKUP LOG ['+@nom_base+'] TO '+@destination +' WITH INIT'
END
ELSE SET @cmd = 'BACKUP DATABASE ['+@nom_base+'] TO '+@destination +' WITH INIT'
IF (upper(@type_sauvegarde)='COPY_ONLY')
SET @cmd = @cmd + ', COPY_ONLY'

IF (upper(@type_sauvegarde)='DIFFERENTIEL')
SET @cmd = @cmd + ', DIFFERENTIAL'

PRINT @cmd
EXECUTE(@cmd)

IF NOT EXISTS (select 1 from msdb.dbo.backupmediafamily where physical_device_name like '%'+@prefixe_fichier+'%')
BEGIN
SET @msg='Echec de l'' exécution de sauvegarde_base lors de l''appel à '+ISNULL(@cmd,'?') +'. Consultez le journal d''erreurs pour plus d''informations'
RAISERROR (@msg, 16, 1) WITH NOWAIT,LOG
return 1
END
END
GO</pre>
<p>Les sauvegardes devront être externalisées au plus tôt, soit en sauvegardant directement sur un répertoire distant, soit en mettant en place une mise sur bande ou un déplacement vers une machine de centralisation.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/" rel="bookmark" title="26 mars 2012">Production SQL Server : Les Statistiques</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/" rel="bookmark" title="2 avril 2012">Production SQL Server: Réorganisation des objets</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/" rel="bookmark" title="7 mars 2012">Production SQL Server : Ordonnancement</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/" rel="bookmark" title="10 avril 2012">Production SQL Server : Contrôle de cohérence</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/" rel="bookmark" title="16 avril 2012">Production SQL Server : banalisation des instances</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.451 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%2Fproduction-sql-server-sauvegardes%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-sauvegardes%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/WOdAlD6cDMU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server : Ordonnancement</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/mY55ovbgxBE/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 16:19:18 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3179</guid>
		<description><![CDATA[Second article de la série Une approche pragmatique de la production SQL Server, il s’agit ici de voir comment gérer efficacement l’automatisation des tâches de maintenance.
Inutile de réinventer la roue:

Si un      ordonnanceur est déjà en place dans le Système d’Informations ($Universe,      Control-M, OPC&#8230;), le suivi [...]]]></description>
			<content:encoded><![CDATA[<p>Second article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, il s’agit ici de voir comment gérer efficacement l’automatisation des tâches de maintenance.<br />
Inutile de réinventer la roue:</p>
<ul>
<li>Si un      ordonnanceur est déjà en place dans le Système d’Informations ($Universe,      Control-M, OPC&#8230;), le suivi des tâches ordonnancées est  a priori      déjà assuré. Les tâches de maintenance SQL Server seront donc gérées      (déployées, exécutées, surveillées) par une équipe experte.</li>
<li>Sinon,      l’ordonnanceur de SQL Server, SQL Agent, convient tout à fait, à condition      de mettre en place la remonté des erreurs d’exécution de tâches et de      surveiller que l’Agent est toujours opérationnel. L’utilisation du      mécanisme  natif centralisation de tâches SQL Agent, MSX/TSX, facilitera      le déploiement et la mise à jour des tâches (voir par exemple <a href="http://msdn.microsoft.com/fr-fr/library/ms180992.aspx">cet article </a> pour la mise en place de MST/TSX).</li>
</ul>
<p>La tâche exécutée par l’ordonnanceur doit être la plus générique possible pour que sa maintenance reste simple. Pas question par exemple d’avoir à mentionner à chaque appel le nom des bases sur lesquelles effectuer les sauvegardes.<br />
Il existe un moyen simple de répondre à ce besoin: la table de paramètre.<br />
Sur toutes les instances du parc, une table contenant les paramètres de chaque tâche permettra de définir le périmètre et les options de chaque tâche:</p>
<table border="1" cellspacing="0" cellpadding="0" width="521">
<tbody>
<tr>
<td valign="top">TACHE</td>
<td valign="top">PARAMETRE</td>
<td valign="top">CIBLE</td>
<td valign="top">VALEUR</td>
</tr>
<tr>
<td valign="top">‘Sauvegarde’</td>
<td valign="top">‘Chemin’</td>
<td valign="top">‘Défaut’</td>
<td valign="top">‘E:\sauvegardes’</td>
</tr>
<tr>
<td valign="top">‘Sauvegarde’</td>
<td valign="top">‘Chemin’</td>
<td valign="top">‘model’</td>
<td valign="top">‘C:\temp’</td>
</tr>
<tr>
<td valign="top">‘Sauvegarde’</td>
<td valign="top">‘Exclusion’</td>
<td valign="top">‘base_temp’</td>
<td valign="top"></td>
</tr>
</tbody>
</table>
<p>En se basant sur l’exemple, la tâche de sauvegarde se déroule donc comme ceci:<br />
<em>Pour chaque base:</em><br />
<em> </em><em>S’il existe une ligne ‘Sauvegarde’, ‘Exclusion’, &lt;nom de la base&gt; alors je ne sauvegarde pas cette base</em><br />
<em> </em><em>S’il existe une ligne ‘Sauvegarde’, ‘Chemin’, &lt;nom de la base&gt; alors j’utilise le chemin indiqué.</em><br />
<em> </em><em>Sinon, j’utilise le chemin indiqué dans la ligne ‘Sauvegarde’, ‘Chemin’, ‘Défaut’</em></p>
<p>Pour que la tâche soit maintenable facilement, deux possibilités:</p>
<ul>
<li>Le      script exécuté est stocké sur un répertoire partagé, accessible par tous      les SQL Agent du parc. La définition du script n’est pas dupliquée, il      n’existe donc qu’une seule version.</li>
<li>Le      script se contente d’appeler une Procédure Stockée, déployée sur chaque      instance. Cette méthode a ma préférence puisque le DBA aura accès depuis      Management Studio au code et pourra facilement exécuter ces tâches      manuellement.</li>
</ul>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/" rel="bookmark" title="2 mai 2012">Production SQL Server: Suivi et Contrôle du parc</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/" rel="bookmark" title="16 avril 2012">Production SQL Server : banalisation des instances</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/" rel="bookmark" title="10 avril 2012">Production SQL Server : Contrôle de cohérence</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-lapproche/" rel="bookmark" title="27 février 2012">Production SQL Server : L&#8217;approche</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.183 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%2Fproduction-sql-server-ordonnancement%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-ordonnancement%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/mY55ovbgxBE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/</feedburner:origLink></item>
		<item>
		<title>Production SQL Server : L’approche</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/mhnuwfTlSwU/</link>
		<comments>http://blog.capdata.fr/index.php/production-sql-server-lapproche/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 13:18:30 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3168</guid>
		<description><![CDATA[Premier article de la série Une approche pragmatique de la production SQL Server, j’expose ici les besoins :
Maîtrise du parc:
Dans la mesure du possible, le parc sera le plus homogène possible en terme de versions, d’éditions, de modules installés. Ceci simplifiera grandement la gestion des licences, la mise à jour du moteur SQL Server, la [...]]]></description>
			<content:encoded><![CDATA[<p>Premier article de la série <a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server">Une approche pragmatique de la production SQL Server</a>, j’expose ici les besoins :<br />
<strong>Maîtrise du parc:</strong><br />
Dans la mesure du possible, le parc sera le plus homogène possible en terme de versions, d’éditions, de modules installés. Ceci simplifiera grandement la gestion des licences, la mise à jour du moteur SQL Server, la gestion du support Microsoft, ainsi que l’infrastructure d’administration/supervision  Les instances sur des versions ou des éditions exotiques du moteur peuvent être mises à disposition, mais ceci doit rester une exception.</p>
<p><strong>Normalisation des instances:</strong><br />
Gérer un incident sur une instance SQL Server que l’on ne connaît pas, c’est perdre énormément de temps à prendre connaissance de l’environnement (configuration de la machine, de l’instance, emplacement sur disques des journaux d’erreur, des fichiers de bases, …). Lorsque les instances du parc sont normalisées, ce temps précieux est économisé !<br />
Il faut donc définir des règles basiques sur le nommage des instances, l’arborescence des fichiers, la configuration standard de l’instance (collation, options de sécurité, …)</p>
<p><strong>Industrialisation des déploiements:</strong><br />
Même avec une norme écrite, rien ne garantit que l’installation manuelle d’une nouvelle instance soit conforme.<br />
A minima, une procédure d’installation/configuration du moteur semble nécessaire.<br />
Mieux, l’installation de l’instance peut être scriptée (fichier de configuration du setup); même chose pour la configuration (ensemble de scripts Transact-SQL). L’industrialisation sera couverte dans un article à venir.</p>
<p>Lorsque ces besoins sont correctement adressés, les tâches d’administration et la supervision pourront être banalisées.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/" rel="bookmark" title="16 avril 2012">Production SQL Server : banalisation des instances</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/" rel="bookmark" title="2 mai 2012">Production SQL Server: Suivi et Contrôle du parc</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/" rel="bookmark" title="7 mars 2012">Production SQL Server : Ordonnancement</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server/" rel="bookmark" title="27 février 2012">Une approche pragmatique de la production SQL Server</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.927 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%2Fproduction-sql-server-lapproche%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fproduction-sql-server-lapproche%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/mhnuwfTlSwU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/production-sql-server-lapproche/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/production-sql-server-lapproche/</feedburner:origLink></item>
		<item>
		<title>Une approche pragmatique de la production SQL Server</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/W3-NfH-efgA/</link>
		<comments>http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 13:18:02 +0000</pubDate>
		<dc:creator>Benjamin VESAN</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3166</guid>
		<description><![CDATA[Voici une série d’articles sur un thème de la gestion d’un parc d’instances SQL Server de production. Il sera ici question d’installer, administrer et surveiller quelques dizaines d’instances.
A ce jour, les articles disponibles sont:
- L’approche
- Ordonnancement
- Sauvegardes
- Statistiques
- Réorganisation
- Contrôle de cohérence
- Banalisation des instances
- Suivi et contrôle du parc
Continuez votre lecture sur le blog [...]]]></description>
			<content:encoded><![CDATA[<p>Voici une série d’articles sur un thème de la gestion d’un parc d’instances SQL Server de production. Il sera ici question d’installer, administrer et surveiller quelques dizaines d’instances.<br />
A ce jour, les articles disponibles sont:<br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-lapproche">- L’approche</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/">- Ordonnancement</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/">- Sauvegardes</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/">- Statistiques</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/">- Réorganisation</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/">- Contrôle de cohérence</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-banalisation-des-instances/">- Banalisation des instances</a><br />
<a href="http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/">- Suivi et contrôle du parc</a><br />
<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-suivi-et-controle-du-parc/" rel="bookmark" title="2 mai 2012">Production SQL Server: Suivi et Contrôle du parc</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-ordonnancement/" rel="bookmark" title="7 mars 2012">Production SQL Server : Ordonnancement</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-lapproche/" rel="bookmark" title="27 février 2012">Production SQL Server : L&#8217;approche</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/" rel="bookmark" title="26 mars 2012">Production SQL Server : Les Statistiques</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-controle-de-coherence/" rel="bookmark" title="10 avril 2012">Production SQL Server : Contrôle de cohérence</a> (Benjamin VESAN) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.928 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%2Fune-approche-pragmatique-de-la-production-sql-server%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fune-approche-pragmatique-de-la-production-sql-server%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/W3-NfH-efgA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/une-approche-pragmatique-de-la-production-sql-server/</feedburner:origLink></item>
		<item>
		<title>Techdays !!!</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/OtO8P4ADiFM/</link>
		<comments>http://blog.capdata.fr/index.php/techdays/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 17:20:10 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3153</guid>
		<description><![CDATA[Hello,
Un petit mot pour vous dire que je serai présent aux Techdays le mercredi 8 février avec Christophe Laporte (blog&#124;twitter) et François Jehl (blog) sur les stands GUSS et SQL Server pour répondre à toutes vos questions entre 2 sessions.

Venez nombreux !!
David B.Continuez votre lecture sur le blog :

Journées SQL Server 12/13 décembre (suite) (David [...]]]></description>
			<content:encoded><![CDATA[<p>Hello,</p>
<p>Un petit mot pour vous dire que je serai présent aux Techdays le mercredi 8 février avec Christophe Laporte (<a href="http://conseilit.wordpress.com/">blog</a>|<a href="http://twitter.com/Conseilit">twitter</a>) et François Jehl (<a href="http://fjehl.blogspot.com/">blog</a>) sur les stands GUSS et SQL Server pour répondre à toutes vos questions entre 2 sessions.</p>
<p style="text-align: center;"><a href="http://www.microsoft.com/france/mstechdays/"><img class="size-full wp-image-3157 aligncenter" title="FY12_techdays-kit-partenaire-inscription-250x250" src="http://blog.capdata.fr/wp-content/uploads/2012/02/FY12_techdays-kit-partenaire-inscription-250x2501.png" alt="" width="250" height="250" /></a></p>
<p>Venez nombreux !!</p>
<p>David B.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/" rel="bookmark" title="27 décembre 2011">Journées SQL Server 12/13 décembre (suite)</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-a-paris-les-12-et-13-decembre-2011/" rel="bookmark" title="25 octobre 2011">Journées SQL Server à Paris les 12 et 13 décembre 2011 !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/reperer-un-package-ssis-lors-de-son-execution/" rel="bookmark" title="30 juin 2011">Repérer un package SSIS lors de son exécution</a> (Louis HOCHBERG) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/" rel="bookmark" title="30 septembre 2009">Modifier la Collation d&#8217;une base SQL 2005</a> (Louis HOCHBERG) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/reunion-guss-le-1er-juillet/" rel="bookmark" title="23 juin 2010">Réunion GUSS le 1er juillet !</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.726 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%2Ftechdays%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Ftechdays%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/OtO8P4ADiFM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/techdays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/techdays/</feedburner:origLink></item>
		<item>
		<title>Journées SQL Server 12/13 décembre (suite)</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/t0dX2Xv10D0/</link>
		<comments>http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 14:51:10 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3125</guid>
		<description><![CDATA[Bilan des journées SQL Server des 12 et 13 décembre : 310 participants, 27 speakers (dont MVPs, personnes du support PSS, le Program Manager de la répli JY Devant et Bruno Aziza responsable marketing monde sur SQL Server), un gros succès qui montre que la communauté bouge aussi en France. Un gros merci aux sponsors [...]]]></description>
			<content:encoded><![CDATA[<p>Bilan des journées SQL Server des 12 et 13 décembre : 310 participants, 27 speakers (dont MVPs, personnes du support PSS, le Program Manager de la répli JY Devant et Bruno Aziza responsable marketing monde sur SQL Server), un gros succès qui montre que la communauté bouge aussi en France. Un gros merci aux sponsors et aux organisateurs <a href="http://blogs.codes-sources.com/christian/">Christian</a>, <a href="http://www.datafly.fr/">Arian </a>et <a href="http://blog.djeepy1.net/">Djeepy</a>, qui ont abattu un sacré boulot pour trouver des sponsors, des speakers et organiser tout ça. Un engouement qui devrait permettre en marge des TechDays de lancer l&#8217;idée d&#8217;une à deux manifestations de ce style par an.</p>
<p>Ce fut l&#8217;occasion aussi de permettre aux MVP et aux personnes du support (EE, PFE) de se rencontrer. On a eu la chance également de pouvoir échanger avec Jean-Yves Devant, responsable de la partie Réplication + Change tracking + CDC au niveau du dev à Redmond. La rencontre a été immortalisée dans le hall principal de MS (Merci à Marc Biarnes):</p>
<p style="text-align: center;"><a href="http://blog.capdata.fr/wp-content/uploads/2011/12/MVP_SUPPORT_SQL_Days1.jpg"><img class="aligncenter size-large wp-image-3127" title="MVP_SUPPORT_SQL_Days" src="http://blog.capdata.fr/wp-content/uploads/2011/12/MVP_SUPPORT_SQL_Days1-1024x682.jpg" alt="" width="717" height="477" /></a></p>
<p>Les sessions sont presque toutes disponibles <a href="http://www.microsoft.com/fr-fr/showcase/search.aspx?rvuuid=ffdf8aff-82cf-4378-8c6d-c509d1e1981b">en webcast </a>, ainsi que les deux keynotes (<a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=b9b60a7f-fa6c-4450-88ca-09d74740c2a3">1</a> et <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=9e72c1be-0aa0-4c43-b532-4b5d79bc9c6d">2</a>). Quelques unes des sessions que je vous recommande sur la partie  moteur:</p>
<ul>
<li>Philippe Geiger (MVP): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=a96753d8-e118-4706-b854-de8b9e53fac9">SQL Server: ses fonctionnalités méconnues donc indispensables</a>.</li>
<li>Pascal Belaud (MS): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=c676ed0b-6c39-4fa2-9d62-f66e841781ac">Always On </a></li>
<li>Arian Papillon : <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=5523745e-6c3b-414d-9169-ef543f4ca1ac">Réussir sa migration avec SQL Server 2008 R2 ou SQL Server 2012</a>.</li>
<li>Jean-Yves Devant (MS): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=d2ca5515-6322-49b4-997f-cee7e6bc0ea9">Synchronisation des données / réplication</a></li>
<li>Christophe Laporte (MVP,MCM): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=557197e6-2ca5-44ec-8a0b-b91aed1519cd">Server Core et Virtualisation</a>.</li>
<li>Frédéric Pichaut (MS): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=06e5f376-77be-489b-8089-9cefb8ad00e6">Optimisation et Troubleshooting</a>.</li>
<li>Frédéric Brouard (MVP): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=3ed1f167-a444-418b-b032-8fe0100a9068">Contraintes et performances</a></li>
<li>David Barbarin (MVP): <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=64622d95-e07d-4200-ae8d-64139754281c">Sécurité dans SQL Server 2012</a></li>
<li>Et ma session sur le moteur XE <a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=ffdf8aff-82cf-4378-8c6d-c509d1e1981b">ici</a>.</li>
</ul>
<p>A+<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-a-paris-les-12-et-13-decembre-2011/" rel="bookmark" title="25 octobre 2011">Journées SQL Server à Paris les 12 et 13 décembre 2011 !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/techdays/" rel="bookmark" title="1 février 2012">Techdays !!!</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-lapproche/" rel="bookmark" title="27 février 2012">Production SQL Server : L&#8217;approche</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/web-seminaire-haute-disponibilite-avec-sql-server/" rel="bookmark" title="22 mars 2012">Web Séminaire &laquo;&nbsp;Haute Disponibilité avec SQL Server&nbsp;&raquo;</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/reperer-un-package-ssis-lors-de-son-execution/" rel="bookmark" title="30 juin 2011">Repérer un package SSIS lors de son exécution</a> (Louis HOCHBERG) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.983 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%2Fjournees-sql-server-1213-decembre-suite%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fjournees-sql-server-1213-decembre-suite%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/t0dX2Xv10D0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/</feedburner:origLink></item>
		<item>
		<title>Journées SQL Server à Paris les 12 et 13 décembre 2011 !</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/g4wZFFpaSCE/</link>
		<comments>http://blog.capdata.fr/index.php/journees-sql-server-a-paris-les-12-et-13-decembre-2011/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 16:10:32 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[conférences]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3096</guid>
		<description><![CDATA[Un petit mot pour vous encourager vivement à venir assister aux journées SQL Server qui auront lieu les 12 et 13 décembre prochains à Paris dans les locaux de MS. Cet évènement complètement gratuit est organisé par le GUSS et paraîné par HP, Microsoft, Quest, Waisso et IT -Pro.
Nous serons une petite vingtaine de MVP, [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit mot pour vous encourager vivement à venir assister aux<strong> </strong>journées SQL Server qui auront lieu<strong> les 12 et 13 décembre</strong> <strong>prochains </strong>à Paris dans les locaux de MS. Cet évènement complètement gratuit est organisé par le GUSS et paraîné par HP, Microsoft, Quest, Waisso et IT -Pro.</p>
<p>Nous serons une petite vingtaine de MVP, consultants et intervenants MS pour évoquer différents sujets autour du moteur relationnel et de la BI, et des nouveautés de la version 2012 qui sort l&#8217;année prochaine.</p>
<p>Je présenterai une session sur les XEvents en Denali CTP3 le lundi matin et serai présent sur le salon les deux jours. Ce sera surtout l&#8217;occasion de se rencontrer et d&#8217;échanger autour de SQL Server. Tous les détails sur le planning des sessions et l&#8217;organisation sont sur le site du <a href="http://www.guss.fr/accueil/les-journ%C3%A9es-sql-server.aspx">GUSS</a>.</p>
<p>Alors à très bientôt !</p>
<p>David B.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">http://www.guss.fr/accueil/les-journ%C3%A9es-sql-server.aspx</div>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/journees-sql-server-1213-decembre-suite/" rel="bookmark" title="27 décembre 2011">Journées SQL Server 12/13 décembre (suite)</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/reunion-guss-le-1er-juillet/" rel="bookmark" title="23 juin 2010">Réunion GUSS le 1er juillet !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-2012-developper-training-kit/" rel="bookmark" title="26 mars 2012">SQL Server 2012 Developper Training Kit</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/techdays/" rel="bookmark" title="1 février 2012">Techdays !!!</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/reperer-un-package-ssis-lors-de-son-execution/" rel="bookmark" title="30 juin 2011">Repérer un package SSIS lors de son exécution</a> (Louis HOCHBERG) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.739 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%2Fjournees-sql-server-a-paris-les-12-et-13-decembre-2011%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fjournees-sql-server-a-paris-les-12-et-13-decembre-2011%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/g4wZFFpaSCE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/journees-sql-server-a-paris-les-12-et-13-decembre-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/journees-sql-server-a-paris-les-12-et-13-decembre-2011/</feedburner:origLink></item>
		<item>
		<title>Regénérer le DDL des indexes FULL TEXT</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/crT-3jqq6Uk/</link>
		<comments>http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 15:18:12 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[fulltext]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3052</guid>
		<description><![CDATA[Comme il n&#8217;y a pas d&#8217;outil pour le faire et que j&#8217;ai dû le faire pour un client récemment (ne fonctionne qu&#8217;à partir de SQL Server 2008+):
use mabase ;

create table #ftsDDL (catalogname sysname, objname sysname, objtype varchar(20),
colname sysname, type_column_id sysname NULL, langid int, indexname sysname,
changetracking varchar(10), stoplistname sysname)

insert into #ftsDDL
select FTC.name 'Catalog Name', T.name 'Object [...]]]></description>
			<content:encoded><![CDATA[<p>Comme il n&#8217;y a pas d&#8217;outil pour le faire et que j&#8217;ai dû le faire pour un client récemment (ne fonctionne qu&#8217;à partir de SQL Server 2008+):</p>
<pre><span style="color: #0000ff;">use mabase ;

</span><span style="color: #0000ff;">create table #ftsDDL (catalogname sysname, objname sysname, objtype varchar(20),
colname sysname, type_column_id sysname NULL, langid int, indexname sysname,
changetracking varchar(10), stoplistname sysname)

insert into #ftsDDL
select FTC.name 'Catalog Name', T.name 'Object name', 'Table' 'Object Type',
C.name 'colname', FTIC.type_column_id, FTIC.language_id, I.name 'UQIndexName',
FTI.change_tracking_state_desc,
case when STP.name &lt;&gt; '0' then STP.name else 'system' end
from sys.fulltext_indexes FTI
inner join sys.fulltext_catalogs FTC on FTC.fulltext_catalog_id = FTI.fulltext_catalog_id
inner join sys.tables T on FTI.object_id = T.object_id
inner join sys.indexes I on I.object_id = T.object_id
inner join sys.fulltext_index_columns FTIC on FTIC.object_id = FTI.object_id
inner join sys.columns C on C.column_id = FTIC.column_id and C.object_id = FTI.object_id
left outer join sys.fulltext_stoplists STP on STP.stoplist_id = FTI.stoplist_id
where I.is_unique = 1 and I.type = 1
and FTIC.type_column_id is NULL

	 UNION 

select FTC.name 'Catalog Name', V.name 'Object name', 'Indexed View' 'Object Type',
C.name 'colname', FTIC.type_column_id, FTIC.language_id, I.name 'UQIndexName',
FTI.change_tracking_state_desc,
case when STP.name &lt;&gt; '0' then STP.name else 'system' end
from sys.fulltext_indexes FTI
inner join sys.fulltext_catalogs FTC on FTC.fulltext_catalog_id = FTI.fulltext_catalog_id
inner join sys.views V on FTI.object_id = V.object_id
inner join sys.indexes I on I.object_id = V.object_id
inner join sys.fulltext_index_columns FTIC on FTIC.object_id = FTI.object_id
inner join sys.columns C on C.column_id = FTIC.column_id and C.object_id = FTI.object_id
left outer join sys.fulltext_stoplists STP on STP.stoplist_id = FTI.stoplist_id
where I.is_unique = 1 and I.type = 1
and FTIC.type_column_id is NULL
order by 1;

with cte as
 (select p1.catalogname, p1.objname, (select colname
 +case
when p2.type_column_id is NULL then '' else ' TYPE COLUMN *put type column here*' end+
' language '+cast(p2.langid as char(5))+','
from #ftsDDL p2 where p1.objname = p2.objname FOR XML PATH ('') ) as 'Columns',
p1.indexname, p1.changetracking, p1.stoplistname from #ftsDDL p1 group by catalogname,
objname, indexname, changetracking, stoplistname
)

select 'CREATE FULLTEXT INDEX ON '+objname+'('+substring(Columns,1,len(Columns)-1)+
') KEY INDEX ['+indexname+'] on ['+catalogname+'] WITH CHANGE_TRACKING '+changetracking+
', STOPLIST = ['+stoplistname+']' from cte;

drop table #ftsDDL;</span></pre>
<pre><span style="color: #008000;">/*</span></pre>
<pre><span style="color: #008000;">CREATE FULLTEXT INDEX ON V_ContentItmListGermany(abstr language 1031 ,desc language 1031 ,
subt language 1031 ,title language 1031 ) KEY INDEX [UI_V_ContentItmsListGermany]
on [Catalog_1] WITH CHANGE_TRACKING AUTO, STOPLIST = [SYSTEM]</span></pre>
<pre><span style="color: #008000;">CREATE FULLTEXT INDEX ON V_GenAtttGermany(blob language 1031 ) KEY INDEX [UI_V_GenAtttGermany]
on [Catalog_1] WITH CHANGE_TRACKING AUTO</span><span style="color: #008000;">, STOPLIST = [SYSTEM]</span><span style="color: #008000;">

</span><span style="color: #008000;">CREATE FULLTEXT INDEX ON V_GenAttachmentDe(blob TYPE COLUMN <span style="color: #ff0000;">*put type column here*</span>
language 1031 ) KEY INDEX  [UI_V_GenAttachmentDe] on [Catalog_LanDe]
WITH CHANGE_TRACKING AUTO</span><span style="color: #008000;">, STOPLIST = [SYSTEM]</span></pre>
<pre><span style="color: #008000;">CREATE FULLTEXT INDEX ON V_GenAtttUS(blob language 1033 ) KEY INDEX [UI_V_GenAtttUS]
on [Catalog_2] WITH CHANGE_TRACKING AUTO</span><span style="color: #008000;">, STOPLIST = [SYSTEM]</span></pre>
<pre><span style="color: #008000;">CREATE FULLTEXT INDEX ON V_GenAttachmentEn(blob TYPE COLUMN <span style="color: #ff0000;">*put type column here*</span>
language 1033 ) KEY INDEX  [UI_V_GenAttachmentEn] on [Catalog_LanEn]
WITH CHANGE_TRACKING AUTO</span><span style="color: #008000;">, STOPLIST = [SYSTEM]</span><span style="color: #008000;">

CREATE FULLTEXT INDEX ON V_GenAtttFrance(blob language 1036 ) KEY INDEX [UI_V_GenAtttFrance]
on [Catalog_3] WITH CHANGE_TRACKING AUTO</span><span style="color: #008000;">, STOPLIST = [SYSTEM]</span></pre>
<p><span style="color: #008000;">*/</span></p>
<p>Les indexes FTS, contraitement aux catalogues ne peuvent pas être scriptés directement dans SSMS. Evidemment il faudra recréer les catalogues avant. Attention, si des colonnes indexées sont de type varbinary(max) ou image, il faudra préciser le nom de la colonne qui stocke l&#8217;extension (cf <a href="http://msdn.microsoft.com/en-us/library/ms187317.aspx">http://msdn.microsoft.com/en-us/library/ms187317.aspx</a>) à la place de<span style="color: #ff0000;"> <em>*put type column here*</em><br />
<span style="color: #000000;">(je ne peux pas les deviner)</span><br />
</span></p>
<p>Petite note intéressante, dans le cas de ce client, les indexes FTS étaient créés sur des vues indexées, d&#8217;où l&#8217;UNION entre les indexes liés à sys.tables et ceux liés à sys.views dans la table temporaire. Et pour transposer et concaténer les colonnes de l&#8217;index sur une ligne on utilise la technique avec FOR XML PATH(&nbsp;&raquo;) dans la CTE.</p>
<p>A+</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 2px; width: 1px; height: 1px;">
<pre><span style="color: #008000;">ContentItmListGermany</span></pre>
</div>
<p><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/msg-2508-level-16-state-1-the-in-row-data-for-object-is-incorrect/" rel="bookmark" title="10 mai 2011">Msg 2508, Level 16, State 1: the In-Row data %% for object %% is incorrect</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-reorganisation-des-objets/" rel="bookmark" title="2 avril 2012">Production SQL Server: Réorganisation des objets</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-les-statistiques/" rel="bookmark" title="26 mars 2012">Production SQL Server : Les Statistiques</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-part-1/" rel="bookmark" title="2 avril 2012">Oracle Text pour DBA Oracle : Partie 1</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 4.363 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%2Fregenerer-le-ddl-des-indexes-full-text%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fregenerer-le-ddl-des-indexes-full-text%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/crT-3jqq6Uk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/</feedburner:origLink></item>
		<item>
		<title>Suppression accidentelle de ligne : comment retrouver le coupable ?</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/VtKeYqCgpok/</link>
		<comments>http://blog.capdata.fr/index.php/suppression-accidentelle-de-ligne-comment-retrouver-le-coupable/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 10:50:28 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[journal de transactions]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=3019</guid>
		<description><![CDATA[C&#8217;est vrai qu&#8217;il y a des outis, Change Data Capture et tout l&#8217;arsenal des Database Audit Specifications. Mais pour retrouver qui a supprimé les lignes dans la table T1 le 17 septembre dernier entre 12h00 et 14h00 il y a encore plus simple, pour peu qu&#8217;il y ait des backups de transactions.
La fonction qui tue:
Dans [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est vrai qu&#8217;il y a des outis, Change Data Capture et tout l&#8217;arsenal des Database Audit Specifications. Mais pour retrouver qui a supprimé les lignes dans la table T1 le 17 septembre dernier entre 12h00 et 14h00 il y a encore plus simple, pour peu qu&#8217;il y ait des backups de transactions.</p>
<h2>La fonction qui tue:</h2>
<p>Dans un article <a href="http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/">précédent</a>, nous avons couvert une fonction table valuée fort intéressante qui permet de relire à l&#8217;intérieur d&#8217;une sauvegarde de journal: <strong>fn_dump_dblog()</strong>. Nous allons nous en servir pour connaître cette fois l&#8217;identité du coupable. La table concernée par le DELETE est la table T1, il faut commencer par récupérer sa valeur de allocation_unit_id:</p>
<pre><span style="color: #0000ff;">select allocation_unit_id from sys.allocation_units AU inner join sys.partitions P
on P.hobt_id = AU.container_id where P.object_id = object_id('T1')</span></pre>
<pre><span style="color: #3366ff;"><em>allocation_unit_id
---------------------
72057594043301888
</em></span></pre>
<p>Ensuite, rechercher dans les backups transactionnels des opérations de suppression de lignes sur cet objet:</p>
<pre><span style="color: #0000ff;">select [Current LSN] ,Operation ,[Transaction ID] ,AllocUnitId
from fn_dump_dblog(DEFAULT, DEFAULT,DEFAULT, DEFAULT,
'<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery.TRAN2.bak</span>',
DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT) where Operation  = '<span style="color: #ff0000;">LOP_DELETE_ROWS</span>' and AllocUnitId = <span style="color: #ff0000;">72057594043301888

</span></span><span style="color: #3366ff;"><em>Current LSN             Operation          Transaction ID AllocUnitId         
----------------------- ------------------ -------------- --------------------
00000025:00000032:0003  LOP_DELETE_ROWS    <span style="color: #ff0000;">0000:00000a9d </span> 72057594043301888   
00000025:00000032:0005  LOP_DELETE_ROWS    <span style="color: #ff0000;">0000:00000a9d</span>  72057594043301888   
00000025:00000032:0006  LOP_DELETE_ROWS    <span style="color: #ff0000;">0000:00000a9d</span>  72057594043301888   
00000025:00000032:0007  LOP_DELETE_ROWS    <span style="color: #ff0000;">0000:00000a9d</span>  72057594043301888   
00000025:00000032:0008  LOP_DELETE_ROWS    <span style="color: #ff0000;">0000:00000a9d</span>  72057594043301888   </em></span>
<span style="color: #3366ff;">...</span></pre>
<p>On récupère le LSN de la transaction pour retrouver le BEGIN TRAN correspondant:  <span style="color: #ff0000;"><em>0000:00000a9d</em>:</span></p>
<pre><span style="color: #0000ff;">select [Current LSN] ,Operation ,[Transaction ID] ,AllocUnitId
 ,[Begin Time] ,[Transaction Name] ,[End Time] ,[Description]
 ,[Transaction SID]
from fn_dump_dblog(DEFAULT, DEFAULT,DEFAULT, DEFAULT,
'<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery.TRAN2.bak</span>',
DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
where Operation  = '<span style="color: #ff0000;">LOP_BEGIN_XACT</span>' and [Transaction ID] = '<span style="color: #ff0000;">0000:00000a9d</span>'</span>

<span style="color: #3366ff;">Current LSN             Operation                       Transaction ID AllocUnitId        
----------------------- ------------------------------- -------------- --------------------
00000025:00000032:0001  LOP_BEGIN_XACT                  0000:00000a9d  NULL                

</span></pre>
<pre><span style="color: #3366ff;"> Begin Time               Transaction Name                  Description                                  
------------------------ --------------------------------- -----------------------------------------------
2011/10/05 15:21:50:510  tralalala                         tralalala;<span style="color: #ff0000;">0x75a770d73d6bf54bb0dc07725254ae57</span>    </span><span style="color: #ff0000;">

</span></pre>
<pre><span style="color: #3366ff;">Transaction SID
------------------------------------
<span style="color: #ff0000;">0x75A770D73D6BF54BB0DC07725254AE57</span></span></pre>
<p>Remarque intéressante, [Transaction SID] (en rouge) correspond au SID de l&#8217;utilisateur dans la base&#8230;</p>
<h2>Le dénouement&#8230;</h2>
<p>Il ne reste plus qu&#8217;à dégainer la requête sur sys.database_principals:</p>
<pre><span style="color: #0000ff;">select name from sys.database_principals where sid = <span style="color: #ff0000;">0x75A770D73D6BF54BB0DC07725254AE57</span></span></pre>
<pre><em><span style="color: #3366ff;">name
</span><span style="color: #3366ff;">-------------------
user1

</span></em><em></em></pre>
<p>A+<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/" rel="bookmark" title="13 juillet 2011">Point-in-time recovery et fn_dump_dblog()</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/msg-2508-level-16-state-1-the-in-row-data-for-object-is-incorrect/" rel="bookmark" title="10 mai 2011">Msg 2508, Level 16, State 1: the In-Row data %% for object %% is incorrect</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</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 4.194 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%2Fsuppression-accidentelle-de-ligne-comment-retrouver-le-coupable%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fsuppression-accidentelle-de-ligne-comment-retrouver-le-coupable%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/VtKeYqCgpok" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/suppression-accidentelle-de-ligne-comment-retrouver-le-coupable/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/suppression-accidentelle-de-ligne-comment-retrouver-le-coupable/</feedburner:origLink></item>
		<item>
		<title>Point-in-time recovery et fn_dump_dblog()</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/TRyUwPkLb7c/</link>
		<comments>http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 15:59:05 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[journal de transaction]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=2871</guid>
		<description><![CDATA[Point-in-time recovery désigne une restauration de base de données consistante à un point précis soit dans le temps (STOPAT), soit dans une séquence de transactions (STOPATMARK, STOPBEFOREMARK). On ne peut faire du PIT recovery que lorsque la base est en mode de restauration complet.
Le problème inhérent à ce genre de restauration, c&#8217;est qu&#8217;on ne sait [...]]]></description>
			<content:encoded><![CDATA[<p><em>Point-in-time recovery</em> désigne une restauration de base de données consistante à un point précis soit dans le temps (STOPAT), soit dans une séquence de transactions (STOPATMARK, STOPBEFOREMARK). On ne peut faire du PIT recovery que lorsque la base est en mode de restauration complet.</p>
<p>Le problème inhérent à ce genre de restauration, c&#8217;est qu&#8217;on ne sait pas exactement jusqu&#8217;où restaurer. Lorsque votre collègue vous dit qu&#8217;il a supprimé accidentellement les données de la table principale vers 13h45, c&#8217;est assez vague comme réponse. Si vous restaurez à 13h44, que fait-on des transactions validées entre 13h44 et le moment précis où le delete a été exécuté ? Il faut jouer avec RESTORE LOG WITH STOPAT, STANDBY pour déterminer le point dans le temps où les données ne sont plus dans la table. Milliseconde par milliseconde ? Bof bof bof&#8230;</p>
<p>L&#8217;alternative est d&#8217;utiliser des marques de transactions:</p>
<pre><span style="color: #0000ff;">BEGIN TRAN <span style="color: #ff0000;">MiseAJourProduits
</span>GO
DELETE FROM </span><span style="color: #0000ff;">PRODUITS <span style="color: #008000;">-- WHERE ID_PRODUIT = @id_produit</span></span> <span style="color: #008000;">(aïeuuu)</span>
<span style="color: #0000ff;">GO
...
COMMIT TRAN <span style="color: #ff0000;">MiseAJourProduits</span>
GO</span></pre>
<p>Dès lors il est possible de restaurer avant la transaction qui pose problème en utilisant l&#8217;option STOPBEFOREMARK de RESTORE LOG:</p>
<pre><span style="color: #0000ff;">RESTORE LOG maBASE FROM DISK='C:\UTRECHT\MSSQL.1\MSSQL\Backup\maBase.20110712.trn'
WITH RECOVERY, STOPBEFOREMARK = '<span style="color: #ff0000;">MiseAJourProduits</span>'
GO</span></pre>
<p>Seul problème, c&#8217;est à l&#8217;initiative du développeur de le faire, or la plupart du temps les transactions sont non marquées, je ne vous parle même pas des progiciels&#8230;</p>
<h2>Fiat lux:</h2>
<p>J&#8217;ai longtemps regretté l&#8217;absence d&#8217;un outil built-in tel que <a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14215/logminer.htm">LogMiner</a> pour pouvoir lire le contenu d&#8217;un backup log, et pouvoir effectuer une restauration précise à la transaction près. En effet,  STOPATMARK / STOPBEFOREMARK permettent d&#8217;utiliser une syntaxe telle que :</p>
<pre><span style="color: #0000ff;">RESTORE LOG ... WITH STOPBEFOREMARK = 'lsn:&lt;LSN number&gt;'</span>.</pre>
<p>Seulement voilà, comment connaître les différentes transactions embarquées dans un backup log ? fn_dblog() permet d&#8217;obtenir cette information sur le journal lui-même, mais quid des backups&#8230;</p>
<p>Et il y a quelques jours, je joue avec <a href="http://blog.capdata.fr/index.php/openrowset-episode-1/">OPENROWSET()</a> et là je tombe sur une fonction système non-documentée dans la base resource : <span style="color: #000000;"><strong>fn_dump_dblog()</strong></span>. En lisant le nom, l&#8217;émotion m&#8217;étreint. Le souffle court, je jette un coup d&#8217;oeil au source de la fonction:</p>
<pre><span style="color: #0000ff;">create function sys.fn_dump_dblog  
 (  
    @start    nvarchar (25) = NULL,  
    @end      nvarchar (25) = NULL,  
<span style="color: #ff0000;">    @devtype  nvarchar (260) = NULL, <span style="color: #008000;">-- NULL(DISK) | DISK | TAPE | VIRTUAL_DEVICE  </span></span>
    @seqnum   Int         = 1,  
    @fname1   nvarchar (260) = NULL,  
    @fname2   nvarchar (260) = NULL,  
    @fname3   nvarchar (260) = NULL, 
    ...
    @fname64   nvarchar (260) = NULL  
 )  
returns table  
as  
 return select  
     [Current LSN],  [Operation],  [Context],  [Transaction ID],   [Tag Bits],  
     [Log Record Fixed Length],  [Log Record Length],   [Previous LSN],  
     (...)
     from OpenRowset (DBLog, @start, @end, @devtype, @seqnum,  
     @fname1,  @fname2,  @fname3,  @fname4,  @fname5, 
     (...)
     @fname62,  @fname63,  @fname64)</span></pre>
<p>En lisant le paramètre <em>@devtype</em> j&#8217;avale mon sandwich indien poulet-curry de travers. Ça fait dix mois que je bosse sur un provider OLEDB qui permette de lire dans un backup full (un peu l&#8217;équivalent de l&#8217;<a href="http://www.sybase.com/files/Product_Overviews/Sybase-ISUG-101707.pdf">Archive Database Access </a>sous Sybase ASE), et là je découvre qu&#8217;il existe une fonction qui fait la même chose sur les backups log. Depuis la 2005 RTM. Argl.</p>
<p>Et puis en gouglant un peu, je tombe sur <a href="http://blogs.msdn.com/b/dfurman/archive/2009/11/05/reading-database-transaction-log-with-fn-dump-dblog.aspx">cet article de Dimitri Furman</a>, une personne de MS Consulting Services à New-York qui décrit brièvement la fonction et ses arguments. Je ne peux pas résister, il va falloir tester ça.</p>
<h2>Scénario de test:</h2>
<p>On va donc créer une base de démo, peupler une table et supprimer des intervalles de valeurs en les entrelaçant de backup logs. On arrive à une suppression par erreur, et on souhaite remonter les données juste à la transaction d&#8217;avant, sachant que les transactions ne sont pas marquées.</p>
<pre><span style="color: #008000;">/*************************************************************************************
 Obj:       DEMO RESTAURATION SUITE A ERREUR MANUELLE
            UTILISATION DU MODE STANDBY POUR EFFECUTER UN POINT-IN-TIME RECOVERY
 Aut:       dbaffaleuf@capdata
 Crdate:    2011/07/13
*/</span>

<span style="color: #0000ff;"><span style="color: #008000;">-- Population de la base</span>
use master
GO
if exists (select 1 from sys.databases where name='<span style="color: #ff0000;">demorecovery</span>')
 drop database demorecovery
GO
create database demorecovery
GO

use demorecovery
GO
create table T1(
 a numeric identity,
 b char(4000) default replicate('<span style="color: #ff0000;">b</span>',4000),
 c bigint default round(rand()*100,0))
GO
insert into T1 default values
GO 1000
create unique clustered index IDX_T1C on T1(a)
GO
create index IDX_T1NC__c on T1(c)
GO

<span style="color: #008000;">-- Activation du mode de récupération complet</span>
alter database demorecovery set recovery full
GO
backup database demorecovery to disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_FULL.bak</span>' with init, stats
GO

<span style="color: #008000;">-- Quelques transactions et quelques backups de transactions</span>
delete from T1 where a &lt; 10
GO
backup log demorecovery to disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG1.bak</span>' with init, stats
GO
delete from T1 where a &lt; 20
GO
backup log demorecovery to disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG2.bak</span>' with init, stats
GO
delete from T1 where a &lt; 30
GO
backup log demorecovery to disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG3.bak</span>' with init, stats
GO
<span style="color: #008000;">
-- Trois autres transactions à suivre, la dernière (a&lt;60) est une erreur manuelle</span>
delete from T1 where a &lt; 40
GO
delete from T1 where a &lt; 50
GO
delete from T1 where a &lt; 60  <span style="color: #008000;">-- &lt;-- CES DONNEES SONT EFFACEES PAR ERREUR !!!</span>
GO
backup log demorecovery to disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG4.bak</span>' with init, stats
GO

<span style="color: #008000;">-- Une autre transaction valide passe entre-temps</span>
delete from T1 where a &gt; 990
GO

<span style="color: #008000;">-- Le téléphone sonne, l'utilisateur demande s'il est possible de récupérer les données avant le delete where a &lt; 60</span>
use master
GO
<span style="color: #008000;">-- tail log backup</span>
backup log demorecovery to disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_TAILLOG.bak</span>' with init, stats, NO_TRUNCATE, NORECOVERY
GO
select state_desc from sys.databases where name='demorecovery'
GO
<span style="color: #33cccc;"><em><span style="color: #3366ff;">
state_desc
------------------------------------------------------------
RESTORING</span>
</em></span><span style="color: #008000;">
-- On identifie le backup de journal qui embarque l'erreur: demorecovery_LOG4.bak
-- on recherche les différentes transactions contenues à l'intérieur avec fn_dump_dblog():</span>
select *, [Current LSN]
 ,Operation
 ,[Transaction ID]
 ,AllocUnitId
 ,[Begin Time]
 ,[Transaction Name]
 ,[End Time]
 ,[Description]
from fn_dump_dblog(DEFAULT, DEFAULT,DEFAULT, DEFAULT,
'<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG4.bak</span>',
DEFAULT,DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
where Operation  = '<span style="color: #ff0000;">LOP_BEGIN_XACT</span>'

<span style="color: #3366ff;"><em>Current LSN             Operation         Transaction ID  Begin Time               Transaction Name    Description
----------------------- ----------------- --------------  ------------------------ ------------------- -----------------------------------------------------------------------
00000041:00000338:000e  LOP_BEGIN_XACT    0000:000008b8   2011/07/13 15:59:43:580  DELETE              DELETE;0x0105000000000005150000006aa3aebb1b5c3491642b62e2e8030000
00000042:00000021:0001  LOP_BEGIN_XACT    0000:000008b9   2011/07/13 15:59:43:587  DELETE              DELETE;0x0105000000000005150000006aa3aebb1b5c3491642b62e2e8030000
00000042:00000076:0001  LOP_BEGIN_XACT    0000:000008ba   2011/07/13 15:59:43:630  DELETE              DELETE;0x0105000000000005150000006aa3aebb1b5c3491642b62e2e8030000</em></span>

<span style="color: #008000;">
-- On restaure jusqu'au N-1 backup log avant pb</span>
restore database demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_FULL.bak</span>' with stats, norecovery
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG1.bak</span>' with stats, norecovery
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG2.bak</span>' with stats, norecovery
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG3.bak</span>' with stats, norecovery
GO

<span style="color: #008000;">-</span><span style="color: #008000;"><span style="color: #008000;">- </span>On restaure en standby mode à la première transaction pour déterminer si les données entre 50 et 60 sont toujours là</span>
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG4.bak</span>' with stats,
standby='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\stdby_files.bak</span>', stopbeforemark='<span style="color: #ff0000;">lsn:0x00000042:00000021:0001</span>'
GO

select state_desc, is_in_standby from sys.databases where name='demorecovery'
GO

<span style="color: #3366ff;"><em>state_desc    is_in_standby
------------- --------------
ONLINE        1
</em></span>
use demorecovery
GO
select * from T1 where a &lt; 60
GO

<em><span style="color: #3366ff;">a      b                            c
------ ---------------------------- ----
40     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 31
41     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 28
42     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 77
43     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 18
44     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 12
45     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 42
46     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
47     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 46
48     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 39
49     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 74
50     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 45
51     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
52     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 32
53     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 10
54     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
55     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 99
56     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 71
57     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 38
58     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
59     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 41</span></em>

<span style="color: #008000;">-- OK, allons voir à la transaction suivante</span>
use master
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG4.bak</span>' with stats,
standby='C<span style="color: #ff0000;">:\UTRECHT\MSSQL.1\MSSQL\Backup\stdby_files.bak</span>', stopbeforemark='<span style="color: #ff0000;">lsn:0x00000042:00000076:0001</span>'
GO

use demorecovery
GO
select * from T1 where a &lt; 60
GO

<span style="color: #3366ff;"><em>a      b                            c
------ ---------------------------- ----
50     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 45
51     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
52     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 32
53     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 10
54     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
55     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 99
56     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 71
57     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 38
58     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
59     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 41</em></span>

<span style="color: #008000;">-- On dirait bien qu'on est dans l'état attendu. Allons voir à la dernière transaction pour confirmer:</span>
use master
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG4.bak</span>' with stats,
standby='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\stdby_files.bak</span>'
GO

use demorecovery
GO
select * from T1 where a &lt; 60
GO

<span style="color: #3366ff;"><em>a      b                            c
------ ---------------------------- ----</em></span>

<span style="color: #008000;">-- Ouaip, donc il faut revenir au point précédent, en rechargeant tout depuis le backup FULL:</span>
use master
GO
restore database demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_FULL.bak</span>' with stats, norecovery
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG1.bak</span>' with stats, norecovery
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG2.bak</span>' with stats, norecovery
GO
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG3.bak</span>' with stats, norecovery
GO

restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_LOG4.bak</span>' with stats,
stopbeforemark='<span style="color: #ff0000;">lsn:0x00000042:00000076:0001</span>', recovery
GO

use demorecovery
GO
select * from T1 where a &lt; 60
GO
<span style="color: #3366ff;"><em>
a      b                            c
------ ---------------------------- ----
50     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 45
51     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
52     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 32
53     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 10
54     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
55     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 99
56     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 71
57     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 38
58     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 2
59     bbbbbbbbbbbbbbbbbbbbbbbbbbbb 41</em></span>

<span style="color: #008000;">-- Note: la transaction suivante (a&gt;990) est perdue. On ne peut pas la recharger car il y aurait une cassure dans la chaîne de LSNs.
-- Si on avait tenté de restaurer le tail-log à la suite:</span>
restore log demorecovery from disk='<span style="color: #ff0000;">C:\UTRECHT\MSSQL.1\MSSQL\Backup\demorecovery_TAILLOG.bak</span>' with stats, recovery
GO

<em><span style="color: #3366ff;">Msg 4305, Niveau 16, État 1, Ligne 1
Le journal dans ce jeu de sauvegarde commence au numéro de séquence d'enregistrement 66000000017600001, ce qui est trop récent
pour une application à la base de données. Une sauvegarde de fichier journal antérieure qui inclut le numéro de séquence
d'enregistrement 66000000009200001 peut être restaurée.
Msg 3013, Niveau 16, État 1, Ligne 1
RESTORE LOG s'est terminé anormalement.</span></em>

</span></pre>
<p>Donc voilà enfin une méthode pour récupérer une base pile à l&#8217;endroit où on veut la récupérer, encore une fois grâce à une fonction non documentée qui mériterait d&#8217;être plus connue.</p>
<p>A+. David B.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/suppression-accidentelle-de-ligne-comment-retrouver-le-coupable/" rel="bookmark" title="6 octobre 2011">Suppression accidentelle de ligne : comment retrouver le coupable ?</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>
<li><a href="http://blog.capdata.fr/index.php/production-sql-server-sauvegardes/" rel="bookmark" title="19 mars 2012">Production SQL Server : Sauvegardes</a> (Benjamin VESAN) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/pourquoi-il-faut-sauvegarder-les-bases-systemes/" rel="bookmark" title="3 juillet 2011">Pourquoi il faut sauvegarder les bases systèmes</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-principes-dune-sauvegarde-a-chaud/" rel="bookmark" title="12 décembre 2008">Principes d&#8217;une sauvegarde à chaud</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 4.808 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%2Fpoint-in-time-recovery-et-fn_dump_dblog%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fpoint-in-time-recovery-et-fn_dump_dblog%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/TRyUwPkLb7c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/</feedburner:origLink></item>
		<item>
		<title>OPENROWSET, épisode 1</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/VIsSClGH08o/</link>
		<comments>http://blog.capdata.fr/index.php/openrowset-episode-1/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 06:02:40 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[oledb]]></category>
		<category><![CDATA[openrowset]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=2877</guid>
		<description><![CDATA[Alors là c&#8217;est un puits sans fond. OPENROWSET() est tellement vaste qu&#8217;on peut se demander si on touchera un jour les limites de la chose.
En gros c&#8217;est une fonction qui appelle un provider OLEDB, et qui retourne un résultat au format table-valué. Par exemple on l&#8217;utilise pour exécuter des requêtes sur des serveurs liés en [...]]]></description>
			<content:encoded><![CDATA[<p>Alors là c&#8217;est un puits sans fond. <a href="http://msdn.microsoft.com/fr-fr/library/ms190312.aspx">OPENROWSET()</a> est tellement vaste qu&#8217;on peut se demander si on touchera un jour les limites de la chose.</p>
<p>En gros c&#8217;est une fonction qui appelle un provider OLEDB, et qui retourne un résultat au format table-valué. Par exemple on l&#8217;utilise pour exécuter des requêtes sur des serveurs liés en passant le nom d&#8217;un provider (MSDAORA pour oracle, SQLNCLI pour le client natif MSSQL, etc&#8230;). Par exemple:</p>
<pre><span style="color: #0000ff;">SELECT RemoteDepts.*
FROM OPENROWSET('SQLNCLI', 'Server=MS2K8-Win2008-1;Trusted_Connection=yes;',
     'SELECT * FROM CAPDATA.dbo.DEPARTEMENT') AS RemoteDepts;</span></pre>
<p>Jusque là, rien de révolutionnaire.</p>
<h2>Juste pour rire, on réinvente le CSV engine:</h2>
<p>Il existe un certain nombre de providers non documentés sur lesquels s&#8217;appuient en général  les <em>DMV/DMF </em>et quelques fonctions table-valuées comme<em> fn_dblog()</em>,<em> fn_helpcollations()</em>, etc&#8230; qui feront l&#8217;objet de l&#8217;épisode 2. Il en existe un toutefois, <strong>BULK</strong>,  qui est parfaitement documenté et très pratique, et qui permet de faire du chargement massif notamment (l&#8217;ancêtre du BULK INSERT T-SQL) mais aussi de renvoyer à peu près n&#8217;importe quoi sous une forme table-valuée.</p>
<p>Par exemple, on peut reprendre à notre compte le concept du <a href="http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html">moteur CSV</a> de MySQL, et créer des vues qui mappent des fichiers CSV sur disque, pour visualiser le contenu sans les stocker physiquement dans la base. Un exemple de fichier CSV et de fichier de format (pour plus d&#8217;infos voir <a href="http://msdn.microsoft.com/en-us/library/ms178129.aspx">la page MSDN</a> concernant les fichiers de format):</p>
<p><strong>bulktest.csv:</strong></p>
<pre><span style="color: #008000;">LOUISH,21941
DAVID,21940
LOUISP,21943
LAURENT,21942
JSEB,21944</span></pre>
<p><strong>bulktest.fmt:</strong></p>
<pre><span style="color: #008000;">9.0
2
1 SQLCHAR 0 10 "," 1 CurName ""
2 SQLCHAR 0 5 "\r\n" 2 ID ""</span></pre>
<p><strong>La vue T-SQL:</strong></p>
<pre><span style="color: #0000ff;">create view CSVENgine
as
    select * from openrowset(bulk 'V:\DBA2\MSSQL.1\MSSQL\Backup\bulktest.csv',
    FORMATFILE = 'V:\DBA2\MSSQL.1\MSSQL\Backup\bulktest.fmt') as CSV1
GO
</span></pre>
<pre><span style="color: #0000ff;">select * from CSVENgine order by ID desc

</span><span style="color: #0000ff;"><em>CurName    ID
---------- -----
JSEB       21944
LOUISP     21943
LAURENT    21942
LOUISH     21941
DAVID      21940

(5 ligne(s) affectée(s)</em></span>)</pre>
<p>Seule petite ombre au tableau, le provider BULK ne permet pas la mise à jour, on ne peut accéder aux données qu&#8217;en lecture seule. Mais ça reste quand même bien pratique pour attaquer une trace perfmon directement en SQL.</p>
<h2>Charger des fichiers binaires:</h2>
<p>Les options SINGLE_BLOB / SINGLE_CLOB/ SINGLE_NCLOB du provider BULK permettent en outre de charger des  documents binaires (vidéos, images, PDF, documents word, etc&#8230;)  dans  des tables, respectivement soit en varbinary(max) / varchar(max) / nvarchar(max) si les  fichiers sont inférieurs à 2Gb comme c&#8217;est la cas dans l&#8217;exemple, soit  dans du filestream pour les fichiers supérieurs.</p>
<pre><span style="color: #0000ff;">create table Documents (ID numeric identity, title varchar(255), Filedata varbinary(max))

insert into Documents (title, Filedata)
SELECT 'SQL 2008 Licensing',
doc.* from OPENROWSET(BULK 'E:\CAPDATA\DOCUMENTATION\SGBD\SQL Server\WINWORDS\2008
SQL Licensing Overview final.docx', SINGLE_BLOB) as doc

insert into Documents (title, Filedata)
SELECT 'DBM Sharepoint Labs',
doc.* from OPENROWSET(BULK 'E:\CAPDATA\DOCUMENTATION\SGBD\SQL Server\WINWORDS\
DBM_Sharepoint_Labs.docx', SINGLE_BLOB) as doc

insert into Documents (title, Filedata)
SELECT 'DBM and Log Shipping',
doc.* from OPENROWSET(BULK 'E:\CAPDATA\DOCUMENTATION\SGBD\SQL Server\WINWORDS\
DBMandLogShipping.docx', SINGLE_BLOB) as doc

insert into Documents (title, Filedata)
SELECT 'Database Snapshot Performance',
doc.* from OPENROWSET(BULK 'E:\CAPDATA\DOCUMENTATION\SGBD\SQL Server\WINWORDS\
DBSnapshotPerf.docx', SINGLE_BLOB) as doc</span></pre>
<h2>Récupérer la sortie d&#8217;une procédure stockée sous la forme d&#8217;une table:</h2>
<p>Une astuce monstrueuse révélée par<a href="http://blogs.technet.com/b/wardpond/"> Ward Pond</a> en 2005, qui détourne l&#8217;utilisation d&#8217;OPENROWSET pour appeler une procédure stockée sur le serveur local et retransformer le résultat en format table-valué, un peu à la façon dont les <a href="http://www.sypron.nl/mda.html">tables MDA</a> sont appelées sous Sybase ASE, et qui nous a sauvé la vie bien des fois sur SQL Server 2000 avant que n&#8217;apparaissent les DMV:</p>
<pre><span style="color: #0000ff;">sp_configure 'Ad Hoc Distributed Queries',1
GO
reconfigure
GO</span>
<span style="color: #0000ff;">SELECT  w.SPID, w.Status, w.loginame, w.blk, w.dbname,w.cmd,
Lck.Objid, lck.Type, lck.Mode
FROM    OPENROWSET ('SQLNCLI','Server=(local);TRUSTED_CONNECTION=YES;',
                   'set fmtonly off exec master.dbo.sp_who') as w
INNER JOIN OPENROWSET ('SQLNCLI','Server=(local);TRUSTED_CONNECTION=YES;',
                       'set fmtonly off exec master.dbo.sp_lock') as lck
on lck.spid = w.spid
where w.blk &lt;&gt; 0
GO
<em>
SPID   Status       loginame            blk   dbname          cmd     Objid       Type Mode
------ ------------ ------------------- ----- --------------- ------- ----------- ---- --------
55     suspended    DBA2\dbaffaleuf     54    whitepaperz     SELECT  2073058421  TAB  IS
55     suspended    DBA2\dbaffaleuf     54    whitepaperz     SELECT  0           DB   S
55     suspended    DBA2\dbaffaleuf     54    whitepaperz     SELECT  2073058421  RID  S
55     suspended    DBA2\dbaffaleuf     54    whitepaperz     SELECT  2073058421  PAG  IS</em></span></pre>
<h2>Voir plus loin ?</h2>
<p>MS fournit des providers OLEDB pour s&#8217;interfacer avec OPENROWSET, certains sont publics (providers relatifs aux serveurs liés, BULK), et certains sont non documentés et utilisés par des vues ou fonctions dynamiques dans SQL Server. C&#8217;est ceux-ci que nous essaierons de référencer et de comprendre dans l&#8217;épisode 2. Enfin dans l&#8217;épisode 3,  nous verrons comment créer son propre provider OLEDB avec Advanced Template Library et Visual C++, et nous essaierons de le faire communiquer avec SQL Server. Du pain sur la planche !</p>
<p>A+ David B.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/regenerer-le-ddl-des-indexes-full-text/" rel="bookmark" title="12 octobre 2011">Regénérer le DDL des indexes FULL TEXT</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/point-in-time-recovery-et-fn_dump_dblog/" rel="bookmark" title="13 juillet 2011">Point-in-time recovery et fn_dump_dblog()</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/pourquoi-il-faut-sauvegarder-les-bases-systemes/" rel="bookmark" title="3 juillet 2011">Pourquoi il faut sauvegarder les bases systèmes</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/oracle-text-pour-dba-oracle-part-1/" rel="bookmark" title="2 avril 2012">Oracle Text pour DBA Oracle : Partie 1</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 4.367 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%2Fopenrowset-episode-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fopenrowset-episode-1%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/VIsSClGH08o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/openrowset-episode-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/openrowset-episode-1/</feedburner:origLink></item>
	</channel>
</rss>

