<?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 l'équipe conseil de CapData Consulting</description>
	<lastBuildDate>Fri, 12 Mar 2010 18:01:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</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>Scruter les journaux d’évènements Windows avec LogParser</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/_mPaU4xJhF0/</link>
		<comments>http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 18:01:52 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[Service hétérogène]]></category>
		<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[eventlog]]></category>
		<category><![CDATA[journaux d'évènements]]></category>
		<category><![CDATA[logparser]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=632</guid>
		<description><![CDATA[Un petit post sur un outil bien pratique pour tous ceux qui rament pour écrire des scripts sous Windows. Un des outils indispensables dont toute production doive se doter est un analyseur de journaux d&#8217;erreur.
Logparser est un petit exécutable fourni gratuitement par Microsoft et qui permet de lire des fichiers structurés propriétaires tels que les [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit post sur un outil bien pratique pour tous ceux qui rament pour écrire des scripts sous Windows. Un des outils indispensables dont toute production doive se doter est un analyseur de journaux d&#8217;erreur.</p>
<p><strong>Logparser </strong>est un petit exécutable fourni gratuitement par Microsoft et qui permet de lire des fichiers structurés propriétaires tels que les eventlogs *.EVT, mais aussi les fichiers CVS, ETW, REG, etc&#8230; Tout d&#8217;abord il s&#8217;agit de le <a title="Logparser 2.2" href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAkQFjAA&amp;url=http%3A%2F%2Fwww.microsoft.com%2Fdownloads%2Fdetails.aspx%3FFamilyID%3D890cd06b-abf8-4c25-91b2-f8d975cf8c07&amp;rct=j&amp;q=download+logparser&amp;ei=m0-aS6yaLcT04gbn-fl7&amp;usg=AFQjCNGYcYCEUI2OdAX2GV_EO6ETNHqXnA&amp;sig2=vVABqIEJDhihHTm_mfP7CQ">télécharger</a> et de l&#8217;installer en trois ou quatre clics. Je passe rapidement sur l&#8217;install, il faudra juste bien penser à ajouter le chemin de logparser.exe dans votre PATH.</p>
<p>L&#8217;avantage principal est qu&#8217;il utilise un pseudo langage proche du SQL pour effectuer des recherches. Par exemple, si je veux remonter les 3 dernières erreurs dans le journal Application :</p>
<pre>$ logparser "SELECT TOP 3 TimeGenerated, SourceName, Message
from Application
where eventtype=1
order by TimeGenerated desc" -i:EVT -stats:OFF</pre>
<pre>TimeGenerated           SourceName      Message
-------------------     -----------     ------------------------------------------------
2010-03-11 13:03:39     MSSQLSERVER     Database mirroring connection error 2 'Connection ...
2010-03-11 13:03:17     MSSQLSERVER     Database mirroring connection error 4 '64...
2010-03-11 13:02:57     MSSQLSERVER     The mirroring connection to "tcp://192...</pre>
<p>On peut utiliser le mot-clé &#8216;<em>into</em>&#8216; après le SELECT pour indiquer que l&#8217;on souhaite placer le résultat dans un fichier. La répartition des codes erreurs dans les journaux d&#8217;évènements se fait comme suit:</p>
<pre>$ logparser "select distinct EventTypeName, EventType
from Application" -i:EVT -stats:OFF

EventTypeName       EventType
------------------- ---------
Information event   4
Success event       0
Warning event       2
Error event         1
Failure Audit event 16</pre>
<p>On recherchera donc en priorité les eventtype = 1.</p>
<p>Parmi les options intéressantes:</p>
<p><strong>-i</strong>: Donne le type d&#8217;entrée du fichier. exemple, -i:EVT indique que l&#8217;on souhaite lire un fichier *.evt. S&#8217;il n&#8217;est pas indiqué, logparser le trouve tout seul en fonction de l&#8217;entrée.<br />
<strong>-o</strong>: Donne le format de sortie. Par exemple -o:XML pour écrire au format XML. S&#8217;il n&#8217;est pas indiqué, logparser le trouve tout seul en fonction du fichier indiqué dans la clause &#8216;<em>into</em>&#8216;.<br />
<strong>-stats</strong>: ON/OFF: si les stats sont indiquées, alors logparser renvoie le nombre de lignes traitées et le temps passé.<br />
<strong>-q</strong>: ON/OFF: mode quiet, par exemple pour éliminer les entêtes.</p>
<p>Il possède également des fonction d&#8217;agrégation de type <em>GROUP BY / HAVING&#8230; </em>Par exemple pour ramener le nombre d&#8217;erreurs par Source:</p>
<pre>$ logparser "SELECT SourceName, count(*)
from Application where EventType = 1
group by SourceName order by count(*) desc"
-i:EVT -stats:OFF

SourceName                        COUNT(ALL *)
--------------------------------- ------------
MSSQLSERVER                       83
Winlogon                          30
Software Licensing Service        2
Perflib                           2
.NET Runtime Optimization Service 2
SideBySide                        2
SQLDIAG                           1</pre>
<p>Dès lors il devient facile de créer un script qui va régulièrement exécuter une recherche des erreurs remontées dans les journaux <em>Application </em>et <em>System</em>. Nous pouvons utiliser un simple fichier par exemple pour stocker la dernière ligne lue à chaque passage, et nous permettre de repartir de cette ligne à l&#8217;exécution suivante:</p>
<pre>$ logparser "SELECT MAX(RecordNumber) into E:\maxrecod.app.log FROM Application"
-i:EVT -stats:OFF -q:ON
$ cat E:/maxrecod.app.log
3597</pre>
<p>&#8230; et dans un script, affecter le contenu du fichier dans une variable, et utiliser la variable dans une nouvelle recherche. Par exemple sous cygwin:</p>
<pre>MAXRECORD=$(cat E:/maxrecod.app.log)
if [ ! -z ${MAXRECORD} ]
then
      SELECT TimeGenerated, SourceName, Message into E:/Application.err
      from Application where EventType=1 and RecordNumber &gt;= ${MAXRECORD}" 
      -i:EVT -stats:OFF -q:ON
else
      echo "borne invalide"
fi</pre>
<p>A+. David  B.<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</li>
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/" rel="bookmark" title="28 janvier 2010">Retrouver les tables dont les stats ne sont plus compilées en automatique</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" rel="bookmark" title="6 janvier 2010">MySQL et les tables temporaires internes</a> (Cédric PEINTRE) [MySQL]</li>
</ul>
<p><!-- Similar Posts took 3.115 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/_mPaU4xJhF0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/</feedburner:origLink></item>
		<item>
		<title>XtraDB sauvegarde votre cache, et ça marche !</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/ZYP8Fk6WYfU/</link>
		<comments>http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 08:00:30 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[innodb buffer pool]]></category>
		<category><![CDATA[innodb_buffer_pool_size]]></category>
		<category><![CDATA[percona]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[xtradb]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=643</guid>
		<description><![CDATA[La dernière version de XtraDB, le moteur de stockage proposé par Percona, dispose d&#8217;une fonctionnalité plutôt pertinente avec MySQL : La sauvegarde du cache InnoDB (InnoDB Buffer Pool)
Sauvegarder le cache, oui, mais pour quoi faire ?
Vous devez effectivement comprendre l&#8217;intérêt de la chose si vous vous êtes déjà frotté à l&#8217;administration d&#8217;un MySQL mais je [...]]]></description>
			<content:encoded><![CDATA[<p>La dernière version de XtraDB, le moteur de stockage proposé par Percona, dispose d&#8217;une fonctionnalité plutôt pertinente avec MySQL : La sauvegarde du cache InnoDB (InnoDB Buffer Pool)</p>
<h3>Sauvegarder le cache, oui, mais pour quoi faire ?</h3>
<p>Vous devez effectivement comprendre l&#8217;intérêt de la chose si vous vous êtes déjà frotté à l&#8217;administration d&#8217;un MySQL mais je dois vous avouer qu&#8217;en abordant le sujet pendant la pose café, tout le monde n&#8217;était pas forcement convaincu.</p>
<p>En effet, la mise en œuvre d&#8217;une telle fonctionnalité soulève une autre question : Pourquoi redémarrer MySQL ?</p>
<p>Effectivement, le véritable intérêt de cette sauvegarde est de pouvoir couper son MySQL sans perdre les informations stockées dans le cache. Intérêt évidemment compris de tous dans le cas d&#8217;un crash du serveur MySQL.</p>
<p>Dans les faits, XtraDB permet de sauvegarder et restaurer le cache même si il n&#8217;y a pas eu d&#8217;arrêt de l&#8217;instance. Ce qui peut d&#8217;ailleurs s&#8217;avérer utile dans certaines conditions, après le passage d&#8217;un gros batch par exemple, afin de retrouver un cache d&#8217;activité transactionnelle standard.</p>
<p>Pour en revenir à la question posée par mon collègue, en dehors du contexte de crash, pourquoi redémarrer MySQL ?<br />
Alors que d&#8217;autres éditeurs de bases de données concentrent leurs efforts pour justement limiter au maximum le redémarrage des instances, il semble que MySQL soit plus exposé que les autres à ce type de problématique.<br />
Et effectivement, même si la modification dynamique de paramètres gagne du terrain avec les nouvelles versions, la gestion des fichiers physiques reste problématique dans un environnement de production critique.</p>
<p>Il s&#8217;agit donc ici de se poser la question à l&#8217;envers et c&#8217;est donc pour ces différentes raisons que la sauvegarde du cache de données est pertinente avec MySQL !</p>
<h3>Comment ça marche ?</h3>
<p>Le pré-requis est évidemment d&#8217;installer et d&#8217;utiliser le moteur de stockage XtraDB fourni par Percona (lien en fin d&#8217;article).</p>
<p>Pour comprendre le fonctionnement de cette sauvegarde, j&#8217;ai réalisé un petit test en utilisant le compteur <em>Innodb_buffer_pool_pages_data</em> qui indique combien de pages du cache sont utilisées :</p>
<p>1 &#8211; Arrêt et relance de l&#8217;instance MySQL (Tous les caches sont vidés)</p>
<p>2 &#8211; Je contrôle l&#8217;état de mon cache :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 14    |
+-------------------------------+-------+
</pre>
<p>3 &#8211; Je fais une requête simple sur ma table ETAT :</p>
<ul>
<li>mysql&gt; select * from capdata_innodb.ETAT;</li>
</ul>
<p>4 -Nouvelle vérification du cache, à ce stade, la table ETAT a bien été montée dans le cache (au moins une  partie de ses données) :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 17    |
+-------------------------------+-------+
</pre>
<p>5 &#8211; Je lance une sauvegarde du cache :</p>
<ul>
<li>mysql&gt; select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA_LRU_DUMP*/;</li>
</ul>
<pre>+------------------------------+
| result_message               |
+------------------------------+
| XTRA_LRU_DUMP was succeeded. |
+------------------------------+
</pre>
<p>6 &#8211; Arrêt et relance de l&#8217;instance MySQL (Tous les caches sont vidés)</p>
<p>7 &#8211; Vérification du cache :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 14    |
+-------------------------------+-------+</pre>
<p>8 -Restauration du cache :</p>
<ul>
<li>mysql&gt; select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA_LRU_RESTORE*/;</li>
</ul>
<pre>+---------------------------------+
| result_message                  |
+---------------------------------+
| XTRA_LRU_RESTORE was succeeded. |
+---------------------------------+
</pre>
<p>9 &#8211; Dernière vérification du cache :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 17    |
+-------------------------------+-------+
</pre>
<p>Le cache a bien été restauré, à vous le warm restart facile !</p>
<p>Percona a réalisé un petit benchmark comparatif dont voici le résultat :</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/03/test_xtraDB_CB.png"><img class="aligncenter size-full wp-image-706" title="test_xtraDB_CB" src="http://blog.capdata.fr/wp-content/uploads/2010/03/test_xtraDB_CB.png" alt="" width="796" height="282" /></a></p>
<p>Retrouvez toutes les informations sur le moteur XtraDB ici : <a href="http://www.percona.com/docs/wiki/percona-xtradb:start" target="_blank">http://www.percona.com/docs/wiki/percona-xtradb:start</a><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<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) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" rel="bookmark" title="6 janvier 2010">MySQL et les tables temporaires internes</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/replication-sql-server-attention-publication-transactionnelle-et-indexes-non-clusters/" rel="bookmark" title="18 juin 2009">Attention : publication transactionnelle et indexes non clusters</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 2.466 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/ZYP8Fk6WYfU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/</feedburner:origLink></item>
		<item>
		<title>Création d’un Dataguard physique</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/IgU8YhKCJG8/</link>
		<comments>http://blog.capdata.fr/index.php/creation-d%e2%80%99une-physical-standby-database/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 14:42:12 +0000</pubDate>
		<dc:creator>Guillaume DEFENDINI</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[archive]]></category>
		<category><![CDATA[Data Guard]]></category>
		<category><![CDATA[standby]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=720</guid>
		<description><![CDATA[Configuration :
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Oracle 10GR2
PTEST : base primaire
STEST : base standby
Remarque :Toutes les opérations SQL se font connecté en tant que &#171;&#160;as sysdba&#160;&#187; 
1. Configuration  des bases en archivelog et force logging

SQL&#62; ALTER DATABASE FORCE LOGGING;
SQL&#62; alter database archivelog ;
2. Créer une sauvegarde de la base primaire
A) Créer les standby [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Configuration </strong></em>:<br />
Red Hat Enterprise Linux Server release 5.4 (Tikanga)<br />
Oracle 10GR2<br />
PTEST : base primaire<br />
STEST : base standby</p>
<p>Remarque :Toutes les opérations SQL se font connecté en tant que &laquo;&nbsp;as sysdba&nbsp;&raquo;<strong> </strong></p>
<p><strong>1. Configuration  des bases en archivelog et force logging<br />
</strong></p>
<p>SQL&gt; ALTER DATABASE FORCE LOGGING;<br />
SQL&gt; alter database archivelog ;</p>
<p><strong>2. Créer une sauvegarde de la base primaire</strong></p>
<p>A) Créer les standby controlfile<br />
SQL&gt; alter database create standby controlfile as ‘/u01/app/oracle/TEST/standby1.ctl’;</p>
<p>B) Créer les standby redo log .<br />
SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE &#8216;/u01/app/oracle/TEST/srl01.log&#8217; SIZE 10M   REUSE;<br />
SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE &#8216;/u01/app/oracle/TEST/srl02.log&#8217; SIZE 10M   REUSE;<br />
SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE &#8216;/u01/app/oracle/TEST/srl03.log&#8217; SIZE 10M   REUSE;<br />
SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE &#8216;/u01/app/oracle/TEST/srl04.log&#8217; SIZE 10M   REUSE;</p>
<p>Il est conseillé :</p>
<ul>
<li> de créer un fichier &laquo;&nbsp;standby redo log&nbsp;&raquo; de plus que les redo log</li>
<li> d&#8217;avoir une taille des standby redo log &gt;= taille des redo log</li>
</ul>
<p>C) Effectuer une sauvegarde de la base primaire ((il est possible de le faire à chaud par rman)</p>
<p>Arrêter la base primaire</p>
<p>Faire une copie physique dans un répertoire de sauvegarde des types de fichier suivants :<br />
- datafiles<br />
- online redo logs<br />
- standby controlfile<br />
- standby redolog</p>
<p>Redémarrer la base primaire</p>
<p><strong>3.  Modification ou création des  paramètres d’initialisation des bases primaire et standby</strong></p>
<p><em>Base ayant le rôle primaire (PTEST) </em>:<br />
log_archive_format=%t_%s_%r.arc<br />
log_archive_dest_2=&#8217;service=STEST LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=STEST&#8217;<br />
log_archive_config=&#8217;DG_CONFIG=(PTEST,STEST)&#8217;<br />
LOG_ARCHIVE_DEST_STATE_2=ENABLE<br />
db_name=TEST<br />
db_unique_name=PTEST<br />
fal_server=STEST<br />
fal_client=PTEST<br />
DB_FILE_NAME_CONVERT=(&#8216;/u01/app/oracle/TESTSTANDBY&#8217;,'/u01/app/oracle/TEST&#8217;)<br />
LOG_FILE_NAME_CONVERT=(&#8216;/u01/app/oracle/TESTSTANDBY&#8217;,'/u01/app/oracle/TEST&#8217;)<br />
standby_archive_dest=/u01/app/oracle/flash_recovery_area/STEST/standby_archive<br />
STANDBY_FILE_MANAGEMENT=AUTO</p>
<p><em> Base ayant le rôle standby (STEST)  :</em><br />
fal_server=PTEST<br />
fal_client=STEST<br />
DB_FILE_NAME_CONVERT=(&#8216;/u01/app/oracle/TEST&#8217;,'/u01/app/oracle/TESTSTANDBY&#8217;)<br />
LOG_FILE_NAME_CONVERT=(&#8216;/u01/app/oracle/TEST&#8217;,'/u01/app/oracle/TESTSTANDBY&#8217;)<br />
STANDBY_ARCHIVE_DEST=/u01/app/oracle/flash_recovery_area/STEST/standby_archive<br />
log_archive_format=%t_%s_%r.dbf<br />
STANDBY_FILE_MANAGEMENT=AUTO<br />
log_archive_config=&#8217;DG_CONFIG=(PTEST,STEST)&#8217;<br />
LOG_ARCHIVE_DEST_2=&#8217;service=STEST LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=PTEST&#8217;<br />
LOG_ARCHIVE_DEST_STATE_2=DEFER<br />
CONTROL_FILES=(&laquo;&nbsp;/u01/app/oracle/TESTSTANDBY/standby1.ctl&nbsp;&raquo;, &laquo;&nbsp;/u01/app/oracle/TESTSTANDBY/standby2.ctl&nbsp;&raquo;, &laquo;&nbsp;/u01/app/oracle/TESTSTANDBY/standby3.ctl&nbsp;&raquo;)</p>
<p><strong>4.  Configurer le listener, Oracle services names de la base primaire et de la standby</strong></p>
<p>A) Configurer les fichiers $ORACLE_HOME/network/admin/listener.ora pour l&#8217;enregistrement statique</p>
<p><em>listener.ora :</em></p>
<p>SID_LIST_LISTENER_PRIMARY =<br />
(SID_LIST=<br />
(SID_DESC=<br />
(GLOBAL_DBNAME=TEST)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)<br />
(SID_NAME=PTEST)<br />
)<br />
)</p>
<p>SID_LIST_LISTENER_STANDBY =<br />
(SID_LIST =<br />
(SID_DESC =<br />
(GLOBAL_DBNAME = TEST)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1 )<br />
(SID_NAME = STEST)<br />
)<br />
)</p>
<p>LISTENER_PRIMARY =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1521))<br />
)<br />
)</p>
<p>LISTENER_STANDBY =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1522))<br />
)<br />
)</p>
<p>B) Configurer les $ORACLE_HOME/network/admin/tnsnames.ora</p>
<p>STEST =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1522))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME =STEST)<br />
)<br />
)</p>
<p>PTEST =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME =PTEST)<br />
)<br />
)</p>
<p>C) Redémarrer les listeners des deux bases.</p>
<p>$ORACLE_HOME/bin/lsnrctl start LISTENER_PRIMARY<br />
$ORACLE_HOME/bin/lsnrctl start LISTENER_STANDBY</p>
<p><strong>5. Copie du fichier de mot de passe ou génération avec $ORACLE_HOME/bin/orapwd<br />
</strong></p>
<p><strong>6. Faire un startup mount de la base standby :</strong></p>
<p>SQL&gt; startup mount</p>
<p><strong>7. </strong> <strong>Démarrer le recovery sur la base standby</strong></p>
<p>A l’aide de la commande suivante :<br />
SQL&gt; alter database recover managed standby database disconnect from session;</p>
<ul>
<li>Dès qu’un archive log est transmis par la base primaire, la base standby commence à effectuer le recovery.</li>
<li>L’option “disconnect from session” permet de garder la main sur la session SQL dans laquelle la commande a été exécutée, le process est alors lancé en background.</li>
</ul>
<p><strong> 8.  Vérifier le transport des journaux</strong></p>
<p>En forçant la création d’un archive log sur la base primaire :<br />
SQL&gt; alter system archive log current ;<br />
L’archive log est alors transmis vers le répertoire d’archive de la base standby, et cette dernière fait automatiquement un recovery à partir du log transmis.</p>
<p><strong>9. </strong><strong>Vérifier que le data Guard fonctionne </strong></p>
<p>en exécutant la requête suivante sur le primary et sur la standby:<br />
SQL&gt; select max(sequence#) from v$log_history;</p>
<div style="overflow: hidden; width: 1px; height: 1px;">
<h1><a name="p"></a><span lang="EN-GB"> </span></h1>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><em>Remarques :</em></p>
<p class="MsoNormal">
<p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"><!--[if !supportLists]--><span>-<span> </span></span><!--[endif]-->Dans notre démarche nous adopterons la dénomination suivante:</p>
<p class="MsoNormal" style="text-indent: 35.45pt;">PTEST : base primaire</p>
<p class="MsoNormal" style="text-indent: 35.45pt;">STEST : base standby</p>
<p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"><!--[if !supportLists]--><span><span>-<span> </span></span></span><!--[endif]-->Toutes les opérations SQL se font connecté en tant que <strong><em>sys as sysdba</em></strong></p>
<p class="MsoNormal">
<h2><a name="_Toc255820650"></a></h2>
<p class="MsoNormal">
<p class="SQL"><span> </span><span lang="EN-GB">SQL&gt; </span>ALTER DATABASE FORCE LOGGING;</p>
<p class="SQL"><span> </span>SQL&gt; alter database archivelog ;</p>
<blockquote cite="4B94FA71.9070302@capdata.fr">
<h2><a name="_Toc255820651"></a></h2>
<h2><a name="_Toc255820652"></a></h2>
<p class="MsoNormal">
<p class="Titredesection"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Créer les standby controlfile</p>
<p class="MsoNormal">
<p class="SQL"><span> </span><span lang="EN-GB">SQL&gt; alter database create standby controlfile as</span></p>
<p class="SQL"><span lang="EN-GB"><span> </span><span> </span><span> </span>‘/u01/app/oracle/TEST/standby1.ctl’;</span></p>
<p><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><em><span style="font-size: 10pt;" lang="EN-US"> </span></em></p>
<p class="Titredesection" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]--><span lang="EN-US"><span> </span></span>Créer les standby redo log .</p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE</span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>&#8216;/u01/app/oracle/TEST/srl01.log&#8217; SIZE 10M<span> </span>REUSE;</span></p>
<p class="SQL"><span lang="EN-GB"><span> </span></span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE</span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>&#8216;/u01/app/oracle/TEST/srl02.log&#8217; SIZE 10M<span> </span>REUSE;</span></p>
<p class="SQL"><span lang="EN-GB"> </span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE</span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>&#8216;/u01/app/oracle/TEST/srl03.log&#8217; SIZE 10M<span> </span>REUSE;</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>SQL&gt; ALTER DATABASE ADD STANDBY LOGFILE</span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>&#8216;/u01/app/oracle/TEST/srl04.log&#8217; SIZE 10M<span> </span>REUSE;</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><em><span style="font-size: 10pt;">Il est conseillé de créer un fichier stand by redo log de plus que les redo log afin d’éviter un problème en cas de saturation des redo log</span></em></p>
<p class="MsoNormal"><em><span style="font-size: 10pt;"> </span></em></p>
<p class="Titredesection"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Arrêter la base primaire ((il est possible de le faire à chaud par rman)</p>
<p class="MsoNormal">
<p class="Titredesection" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Faire une copie physique dans un répertoire de sauvegarde des types de fichier suivants :</p>
<p class="MsoNormal">
<p class="MsoNormal" style="margin-left: 53.45pt; text-indent: -18pt;"><!--[if !supportLists]--><span>-<span> </span></span><!--[endif]-->datafiles</p>
<p class="MsoNormal" style="margin-left: 53.45pt; text-indent: -18pt;"><!--[if !supportLists]--><span>-<span> </span></span><!--[endif]-->online redo logs</p>
<p class="MsoNormal" style="margin-left: 53.45pt; text-indent: -18pt;"><!--[if !supportLists]--><span>-<span> </span></span><!--[endif]-->standby controlfile</p>
<p class="MsoNormal" style="margin-left: 53.45pt; text-indent: -18pt;"><!--[if !supportLists]--><span>-<span> </span></span><!--[endif]-->standby redolog</p>
<p class="MsoNormal">
<p class="Titredesection"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Redémarrer la base primaire</p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<h2><a name="_Toc255820653"></a></h2>
<p class="MsoNormal">
<p class="MsoNormal"><span style="text-decoration: underline;">Base ayant le rôle <strong>primaire</strong> (PTEST)</span> :</p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">log_archive_format</span></strong><strong><span lang="EN-GB">=%t_%s_%r.arc</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">log_archive_dest_2</span></strong><strong><span lang="EN-GB">=&#8217;service=STEST LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=STEST&#8217;</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">log_archive_config</span></strong><strong><span lang="EN-GB">=&#8217;DG_CONFIG=(PTEST,STEST)&#8217;</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">LOG_ARCHIVE_DEST_STATE_2</span></strong><strong><span lang="EN-GB">=ENABLE</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">dg_broker_start</span></strong><strong><span lang="EN-GB"> = TRUE</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">db_name=</span></strong><strong><span lang="EN-GB">TEST<span style="color: #f79646;"> </span></span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">db_unique_name</span></strong><strong><span lang="EN-GB">=PTEST</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB"> </span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">### Primary database standby role parameters ###</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">fal_server</span></strong><strong><span lang="EN-GB">=STEST</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">fal_client</span></strong><strong><span lang="EN-GB">=PTEST</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">DB_FILE_NAME_CONVERT</span></strong><strong><span lang="EN-GB">=(&#8216;/u01/app/oracle/TESTSTANDBY&#8217;,'/u01/app/oracle/TEST&#8217;)</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">LOG_FILE_NAME_CONVERT</span></strong><strong><span lang="EN-GB">=(&#8216;/u01/app/oracle/TESTSTANDBY&#8217;,'/u01/app/oracle/TEST&#8217;)</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">standby_archive_dest</span></strong><strong><span lang="EN-GB">=/u01/app/oracle/flash_recovery_area/STEST/standby_archive</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">STANDBY_FILE_MANAGEMENT</span></strong><strong><span lang="EN-GB">=AUTO</span></strong><strong><span> </span></strong></p>
</div>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><span style="text-decoration: underline;">Base ayant le rôle <strong>standby</strong> (STEST)</span> :</p>
<p class="MsoNormal">
<p class="MsoNormal">
<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">### Standby database standby role parameters ###</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">fal_server</span></strong><strong><span lang="EN-GB">=PTEST</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">fal_client</span></strong><strong><span lang="EN-GB">=STEST</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">DB_FILE_NAME_CONVERT</span></strong><strong><span lang="EN-GB">=(&#8216;/u01/app/oracle/TEST&#8217;,'/u01/app/oracle/TESTSTANDBY&#8217;)</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">LOG_FILE_NAME_CONVERT</span></strong><strong><span lang="EN-GB">=(&#8216;/u01/app/oracle/TEST&#8217;,'/u01/app/oracle/TESTSTANDBY&#8217;)</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">STANDBY_ARCHIVE_DEST</span></strong><strong><span lang="EN-GB">=/u01/app/oracle/flash_recovery_area/STEST/standby_archive</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">log_archive_format</span></strong><strong><span lang="EN-GB">=%t_%s_%r.dbf</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">STANDBY_FILE_MANAGEMENT</span></strong><strong><span lang="EN-GB">=AUTO</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">log_archive_config</span></strong><strong><span lang="EN-GB">=&#8217;DG_CONFIG=(PTEST,STEST)&#8217;</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB"> </span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">### Standby database primary role parameters ###</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">LOG_ARCHIVE_DEST_2</span></strong><strong><span lang="EN-GB">=&#8217;service=STEST LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=PTEST&#8217;</span></strong></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><strong><span lang="EN-GB">LOG_ARCHIVE_DEST_STATE_2</span></strong><strong><span lang="EN-GB">=DEFER</span></strong><strong><span> </span></strong></p>
</div>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<h2><a name="_Toc255820654"></a></h2>
<p class="MsoNormal">
<p class="Titredesection" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Configurer les fichiers listener.ora situés sous $ORACLE_HOME/network/admin</p>
<p class="MsoNormal">
<p class="MsoNormal" style="margin-left: 18pt;"><span>Si le port du <em>listener</em> de l’instance n’est pas 1521, la valeur du paramètre LOCAL_LISTENER doit être renseignée.</span></p>
<p class="MsoNormal">
<p class="MsoNormal"><span lang="EN-US">Listener.ora</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
<p><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">SID_LIST_LISTENER_PRIMARY =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_LIST=</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_DESC=</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span><span> </span>(GLOBAL_DBNAME=TEST)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_NAME=PTEST)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">SID_LIST_LISTENER_STANDBY =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_LIST =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span></span><span>(SID_DESC =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_NAME = PLSExtProc)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(PROGRAM = extproc)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_DESC =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(GLOBAL_DBNAME = TEST)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1 )</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID_NAME = STEST)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span></span><span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">LISTENER_PRIMARY =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(DESCRIPTION_LIST =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(DESCRIPTION =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1521))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">LISTENER_STANDBY =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">(DESCRIPTION_LIST =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(DESCRIPTION =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC2))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1522))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span></span><span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span><span> </span>)</span></p>
</div>
<p class="MsoNormal">
<p class="Titredesection" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Configurer les tnsnames.ora</p>
<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">STEST =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(DESCRIPTION =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1522))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(CONNECT_DATA =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SERVER = DEDICATED)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span><span> </span>(SERVICE_NAME =STEST)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">PTEST =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(DESCRIPTION =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = TCP)(HOST = LINUX-ORA10-DATAGUARD-PRIMARY)(PORT = 1521))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(CONNECT_DATA =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SERVER = DEDICATED)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SERVICE_NAME =PTEST)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US">EXTPROC_CONNECTION_DATA =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(DESCRIPTION =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS_LIST =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(CONNECT_DATA =</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(SID = PLSExtProc)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span>(PRESENTATION = RO)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span lang="EN-US"><span> </span></span><span>)</span></p>
<p class="MsoNormal" style="border: medium none; padding: 0cm;"><span><span> </span>)</span></p>
</div>
<p class="MsoNormal">
<p class="MsoNormal">Redémarrer les listeners des deux bases.</p>
<p class="MsoNormal">
<p class="MsoNormal"><span lang="EN-US">&gt;Lsnrctl start LISTENER_PRIMARY</span></p>
<p class="MsoNormal"><span lang="EN-US">&gt;Lsnrctl start LISTENER_STANDBY</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<h2><a name="_Toc255820655"></a></h2>
<p class="MsoNormal">
<p class="SQL"><span lang="EN-GB">SQL&gt; create spfile from pfile=’/u01/app/oracle/admin/PTEST/pfileinitGUARD2.ora’ ;</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="Titredesection"><!--[if !supportLists]--><span style="font-family: Symbol;"> </span><!--[endif]-->Faire un startup nomount de la base standby, puis la monter en mode standby:</p>
<p class="MsoNormal">
<p class="SQL"><span> </span><span lang="EN-US">SQL&gt; startup nomount</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="SQL"><span lang="EN-GB"><span> </span>SQL&gt; alter database mount standby database ;</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal">
<h2><a name="_Toc255820656"></a></h2>
<p class="MsoNormal">
<p class="PucesLBi"><!--[if !supportLists]--><span style="font-family: Wingdings; color: #3366ff;"><span>§<span> </span></span></span><!--[endif]-->A l’aide de la commande suivante :</p>
<p class="MsoNormal">
<p class="SQL" style="margin-left: 35.45pt;"><span lang="EN-GB">SQL&gt; alter database recover managed standby database disconnect from session;</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="PucesLBi" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Wingdings; color: #3366ff;"><span>§<span> </span></span></span><!--[endif]-->Dès qu’un archive log est transmis par la base primaire, la base standby commence à effectuer le recovery.</p>
<p class="MsoNormal">
<p class="PucesLBi" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Wingdings; color: #3366ff;"><span>§<span> </span></span></span><!--[endif]-->L’option “disconnect from session” permet de garder la main sur la session SQL dans laquelle la commande a été exécutée, le process est alors lancé en background.</p>
<p class="MsoNormal" style="margin-left: 18pt;">
<p class="PucesLBi" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Wingdings; color: #3366ff;"><span>§<span> </span></span></span><!--[endif]-->Démarrer le transport des redo logs en forçant la création d’un archive log sur la base primaire :</p>
<p class="MsoNormal" style="margin-left: 18pt;">
<p class="SQL"><span> </span><span lang="EN-US">SQL&gt; alter system archive log current ;</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;">L’archive log est alors transmis vers le répertoire d’archive de la base standby, et cette dernière fait automatiquement un recovery à partir du log transmis.</p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="PucesLBi" style="text-align: justify;"><!--[if !supportLists]--><span style="font-family: Wingdings; color: #3366ff;"><span>§<span> </span></span></span><!--[endif]-->Vérifier que le dataguard fonctionne en exécutant la requête suivante <span style="text-decoration: underline;">sur le primary et sur la standby</span>:</p>
<p class="MsoNormal" style="margin-left: 18pt;">
<p class="SQL"><span> </span><span lang="EN-US">SQL&gt; select max(sequence#) from v$log_history;</span></p>
</blockquote>
</div>
<p><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<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/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/" rel="bookmark" title="5 juin 2009">Installation Oracle 64 bits sur Red Hat 5</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/" rel="bookmark" title="18 juin 2009">Direct i/o, dsync on/off, raw device</a> (David BAFFALEUF) [Sybase]</li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</li>
</ul>
<p><!-- Similar Posts took 3.102 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/IgU8YhKCJG8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/creation-d%e2%80%99une-physical-standby-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/creation-d%e2%80%99une-physical-standby-database/</feedburner:origLink></item>
		<item>
		<title>Installation Oracle 11gR2 64 bits sur Red Hat 5 Partie 1</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/Le0E0krJRFs/</link>
		<comments>http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 16:41:04 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[11gR2]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[Grid]]></category>
		<category><![CDATA[Red Hat]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=654</guid>
		<description><![CDATA[Cet article est écrit par Thierry GASCARD.
Il sera composé de trois parties :
- installation Oracle Grid Infrastructure 11gR2
- installation Oracle Database 11gR2
- utilisation Oracle Restart
1.  Configuration système
1.1 Pré-requis matériel :
-  5 Go pour les binaires Oracle en RAID 10
-  400 Mo sur /tmp
-  disques pour ASM
1.2 Noyau linux utilisé
RH 5 Entreprise 64 Bits Update 4
1.3 [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est écrit par Thierry GASCARD.<br />
Il sera composé de trois parties :<br />
- installation Oracle Grid Infrastructure 11gR2<br />
- installation Oracle Database 11gR2<br />
- utilisation Oracle Restart</p>
<p><strong>1.  Configuration système</strong></p>
<p>1.1 Pré-requis matériel :</p>
<p>-  5 Go pour les binaires Oracle en RAID 10<br />
-  400 Mo sur /tmp<br />
-  disques pour ASM</p>
<p>1.2 Noyau linux utilisé</p>
<p>RH 5 Entreprise 64 Bits Update 4</p>
<p>1.3 Pré-requis noyau</p>
<p>SELinux désactivé<br />
X installé et configuré<br />
Rpms suivants installés en plus des Rpms par défaut (version minimum) :<br />
binutils-2.17.50.0.6-12.el5  (x86_64)<br />
compat-libstdc++-33-3.2.3-61  (x86_64)<br />
compat-libstdc++-33-3.2.3-61  (i386)<br />
elfutils-libelf-0.137-3.el5  (x86_64)<br />
elfutils-libelf-0.137-3.el5  (i386)<br />
elfutils-libelf-devel-0.137-3.el5  (i386)<br />
elfutils-libelf-devel-0.137-3.el5  (x86_64)<br />
elfutils-libelf-devel-static-0.137-3.el5  (i386)<br />
elfutils-libelf-devel-static-0.137-3.el5  (x86_64)<br />
gcc-4.1.2-46.el5  (x86_64)<br />
gcc-c++-4.1.2-46.el5  (x86_64)<br />
glibc-2.5-42  (i686)<br />
glibc-2.5-42  (x86_64)<br />
glibc-common-2.5-42  (x86_64)<br />
glibc-devel-2.5-42  (x86_64)<br />
glibc-devel-2.5-42  (i386)<br />
glibc-headers-2.5-42  (x86_64)<br />
ksh-20080202-14.el5  (x86_64)<br />
libaio-0.3.106-3.2  (x86_64)<br />
libaio-0.3.106-3.2  (i386)<br />
libaio-devel-0.3.106-3.2  (i386)<br />
libaio-devel-0.3.106-3.2  (x86_64)<br />
libgcc-4.1.2-46.el5  (x86_64)<br />
libgcc-4.1.2-46.el5  (i386)<br />
libstdc++-4.1.2-46.el5  (x86_64)<br />
libstdc++-4.1.2-46.el5  (i386)<br />
libstdc++-devel-4.1.2-46.el5  (x86_64)<br />
libstdc++-devel-4.1.2-46.el5  (i386)<br />
make-3.81-3.el5  (x86_64)<br />
sysstat-7.0.2-3.el5  (x86_64)<br />
unixODBC-2.2.11-7.1  (x86_64)<br />
unixODBC-2.2.11-7.1  (i386)<br />
unixODBC-devel-2.2.11-7.1  (x86_64)<br />
unixODBC-devel-2.2.11-7.1  (i386)</p>
<p>La commande suivante nous donne des informations sur les Rpms nécessaires :<br />
rpm -q &#8211;qf &#8216;%{NAME}-%{VERSION}-%{RELEASE}  (%{ARCH})\n&#8217; \<br />
binutils compat-libstdc++-33-3.2.* elfutils-libelf elfutils-libelf-devel \<br />
elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers \<br />
ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel</p>
<p>Rem : attention à la présence de rpms 32 bits : utilisation possible de l’option force : rpm -ivh –force ..</p>
<p>1.4 Configuration des limites systèmes</p>
<p>[root@]# cat &gt;&gt; /etc/security/limits.conf &lt;&lt;EOF<br />
grid soft nproc 2047<br />
grid hard nproc 16384<br />
grid soft nofile 1024<br />
grid hard nofile 65536<br />
EOF</p>
<p>[root@]# cat &gt;&gt; /etc/pam.d/login &lt;&lt;EOF<br />
session    required     pam_limits.so<br />
EOF</p>
<p>[root@]# cat &gt;&gt; /etc/profile &lt;&lt;EOF<br />
if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then<br />
if [ \$SHELL = "/bin/ksh" ]; then<br />
ulimit -p 16384<br />
ulimit -n 65536<br />
ulimit -n 25165824<br />
else<br />
ulimit -u 16384 -n 65536 -l 25165824<br />
fi<br />
umask 022<br />
fi<br />
EOF</p>
<p>1.5 Configuration du serveur pour oracle</p>
<p>[root@]# cat &gt;&gt; /etc/sysctl.conf &lt;&lt;EOF<br />
kernel.shmmax=25769803776 &#8212; soit 24 Go<br />
kernel.shmall=6291456 &#8212; avec taille de 4ko soit 24 Go<br />
kernel.shmmni = 4096<br />
kernel.sem = 250 32000 100 128<br />
fs.file-max = 6815744<br />
net.ipv4.ip_local_port_range = 9000 65500<br />
net.core.rmem_default=262144<br />
net.core.rmem_max=4194304<br />
net.core.wmem_default=262144<br />
net.core.wmem_max=1048576<br />
fs.aio-max-nr=1048576<br />
EOF</p>
<p><strong>2.   Préparation système</strong></p>
<p>2.1 Création groupe oinstall,asmadmin,asmdba,asmoper</p>
<p>[root@]# groupadd -g 1000 oinstall<br />
[root@]# groupadd -g 1200 asmadmin<br />
[root@]# groupadd -g 1201 asmdba<br />
[root@]# groupadd -g 1202 asmoper</p>
<p>2.2   Création utilisateur grid</p>
<p>[root@]# useradd -m -u 1100 -g oinstall -G asmadmin,asmdba,asmoper -d /home/grid -s /bin/bash -c &laquo;&nbsp;Grid Infrastructure Owner&nbsp;&raquo; grid<br />
[root@]# id grid<br />
[root@]# passwd grid</p>
<p>2.3 Vérification de l&#8217;existence de l&#8217;utilisateur nobody</p>
<p>[root@]# id nobody</p>
<p>2.4    Création des répertoires</p>
<p>[root@]# mkdir -p /capdata/app/grid<br />
[root@]# mkdir -p /capdata/app/11.2.0/grid<br />
[root@]# chown -R grid:oinstall /capdata<br />
[root@]# chmod -R 775 /capdata</p>
<p>2.4 Mise à jour du profile de l&#8217;utilisateur grid</p>
<p>export ORACLE_SID=+ASM<br />
export ORACLE_BASE=/capdata/app/grid<br />
export ORACLE_HOME=/capadata/app/11.2.0/grid<br />
export ORA_NLS11=$ORACLE_HOME/nls/data<br />
export PATH=${PATH}:$HOME/bin:$ORACLE_HOME/bin<br />
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib<br />
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib<br />
export TEMP=/tmp<br />
export TMPDIR=/tmp<br />
umask 022</p>
<p><strong>3. Installation et configuration de la librairie ASM</strong><br />
3.1   Téléchargement</p>
<p>En fonction du noyau linux (uname -r), télécharger les rpms ASM sur le site <a href="http://www.oracle.com/technology/tech/linux/asmlib/" target="_blank">Oracle d&#8217;asm </a><br />
- ASMLib Kernel Driver<br />
- Userspace Library<br />
- Driver Support Files</p>
<p>3.2   Installation</p>
<p>[root@]#rpm -Uvh oracleasm*</p>
<p>3.2   Configuration</p>
<p>[root@]# /usr/sbin/oracleasm configure -i<br />
..<br />
Default user to own the driver interface []: <strong>grid</strong><br />
Default group to own the driver interface []: <strong>asmadmin</strong><br />
Start Oracle ASM library driver on boot (y/n) [n]: <strong>y</strong><br />
Scan for Oracle ASM disks on boot (y/n) [y]: <strong>y</strong><br />
Writing Oracle ASM library driver configuration: done</p>
<p>puis chargement<br />
[root@]# /usr/sbin/oracleasm init</p>
<p>3.2   Création des disques ASM<br />
a &#8211; partitionnement des LUNs EMC</p>
<p>J&#8217;effectue un alignement des partitions en enlevant les 256 premiers secteurs de disques soit 128 Ko</p>
<p>[root@]# /sbin/parted /dev/emcpowera<br />
mklabel msdos<br />
unit s<br />
mkpart primary 256 -1s<br />
print<br />
quit</p>
<p>[root@]# /sbin/parted /dev/emcpowerb<br />
mklabel msdos<br />
unit s<br />
mkpart primary 256 -1s<br />
print<br />
quit</p>
<p>b- création des disques ASM</p>
<p>[root@]# /usr/sbin/oracleasm createdisk DATA_DISK1 /dev/emcpowera1<br />
[root@]# /usr/sbin/oracleasm createdisk BACK_DISK1 /dev/emcpowerb1</p>
<p><strong>4. Installation d&#8217;Oracle Grid Infrasture 11gR2</strong></p>
<p>[grid@]# ./runInstaller &amp;</p>
<p>Ordre d’installation<br />
1. Installation Option : « Install and Configure for Standalone Server »<br />
2. Product Languages : « english, french »<br />
3. Create ASM Disk Group : « DATA,BACK »<br />
4. ASM passwaord  : «same password»<br />
5. Operating system Group : « asmdba,asmoper,asmadmin »<br />
6. Installation location :<br />
ORACLE_BASE : /capdata/app/grid<br />
ORACLE_HOME : /capadata/app/11.2.0/grid<br />
7. Prerequisite checks :<br />
Génération d&#8217;un script fixit.sh pour fixer d&#8217;événtuel problème<br />
8. Summary<br />
9. Setup<br />
Lancement de deux scripts sous root<br />
[root@]# /capdata/app/oraInventory/orainstRoot.sh<br />
[root@]# /capdata/app/11.2.0/grid/root.sh<br />
10.Finish</p>
<p>Et voilà pour la première partie&#8230;.<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/" rel="bookmark" title="5 juin 2009">Installation Oracle 64 bits sur Red Hat 5</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/" rel="bookmark" title="12 juin 2008">Se connecter à SQL Server à travers Oracle, quelle drôle d&#8217;idée ?</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/" rel="bookmark" title="5 juin 2009">Création et utilisation d&#8217;OCFS2</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 3.130 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/Le0E0krJRFs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/</feedburner:origLink></item>
		<item>
		<title>SQLDIAG (épisode 1)</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/g4fNSCuitYM/</link>
		<comments>http://blog.capdata.fr/index.php/sqldiag-episode-1/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 12:10:31 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[perfmon]]></category>
		<category><![CDATA[pssdiag]]></category>
		<category><![CDATA[RML Utilities]]></category>
		<category><![CDATA[sqldiag]]></category>
		<category><![CDATA[SQLNexus]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=490</guid>
		<description><![CDATA[Début d&#8217;une assez longue série de posts sur l&#8217;utilitaire SQLDIAG et ses petits camarades de jeu PSSDIAG, SQLNexus et autres RML Utilities&#8230;
SQLDIAG est un utilitaire en mode ligne de commandes qui est livré avec SQL Server depuis plus de 10 ans maintenant. Il est bien caché, peu de gens l&#8217;utilisent mais il peut être d&#8217;une [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #333333;">Début d&#8217;une assez longue série de posts sur l&#8217;utilitaire SQLDIAG et ses petits camarades de jeu PSSDIAG, SQLNexus et autres RML Utilities&#8230;</span></p>
<p><span style="color: #333333;"><strong>SQLDIAG </strong>est un utilitaire en mode ligne de commandes qui est livré avec SQL Server depuis plus de 10 ans maintenant. Il est bien caché, peu de gens l&#8217;utilisent mais il peut être d&#8217;une puissance redoutable. Il est capable de lancer en même temps:</span></p>
<ul>
<li><span style="color: #333333;"><em>Une collecte perfmon.</em></span></li>
<li><span style="color: #333333;"><em>Une trace type SQL Trace.</em></span></li>
<li><span style="color: #333333;"><em>Une collecte des journaux d&#8217;évènements.</em></span></li>
<li><span style="color: #333333;"><em>Un inventaire complet  de la machine basé sur msinfo32.</em></span></li>
<li><span style="color: #333333;"><em>Un inventaire complet de l&#8217;instance.</em></span></li>
</ul>
<p><span style="color: #333333;">Il permettra même de corréler des traces de compteurs perfmon et le traçage de sessions SQL dans Profiler. Il se base sur un fichier de configuration au format XML. Il en existe un par défaut (SQLDiag.xml) qui se trouve sous ~Tools\Binn, mais il est très exhaustif  et trace tous les compteurs et évènements disponibles. L&#8217;inconvénient de l&#8217;utiliser est qu&#8217;il créé des traces pénalisantes et très encombrantes, plusieurs dizaines de Gb de fichiers textes, blg, trc, etc&#8230; Donc on a intérêt à se créer son petit fichier XML pour ne capturer que ce dont on aura besoin.</span></p>
<h2><span style="color: #333333;">SQLDiag.xml<br />
</span></h2>
<p><span style="color: #333333;">Dans ce premier épisode, nous allons donc parler de la structure de ce fichier XML. Elle ressemble vu d&#8217;en haut à ceci:</span></p>
<pre><span style="color: #0000ff;">&lt;Collection&gt;
&lt;Machines&gt;
        &lt;Machine name="."&gt;
                &lt;MachineCollectors&gt;
                        &lt;<span style="color: #008000;">EventlogCollector</span> /&gt;
                        &lt;<span style="color: #008000;">PerfmonCollector</span> /&gt;
                &lt;/MachineCollectors&gt;
                &lt;Instances&gt;
                       &lt;Instance&gt;
                              &lt;Collectors&gt;
                                    &lt;<span style="color: #008000;">SqldiagCollector</span> /&gt;
                                    &lt;<span style="color: #008000;">BlockingCollector</span> /&gt;
                                    &lt;<span style="color: #008000;">ProfilerCollector</span> /&gt;
                                    &lt;<span style="color: #008000;">CustomDiagnostics</span> /&gt;
                             &lt;/Collectors&gt;
                     &lt;/Instance&gt;
              &lt;/Instances&gt;
      &lt;/Machine&gt;
&lt;/Machines&gt;
&lt;/Collection&gt;</span></pre>
<p><span style="color: #000000;"><span style="color: #333333;">Chaque balise </span><span style="color: #008000;"><strong>%</strong><em><strong>Collector</strong></em><span style="color: #333333;"> </span></span><span style="color: #333333;">délimite la zone de paramétrage de chaque <strong>collecteur de trace</strong>. Pour activer / désactiver un collecteur, passer son attribut enabled à <em>true</em> ou <em>false</em>:</span></span></p>
<ul>
<li><span style="color: #333333;"><strong>EventlogCollector </strong>pour collecter les journaux d&#8217;évènements.<br />
</span></li>
<li><span style="color: #333333;"><strong>PerfmonCollector </strong>pour lancer la trace perfmon.</span></li>
<li><span style="color: #333333;"><strong>SQLdiagCollector </strong>pour récupérer toute la configuration de l&#8217;instance: paramètres, contenu de tous les errorlogs, connexions, verrous, liste des bases et options, xp_msver, etc&#8230;<br />
</span></li>
<li><span style="color: #333333;"><strong>BlockingCollector </strong>pour l&#8217;évènement BlockedProcessReport de SQL Trace, rapporte les processus bloqués si le paramètre &#8216;<em>blocked process threshold (s)</em>&#8216; est configuré.</span></li>
<li><span style="color: #333333;"><strong>ProfilerCollector </strong>pour la trace SQL Trace complète avec les évènements que l&#8217;on aura indiqué.<br />
</span></li>
<li><span style="color: #333333;"><strong>CustomDiagnostics </strong>pour lancer des exécutables supplémentaires, en l&#8217;occurence msinfo32 dans notre cas, et récupérer la configuration complète de la machine.<br />
</span></li>
</ul>
<h3><span style="color: #333333;"><strong>PerfmonCollector </strong></span></h3>
<p><span style="color: #333333;">C&#8217;est le collecteur de compteurs perfmon. Ses éléments fils sont &lt;PerfmonObject /&gt; qui désigne la famille de compteurs comme <em>&laquo;&nbsp;PhysicalDisk(*)</em>&nbsp;&raquo; par exemple, et &lt;PerfmonCounter /&gt; qui désigne le compteur associé comme &laquo;&nbsp;<em>\Avg. Disk sec/Read</em>&laquo;&nbsp;. On aura besoin d&#8217;activer chaque compteur en passant son attribut enabled à <em>true</em>. Une zone PerfmonCollector peut ressembler à ceci, avec le nom des compteurs en vert:</span></p>
<pre><span style="color: #0000ff;">&lt;PerfmonCollector enabled="true" pollinginterval="30" maxfilesize="256"&gt;
    &lt;PerfmonCounters&gt;
        &lt;PerfmonObject name="\PhysicalDisk(*)" enabled="true"&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Avg. Disk sec/Read</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Avg. Disk sec/Write</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Disk Read Bytes/sec</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Disk Write Bytes/sec</span>" enabled="true" /&gt;
             &lt;PerfmonCounter name="<span style="color: #008000;">\Avg. Disk Bytes/Transfer</span>" enabled="true" /&gt;
        &lt;/PerfmonObject&gt;
        &lt;PerfmonObject name="\Processor(*)" enabled="false"&gt;
            &lt;PerfmonCounter name="<span style="color: #008000;">\% Processor Time</span>" enabled="true" /&gt;
            &lt;PerfmonCounter name="<span style="color: #008000;">\% User Time</span>" enabled="true" /&gt;
            &lt;PerfmonCounter name="<span style="color: #008000;">\% Privileged Time</span>" enabled="true" /&gt;
        &lt;/PerfmonObject&gt;
    &lt;/PerfmonCounters&gt;
&lt;/PerfmonCollector&gt;</span></pre>
<p><span style="color: #333333;">L&#8217;attribut <em>pollinginterval </em>indique la fréquence d&#8217;échantillonnage des compteurs. Le fichier de sortie de ce collecteur sera un fichier BLG intitulé tout simplement<em> <strong>SQLDIAG.blg</strong></em>. Il pourra être corrélé plus tard avec la trace qui sera générée par le collecteur ProfilerCollector.</span></p>
<h3><span style="color: #333333;">SQLdiagCollector</span></h3>
<p><span style="color: #333333;">C&#8217;est le collecteur de données de l&#8217;instance. Il n&#8217;est pas paramétrable est composé d&#8217;une seule ligne:</span></p>
<pre><span style="color: #0000ff;">&lt;SqldiagCollector enabled="true" startup="false" shutdown="true" /&gt; </span></pre>
<p><span style="color: #333333;">On l&#8217;activera donc en passant son attribut enabled à <em>true</em> là encore. Les paramètres startup et shutdown permettent d&#8217;indiquer si la collecte se fait au démarrage ou à l&#8217;arrêt de la trace SQLDIAG.<br />
</span></p>
<h3><span style="color: #333333;">BlockingCollector:</span></h3>
<p><span style="color: #333333;">C&#8217;est le collecteur des processus bloqués en attente de libération de ressources (verrous). Lui aussi n&#8217;est constitué  que d&#8217;un seul élément:</span></p>
<pre><span style="color: #0000ff;">&lt;BlockingCollector enabled="true" pollinginterval="5" maxfilesize="350" /&gt; </span></pre>
<p><span style="color: #333333;">L&#8217;attribut <em>pollinginterval </em>désigne la fréquence d&#8217;échantillonnage  de l&#8217;évènement, et <em>maxfilesize </em>la taille maximale du fichier en sortie. Ce collecteur se base sur le paramètre d&#8217;instance &#8216;<em>blocked process threshold</em>&#8216; qui définit la durée en secondes au delà de laquelle on considère que le blocage est anormalement long. Il faudra définir ce paramètre car sa valeur par défaut est à zéro, ce qui signifie qu&#8217;il n&#8217;est pas activé. Par exemple pour mettre le seuil à 20 secondes:</span></p>
<pre><span style="color: #808080;">sp_configure 'blocked process threshold', 20
go
reconfigure
go</span></pre>
<p><span style="color: #333333;">Ensuite, le collecteur va créer une trace SQL Trace avec le seul évènement &#8216;<em>Blocked Process Report</em>&#8216;, et capturer les sessions qui auront été bloquées pendant plus de 20 secondes. Le fichier de sortie de ce collecteur est un fichier trc classique nommé <strong><em>&lt;INSTANCE&gt;_SQLDIAG_sp_trace_blk</em></strong>.</span></p>
<h3><span style="color: #333333;">ProfilerCollector:</span></h3>
<p><span style="color: #333333;">Ensuite, ProfilerCollector est le collecteur de trace SQL Trace classique. Comme pour PerfmonCollector, il va disposer d&#8217;éléments fils comme &lt;EventType /&gt; et &lt;Event /&gt; dans lesquels on va bien entendu retrouver nos classes d&#8217;évènements:</span></p>
<pre><span style="color: #0000ff;">&lt;ProfilerCollector enabled="true" template="_GeneralPerformance100.xml" pollinginterval="5" maxfilesize="350"&gt;
     &lt;Events&gt;
         &lt;EventType name="Stored Procedures"&gt;
             &lt;Event id="10" name="<span style="color: #008000;">RPC:Completed<span style="color: #0000ff;">"</span><span style="color: #0000ff;"> enabled="true</span></span>"/&gt;
             &lt;Event id="11" name="<span style="color: #008000;">RPC:Starting<span style="color: #0000ff;">"</span><span style="color: #0000ff;"><span style="color: #0000ff;"> </span>enabled="true</span></span><span style="color: #0000ff;">"</span> /&gt;
             &lt;Event id="43" name="<span style="color: #008000;">SP:Completed</span>" enabled="true" /&gt;
             &lt;Event id="42" name="<span style="color: #008000;">SP:Starting</span>" enabled="true" /&gt;
             &lt;Event id="45" name="<span style="color: #008000;">SP:StmtCompleted</span>" enabled="true" /&gt;
             &lt;Event id="44" name="<span style="color: #008000;">SP:StmtStarting</span>" enabled="true" /&gt;
        &lt;/EventType&gt;
       &lt;EventType name="TSQL"&gt;
             &lt;Event id="40" name="<span style="color: #008000;">SQL:StmtStarting</span>" enabled="true"/&gt;
             &lt;Event id="41" name="<span style="color: #008000;">SQL:StmtCompleted</span>" enabled="true" /&gt;
       &lt;/EventType&gt;
     &lt;/Events&gt;
 &lt;/ProfilerCollector&gt;</span></pre>
<p><span style="color: #333333;">Le fichier de sortie de ce collecteur sera </span>aussi <span style="color: #333333;">un fichier trace classique nommé </span><strong><em>&lt;INSTANCE&gt;_SQLDIAG_sp_trace.</em></strong></p>
<h3><span style="color: #333333;">CustomDiagnostics</span></h3>
<p>Enfin, CustomDiagnostics permet de pousser encore plus loin la personnalisation du rapport, en nous permettant d&#8217;utiliser nos propres outils de collecte. L&#8217;outil qui est utilisé par défaut est <strong>msinfo32 </strong>qui est utilisé pour afficher de manière graphique (Démarrer -&gt; Exécuter -&gt; msinfo32) ou en ligne de commande toute la configuration de la machine hôte:</p>
<pre><span style="color: #0000ff;">&lt;CustomDiagnostics&gt;
 &lt;CustomGroup name="msinfo" enabled="true" /&gt;
 &lt;CustomTask enabled="true" groupname="MsInfo" taskname="<span style="color: #008000;">Get MSINFO32</span>" type="Utility" point="Startup" wait="OnlyOnShutdown" cmd="start /B /WAIT MSInfo32.exe /computer %server% /report
         &amp;quot;%output_path%%server%_MSINFO32.TXT&amp;quot; /categories +SystemSummary+ResourcesConflicts+ResourcesIRQS+ComponentsNetwork+ComponentsStorage+ComponentsProblemDevices+SWEnvEnvVars+
         SWEnvNetConn+SWEnvServices+SWEnvProgramGroup+SWEnvStartupPrograms" /&gt;
 &lt;CustomTask enabled="true" groupname="MsInfo" taskname="<span style="color: #008000;">Get default traces</span>" type="Copy_File" point="Startup" wait="OnlyOnShutdown" cmd="&amp;quot;%sspath%log\log*.trc&amp;quot; &amp;quot;%output_path%&amp;quot;" /&gt;
 &lt;CustomTask enabled="true" groupname="MsInfo" taskname="<span style="color: #008000;">Get SQLDumper log</span>" type="Copy_File" point="Startup" wait="OnlyOnShutdown" cmd="&amp;quot;%sspath%log\SQLDUMPER_ERRORLOG.log&amp;quot;
          &amp;quot;%output_path%%server%_%instance%_SQLDUMPER_ERRORLOG.log&amp;quot;" /&gt;
 &lt;/CustomDiagnostics&gt;</span></pre>
<p>Mais en plus de récupérer le contenu d&#8217;une trace msinfo32, il peut également récupérer le contenu des traces SQL Server par défaut *, et les stacktraces générées par SQL Server lorsqu&#8217;il rencontre une erreur fatale sur un module. Il va copier le contenu de ces traces dans le répertoire passé à l&#8217;exécution de SQLDIAG.</p>
<h2>Exécution d&#8217;une trace</h2>
<p>Une fois le fichier XML défini, lancer une trace devient un jeu d&#8217;enfant:</p>
<pre><strong>$ sqldiag /I MyXMLfile.xml /O e:/SQLDIAG/TRACE1</strong>
<span style="color: #808080;">2010/02/04 18:58:10.28 SQLDIAG Collector version
2010/02/04 18:58:10.29 SQLDIAG</span>

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

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

<span style="color: #008000;">2010/02/04 18:58:22.28 SQLDIAG Collection started.  Press Ctrl+C to stop.</span></pre>
<p>La trace est lancée, un simple Ctrl-C suffira à la stopper. Les commutateurs /I et /O permettent d&#8217;indiquer le fichier de configuration XML choisi et le répertoire où va se loger le contenu de la trace complète.</p>
<p>Il existe aussi des commutateurs pour indiquer à SQLDIAG de programmer son exécution à des heures déterminées. Il est même possible de l&#8217;enregistrer en tant que service dans windows.</p>
<p>Dans le prochain post sur SQLDIAG, on verra comment dépouiller les fichiers de résultat.</p>
<p>A+ David B.</p>
<p>(avec la collaboration de Martial LUCAS. )</p>
<p><em>* Depuis la version SQL Server 2005, un paramètre instance &#8216;default trace enabled&#8217; avec une valeur de 1 (valeur par défaut) génère une trace systématiquement au démarrage de l&#8217;instance. Cette trace contient les classes évènements Database, Errors and Warnings, Full text, Objects, Performance, Server et Security Audit. Chaque trace vient se loger dans le répertoire des ERRORLOG par défaut.</em><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/" rel="bookmark" title="13 juin 2008">Modes de récupération et journal de transactions, épisode 1</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 1.737 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/g4fNSCuitYM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sqldiag-episode-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sqldiag-episode-1/</feedburner:origLink></item>
		<item>
		<title>Retrouver les tables dont les stats ne sont plus compilées en automatique</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/Xbgl-2q-TQQ/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 17:09:28 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[statistiques]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=452</guid>
		<description><![CDATA[Quand on tombe sur un problème de performance de requête, il faut entre autres choses vérifier si les statistiques sur les tables ont bien été recompilées récemment. En effet, ce n&#8217;est pas parce que les options &#8216;auto create statistics&#8216; et &#8216;auto update statistics&#8216; sont activées pour une base que ses tables et indexes ont toujours [...]]]></description>
			<content:encoded><![CDATA[<p>Quand on tombe sur un problème de performance de requête, il faut entre autres choses vérifier si les statistiques sur les tables ont bien été recompilées récemment. En effet, ce n&#8217;est pas parce que les options &#8216;<em>auto create statistics</em>&#8216; et &#8216;<em>auto update statistics</em>&#8216; sont activées pour une base que ses tables et indexes ont toujours des statistiques à jour.</p>
<p>On va créer une base de test pour démontrer ce point:</p>
<pre><span style="color: #000080;">create database test_statistics</span></pre>
<p>On va vérifier si les options de création et de mise à jour auto sont bien activées</p>
<pre><span style="color: #000080;">select databasepropertyex('test_statistics','IsAutoCreateStatistics')
select databasepropertyex('test_statistics','IsAutoUpdateStatistics')</span></pre>
<pre><span style="color: #008000;"><em>1
1</em></span></pre>
<p>On créé un peu de volumétrie et on ajoute les indexes clusterisés</p>
<pre><span style="color: #000080;">use test_statistics
create table STATS1(a numeric identity, b varchar(400))
create table STATS2(a numeric identity, b varchar(400))
insert into STATS1 values (replicate('a',400))
go 1000
insert into STATS2 values (replicate('a',400))
go 1000
alter table STATS1 add constraint PK_STATS1 primary key (a)
alter table STATS2 add constraint PK_STATS2 primary key (a)</span></pre>
<p>On fixe ensuite la date de dernière mise à jour des stats pour les deux tables avec STATS_DATE()</p>
<pre><span style="color: #000080;">select object_name(object_id), stats_date(object_id,stats_id) FROM sys.stats S
inner</span><span style="color: #000080;"> join sys.tables T on T.object_id = S.object_id

</span><span style="color: #008000;"><em>STATS1    2010-01-28 17:41:45.617
STATS2    2010-01-28 17:41:45.963</em>
</span></pre>
<p>A partir de là, on va forcer le calcul des stats en <strong>NORECOMPUTE </strong>sur STATS1 seulement et revérifier les dates de stats. <strong>NORECOMPUTE </strong>aura pour effet de dire à SQL Server de ne plus compiler en auto sur cette table.</p>
<pre><span style="color: #000080;">update statistics dbo.STATS1 PK_STATS1 WITH NORECOMPUTE</span>
<em><span style="color: #808080;"><span style="color: #008000;"> Command(s) completed successfully.</span>
</span></em><span style="color: #000080;">
select object_name(S.object_id), stats_date(S.object_id,S.stats_id) FROM sys.stats S
inner join sys.tables T on T.object_id = S.object_id
</span><span style="color: #808080;"><em><span style="color: #008000;">STATS1    2010-01-28</span> <span style="color: #ff0000;"><strong>17:42:14.350 </strong></span></em></span><em>
<span style="color: #008000;">STATS2    2010-01-28 17:41:45.963</span></em>
</pre>
<p>La date pour STATS1 a bien été modifiée. OK<br />
On va générer quelques perturbations identiques aux niveau des deux tables comme ajouter une colonne, supprimer des lignes, etc de manière à déclencher <strong>statman</strong>, l&#8217;utilitaire de recompilation auto des stats&#8230; On le verra passer dans une session Profiler:</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/01/autostats.png"><img class="alignnone size-full wp-image-455" title="autostats" src="http://blog.capdata.fr/wp-content/uploads/2010/01/autostats.png" alt="" width="469" height="331" /></a></p>
<p>Si  on revérifie maintenant les dates de mise à jour:</p>
<pre><span style="color: #000080;">select object_name(S.object_id), stats_date(S.object_id,S.stats_id) FROM sys.stats S
inner join sys.tables T on T.object_id = S.object_id</span>
<span style="color: #808080;"><em><span style="color: #008000;">STATS1    2010-01-28 17:42:14.350
</span><span style="color: #008000;">STATS2    2010-01-28 </span><span style="color: #ff0000;"><strong>17:47:59.630</strong></span></em></span></pre>
<p>Cette fois seule STATS2 a été modifiée. Il faudra donc que je prévoie de mettre à jour manuellement STATS1 à intervalles réguliers, 1 fois par jour la nuit par exemple.</p>
<p><strong>Conclusion </strong>pour retrouver sur une base les tables qui sont passées en norecompute au niveau des stats:</p>
<pre><span style="color: #000080;">select T.name 'tablename', S.name 'statsname', S.no_recompute
from sys.tables T
INNER JOIN sys.stats S on S.object_id = T.object_id
WHERE S.no_recompute = 1</span>

<em><span style="color: #808080;"><span style="color: #008000;">tablename             statsname                        no_recompute
-------------------  -------------------------------  ------------------------------
STATS1                PK_STATS1                       1
</span>
</span></em></pre>
<p><span style="color: #000000;"><em>A+ [David B.]</em></span></p>
<p><em><span style="color: #808080;"> </span></em><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" rel="bookmark" title="6 janvier 2010">MySQL et les tables temporaires internes</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [Service hétérogèneSqlServer]</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/replication-sql-server-retrouver-la-vilaine-transaction-en-echec/" rel="bookmark" title="21 septembre 2009">Retrouver une transaction en échec</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 2.664 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/Xbgl-2q-TQQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/</feedburner:origLink></item>
		<item>
		<title>MySQL et les tables temporaires internes</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/LGovMuOrIYw/</link>
		<comments>http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 16:04:34 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[max_heap_table_size]]></category>
		<category><![CDATA[tables temporaires]]></category>
		<category><![CDATA[temporary tables]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[tmp_table_size]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=293</guid>
		<description><![CDATA[MySQL créé des tables temporaires automatiquement lors de certaines sélections de données, en particulier lors de l&#8217;utilisation des clauses ORDER BY ou GROUP BY.
Le détail des cas de création de tables temporaires est disponible dans la documentation MySQL :

http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html

Ces tables temporaires sont créées en mémoire par défaut, dans la limite de la taille définie par [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL créé des tables temporaires automatiquement lors de certaines sélections de données, en particulier lors de l&#8217;utilisation des clauses <em>ORDER BY</em> ou<em> GROUP BY</em>.</p>
<p>Le détail des cas de création de tables temporaires est disponible dans la documentation MySQL :</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html</a></li>
</ul>
<p>Ces tables temporaires sont créées en mémoire par défaut, dans la limite de la taille définie par le paramètre <strong><em>tmp_table_size</em> </strong>[taille par défaut dépendante de l'OS]. Au delà de cette limite, la table temporaire est créée sur disque. Attention toutefois, si la valeur du paramètre <em>max_heap_table_size</em> [16M par défaut] est inférieure à celle de <em>tmp_table_size</em>, alors les tables temporaires en mémoire seront limitées à <em>max_heap_table_size</em>. Pour simplifier les choses, positionnez les deux paramètres à la même valeur.</p>
<p>Il est évidemment plus performant de provoquer le maximum de création en mémoire en positionnant la valeur du paramètre<em> tmp_table_size</em> à une taille relativement importante (16M à 32M).<br />
Attention toutefois au débordement mémoire, en effet, cette taille peut potentiellement être consommée par chaque thread connecté !</p>
<p>La colonne <em>Extra </em>de la commande <em>EXPLAIN </em>pour une requête de type <em>SELECT </em>permet d&#8217;obtenir une information sur la création d&#8217;une éventuelle table temporaire.<br />
Dans ce cas (utilisation d&#8217;un<em> GROUP BY</em>), une table temporaire sera créée :</p>
<p style="text-align: center;">*************************** 1. row ***************************<br />
id: 1<br />
select_type: SIMPLE<br />
table: t_evenement<br />
type: ALL<br />
possible_keys: NULL<br />
key: NULL<br />
key_len: NULL<br />
ref: NULL<br />
rows: 14988<br />
Extra: <strong>Using temporary</strong>; Using filesort</p>
<p>En revanche, cette commande ne permet pas de savoir si la table temporaire est créée sur disque ou en mémoire, pour cela, il faudra s&#8217;appuyer sur les compteurs MySQL évoqués dans la suite de l&#8217;article.</p>
<p>Le graphe suivant présente un état des tables temporaires créées en mémoire et sur disque pour notre instance de production  :</p>
<div id="attachment_378" class="wp-caption aligncenter" style="width: 549px"><a href="http://www.capdata.fr/support-DBA-oracle-sqlserver-mysql-sybase.htm"><img class="size-full wp-image-378  " src="http://blog.capdata.fr/wp-content/uploads/2010/01/temporay_tables.jpg" alt="Tables temporaires" width="539" height="376" /></a><p class="wp-caption-text">Tables temporaires MySQL</p></div>
<p>Les compteurs MySQL utilisés pour relever ces valeurs sont<code> <em>Created_tmp_table</em> et <em>Created_tmp_disk_tables</em>.</code> Il n&#8217;est malheureusement pas possible de connaitre la taille consommée en mémoire ou sur disque par ces tables temporaires.</p>
<p>Ici, la quasi totalité des tables temporaires est créée sur disque. La taille maximum d&#8217;une table temporaire en mémoire est pourtant positionnée à une valeur relativement importante (48M).</p>
<p><strong>Le fait d&#8217;augmenter la valeur du <em>tmp_table_size</em> ne changera rien dans ce cas ! Explications :</strong></p>
<p>MySQL utilise le moteur de stockage <a href="http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html" target="_blank"><em>MEMORY </em></a>pour la création des tables temporaires internes. Ce moteur se comporte quasiment comme <em>MyISAM</em>, cependant, une  contrainte  de ce moteur vient perturber le fonctionnement des tables temporaires internes : <strong>Il n&#8217;est pas possible d&#8217;utiliser des colonnes de type BLOB ou TEXT pour les tables <em>MEMORY</em>.</strong></p>
<p>De ce fait, si MySQL doit créer une table temporaire pour un ordre <em>SELECT </em>contenant ces types de colonne, elle sera automatiquement créée sur disque.</p>
<p>Deux possibilités s&#8217;offrent à vous dans ce cas :</p>
<ul>
<li>Limiter l&#8217;utilisation des colonnes de type BLOB ou TEXT</li>
<li>Monter un système de fichier mémoire pour le stockage des tables temporaires interne MySQL</li>
</ul>
<p>[ Cédric P ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/" rel="bookmark" title="28 janvier 2010">Retrouver les tables dont les stats ne sont plus compilées en automatique</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/" rel="bookmark" title="9 mars 2010">XtraDB sauvegarde votre cache, et ça marche !</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/replication-sql-server-attention-publication-transactionnelle-et-indexes-non-clusters/" rel="bookmark" title="18 juin 2009">Attention : publication transactionnelle et indexes non clusters</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [Service hétérogèneSqlServer]</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>
</ul>
<p><!-- Similar Posts took 3.250 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/LGovMuOrIYw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/</feedburner:origLink></item>
		<item>
		<title>Règles d’installation de base (épisode 2)</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/GZebEvQDXkY/</link>
		<comments>http://blog.capdata.fr/index.php/regles-d%e2%80%99installation-de-base-episode-2/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 09:24:15 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[installation]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=223</guid>
		<description><![CDATA[Suite de l&#8217;épisode précédent.
Une fois le matériel commandé, livré, déballé, racké, etc&#8230;, il va falloir installer Windows et SQL Server. Là encore il va falloir regarder certains détails de près :
Paramétrage de Windows Server:
Préparation des disques:
On l&#8217;a dit dans l&#8217;épisode 1, le disque c&#8217;est le nerf de la guerre. Je vais donc apporter un soin [...]]]></description>
			<content:encoded><![CDATA[<p>Suite de l&#8217;épisode <a href="http://blog.capdata.fr/?p=130">précédent</a>.</p>
<p>Une fois le matériel commandé, livré, déballé, racké, etc&#8230;, il va falloir installer Windows et SQL Server. Là encore il va falloir regarder certains détails de près :</p>
<h2>Paramétrage de Windows Server:</h2>
<h3><strong>Préparation des disques</strong>:</h3>
<p>On l&#8217;a dit dans l&#8217;épisode 1, le disque c&#8217;est le nerf de la guerre. Je vais donc apporter un soin particulier à la configuration de mes axes.</p>
<p><strong>Pour placer sur disque une base de données transactionnelle, on essaie de considérer deux règles de base:</strong></p>
<ul>
<li><strong> Toujours séparer physiquement le fichier de données du journal de transactions</strong>: pour deux raisons. La première pour la sécurité des données: si je perds mon disque de données, j&#8217;ai besoin d&#8217;avoir accès au journal pour récupérer les dernières transactions validées mais pas encore prises par le backup log. La seconde pour des raisons de performances: le critère qui pèse le plus dans le temps de service d&#8217;un disque, c&#8217;est le déplacement de la tête au dessus de la bonne piste (<em>seek time</em>). Les accès aux données sont de nature aléatoire et donc augmentent cette latence de recherche. En revanche, les accès sur le journal sont séquentiels, donc limitent le seek time car une fois la tête positionnée sur la bonne piste / bon secteur, elle glisse tranquillement pour lire (recovery) ou écrire (commit / checkpoints) sur les secteurs adjacents. Mélanger les deux, ça plombe les accès au journal, et sur une instance OLTP, on sait que l&#8217;accès en écriture sur le journal est critique car il conditionne le temps de réponse du commit.</li>
</ul>
<ul>
<li><strong>Toujours séparer </strong><strong>physiquement </strong><strong>les données des sauvegardes</strong>: pour une raison évidente de sécurité des données, mais il faut y penser avant d&#8217;avoir un problème. Et par défaut jusqu&#8217;en SQL Server 2005, tout allait dans ~MSSQL\Data et ~MSSQL\Backup.</li>
</ul>
<p><strong>Séparer physiquement</strong>, ça veut dire <strong>PAS</strong> sur les mêmes disques. Ce n&#8217;est pas parce que j&#8217;ai trois lecteurs E:\, F:\ et G:\ que j&#8217;ai trois disques, il faudra le vérifier avec la console de gestion des volumes (diskmgmt.msc) et avec votre ami l&#8217;administrateur système en charge du stockage pour vérifier s&#8217;il ne vous a pas refilé 3 LUNs découpées dans le même diskgroup. Si je reprends mon Proliant DL 580 G5  avec ses 16 slots:</p>
<p style="text-align: center;"><img class="size-full wp-image-326 aligncenter" src="http://blog.capdata.fr/wp-content/uploads/2010/01/proliant4.png" alt="proliant" width="633" height="393" /></p>
<p>Je me paye même le luxe d&#8217;avoir un RAID10 pour placer mes filegroups d&#8217;indexes, comme sur Oracle. Cela dit, la bagarre va être rude parce que tout le monde pense que l&#8217;espace disque est gâché, surtout pour ce qui concerne les journaux de transactions, où on va utiliser peut être 20% de l&#8217;espace alloué. Mais il faut le voir comme un investissement. Vous aurez des temps de service garantis de moins de 4 ms en écriture sur le commit, et le nombre de transactions par seconde va en bénéficier. C&#8217;est une réalité, on voit des exemples de ce type régulièrement chez nos clients. <em> </em></p>
<p>Une fois les axes définis et montrés à la machine, la première chose va être de partitionner le disque en alignant sur le 128ième secteur (=64K), sous diskpart:</p>
<pre><span style="color: #0000ff;">diskpart&gt; create partition primary align=64</span></pre>
<p>Globalement, il faut savoir que jusqu&#8217;en version 2003 incluse, Windows continue de préréserver les 63 premiers secteurs d&#8217;un disque pour y stocker son MBR (master boot record). Lorsque l&#8217;on va formater ensuite le file system en 64K, le premier offset va commencer réellement sur le 63ième secteur et décaler les clusters NTFS de 512 octets (1 secteur). il faut que les écritures de SQL Server (64K) soient alignées avec le début de la partition. Pour davantage d&#8217;infos, voir l&#8217;<a href="http://mikedavem.developpez.com/sqlserver/tutoriels/architecture/">article</a> de David BARBARIN sur le sujet.</p>
<p><strong>En deux étapes:</strong></p>
<ul>
<li>Partitionner le disque en alignant sur le 128ième secteur.</li>
<li>Puis créer un FS en NTFS avec un cluster size de 64K pour les disques de données et de journaux.</li>
</ul>
<p>Il faudra aussi aller vérifier que la politique d&#8217;écriture est bien en write-through au niveau du cache du contrôleur disque. Cet exemple sous OpenManage:</p>
<p style="text-align: center;"><img class="size-full wp-image-333 aligncenter" src="http://blog.capdata.fr/wp-content/uploads/2010/01/openManage_WriteThrough1.jpg" alt="openManage_WriteThrough1" width="427" height="145" /></p>
<h3><strong>Paramètres noyau de Windows pour SQL Server:</strong></h3>
<p>Pas grand chose à faire dans 99% des cas. Il faut valider que le bail (<em>quantum</em> en anglais) par thread est bien de type &#8216;long&#8217; dans les performances avancées de la machine (<em>Poste de Travail -&gt; Properties -&gt; Advanced -&gt; Performance -&gt; Advanced</em>):</p>
<p style="text-align: center;"><img class="size-full wp-image-295 aligncenter" src="http://blog.capdata.fr/wp-content/uploads/2010/01/processsched.png" alt="processsched" width="331" height="111" /></p>
<p>Background services =&gt; chaque thread a le droit de s&#8217;exécuter pendant 12 ticks d&#8217;horloge avant d&#8217;être interrompu par le Dispatcher.  Par défaut sur la gamme Server, le radiobutton doit être sur background services (quantum = 12 ticks d&#8217;horloge) et sur la gamme workstation, sur Programs (quantum = 2 ticks d&#8217;horloge). En général pour tous les SGBD, le quantum doit être plus long pour limiter le nombre de changements de contexte opérés par le système d&#8217;exploitation. Pour plus de détails, voir cet <a href="http://blog.capdata.fr/?p=159">article</a>.</p>
<p>Il faudra aussi aller vérifier que les ressources allouées seront en priorité sur les programmes générant beaucoup d&#8217;IOs comme SQL Server (<em>Connexions réseau, clic-droit sur l&#8217;interface réseau -&gt; Properties-&gt; File and Printer Sharing (et oui !) -&gt; Properties</em>):</p>
<p style="text-align: center;"><img class="size-full wp-image-298 aligncenter" src="http://blog.capdata.fr/wp-content/uploads/2010/01/maximizethroughput.jpg" alt="maximizethroughput" width="381" height="191" /></p>
<p>Maximize throughput for network applications: sous entendu on n&#8217;est pas là pour faire du partage de fichiers.</p>
<p>Et éviter l&#8217;utilisation des antivirus autant que possible.</p>
<h3>Compte de service pour SQL Server et l&#8217;agent:<em> </em></h3>
<p>Le compte de service est le compte déclaré au niveau de la machine ou du domaine pour supporter l&#8217;exécution de SQL Server et l&#8217;ensemble de ses interactions avec le système: poster des IOs, atteindre des machines sur le réseau, écrire dans un fichier de sauvegarde, etc&#8230; Toutes ces actions seront donc exécutées sous le contexte de droits du compte de service.  Dans la plupart des cas, les SQL  Server sont démarrés sous le contrôle des comptes systèmes locaux (LOCAL SYSTEM) avec lesquels sont lancés la plupart des modules de windows exécutés en mode user (smss.exe, crss.exe, lsass.exe, winlogon.exe, etc&#8230;). Et négligence du  DBA, on trouve aussi des SQL Server démarrés sous le compte Administrateur local voire de domaine, ce qui du point de vue sécurité  n&#8217;est pas vraiment l&#8217;idéal.</p>
<p>Et bien depuis la version SQL Server 2005, il n&#8217;y a plus d&#8217;excuse: on créé simplement des comptes utilisateurs locaux ou de domaine sans privilège *** pour SQL Server et SQL Agent (je ne parle pas de SQL Browser puisque du point de vue sécurité, on ne doit pas l&#8217;utiliser **), on les passe ensuite à l&#8217;assistant d&#8217;installation qui créé des groupes avec les droits appropriés, et y intègre les comptes qui héritent du coup des droits strictement nécessaires.</p>
<h2>Éléments à définir avant l&#8217;installation de SQL Server :</h2>
<p>Avant de lancer le setup,il faut réfléchir à quelques éléments caractéristiques de l&#8217;instance que l&#8217;on souhaite installer:</p>
<h3>Instance locale / instance nommée:</h3>
<p>L&#8217;instance locale est l&#8217;instance que l&#8217;on créé par défaut sur une machine. Elle prend par défaut le nom de la machine et le port 1433 attribué par l&#8217;IANA. On ne peut donc en créer qu&#8217;une seule par machine. Ma chaîne de connexion ressemblera à :</p>
<pre><span style="color: #0000ff;">sqlcmd -Udba_exploit -w1000 -S PIXIES </span></pre>
<p>Où PIXIES est le nom de ma machine, et donc le nom de mon instance locale par la même occasion. Maintenant, lorsqu&#8217;on souhaite en installer plus d&#8217;une par machine, on pourra utiliser les instances nommées, dont le nom sera constitué d&#8217;un préfixe (nom de la machine hôte) et d&#8217;un suffixe (nom de l&#8217;instance à choisir) séparés par un backslash (&#8216;\&#8217;). Dans ce cas, ma chaîne de connexion ressemblera à :</p>
<pre><span style="color: #0000ff;">sqlcmd -Udba_exploit -w1000 -S PIXIES\SQL1 </span></pre>
<p>Où SQL1 sera le nom de nom instance nommée. Autre différence majeure, le port de démarrage sera défini dynamiquement. Ce qui signifie qu&#8217;il peut changer entre deux redémarrages, donc problème de firewall à l&#8217;horizon. Pour l&#8217;éviter, il faudra fixer le port de démarrage de l&#8217;instance dans les propriétés TCP, et redémarrer SQL Server. **</p>
<h3>Collation:</h3>
<p>La collation va définir la manière de coder les caractères dans ma base de données. Là aussi le sujet est vaste et largement débattu sur le net. Il faut simplement réfléchir aux types de champs texte que mon application va devoir stocker et choisir le codepage approprié. Il faut essayer de prendre le codepage le plus large possible. Lors de l&#8217;installation en SQL Server 2005, deux types de collations sont proposées: les collations windows et les collations SQL Server. En fait la seconde est incluse pour compatibilité vers les versions précédentes, et ne doit donc être utilisée que pour assurer la compatibilité lors d&#8217;une migration. Il vaut mieux essayer de partir avec une collation Windows dès le départ, elles sont plus riches et plus précises, notamment lorsqu&#8217;on utilise à la fois des colonnes UNICODE et NON-UNICODE, car la collation windows sait convertir du NON-UNICODE à la volée.  Changer la collation à tous niveaux n&#8217;est pas une opération de routine: au niveau de l&#8217;instance, il faudra la reconstruire, au niveau de la base c&#8217;est plus <a title="Changer la collation d'une base" href="http://blog.capdata.fr/?p=222">épique encore.<br />
</a></p>
<h3>Mode d&#8217;authentification:</h3>
<p>Deux solutions:</p>
<ul>
<li><em><strong>Le mode intégré</strong></em>: l&#8217;authentification se fait par une autorité telle qu&#8217;un contrôleur de domaine ou la machine locale. Avantage, SQL Server ne stocke pas de mot de passe, côté sécurité c&#8217;est la meilleure option. Inconvénient, lorsqu&#8217;on souhaite atteindre depuis son application cliente une instance qui n&#8217;est pas dans le même domaine, ou simplement une machine en workgroup, l&#8217;authentification intégrée ne fonctionnera pas.</li>
<li><em><strong>Le mode mixte:</strong></em> donc on sera obligé de permettre aussi de créer et d&#8217;utiliser  des comptes et des mots de passe dans SQL Server. En mode mixte, on se connecte soit avec un compte windows, soit avec un compte SQL Server.</li>
</ul>
<p>Les bonnes pratiques de sécurité préconisent de rester en mode intégré, mais ce n&#8217;est n&#8217;est bien souvent pas très pratique, et donc pas appliqué. Il vaut mieux autoriser le mode mixte mais désactiver le compte sa, et faire appliquer la politique de mots de passe de Windows.</p>
<p>Une fois ces étapes validées, l&#8217;installation peut commencer. Le travail de préparation est terminé.</p>
<p>A bientôt !</p>
<p><em><strong>* </strong>Dans cet exemple, on choisit de faire les backups sur un partage CIFS</em><br />
<em><strong>** </strong>Je ne parle pas de sécurité dans cet article, le sujet est vaste et fera l&#8217;objet d&#8217;un prochain post.<br />
<strong>*** </strong>Penser à cocher le compte n&#8217;expire jamais pour les comptes de service. </em></p>
<p>[ David B. ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/" rel="bookmark" title="11 décembre 2008">Modes de récupération et journal de transactions, épisode 2</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-regles-dinstallation-de-base-episode-1/" rel="bookmark" title="18 juin 2009">Règles d&#8217;installation de base (épisode 1)</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 1.869 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/GZebEvQDXkY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/regles-d%e2%80%99installation-de-base-episode-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/regles-d%e2%80%99installation-de-base-episode-2/</feedburner:origLink></item>
		<item>
		<title>Oracle, les Rpms plus de souci avec YUM</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/XJpIsDOP4bQ/</link>
		<comments>http://blog.capdata.fr/index.php/oracle-les-rpms-et-les-dependances-avec-yum/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 15:58:02 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[public-yum]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=288</guid>
		<description><![CDATA[Un truc sympa, vous en avez marre d&#8217;installer des rpms avec Oracle ou des soucis de dépendance ..
La solution http://public-yum.oracle.com  et YUM.
[root@OEL5-ORA1 yum.repos.d]# cd /etc/yum.repos.d
[root@OEL5-ORA1 yum.repos.d]#wget http://public-yum.oracle.com/public-yum-el5.repo
car j&#8217;utilise OEL 5 Update 4
[root@OEL5-ORA1 ~]# cat /etc/enterprise-release
Enterprise Linux Enterprise Linux Server release 5.4 (Carthage)
Je vais modifier le fichier public-yum-el5.repo en mettant enabled=1 pour ma version el5_u4_base
vi [...]]]></description>
			<content:encoded><![CDATA[<p>Un truc sympa, vous en avez marre d&#8217;installer des rpms avec Oracle ou des soucis de dépendance ..</p>
<p>La solution <a href="http://public-yum.oracle.com/">http://public-yum.oracle.com </a> et YUM.</p>
<p><em>[root@OEL5-ORA1 yum.repos.d]#</em><em> cd /etc/yum.repos.d<br />
[root@OEL5-ORA1 yum.repos.d]#</em><em>wget http://public-yum.oracle.com/public-yum-el5.repo</em></p>
<p>car j&#8217;utilise OEL 5 Update 4</p>
<p>[root@OEL5-ORA1 ~]# cat /etc/enterprise-release<em><br />
Enterprise Linux Enterprise Linux Server release 5.4 (Carthage)</em></p>
<p>Je vais modifier le fichier public-yum-el5.repo en mettant enabled=1 pour ma version <em>el5_u4_base</em></p>
<p>vi public-yum-el5.repo</p>
<p><em>&#8230;<br />
</em></p>
<p><em>[el5_u4_base]<br />
name=Enterprise Linux $releasever U4 &#8211; $basearch &#8211; base<br />
baseurl=http://public-yum.oracle.com/repo/EnterpriseLinux/EL5/4/base/$basearch/<br />
gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5<br />
gpgcheck=1<br />
<strong>enabled=1</strong></em></p>
<p><em>&#8230;</em></p>
<p>[root@OEL5-ORA1 yum.repos.d]# yum list oracleasm<br />
<em>Loaded plugins: security<br />
Error: No matching Packages to list<br />
ocfs2 packages are not available. Let’s install it now</em></p>
<p>[root@OEL5-ORA1 yum.repos.d]# yum install oracleasm</p>
<p><em>Loaded plugins: security<br />
Setting up Install Process<br />
Package oracleasm-2.6.18-164.el5-2.0.5-1.el5.i686 already installed and latest version<br />
Nothing to do</em></p>
<p>Quel plaisir <img src='http://blog.capdata.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <em><br />
</em><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<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/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/replication-sql-server-retrouver-la-vilaine-transaction-en-echec/" rel="bookmark" title="21 septembre 2009">Retrouver une transaction en échec</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/" rel="bookmark" title="18 juin 2009">Direct i/o, dsync on/off, raw device</a> (David BAFFALEUF) [Sybase]</li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</li>
</ul>
<p><!-- Similar Posts took 4.819 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/XJpIsDOP4bQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/oracle-les-rpms-et-les-dependances-avec-yum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/oracle-les-rpms-et-les-dependances-avec-yum/</feedburner:origLink></item>
		<item>
		<title>Modifier la Collation d’une base SQL 2005</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/H4ao6H4Uo3o/</link>
		<comments>http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 13:05:48 +0000</pubDate>
		<dc:creator>Louis HOCHBERG</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[sql server collation]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=222</guid>
		<description><![CDATA[L’objectif de cet article est de présenter une méthode pour changer la collation d’une base de données.]]></description>
			<content:encoded><![CDATA[<p><!--[if gte mso 9]&gt;  Normal 0 21         MicrosoftInternetExplorer4  &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:宋体; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1593833729 1073750107 16 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-update:auto; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:Verdana; 	mso-fareast-font-family:SimSun; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-font-weight:bold;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman";} --> <!--[endif]--></p>
<p class="MsoNormal">La collation (ou classement en français) d’une base de données indique le jeu de caractères et l’ordre de tri des données stockées dans la base de données. De nombreux articles expliquent le rôle et traitent des problèmes de collation. L’objectif de celui-ci est de présenter une méthode pour changer la collation d’une base de données.</p>
<p>La collation peut être fixée:</p>
<ol>
<li>Au niveau de l’instance: à l’installation de SQL Server 2005.</li>
<li>Au niveau de la base:
<pre> CREATE DATABASE ... COLLATE ou ALTER DATABASE ... COLLATE.</pre>
</li>
<li>Au niveau de la colonne:
<pre>CREATE TABLE maTable ... COL1 NVARCHAR(100) COLLATE French_CI_AS</pre>
</li>
<li>Au niveau de l’expression SQL:
<pre>SELECT A, B from T1, T2 where T1.A = T2.B collate French_CI_AS</pre>
</li>
</ol>
<p class="MsoNormal">On peut parfois se retrouver dans la situation suivante :  la base de données a été créée ou restaurée dans une collation qui pose problème à l’application et il faut la modifier.</p>
<p class="MsoNormal"><!--[if gte mso 9]&gt;  Normal 0 21         MicrosoftInternetExplorer4  &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:宋体; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1593833729 1073750107 16 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-update:auto; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:Verdana; 	mso-fareast-font-family:SimSun; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-font-weight:bold;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman";} --> <!--[endif]--></p>
<p class="MsoNormal"><strong>Attention</strong>, gare alors aux problèmes lorsque l’on utilise des bases de collations différentes sur une même instance : La collation de tempdb est héritée de model, qui elle-même hérite de celle de l’instance. Lors de jointures avec des tables temporaires sur des colonnes contenant du texte, des erreurs de comparaison peuvent survenir:<span> </span></p>
<pre><span lang="EN-GB">Msg 468, Level 16, State 9, Line 5 Cannot resolve the collation conflict between
"French_CI_AS" and "Latin1_General_CI_AS_KS_WS" in the equal to operation</span></pre>
<p class="MsoNormal"><!--[if gte mso 9]&gt;  Normal 0 21         MicrosoftInternetExplorer4  &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:宋体; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1593833729 1073750107 16 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-update:auto; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:Verdana; 	mso-fareast-font-family:SimSun; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-font-weight:bold;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman";} --> <!--[endif]--></p>
<p class="MsoNormal">Pour changer la collation d’une base de données, il existe plusieurs techniques :</p>
<p class="MsoNormal"><strong><span style="#ff9900;">Technique 1 : </span></strong></p>
<ol>
<li>Modifier la collation de la base : <span style="&quot;Courier New&quot;;">ALTER DATABASE &#8230; COLLATE<br />
</span>Toutes les nouvelles colonnes de type caractère créées dans la base hériteront de la nouvelle collation mais pas les colonnes caractère déjà créées .</li>
<li>Modifier <span> </span>la collation de chaque colonne à condition quelle ne soit pas référencée dans un index, une contrainte Foreign key ou CHECK, une statistique de distribution ou une colonne calculée<br />
… pas évident</li>
</ol>
<p class="MsoNormal"><span style="#ff9900;"><strong>Technique 2</strong> </span>: celle que je vous propose</p>
<ol>
<li>Générer le script de création de la base et de tous ses objets</li>
<li>Modifier ce script, pour créer une nouvelle base vide avec la bonne collation</li>
<li>Importer dans la nouvelle base les données de l’ancienne base à l’aide de l’assistant de Management Studio</li>
<li>Vérifier si l’application fonctionne correctement sur la nouvelle base</li>
<li>Intervertir l’ancienne base et la nouvelle<br />
On peut renommer une base ( commande <span style="&quot;Courier New&quot;;">ALTER DATABASE … MODIFY NAME</span>). Attention de bien récupérer les comptes utilisateurs de l’ancienne base et le mapping sur les logins.</li>
</ol>
<p class="MsoNormal"><strong>Exemple </strong>: Changer la collation de la base AdventureWorks Latin1_General_CS_AS en<span> </span>En French_CI_AS</p>
<p>Avant de commencer:</p>
<p style="30px;">&#8211; Vérifier la collation du serveur</p>
<pre style="30px;">sp_helpsort</pre>
<pre style="30px;"><span style="#ff9900;"><span style="#3366ff;">Server default collation
---------------------------------------------------------------------------
French, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive</span></span></pre>
<p style="30px;">&#8211; Vérifier la collation de la base</p>
<pre style="30px;"><span style="#3366ff;"><span style="#000000;">select DATABASEPROPERTYEX('AdventureWorks', 'Collation')</span>
-----------------------------------------------------------------------
Latin1_General_CS_AS</span></pre>
<p style="30px;">&#8211; Vérifier la collation des colonnes</p>
<pre style="30px;">SELECT B.table_name, column_name, collation_name, data_type FROM INFORMATION_SCHEMA.COLUMNS A,
INFORMATION_SCHEMA.TABLES B
WHERE A.table_name = B.table_name and collation_name is not null
ORDER BY B.table_name</pre>
<pre style="30px;"><span style="#3366ff;">table_name    column_name   collation_name             data_type
-----------------------------------------------------------------------------------
Address       AddressLine1  Latin1_General_CS_AS        nvarchar
Address       AddressLine2  Latin1_General_CS_AS        nvarchar
...</span></pre>
<blockquote>
<p class="MsoNormal"><span lang="EN-GB"><span> </span></span></p>
</blockquote>
<p class="MsoNormal"><span style="#ff9900;"><strong>Etape 1</strong></span> : Générer le script de création de la base et de tous ses objets</p>
<p class="MsoNormal">A Partir de Management Studio, cliquer sur &laquo;&nbsp;Generate Scripts&nbsp;&raquo;</p>
<p class="MsoNormal"><a href="https://www.alldb.fr/blog/wp-content/uploads/2009/09/genscript1.png"><img class="alignnone size-full wp-image-241" src="https://www.alldb.fr/blog/wp-content/uploads/2009/09/genscript1.png" alt="" /></a></p>
<p class="MsoNormal">&#8212;<br />
Choisir la base AdventureWorks,<br />
Cocher l&#8217;option &laquo;&nbsp;Script All Objects&nbsp;&raquo;<br />
Next<br />
&#8212;<br />
<!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:宋体; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1593833729 1073750107 16 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-update:auto; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:Verdana; 	mso-fareast-font-family:SimSun; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-font-weight:bold;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman";} --> <!--[endif]-->Choose script Options<br />
Modifier les options suivantes :<span lang="EN-GB"><br />
Include Descriptive Headers: True<br />
Script Database Create: True<br />
Script Object-Level Permissions : True<br />
Script USE DATABASE : False<br />
Script Full-Text Indexes : True</span><br />
&#8212;<br />
Next<br />
Script to New Query Window<br />
&#8212;<br />
Next<br />
&#8212;<br />
Finish<br />
&#8212;<br />
Close
</p>
<p class="MsoNormal"><span style="#ff9900;"><strong>Etape 2</strong></span> : <!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:宋体; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1593833729 1073750107 16 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-update:auto; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:Verdana; 	mso-fareast-font-family:SimSun; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-font-weight:bold;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman";} --> <!--[endif]--><span style="Verdana;">Modifier ce script, pour créer une nouvelle base vide avec la bonne collatio</span></p>
<p class="MsoNormal">Avec l&#8217;outil Find/Replace Remplacer le mot AdventureWorks par AdventureWorks_2<br />
(nom de la nouvelle base)</p>
<p><!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:SimSun; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:宋体; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:Verdana; 	panose-1:2 11 6 4 3 5 4 4 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1593833729 1073750107 16 0 415 0;} @font-face 	{font-family:"\@SimSun"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-update:auto; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:Verdana; 	mso-fareast-font-family:SimSun; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-font-weight:bold;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 70.85pt 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman";} --> <!--[endif]-->
</p>
<p class="MsoNormal">Modifier la Collation de la base de données avec la valeur voulue en ajoutant la clause collate</p>
<pre><span>CREATE DATABASE
…
( NAME =
N'AdventureWorks_2_Log', FILENAME = N'C:\Program Files\Microsoft SQL
Server\MSSQL.1\MSSQL\DATA\AdventureWorks_2_Log.ldf' , SIZE = 916352KB , MAXSIZE
= UNLIMITED, FILEGROWTH = 10%)
<strong>COLLATE FRENCH_CI_AS</strong>
END</span></pre>
<p class="MsoNormal">Modifier les chemins des fichiers de données en cas de besoin (pour ne pas utiliser les mêmes que la base d’origine).</p>
<p><!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]--></p>
<p class="MsoNormal">=&gt; Exécuter le script</p>
<p class="MsoNormal">Vérifier qu’il n’y a pas d’erreur problématique lors de la création de la base et de ses objetts.<br />
Vérifier la collation de la nouvelle base et de ses colonnes.
</p>
<p class="MsoNormal"><!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]--></p>
<p class="MsoNormal">
<p class="MsoNormal"><strong>Etape 3</strong> : Importer dans la nouvelle base les données les données de l’ancienne</p>
<p class="MsoNormal">A l’aide SSMS depuis la base <span>AdventureWorks_2, lancer l’assistant d’import de données : </span></p>
<p class="MsoNormal"><!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]--></p>
<p><a href="https://www.alldb.fr/blog/wp-content/uploads/2009/09/import1.png"><img class="size-full wp-image-238 alignnone" src="https://www.alldb.fr/blog/wp-content/uploads/2009/09/import1.png" alt="Import des données avec SSMS" /></a></p>
<p class="MsoNormal">&#8212;<br />
Choose a Datasource: AdventureWorks<br />
Next<br />
&#8212;<br />
Choose a destination : AdventureWorks_2<br />
Next<br />
&#8212;<br />
Copy data from one or more tables or views<br />
Next<br />
&#8212;<br />
Ne sélectionner que les tables , pas les vues<br />
Next<br />
&#8212;<br />
Execute immediately<br />
Next<br />
Finish<br />
&#8212;-</p>
<p><!--[if gte mso 9]&gt;  Normal 0    21         MicrosoftInternetExplorer4  &lt;![endif]-->
</p>
<p class="MsoNormal">Les lignes de chaque table ont été ajoutées aux tables vides avec la nouvelle collation pour les données type Caractère</p>
<p class="MsoNormal">L.Hochberg</p>
<p><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<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) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 2.124 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/H4ao6H4Uo3o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/</feedburner:origLink></item>
		<item>
		<title>Retrouver une transaction en échec</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/y5JMC7ZBMw0/</link>
		<comments>http://blog.capdata.fr/index.php/replication-sql-server-retrouver-la-vilaine-transaction-en-echec/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 09:05:00 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=203</guid>
		<description><![CDATA[Aujourd&#8217;hui la réplication transactionnelle est en panne. Un coup d&#8217;oeil rapide au moniteur de réplication nous confirme que l&#8217;agent de distribution est en échec:
Command attempted:
if @@trancount &#62; 0 rollback tran
(Transaction sequence number: 0x0000CD53000011DE001000000000, Command ID: 1)

Error messages:
Syntax error, permission violation, or other nonspecific error (Source: MSSQLServer,
Error number: 20025)
Get help: http://help/20025
Syntax error, permission violation, or other [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui la réplication transactionnelle est en panne. Un coup d&#8217;oeil rapide au moniteur de réplication nous confirme que l&#8217;agent de distribution est en échec:</p>
<pre><em>Command attempted:
if @@trancount &gt; 0 rollback tran
(Transaction sequence number: 0x0000CD53000011DE001000000000, Command ID: 1)

Error messages:
Syntax error, permission violation, or other nonspecific error (Source: MSSQLServer,
Error number: 20025)
Get help: http://help/20025
Syntax error, permission violation, or other nonspecific error (Source: MSSQLServer,
Error number: 42000)
Get help: http://help/42000</em></pre>
<p>Ce n&#8217;est même pas la peine d&#8217;essayer de voir ce qu&#8217;il y a au bout des deux liens <em>http://help/&#8230;</em> proposés. En gros l&#8217;agent de distribution a trouvé une erreur en essayant d&#8217;appliquer une transaction. Le but est de retrouver le code SQL qui correspond à la transaction en échec. Lancer une trace Profiler sur le distributeur ne servira pas à grand chose car la transaction en question sera noyée dans le flot de mises à jour sur les tables systèmes de la réplication. En fait la chose la plus importante dans le log d&#8217;erreur est le numéro de transaction: <strong><em></em><em>0&#215;0000CD53000011DE001000000000</em></strong></p>
<p>Pour retrouver l&#8217;ordre correspondant sur le distributeur, utiliser <strong>sp_browsereplcmds</strong>, regarder la première ligne:</p>
<pre>use distribution
sp_browsereplcmds @xact_seqno_start = '0x0000CD53000011DE001000000000'

0x0000CD53000012EE000E	NULL	NULL	1	30	0	0	NULL	NULL
0x00000000000000000000
{CALL sp_MSins_EMAIL MOBILE DATA ('MICHAEL.HEARSLEY#TATOINE.COM', 'J74K6L')}	1

0x0000CD5300001304000F	NULL	NULL	1	30	0	0	NULL	NULL
0x00000000000000000000
{CALL sp_MSins_EMAIL MOBILE DATA ('EDUARDO.ALFONSO#JPMM.COM', 'J91RCX')}	1

0x0000CD530000131A0018	NULL	NULL	1	30	0	0	NULL	NULL
0x00000000000000000000
{CALL sp_MSins_EMAIL MOBILE DATA ('MARK.D.SPELLMAN#ATTACH.CO.UK', 'J731FZ')} 1

0x0000CD530000133B000E	NULL	NULL	1	30	0	0	NULL	NULL
0x00000000000000000000
{CALL sp_MSins_EMAIL MOBILE DATA ('XAVIER.BARTOLDI#NRJ.PICATRIX.COM', 'J92HBF')} 1

...</pre>
<p>Effectivement si on lance l&#8217;exécution de la proc à la main sur le subscriber:</p>
<pre>CALL sp_MSins_EMAIL MOBILE DATA ('MICHAEL.HEARSLEY#TATOINE.COM', 'J74K6L')

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'MOBILE'.</pre>
<p>Il y a des espaces dans le nom de la proc. L&#8217;assistant graphique de mise en place de la réplication créera la procédure avec des underscores, donc pas de souci, c&#8217;est juste pour l&#8217;exemple.</p>
<p>[ David B. ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/replication-sql-server-attention-publication-transactionnelle-et-indexes-non-clusters/" rel="bookmark" title="18 juin 2009">Attention : publication transactionnelle et indexes non clusters</a> (David BAFFALEUF) [SqlServer]</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/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-retrouver-les-tables-dont-les-stats-ne-sont-plus-compilees-en-automatique/" rel="bookmark" title="28 janvier 2010">Retrouver les tables dont les stats ne sont plus compilées en automatique</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 3.346 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/y5JMC7ZBMw0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/replication-sql-server-retrouver-la-vilaine-transaction-en-echec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/replication-sql-server-retrouver-la-vilaine-transaction-en-echec/</feedburner:origLink></item>
		<item>
		<title>Sessions consommatrices dans tempdb</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/5blcM1oSZzA/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-sessions-consommatrices-dans-tempdb/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 08:56:42 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[dbcc inputbuffer]]></category>
		<category><![CDATA[DBCCINPUTBUFFER]]></category>
		<category><![CDATA[DBCCSHOWFILESTATS]]></category>
		<category><![CDATA[monitorTempdb]]></category>
		<category><![CDATA[sessions]]></category>
		<category><![CDATA[tempdb]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=184</guid>
		<description><![CDATA[Je sais ce que vous allez dire: on l&#8217;a déjà vu partout, il y a déjà un million d&#8217;articles sur le sujet, quel intérêt pour une société qui se défend justement de poster sur des sujets originaux, etc&#8230;
Je vous répondrai que le problème n&#8217;est pas trivial. Tout le monde utilise les vues DMV pour récupérer [...]]]></description>
			<content:encoded><![CDATA[<p>Je sais ce que vous allez dire: on l&#8217;a déjà vu partout, il y a déjà un million d&#8217;articles sur le sujet, quel intérêt pour une société qui se défend justement de poster sur des sujets originaux, etc&#8230;</p>
<p>Je vous répondrai que le problème n&#8217;est pas trivial. Tout le monde utilise les vues DMV pour récupérer les infos de la session qui occupe l&#8217;espace dans tempdb, notamment le texte SQL de la requête:<br />
- <em>sys.dm_db_task_space_usage</em>: pour voir l&#8217;espace utilisé par session.<br />
- <em>sys.dm_exec_requests</em> ou <em>sys.dm_exec_query_stats</em> + <em>cross apply sys.dm_exec_sql_text(sql_handle)</em>: pour plus d&#8217;infos sur les sessions (stats + texte des requêtes).</p>
<p>Seulement voilà: les sessions dont le plan a été purgé du cache ne sont plus visibles dans les DMV sys.dm_exec&#8230; donc la jointure entre sys.dm_db_task_space_usage et sys.dm_exec&#8230; ne renverra pas d&#8217;infos pour des sessions qui utilisent pourtant bel et bien de l&#8217;espace dans tempdb.</p>
<p>Donc il faut avoir recours au bon vieux  <strong><em>dbcc inputbuffer</em></strong> pour récupérer tout ça.</p>
<p>1) D&#8217;abord, on va créer les tables de recueil.</p>
<p>1.1 DBCCINPUTBUFFER va nous permettre de récupérer le contenu du dbcc inputbuffer par session:</p>
<pre>CREATE TABLE tempdb.guest.DBCCINPUTBUFFER
(
EventType varchar(50),
Parameters int,
SQLText varchar(2000)
)</pre>
<p>1.2 DBCCSHOWFILESTATS va nous permettre de récupérer l&#8217;espace total et utilisé dans tempdb:</p>
<pre>CREATE TABLE tempdb.guest.DBCCSHOWFILESTATS
(
[fileid] [int], [filegroup] [int],
[totalextents] [int], [usedextents] [int],
[name] [varchar] (255), [filename] [varchar] (255)
)</pre>
<p>1.3 monitorTempdb sera notre table finale d&#8217;historique.</p>
<pre>CREATE TABLE tempdb.guest.monitorTempdb
(
curdate datetime,
spaceintempdb bigint,
spaceusedintempdb bigint,
spid int,
sqltext varchar(1000),
internal_objects_alloc_MB bigint,
internal_objects_dealloc_MB bigint,
user_objects_alloc_MB bigint,
user_objects_dealloc_MB bigint,
program_name varchar(100),
login_time datetime,
hostname varchar(20),
login_name varchar(100)
)</pre>
<p>2) Par session récupérer les infos et le texte de la requête: on va placer les sessions consommatrices ainsi que les espaces consommés dans un curseur, puis boucler pour chaque session_id et récupérer plus d&#8217;infos (program_name, login, etc&#8230; depuis sys.dm_exec_sessions, la seule DMV qui affiche toutes les sessions actives ou non) et le dernier texte SQL généré:</p>
<pre>use tempdb
go
declare
	@spid int,
	@sqltext varchar(1000),
	@internal_objects_alloc_page_count bigint,
	@internal_objects_dealloc_page_count bigint,
	@user_objects_alloc_page_count bigint,
	@user_objects_dealloc_page_count bigint,
	@program_name varchar(100),
	@login_time datetime,
	@hostname varchar(20),
	@login_name varchar(100),
	@SQLQUERY varchar(100),
	@spaceintempdb bigint,
	@spaceusedintempdb  bigint

declare cr_sqltext CURSOR READ_ONLY for
select session_id,internal_objects_alloc_page_count,internal_objects_dealloc_page_count,
user_objects_alloc_page_count, user_objects_dealloc_page_count
from sys.dm_db_task_space_usage where internal_objects_alloc_page_count &gt; 12000 

open cr_sqltext
fetch next from cr_sqltext into
	@spid,
	@internal_objects_alloc_page_count,
	@internal_objects_dealloc_page_count,
	@user_objects_alloc_page_count,
	@user_objects_dealloc_page_count

while @@fetch_status = 0
begin
	select
		@program_name = program_name,
		@login_time = login_time,
		@hostname = host_name,
		@login_name = login_name
	from sys.dm_exec_sessions where session_id = @spid

	select @SQLQUERY = 'dbcc inputbuffer('+convert(char(3),@spid)+')'

	insert into tempdb.guest.DBCCINPUTBUFFER exec (@SQLQUERY)
	select @sqltext = SQLText from tempdb.guest.DBCCINPUTBUFFER 

	insert into tempdb.guest.DBCCSHOWFILESTATS exec ('DBCC showfilestats with NO_INFOMSGS')
	select
		@spaceintempdb = sum(totalextents)/16,
		@spaceusedintempdb = sum(usedextents)/16
	from tempdb.guest.DBCCSHOWFILESTATS

	delete from tempdb.guest.DBCCINPUTBUFFER
	delete from tempdb.guest.DBCCSHOWFILESTATS

	insert tempdb.guest.monitorTempdb values
	(getdate(),
	@spaceintempdb,
	@spaceusedintempdb ,
	@spid, 	@sqltext,
	@internal_objects_alloc_page_count*8192/1048576 ,
	@internal_objects_dealloc_page_count*8192/1048576 ,
	@user_objects_alloc_page_count*8192/1048576 ,
	@user_objects_dealloc_page_count*8192/1048576 ,
	@program_name ,
	@login_time ,
	@hostname ,
	@login_name)

fetch next from cr_sqltext into
	@spid,
	@internal_objects_alloc_page_count,
	@internal_objects_dealloc_page_count,
	@user_objects_alloc_page_count,
	@user_objects_dealloc_page_count

end
close cr_sqltext
deallocate cr_sqltext
go</pre>
<p>Cette dernière partie peut être mise dans un job planifié toutes les minutes par exemple. C&#8217;est ainsi que j&#8217;ai découvert que sp_MSget_repl_commands et sp_MSdistribution_cleanup (procs de répli) peuvent être extrêmement consommatrices lorsque la file des requêtes à répliquer est très importante.</p>
<p>A+ [ David B. ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</li>
</ul>
<p><!-- Similar Posts took 1.584 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/5blcM1oSZzA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sql-server-sessions-consommatrices-dans-tempdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sql-server-sessions-consommatrices-dans-tempdb/</feedburner:origLink></item>
		<item>
		<title>Planification dans Adaptive Server</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/eQUClysRTos/</link>
		<comments>http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 13:39:46 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[Sybase]]></category>
		<category><![CDATA[internals]]></category>
		<category><![CDATA[scheduling]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=159</guid>
		<description><![CDATA[Un petit post sur la planification de tâches sur Adaptive Server.
Globalement, ASE utilise des threads pour supporter toutes les tâches qu&#8217;il exécute: requêtes, IO réseau ou disque, connexions utilisateur, tâches internes&#8230; en conjonction avec son propre planificateur de tâche.
Le rôle du planificateur de tâche sur tout système est de partager le temps d&#8217;un CPU entre [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit post sur la planification de tâches sur Adaptive Server.</p>
<p>Globalement, ASE utilise des threads pour supporter toutes les tâches qu&#8217;il exécute: requêtes, IO réseau ou disque, connexions utilisateur, tâches internes&#8230; en conjonction avec son propre planificateur de tâche.</p>
<p>Le rôle du planificateur de tâche sur tout système est de partager le temps d&#8217;un CPU entre plusieurs unités d&#8217;exécution (tâches). Il existe deux grandes familles de planificateurs, les <strong>préemptifs</strong>, et les <strong>coopératifs</strong>.</p>
<p>Le planificateur <strong>préemptif </strong>a le pouvoir de planifier et d&#8217;interrompre les tâches selon des règles qui lui sont propres et sans tenir compte du type de tâche en cours d&#8217;exécution. <em>One size fits all</em>, comme on dit.  Ce mécanisme, qui garantit qu&#8217;aucune tâche ne va monopoliser les ressources CPU, permet à chaque programme de pouvoir avoir la main sur la CPU à un moment où un autre. Sur la plupart des OS (linux, UNIX System V et Windows NT à partir de la 4.0), le planificateur alloue au thread un bail d&#8217;exécution ou un quantième. Si la tâche n&#8217;a pas terminé son travail dans le temps imparti, elle est interrompue. Lorsqu&#8217;il interrompt la tâche en cours, le planificateur sauvegarde son contexte dans un coin (c&#8217;est à dire les structures process + thread qui la représentent en mémoire), et planifie une nouvelle tâche sur la CPU. Ce qu&#8217;on appelle un<em> changement de contexte</em>.</p>
<p>Le planificateur <strong>coopératif</strong>, lui, va au contraire laisser à la tâche le soin de se terminer toute seule. C&#8217;est là la plus grosse différence, il n&#8217;interrompt pas une tâche qui n&#8217;a pas terminé son travail.  C&#8217;est à la charge de la tâche de rendre la main pour laisser de la place aux autres, c&#8217;est donc à elle de prévoir un mécanisme de relâche (<em>to yield</em> = &laquo;&nbsp;céder&nbsp;&raquo;). Windows 3.1 employait un scheduler coopératif, les Windows 98 et 95 aussi pour assurer la compatibilité avec les programmes 16 bits.</p>
<p>Maintenant, on imagine facilement le risque d&#8217;employer un tel système de planification: une tâche qui part en vrille ne libèrera jamais la CPU, ça n&#8217;a donc plus été employé pour faire des operating systems.</p>
<p><a href="http://www.csail.mit.edu/user/1547">Micheal Stonebraker</a> avait publié un article de quelques pages au début des années 80* expliquant en gros que les &#8217;services&#8217; apportés par UNIX system V n&#8217;étaient pas adaptés au monde de la base de données, et notamment en matière de planification. Les tâches typiques issues des SGBD prennent plus de temps à s&#8217;effectuer car il ne s&#8217;agit pas de calcul mais d&#8217;IOs, et le mode préemptif n&#8217;est pas adapté car il &#8216;coupe&#8217; la dynamique et l&#8217;efficacité du SGBD en produisant de nombreux changements de contexte.</p>
<p>Donc les développeurs chez Sybase ont répondu en créant un scheduler coopératif &#8216;<em>on top</em>&#8216; **, propre à Adaptive Server et par dessus le planificateur de l&#8217;OS, de telle manière à ce qu&#8217;il masque les choses vis à vis de celui-ci et limite au maximum les changements de contexte.</p>
<p><strong>- Les tranches de temps:</strong><br />
ASE va donc fonctionner comme un OS, mais avec ses règles à lui: il gère sa propre planification, son propre partage du temps CPU, ses propres valeurs de quantième. Car bien que coopératif, il doit pouvoir stopper une tâche qui ne répond plus et éviter la saturation d&#8217;un engine. Lorsqu&#8217;il planifie une tâche, il va lui allouer un bail. Ce bail n&#8217;est pas une valeur temporelle, c&#8217;est un nombre de ticks d&#8217;horloge qui est décrémenté. Il est calculé en divisant le paramètre &#8216;timeslice&#8217; par &#8217;sql server clock tick length&#8217;. Comme les deux valeurs sont à 100 ms par défaut, le nombre de ticks d&#8217;horloge autorisé est de 1. Dans le déroulement de son exécution, une tâche va passer par des parties de code qu&#8217;on appelle des <em>yield points</em>, au cours desquels elle va prendre une seconde pour vérifier qu&#8217;elle n&#8217;a pas dépassé son bail. Si elle découvre que le bail est excédé (bail &lt; 0), elle va demander à ASE de lui accorder une grace supplémentaire (<em>cpu grace time</em>), qui peut aller jusqu&#8217;à  500 ticks (soit 50 secondes). Si elle n&#8217;a pas terminé au delà de cette valeur, alors ASE sort les gros moyens, termine la tâche, annule ses transactions et affiche une stacktrace dans l&#8217;errorlog:</p>
<pre>00:00000:00005:2007/04/02 22:09:24.07 kernel  timeslice -501, current process infected
00:00000:00005:2007/04/02 22:09:24.75 kernel  ************************************
00:00000:00005:2007/04/02 22:09:24.77 kernel  curdb = 1 tempdb = 2 pstat = 0x200
00:00000:00005:2007/04/02 22:09:24.77 kernel  lasterror = 0 preverror = 0 transtate = 1
00:00000:00005:2007/04/02 22:09:24.77 kernel  curcmd = 0 program =
...</pre>
<p>Tout ceci se passe toujours sans que l&#8217;OS ne sache rien, car de son côté, le processus dataserver est toujours en exécution. C&#8217;est le but: l&#8217;OS ne doit pas interrompre le processus dataserver puisque celui-ci semble toujours travailler.</p>
<p><strong>- Runnable Process search count:</strong><br />
Toujours dans le souci de préserver son exécution vis à vis de l&#8217;OS, lorsqu&#8217;il a terminé d&#8217;exécuter des tâches, et plutôt que de rendre la main tout de suite, Adaptive Server va entrer dans une boucle de vérification des IOs en attente côté réseau puis côté disque. S&#8217;il ne trouve rien, il va tourner (<em>spinning</em>) pour rechercher de nouvelles tâches en attente d&#8217;exécution, puis de nouvelles IOs réseau, puis de nouvelles IOs disques, etc&#8230; tout ça 2000 fois par défaut (<em>runnable process search count</em>), même s&#8217;il n&#8217;y a rien à traiter dans aucune file d&#8217;attente. Ce qui donne une apparente sensation d&#8217;hyperactivité côté OS, alors que côté Adaptive Sever, l&#8217;électro-encéphalo est plutôt plat.</p>
<p>Pour illustrer tout ça, une petite explication de la section &#8216;kernel&#8217; de sp_sysmon:</p>
<pre>Kernel Utilization
------------------

Your Runnable Process Search Count is set to 5000
and I/O Polling Process Count is set to 10

Engine Busy Utilization        CPU Busy   I/O Busy       Idle
------------------------       --------   --------   --------
Engine 0                       80.0 %      7.5 %     12.5 %
Engine 1                       80.8 %      6.0 %     13.2 %
Engine 2                       82.5 %      5.7 %     11.9 %
Engine 3                       84.0 %      6.7 %      9.3 %
Engine 4                       79.0 %      6.8 %     14.2 %
Engine 5                       80.0 %      7.3 %     12.7 %
Engine 6                       79.6 %      8.3 %     12.0 %
------------------------       --------   --------   --------
Summary           Total         565.9 %     48.4 %     85.7 %
Average                         80.8 %      6.9 %     12.2 %</pre>
<p>Avant de commencer, il faut bien rappeler le cheminement de la boucle:<br />
<a href="https://www.alldb.fr/blog/wp-content/uploads/2009/06/rpsc3.png"><img class="alignnone size-medium wp-image-178" src="https://www.alldb.fr/blog/wp-content/uploads/2009/06/rpsc3-300x140.png" alt="" /></a><a href="https://www.alldb.fr/blogs/wp-content/uploads/2009/06/rpsc2.png"><br />
</a></p>
<p>Chaque engine tient le compte de ticks reçus de l&#8217;OS (par le biais de signaux SIGALRM) tous les 100ms, et les répertorie   selon trois catégories:</p>
<p><strong>CPU Busy</strong>: représente le temps (en fait le nombre de ticks ramené en pourcentage) passé par l&#8217;engine à exécuter une tâche sur l&#8217;intervalle.<br />
<strong>Idle</strong>: représente le temps passé par l&#8217;engine à n&#8217;exécuter aucune tâche sur l&#8217;intervalle.<br />
<strong> I/O Busy</strong>: est une soustraction de Idle. Il s&#8217;agit du temps passé par l&#8217;engine à n&#8217;exécuter aucune tâche (donc Idle) mais où il y avait au moins une IO disque en attente dans la file. Elle représente donc la quantité de temps où l&#8217;engine n&#8217;a pas pu exécuter une tâche parce qu&#8217;il y avait au moins une IO disque en attente.</p>
<p>On peut retrouver ces valeurs brutes en interrogeant les variables globales @@cpu_busy, @@idle, et @@io_busy. La durée d&#8217;un tick peut être retrouvée avec @@timeticks.</p>
<p>A+. [ David B. ]</p>
<p><em>*: Michael Stonebraker, Operating System Support for Database Management, CACM 24(7), p412-418 (1981).<br />
**: et Microsoft fit de même </em><em>en dotant </em><em>SQL Server 7.0  de son propre scheduler coopératif (UMS), toujours bien présent en version 2008 sous une autre dénomination (SQLOS). </em><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [Service hétérogèneSqlServer]</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/sql-server-principes-dune-sauvegarde-a-chaud/" rel="bookmark" title="12 décembre 2008">Principes d&#8217;une sauvegarde à chaud</a> (David BAFFALEUF) [SqlServer]</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/sql-server-sessions-consommatrices-dans-tempdb/" rel="bookmark" title="5 août 2009">Sessions consommatrices dans tempdb</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 3.924 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/eQUClysRTos" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/</feedburner:origLink></item>
		<item>
		<title>Direct i/o, dsync on/off, raw device</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/eziRaETe154/</link>
		<comments>http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 15:20:11 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[Sybase]]></category>
		<category><![CDATA[directio]]></category>
		<category><![CDATA[dsync]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=148</guid>
		<description><![CDATA[Il y a depuis 2 ans et encore aujourd&#8217;hui un gros débat sur l&#8217;avenir du direct IO sur Linux dans la communauté des développeurs kernel (cf post Linus http://lkml.org/lkml/2007/1/10/233) . L&#8217;avenir du raw device lui ne se pose même plus puisque Red Hat ne le supporte plus que du bout des doigts (cf la manpage [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a depuis 2 ans et encore aujourd&#8217;hui un gros débat sur l&#8217;avenir du direct IO sur Linux dans la communauté des développeurs kernel (cf post Linus <a title="LKML.org" href="http://lkml.org/lkml/2007/1/10/233"><em>http://lkml.org/lkml/2007/1/10/233</em></a>) . L&#8217;avenir du raw device lui ne se pose même plus puisque Red Hat ne le supporte plus que du bout des doigts (cf la manpage  de raw en RHEL5):</p>
<p><strong>WARNING</strong><br />
<em>Although  Linux  includes support for rawio, it is now a deprecated interface. If your application performs device access using this interface, Red Hat encourages you to modify your application to open the block device with the O_DIRECT flag. The rawio interface will exist for the life of Red Hat Enterprise Linux 5, but is a candi-<br />
date for removal from future releases.</em></p>
<p>Le bénéfice du raw device n&#8217;est pas nouveau, que ce soit pour Adaptive Server ou Oracle, le fait d&#8217;écrire directement sur la partition brute a deux avantages majeurs pour les SGBD:<br />
1 &#8211; Ca va plus vite.<br />
2 &#8211; Ca garantit que ce que l&#8217;on écrit va bien sur le disque et non dans un buffer en mémoire. En effet, le système de base de données gère lui-même la bufferisation de ses pages de données et d&#8217;indexes, et ne doit pas se reposer sur le système pour ça.</p>
<p>A partir du moment où le raw device cesse d&#8217;être supporté, on va devoir écrire dans un fichier, et qui dit écriture dans un fichier sous UNIX/Linux dit écriture bufferisée. C&#8217;est là où le critère 2 n&#8217;est plus garanti.</p>
<p>Il reste alors deux solutions qui vont nous permettre de garantir celà: DIRECTIO ou DSYNC. Ce sont en fait des arguments qui vont être passés à la primitive d&#8217;ouverture du fichier, le plus souvent open(), sous la forme de flags: O_DIRECT, O_DSYNC ou O_ASYNC.</p>
<p>A travers Adaptive Server, ces arguments seront manipulés lors de la création de devices avec la commande disk init:</p>
<pre>disk init name='PERFSTATS_data01', physname='/sybase_data/ASE1502/userdb/PERFSTATS_data01.dat',
size=512000,
directio=true</pre>
<p>ou</p>
<pre>disk init name='PERFSTATS_data01', physname='/sybase_data/ASE1502/userdb/PERFSTATS_data01.dat',
size=512000,
dsync=true</pre>
<p>On ne peut pas utiliser à la fois directio=true et dsync=true pour le même device, les options sont mutuellement exclusives.</p>
<p><strong>DIRECTIO</strong>:<br />
Lorsque directio est à true, le fichier PERFSTATS_data01.dat sera ouvert avec le flag O_DIRECT:</p>
<pre>open("/sybase_log/ASE1502/userdb/PERFSTATS_data01.dat", O_RDWR|O_SYNC|O_DIRECT|O_LARGEFILE) = 17</pre>
<p>Lorsque la primitive d&#8217;écriture est invoquée (write(), aiowrite()), l&#8217;écriture va directement sur le disque. Donc sémantiquement équivalent à ce que donne une écriture sur un raw device, à la fois en termes de performances et de garantie.</p>
<p><strong>DSYNC:</strong><br />
Lorsque dsync est à true, le fichier PERFSTATS_data01.dat sera ouvert avec le flag O_DSYNC:</p>
<pre>open("/sybase_log/ASE1502/userdb/PERFSTATS_data01.dat", O_RDWR|O_DSYNC|O_LARGEFILE) = 17</pre>
<p>Lorsque dsync est à false, le fichier PERFSTATS_data01.dat sera ouvert avec le flag O_ASYNC:</p>
<pre>open("/sybase_log/ASE1502/userdb/PERFSTATS_data01.dat", O_RDWR|O_ASYNC|O_LARGEFILE) = 17</pre>
<p>Lorsque la primitive d&#8217;écriture est invoquée, l&#8217;écriture sera bufferisée mais en fonction de la valeur passée à disk init (true  ou false),  certains éléments vont être synchronisés sur disque avant que aiowrite() ne revienne au programme appelant.<br />
<em><strong>- dsync=true</strong></em>: alors le flag O_DSYNC est passé à open(). Ce flag garantit que write() reste en attente tant que les données n&#8217;ont pas été synchronisées sur disque.<br />
<em><strong>- dsync=false:</strong></em> alors le flag O_ASYNC est passé à open(). Ce flag indique que write() rend la main une fois l&#8217;écriture bufferisée mais AVANT la synchronisation sur disque, ce qui ne garantit pas notre critère 2.</p>
<p>On recommandera toujours de mettre dsync=true pour les devices de données et de journaux pour avoir la garantie d&#8217;écriture stabilisée, et dsync=false pour les devices tempdb pour favoriser la perf.</p>
<p><strong>- Avantages / Inconvénients pour le DSYNC: </strong><br />
<em><strong>Avantages</strong></em>: c&#8217;est complètement supporté par les file system.<br />
<em><strong>Inconvénients</strong></em>: C&#8217;est moins performant en écriture.</p>
<p><strong>- Avantages / Inconvénients pour le DIRECTIO: </strong><br />
<em><strong>Avantages</strong></em>: c&#8217;est comme du raw device, sauf que c&#8217;est dans un fichier. C&#8217;est même plus efficace en lecture.<br />
<em><strong>Inconvénients</strong></em>: il faut que le filesystem le supporte (c&#8217;est le cas pour ext3), et d&#8217;après Linus l&#8217;implémentation de directio au niveau du kernel est épouvantable. Le problème c&#8217;est que ce qu&#8217;il indique comme contournement à destination des développeurs ASE (Wim Ten Have et Dave Wein en tête) n&#8217;est pas vraiment applicable.</p>
<p>Pas de doute, le DIRECTIO reste la meilleure option.  Ce sera sûrement réécrit un jour, mais pour l&#8217;instant on n&#8217;a pas trouvé mieux.</p>
<p>Un dernier mot sur le dsync=true sur les noyaux 2.6+, l&#8217;écriture asynchrone se transforme en écriture synchrone et les perfs chutent  <img src='http://blog.capdata.fr/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> (( . Il faut vraiment utiliser directio sur les noyaux récents. Ce sera peut être le sujet d&#8217;un prochain post sur ASE.</p>
<p>A+ [ David B. ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<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/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</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/creation-et-utilisation-docfs2/" rel="bookmark" title="5 juin 2009">Création et utilisation d&#8217;OCFS2</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 3.345 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/eziRaETe154" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/</feedburner:origLink></item>
		<item>
		<title>Règles d’installation de base (épisode 1)</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/1qQnhta3V5M/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-regles-dinstallation-de-base-episode-1/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 10:32:12 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[installation]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=130</guid>
		<description><![CDATA[C&#8217;est par là qu&#8217;on commence&#8230; à faire des bêtises en général. SQL Server, c&#8217;est facile, on clique, suivant, suivant et hop c&#8217;est fini.
Hélas, ce n&#8217;est pas plus facile qu&#8217;un autre SGBD. C&#8217;est juste plus facile de se tromper. Voici quelques règles de bases lorsqu&#8217;on s&#8217;apprête à installer un SQL Server en production. Episode 1: le [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est par là qu&#8217;on commence&#8230; à faire des bêtises en général. SQL Server, c&#8217;est facile, on clique, suivant, suivant et hop c&#8217;est fini.</p>
<p>Hélas, ce n&#8217;est pas plus facile qu&#8217;un autre SGBD. C&#8217;est juste plus facile de se tromper. Voici quelques règles de bases lorsqu&#8217;on s&#8217;apprête à installer un SQL Server en production. Episode 1: le matériel.</p>
<p><strong>1) La machine: physique ou virtuelle ? </strong><br />
Le gros débat des mois à venir. Même si la plupart des clients vont conserver des machines physiques pour leurs bases critiques, il y aura des bases de prod, uat, dev, qualif moins critiques qui seront virtualisées.<br />
Les constructeurs (Dell, HP,&#8230;) sortent de plus en plus des chassis dédiés à la virtualisation, avec ESXi embarqué. La virtualisation est (heureusement ? maheureusement ?) un train en marche, et plutôt que de freiner des quatre fers, posons-nous la question &laquo;&nbsp;comment virtualiser&nbsp;&raquo;, parce qu&#8217;il ne faut pas se voiler la face, on va y venir de toutes façons, ce n&#8217;est qu&#8217;une question de temps. HYPER-V et ESX sont tous les deux de bons concurrents, et ESX est annoncé compatible avec les produits MS. La combinaison des technos aujourd&#8217;hui (full virtualisation + assistance matérielle) fait que l&#8217;overhead de performances se réduit de plus en plus (on est quasiment en CPU-direct sur les Intel-VT et les AMD-V). Je penche personnellement pour le raw device mapping, une assistance matérielle CPU et une  configuration mémoire appropriée. Dans quelques temps nous aurons un ESX ou deux et nous pourrons tester tout ça.</p>
<p><strong>2) Admettons, machine physique:<br />
</strong><strong>LE PRIX ! </strong>Franchement les configurations à moins de 8000€ sont assez répandues et fiables. Je pense au HP Proliant DL 580 G5 (2&#215;4 Xeon 3Ghz, 4Gb RAM, 2 cartes 1ge et 16 slots disque pour $7600) ou au très populaire Dell PowerEdge 2950 III (même config mais avec seulement 6 slots disques pour $3600).</p>
<p><strong>DEDIEE/MUTUALISEE: </strong>en fonction des moyens. Mais idéalement il faut une machine dédiée. Les petits budgets vont faire tourner IIS et SQL Server sur la même machine, et d&#8217;expérience, c&#8217;est un mauvais calcul. Il vaut mieux investir un peu plus dans deux machines, et on aura moins de soucis ensuite.<br />
<strong><br />
CPU: </strong>le plus de cores il a sous le coude, et le mieux il se porte, SQL Server. Il est multithreadé, il sait parralléliser ses traitements. Evidemment il faut partir directement en 64 bits (EM64T, IA64, AMD64). Attention les éditeurs commencent à revoir leur politique de licence par socket, ils perdaient trop d&#8217;argent avec les hexacores et certains commencent à limiter à 6 cores par socket. Et attention à ne pas activer l&#8217;hyperthreading sur les machines SQL Server.<br />
<strong><br />
MEMOIRE: </strong>Oublier le 32 bits, la version 2008 de Windows Server sera la dernière à être proposée dans ce mode. En 64 bits, et avec le prix de la DDR2, il ne faut pas lésiner. C&#8217;est encore plus important que la CPU. Plus le cache de données est gros, moins SQL Server fera de lectures physiques.<br />
<strong><br />
RESEAU</strong>: Ca dépend. Je suis intervenu chez un client DRM il y a quelques temps et là le réseau c&#8217;était VRAIMENT crucial. Ca va le devenir de plus en plus avec FILESTREAM, la spatialisation, la vidéo HD, le plus de données on stocke, et le plus de données on va faire transiter. Les cartes et les core switches en 10Ge sont là, les Jumbo Frames, donc tout ça suit derrière. Le réseau entre systèmes Production / Secours est aussi crucial (Database mirroring, réplication). Nous avons un client en database mirroring 2005 qui avait installé un lien 100Mb entre ses deux sites, il va passer en fibre car il a de plus en plus de choses à faire passer sur le lien en plus du streaming lié au DB mirroring (sauvegardes, recopies de fichiers, etc&#8230;). Autre exemple, un client qui a une réplication transactionnelle entre Frankfort et Londres, le lien est vraiment très lent, et la resynchro de répli (34Gb) se fait en moyenne en 10-12 heures.<br />
Mais si l&#8217;application est codée en procédures stockées, que la quantité de données qui transite n&#8217;est pas importante et que SQL server est standalone, alors une carte 100Mb/s devrait faire l&#8217;affaire.<br />
<strong><br />
DISQUES: </strong>tout le monde ne peut pas se payer un SAN, je pense aux petites PME du web avec 1 machine serveur, un IIS  et une base de données de production, avec des moyens modestes. Donc on va considérer deux configurations: les disques internes pour les petits, et le stockage en réseau pour les riches et la classe moyenne.<br />
<em><strong> &#8211; DISQUES INTERNES</strong>:</em> choisir du SAS en 15KRPM. Le disque pour la base de données, c&#8217;est le nerf de la guerre. Le HP DL580 G5 avec ses 16 slots est parfait, il permet de faire trois RAID10 (data, log, backup) et un RAID1 (système) et de garder deux slots de spare. Il faudra vérifier au niveau de l&#8217;interface du contrôleur SAS que celui-ci est bien sur batterie et que celle-ci est valide, et que la politique est en write-through, c&#8217;est à dire que le cache du contrôleur n&#8217;est pas utilisé en écriture. Les disques SAS 73 Gb 15KRPM sont à 330€ chez Dell en 2&#8242;5, ça ne vaut pas le coup de se priver.<br />
<strong><em>- STOCKAGE RESEAU</em>: </strong>ne pas utiliser de NAS au sens strict (attachement réseau), pas de CIFS, ce n&#8217;est pas supporté de base par SQL Server. Il faut que les disques soient vus comme des disques locaux, donc soit une baie avec un attachement direct, soit un SAN. Pour les riches, le SAN en fibre channel est à privilégier. Pour la classe moyenne, le iSCSI est un bon moyen de faire du SAN à moindre coût, à la condition d&#8217;utiliser sur la machine hôte un initiateur matériel et non logiciel, c&#8217;est à dire une carte 1Ge qui soit compatible TSO (TCP Segmentation Offload, calcul de la pile TCP déchargée du CPU hôte), et que le réseau soit dédié au stockage. Pour les disques SAN, même politique que les disques internes. Au niveau du choix de la baie, il faut regarder plusieurs choses: Le nombre de storage processors (va déterminer le multiplexage des entrées, il en faut au moins 2), la  taille du cache par storage processor et non en globalité, le nombre de slots pour les disques, la capacité globale.  Le plus important c&#8217;est la taille du cache par SP.  Si les caches entre SP sont mirrorés l&#8217;un sur l&#8217;autre, on perd la moitié de la capacité  mémoire, si la baie est mirorrée sur une autre, on perd encore car le soft de miroir utilise des buffers dans le cache de chaque SP.  Ensuite, il faut voir comment le cache est partitionné entre les lectures et les écritures. Le plus souvent, c&#8217;est fait à la louche pour des systèmes majoritairement en lecture, mais attention à ne pas négliger les écritures en transactionnel. Un cache en écriture plein, et les queues se remplissent au niveau des SP, on observe des outstanding IOs côté SQL Server et c&#8217;est rapidement la cata.</p>
<p>Il paraît que je fais des articles trop longs, donc ce sera tout pour aujourd&#8217;hui <img src='http://blog.capdata.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Prochain épisode, l&#8217;installation Windows et les prérequis SQL Server.</p>
<p>A+ [ David B. ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/regles-d%e2%80%99installation-de-base-episode-2/" rel="bookmark" title="6 janvier 2010">Règles d&#8217;installation de base (épisode 2)</a> (David BAFFALEUF) [SqlServer]</li>
</ul>
<p><!-- Similar Posts took 1.438 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/1qQnhta3V5M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sql-server-regles-dinstallation-de-base-episode-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sql-server-regles-dinstallation-de-base-episode-1/</feedburner:origLink></item>
		<item>
		<title>Attention : publication transactionnelle et indexes non clusters</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/ozjPLSWfpKc/</link>
		<comments>http://blog.capdata.fr/index.php/replication-sql-server-attention-publication-transactionnelle-et-indexes-non-clusters/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 08:28:06 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=125</guid>
		<description><![CDATA[Récemment, en resynchronisant une publication transactionnelle avec un éditeur 2005 vers un abonné 2005, on s&#8217;est aperçu que le snapshot ne générait que les index clusters pour chaque article, pas les indexes non clusters. Enorme ! Nous avons revérifié avec un éditeur en 2000, et les indexes non clusters sont bien générés en même temps [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, en resynchronisant une publication transactionnelle avec un éditeur 2005 vers un abonné 2005, on s&#8217;est aperçu que le snapshot ne générait que les index clusters pour chaque article, pas les indexes non clusters. Enorme ! Nous avons revérifié avec un éditeur en 2000, et les indexes non clusters sont bien générés en même temps que les clusters.</p>
<p><strong>Explication: </strong>lorsque l&#8217;agent de snapshot doit extraire le DDL des articles et sortir les données par bcp en parrallèle, il se base sur deux options passées lors du sp_addarticle:<br />
- <strong>@type</strong>: qui va indiquer à quel type de publication on a affaire. Dans notre cas, ce sera <em><strong>logbased </strong></em>(=transac)<br />
- <strong>@schema_option</strong> : bitmask qui va indiquer ce qui doit être généré au niveau DDL.</p>
<p>D&#8217;après les BOLs 2005, si <strong>@type = &#8216;logbased&#8217;</strong>, alors <strong>@schema_option</strong> doit être à <strong>0&#215;30F3</strong>, qui décomposé contient bien à la fois le bitmask pour les index clusterisés (0&#215;10) et celui pour les indexes NC (0&#215;40).</p>
<p>Je vous engage à tester ça depuis SSMS, en créant une publication transac bidon et en jetant un coup d&#8217;oeil aux propriétés de l&#8217;article:</p>
<p><a href="https://www.alldb.fr/blog/wp-content/uploads/2009/06/moz-screenshot-176.jpg"><img class="alignnone size-medium wp-image-126" src="https://www.alldb.fr/blog/wp-content/uploads/2009/06/moz-screenshot-176-269x300.jpg" alt="" /></a></p>
<p>Dans le script généré, effectivement on a bien un problème:</p>
<p><tt>exec    sp_addarticle<br />
@publication = N'pubtest1',</tt><tt><br />
@article =    N'Address',<br />
</tt><tt> </tt><tt>@source_owner = N'dbo',<br />
</tt><tt> </tt><tt>@source_object = N'Address',<br />
<strong>@type = N'logbased'</strong>,<br />
</tt><tt> </tt><tt>@description = null,<br />
</tt><tt> </tt><tt>@creation_script = null,<br />
</tt><tt> </tt><tt>@pre_creation_cmd = N'drop',<br />
<strong>@schema_option = 0x000000000803509F</strong>,<br />
</tt><tt> </tt><tt>@identityrangemanagementoption =    N'manual',<br />
</tt><tt> </tt><tt>@destination_table = N'Address',<br />
@destination_owner = N'dbo',<br />
</tt><tt> </tt><tt>@vertical_partition = N'false',<br />
</tt><tt> </tt><tt>@ins_cmd = N'CALL    sp_MSins_dbo</tt><tt>Address</tt><tt>',<br />
@del_cmd =    N'CALL sp_MSdel_dbo</tt><tt>Address</tt><tt>',<br />
</tt><tt> </tt><tt>@upd_cmd = N'SCALL    sp_MSupd_dbo</tt><tt>Address</tt><tt>'<br />
GO</tt></p>
<p>Le bitmask 0&#215;803509F contient bien le 0&#215;10, mais pas le 0&#215;40.  Pour en avoir le coeur net, utilisez le ET logique  en transac (<tt>134434975=0x803509, 64=0x40, 16=0x10):</tt></p>
<p><tt>select 134434975 &amp;    64<br />
select 134434975 &amp; 16</tt></p>
<p><tt>-----------<br />
0</tt></p>
<p><tt>-----------<br />
16<br />
</tt><br />
Suite à une petite discussion avec Paul Randal, il se trouve que nombre de ses clients ont eu le même problème en migrant. Donc si vous migrez une réplication de 2000 vers 2005, et que vous constatez des problèmes de perfs sur les abonnés, vérifiez si vous avez tous vos indexes NC, juste comme ça&#8230; <img src='http://blog.capdata.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>A+ [ David B. ]<br />
<tt><br />
</tt><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/replication-sql-server-retrouver-la-vilaine-transaction-en-echec/" rel="bookmark" title="21 septembre 2009">Retrouver une transaction en échec</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/" rel="bookmark" title="9 mars 2010">XtraDB sauvegarde votre cache, et ça marche !</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" rel="bookmark" title="6 janvier 2010">MySQL et les tables temporaires internes</a> (Cédric PEINTRE) [MySQL]</li>
</ul>
<p><!-- Similar Posts took 2.682 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/ozjPLSWfpKc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/replication-sql-server-attention-publication-transactionnelle-et-indexes-non-clusters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/replication-sql-server-attention-publication-transactionnelle-et-indexes-non-clusters/</feedburner:origLink></item>
		<item>
		<title>Création et utilisation d’OCFS2</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/Q_83QiUcq64/</link>
		<comments>http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 14:26:12 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[CFS]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[OCFS2]]></category>
		<category><![CDATA[rac]]></category>
		<category><![CDATA[suse]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=103</guid>
		<description><![CDATA[Cet article est écrit par Thierry GASCARD.

Nous allons créer un système de fichiers supportant le cluster (Cluster FileSystem).
L&#8217;OS utilisé est une SUSE 10 en 64 bits.
1. Installation du driver OCFS2
A effectuer via l’utilisateur système root.
OCFS2 1.4 est compris dans la distribution SLES10 SP2.
sinon sous les autres linux :
Déterminer la version du noyau : uname –rm
Rechercher [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est écrit par <a href="mailto:tgascard@capdata.fr" target="_blank">Thierry GASCARD.<br />
</a></p>
<p>Nous allons créer un système de fichiers supportant le cluster (Cluster FileSystem).<br />
L&#8217;OS utilisé est une SUSE 10 en 64 bits.</p>
<h1>1. Installation du driver OCFS2</h1>
<p>A effectuer via l’utilisateur système root.<br />
OCFS2 1.4 est compris dans la distribution SLES10 SP2.<br />
sinon sous les autres linux :<br />
Déterminer la version du noyau : uname –rm<br />
Rechercher les drivers sur le site d’<a href="http://oss.oracle.com/projects/ocfs2/" target="_blank">Oracle</a><br />
Télécharger les fichiers correspondants à la plate forme et la version du noyau (ici RH5 64 bits)</p>
<ul>
<li>ocfs2-tools-1.4.1-1.el5.x86_64.rpm</li>
<li>ocfs2console-1.4.1-1.el5.x86_64.rpm</li>
<li>ocfs2-2.6.18-128.1.1.el5-1.4.1-1.el5.x86_64.rpm</li>
</ul>
<p>Installer les RPMs sur chaque noeud :<br />
<em>rpm -Uvh ocfs2*.rpm</em><br />
vérifier l’installation<br />
<em> chkconfig &#8211;list o2cb</em></p>
<h1>2. Configuration OCFS2</h1>
<p>1) Sur un des nœuds en x window lancer ocfs2console puis cluster/configure node<br />
ajouter hostname1   x.x.x<br />
ajouter hostname2   x.x.x<br />
puis propager la configuration<br />
Rem : attention au nom de domaine<br />
2) vérifier sur chaque nœud le fichier /etc/ocfs2/cluster.conf<br />
3) configurer le service o2cb sur chaque nœud en root<br />
<em>/etc/init.d/o2cb configure </em></p>
<p>puis répondre y et accepter les valeurs par défaut sauf Use user-space driven heartbeat? (y/n) [y] n</p>
<h1>3. Formater la partition en OCFS2 sur un nœud</h1>
<p>en x window lancer ocfs2console  puis task/format</p>
<ul>
<li> /dev/emcpowerd</li>
<li> label : oracle</li>
<li> cluster size : 128 K</li>
<li> block size 4k</li>
</ul>
<h1>4. Monter le système de fichiers OCFS2</h1>
<p>1) créer un point de montage sur chaque nœud<br />
<em>mkdir /ocfs</em><br />
2) ajouter dans /etc/fstab, voire la note metalink <span style="helvetica;"><strong>835839.1</strong></span><br />
/dev/emcpowerd /ocfs    ocfs2    _netdev,datavolume,nointr,noatime 0 0</p>
<p>les options correspondent avec ocfs2 1.4.1  :</p>
<ul>
<li> datavolume : utilisation des &laquo;&nbsp;direct IO&nbsp;&raquo;</li>
<li> _netdev : montage après le réseau</li>
<li> nointr: désactive les siganux durant les opération de cluster</li>
<li>noatime : désactive la mise à jour de l&#8217;heure</li>
</ul>
<p><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/" rel="bookmark" title="5 juin 2009">Installation Oracle 64 bits sur Red Hat 5</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/" rel="bookmark" title="12 juin 2008">Se connecter à SQL Server à travers Oracle, quelle drôle d&#8217;idée ?</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" rel="bookmark" title="3 mars 2010">Installation Oracle 11gR2 64 bits sur Red Hat 5 Partie 1</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 5.377 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/Q_83QiUcq64" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/</feedburner:origLink></item>
		<item>
		<title>Utiliser ASMCMD</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/ada4ENdmFyk/</link>
		<comments>http://blog.capdata.fr/index.php/utiliser-asmcmd/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 13:55:30 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[asmcmd]]></category>
		<category><![CDATA[cluster]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=97</guid>
		<description><![CDATA[Cet article est écrit par Vincent Devers
Un utilitaire asmcmd permet de naviguer dans les disques ASM.
Voici quelques commandes utiles.
Avant de se connecter, vérifier que les processus de l’instance ASM sont lancés
 ps –ef &#124;grep ASM
export ORACLE_SID=+ASM
export ORACLE_HOME=/u01/app/asm/asm_1
Afficher la version : asmcmd –v 
Lancer asmcmd sous l&#8217;utilisateur asm ou oracle
Asmcmd&#62;
Lister les disques groupes ( affiche également [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est écrit par <a href="mailto:vdevers@capdata.fr">Vincent Devers</a></p>
<p>Un utilitaire asmcmd permet de naviguer dans les disques ASM.<br />
Voici quelques commandes utiles.<br />
Avant de se connecter, vérifier que les processus de l’instance ASM sont lancés<br />
<em> ps –ef |grep ASM<br />
export ORACLE_SID=+ASM<br />
export ORACLE_HOME=/u01/app/asm/asm_1</em></p>
<p>Afficher la version : <em>asmcmd –v </em><br />
Lancer <em>asmcmd </em>sous l&#8217;utilisateur asm ou oracle<br />
Asmcmd&gt;<br />
Lister les disques groupes ( affiche également la taille des disques et l’espace libre dans les disques ) : <strong>lsdg</strong><br />
Lister les disques : <strong>lsdsk</strong><br />
Avoir les io sur les disques : <strong>lsdsk -s</strong><br />
Vérifier le status des disques : <strong>lsdsk –p</strong><br />
Aller dans un groupe :  <strong>cd </strong>+diskgroup1/<br />
Afficher l’espace total utilisé : du<br />
Trouver tous les fichiers d’un type dans un diskgroup :<br />
<strong>find –t</strong> archivelog  + DISKGROUP1/ *<br />
<strong> find –t</strong> datafile +DISKGROUP1/  *<br />
<strong>find –t</strong> onlinelog +DISKGROUP1/ *<br />
<strong>find –t </strong>tempfile +DISKGROUP1/ *<br />
<strong> find –t </strong>backupset +DISKGROUP1/  *<br />
<strong> find –t</strong> parameterfile +DISKGROUP1/  *<br />
<strong>find –t</strong> dataguardconfig + DISKGROUP1/  *<br />
<strong>find –t</strong> flashback +DISKGROUP1/ *<br />
<strong>find –t </strong>dumpset + DISKGROUP1/  *<br />
Trouver les fichiers sans le type mais avec une wildcard : <strong>find </strong>+DISKGROUP1/  undo*<br />
Créer une sauvegarde contenant les métadonnées pour un ou plusieurs groupes  :<br />
<strong>md_backup –b</strong> /u01/bdd/backupall<br />
<strong>md_backup –b</strong> /u01/bdd/backupdiskgroup1 –g diskgroup1<br />
Restaurer des métadonnées d’un diskgroup :<br />
<strong>md_restore –b</strong> backup_file ( lit les métadata de backup_file )<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/sqldiag-episode-1/" rel="bookmark" title="5 février 2010">SQLDIAG (épisode 1)</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" rel="bookmark" title="3 mars 2010">Installation Oracle 11gR2 64 bits sur Red Hat 5 Partie 1</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/" rel="bookmark" title="5 juin 2009">Création et utilisation d&#8217;OCFS2</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/" rel="bookmark" title="12 juin 2008">Se connecter à SQL Server à travers Oracle, quelle drôle d&#8217;idée ?</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/" rel="bookmark" title="5 juin 2009">Installation Oracle 64 bits sur Red Hat 5</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 3.933 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/ada4ENdmFyk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/utiliser-asmcmd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/utiliser-asmcmd/</feedburner:origLink></item>
		<item>
		<title>Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/5_cYGxH644s/</link>
		<comments>http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 13:14:14 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[asmlib]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[EMC]]></category>
		<category><![CDATA[Powerpath]]></category>
		<category><![CDATA[suse]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=89</guid>
		<description><![CDATA[Cet article est écrit par Thierry GASCARD.
1. Installation et configuration du driver ASMLIB
Sous l&#8217;utilisateur root
1.1    Installation ASMLIB
- Déterminer la version du noyau : uname –rm
- Rechercher les drivers ASM sur le site d’Oracle
- Télécharger les fichiers correspondants à la plate forme et la version du noyau
oracleasm-support-2.1.3-1.SLE10.x86_64.rpm
oracleasmlib-2.0.4-1.SLE10.x86_64.rpm
oracleasm-2.6.16.60-0.39.3-smp-2.0.5-1.SLE10.x86_64.rpm
- Installer les RPM correspondants :
rpm -Uvh \
&#62; oracleasm-2.6.16.60-0.39.3-smp-2.0.5-1.SLE10.x86_64.rpm \
&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est écrit par <a href="mailto:tgascard@capdata.fr" target="_blank">Thierry GASCARD.</a></p>
<h1>1. Installation et configuration du driver ASMLIB</h1>
<p>Sous l&#8217;utilisateur root</p>
<h2>1.1    Installation ASMLIB</h2>
<p>- Déterminer la version du noyau : uname –rm<br />
- Rechercher les drivers ASM sur le site d’<a href="http://www.oracle.com/technology/software/tech/linux/asmlib/sles10.html" target="_blank">Oracle</a><br />
- Télécharger les fichiers correspondants à la plate forme et la version du noyau<br />
oracleasm-support-2.1.3-1.SLE10.x86_64.rpm<br />
oracleasmlib-2.0.4-1.SLE10.x86_64.rpm<br />
oracleasm-2.6.16.60-0.39.3-smp-2.0.5-1.SLE10.x86_64.rpm<br />
- Installer les RPM correspondants :<br />
<em>rpm -Uvh \<br />
&gt; oracleasm-2.6.16.60-0.39.3-smp-2.0.5-1.SLE10.x86_64.rpm \<br />
&gt; oracleasmlib-2.0.4-1.SLE10.x86_64.rpm \<br />
&gt; oracleasm-support-2.1.3-1.SLE10.x86_64.rpm</em></p>
<h2>1.2 Configuration du driver ASM</h2>
<p>- Lancer la commande de configuration<br />
<em># /etc/init.d/oracleasm configure</em><br />
- Renseigner les informations suivantes :<br />
<em>Default user to own the driver interface []: oracle<br />
Default group to own the driver interface []: dba<br />
Start Oracle ASM library driver on boot (y/n) [n]: y<br />
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y<br />
Writing Oracle ASM library driver configuration:           [  OK  ]<br />
Creating /dev/oracleasm mount point:                       [  OK  ]<br />
Loading module &laquo;&nbsp;oracleasm&nbsp;&raquo;:                                [  OK  ]<br />
Mounting ASMlib driver filesystem:                         [  OK  ]<br />
Scanning system for ASM disks :                            [  OK  ]</em></p>
<h2>1.3 Créer les volumes ASM</h2>
<p><em>/usr/sbin/asmtool -C -l /dev/oracleasm -n VOLDB1-s /dev/emcpowerb -a force=yes<br />
/usr/sbin/asmtool -C -l /dev/oracleasm -n VOLBK1 -s /dev/emcpowerc -a force=yes</em><br />
puis redémarrer le serveur</p>
<p>Rem : oracleasm createdisk ne fonctionne pas note Metalink : <span style="helvetica;"><strong>469163.1</strong></span><br />
erreur de reconnaissance des disques fournis avec powerpath<br />
<em># /etc/init.d/oracleasm createdisk VOLDB1 /dev/emcpowerb<br />
Marking disk &laquo;&nbsp;/dev/emcpowerb&nbsp;&raquo; as an ASM disk: asmtool: Device &laquo;&nbsp;/dev/emcpowerb&nbsp;&raquo; is not a partition<br />
[FAILED]</em></p>
<h2>1.3 Vérifier</h2>
<p>lancer la découverte<br />
<em>/etc/init.d/oracleasm scandisks</em><br />
Vérifier l’existence des volumes sur les deux noeuds<br />
<em># /etc/init.d/oracleasm listdisks</em></p>
<h2>1.4 configurer les chemins de découverte des disques</h2>
<p>Modifier le fichier /etc/sysconfig/oracleasm pour paramétrer la gestion du  &laquo;&nbsp;multipathing&nbsp;&raquo; en gras :</p>
<p>..<br />
# ORACLEASM_SCANORDER: Matching patterns to order disk scanning<br />
ORACLEASM_SCANORDER=&nbsp;&raquo;<strong>emcpower</strong>&nbsp;&raquo;</p>
<p># ORACLEASM_SCANEXCLUDE: Matching patterns to exclude disks from scan<br />
ORACLEASM_SCANEXCLUDE=&nbsp;&raquo;<strong>sd</strong>&nbsp;&raquo;</p>
<h2>2. Installation ASM 11g</h2>
<p>Dans son propre ORACLE_HOME (ORACLE_ASM_HOME)</p>
<h1>3. Passage patch 11.1.0.7</h1>
<h1>4. Création de l’instance ASM</h1>
<h2>4.1. Configuration du listener pour ASM</h2>
<p>Connexion avec l’utilisateur asm ou oracle sinon<br />
<em>export ORACLE_HOME=/u01/app/asm/11.1.0/asm_1<br />
$ORACLE_HOME/admin/netca &amp;</em><br />
Creation du listener LISTENER_ASM sur le port 1521 en TCP</p>
<h2>4.2 Création de l&#8217;instance ASM</h2>
<p>Connexion avec l’utilisateur système oracle<br />
export ORACLE_SID=+ASM1<br />
/u01/oracle/11g/asm/bin/dbca &amp;</p>
<p>puis configurer les &laquo;&nbsp;disques groupe&nbsp;&raquo;<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<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/installation-oracle-64-bits-sur-red-hat-5/" rel="bookmark" title="5 juin 2009">Installation Oracle 64 bits sur Red Hat 5</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/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" rel="bookmark" title="3 mars 2010">Installation Oracle 11gR2 64 bits sur Red Hat 5 Partie 1</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/" rel="bookmark" title="5 juin 2009">Création et utilisation d&#8217;OCFS2</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 3.920 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/5_cYGxH644s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/</feedburner:origLink></item>
		<item>
		<title>Installation Oracle 64 bits sur Red Hat 5</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/ef0nuHwz2gg/</link>
		<comments>http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 10:25:29 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[64 bits]]></category>
		<category><![CDATA[huge page]]></category>
		<category><![CDATA[redhat 5]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=72</guid>
		<description><![CDATA[Cet article est écrit par Thierry GASCARD.
1 Configuration système
1.1 Pré-requis matériel :
- 12 Go pour les binaires Oracle en RAID 10
- 400 Mo sur /tmp
1.2 Pré-requis logiciel :
RH 5 Entreprise 64 Bits : Oracle 10.2.0.1 Entreprise Edition Linux x86-64
Patch 10.2.0.4 pour Linux x86-64 sur le site du support Oracle 
Patch 6620371 pour Linux 64 Bits [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est écrit par <a href="mailto:tgascard@capdata.fr" target="_blank">Thierry GASCARD.</a></p>
<h1>1 Configuration système</h1>
<h2>1.1 Pré-requis matériel :</h2>
<p>- 12 Go pour les binaires Oracle en RAID 10<br />
- 400 Mo sur /tmp</p>
<h2>1.2 Pré-requis logiciel :</h2>
<p>RH 5 Entreprise 64 Bits<a href="http://www.oracle.com/technology/software/products/database/index.html" target="_blank"> : Oracle 10.2.0.1 Entreprise Edition Linux x86-64</a></p>
<p>Patch 10.2.0.4 pour Linux x86-64 sur le site du <a href="http://metalink.oracle.com" target="_blank">support Oracle </a></p>
<p>Patch 6620371 pour Linux 64 Bits sur le site du <a href="http://metalink.oracle.com">support Oracle </a></p>
<h2>1.3 Pré-requis noyau</h2>
<p>version du noyau &gt;=2.6.18-8<br />
SELinux désactivé<br />
X installé et configuré<br />
Rpms suivants installés en plus des Rpms par défaut (version minimum) :<br />
binutils-2.17.50 (x86_64)<br />
compat-db-4.2.52 (x86_64)<br />
compat-libstdc++-296(i386)<br />
compat-libstdc++-33-3.2.3 (x86_64)<br />
compat-libstdc++-33-3.2.3(i386)<br />
control-center-2.16.0 (x86_64)<br />
gcc-4.1.1 (x86_64)<br />
gcc-c++-4.1.1 (x86_64)<br />
glibc-2.5-12 (x86_64)<br />
glibc-2.5-12 (i686)<br />
glibc-common-2.5-12 (x86_64)<br />
glibc-devel-2.5-12 (x86_64)<br />
glibc-devel-2.5-12(i386)<br />
glibc-headers-2.5-12 (x86_64)<br />
ksh-20060214-1.4 (x86_64)<br />
libaio-0.3.96 (x86_64)<br />
libgcc-4.1.1(i386)<br />
libgcc-4.1.1(x86_64)<br />
libgnome-2.16.0 (x86_64)<br />
libgnomeui-2.16.0 (x86_64)<br />
libgomp-4.1.1 (x86_64)<br />
libstdc++-4.1.1 (x86_64)<br />
libstdc++-devel-4.1.1 (x86_64)<br />
libXp-1.0.0-8 (i386)<br />
make-3.81 (x86_64)<br />
sysstat-7.0.0 (x86_64)<br />
unixODBC-2.2.11-7.1 x86_64.<br />
unixODBC-devel-2.2.11-7.1 x86_64<br />
util-linux-2.13-0.50.el5 x86_64<br />
xorg-x11-xinit-1.0.2-15.el5 x86_64</p>
<p>Rem : attention à la présence de rpms 32 bits : utilisation possible de l&#8217;option force : <em>rpm -ivh &#8211;force</em> ..</p>
<h2>1.4 Paramètres noyau</h2>
<p>Modification du fichier <strong>/etc/sysctl.conf</strong> :<br />
kernel.shmmni = 4096<br />
kernel.sem= 250 32000 100 128<br />
kernel.sysrq=1<br />
kernel.msgmnb=65536<br />
kernel.msgmni=2878<br />
kernel.msgmax=8192<br />
net.ipv4.ip_local_port_range = 9000 65500<br />
net.core.rmem_default = 262144<br />
net.core.rmem_max=2097152<br />
net.core.wmem_default = 262144<br />
net.core.wmem_max = 262144<br />
fs.aio-max-nr=3145728<br />
fs.file-max=327679<br />
vm.lower_zone_protection=100<br />
kernel.shmall = 3145728<br />
kernel.shmmax = 12884901888<br />
vm.nr_hugepages = 6144</p>
<p>Modification du fichier <strong>/etc/security/limits.conf</strong> :<br />
oracle hard memlock 12582912<br />
oracle soft memlock 12582912<br />
oracle soft core unlimited<br />
oracle hard nofile 131072<br />
oracle hard nproc 131072<br />
oracle soft nproc 131072<br />
oracle soft nofile 131072<br />
oracle hard core unlimited</p>
<h1>2    Préparation système</h1>
<h2>2.1 Création groupe oinstall,dba</h2>
<p><em>root&gt; groupadd -g 55 oinstall<br />
root&gt;groupadd -g 56 dba</em></p>
<h2>2.2    Ajout utilisateur oracle</h2>
<p><em>root&gt; useradd -u 500 -g 55 -G dba -c &laquo;&nbsp;Oracle Owner&nbsp;&raquo; -d /home/oracle -s /bin/bash oracle<br />
root&gt; passwd oracle</em></p>
<p>2.2 Modification du fichier<strong> /etc/profile</strong><br />
if [ $USER = "oracle" ]; then<br />
if [ $SHELL = "/bin/ksh" ]; then<br />
ulimit -p 16384<br />
ulimit -n 65536<br />
ulimit -l 12582912<br />
else<br />
ulimit -u 16384 -n 65536 -l 12582912<br />
fi<br />
fi</p>
<h2>2.2    Création des répertoires</h2>
<p><em>root&gt; mkdir /opt/oracle<br />
root&gt; mkdir /u01<br />
root&gt; chown –R oracle:oinstall /opt/oracle<br />
root&gt; chown –R oracle:oinstall /u01<br />
root&gt; su &#8211; oracle<br />
mkdir -p /opt/oracle/product/10.2.0/db_1<br />
mkdir -p /opt/oracle/admin</em></p>
<h2>3 Installation Oracle</h2>
<h2>3.1    Décompression des zips et cpio</h2>
<p><em>$ cat 10201_database_linux_x86_64.cpio.gz | gunzip | cpio -idvm<br />
$ cat 10201_companion_linux_x86_64.cpio.gz | gunzip | cpio –idvm<br />
$unzip p6810189_10204_Linux-x86-64</em></p>
<h2>3.2   installation</h2>
<p><em>export ORACLE_BASE=/opt/oracle/product ;<br />
export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1<br />
./runInstaller &amp;</em></p>
<p>Ordre d’installation<br />
1. Installation &laquo;&nbsp;Base Product (10.2.0.1)&nbsp;&raquo;<br />
2. Installation “Companion Disk” pour éviter l’erreur NCOMP lors du patch 10.2.0.4<br />
- Choisir l’option «Oracle Database 10g Products 10.2.0.1.0»<br />
3. Installation Patch (10.2.0.4)<br />
4. Installation patch 6620371 pour &laquo;&nbsp;huge page&nbsp;&raquo;<br />
<em> [oracle]$ cd 6620371/<br />
[oracle]$ /opt/oracle/product/10.2.0/db_1/OPatch/opatch apply</em></p>
<h1>4    Mise à jour de l’environnement Oracle</h1>
<h2>4.1 mise à jour du .profile_bash d&#8217;oracle</h2>
<h2>4.2 mise à jour du glogin.sql</h2>
<p>vi $ORACLE_HOME/slplus/admin/glogin.sql<br />
set sqlprompt &laquo;&nbsp;_user &#8216;on&#8217; _date &#8216;at&#8217; _connect_identifier &gt;&nbsp;&raquo;</p>
<h1>5    configuration de huge page sous linux</h1>
<p>- vm.nr_hugepages  : nombre de pages (taille de 2Mo sur linux avec grep Hugepagesize /proc/meminfo)<br />
- vm.hugetlb_shm_group : ID du groupe utilisé par oracle (dba)<br />
- kernel.shmmax supérieur à la taille de l&#8217;espace mémoire accordé aux &laquo;&nbsp;huge page&nbsp;&raquo;<br />
- memlock  : avec /etc/security/limit.conf et ulimit -l<br />
Tout est bien expliqué dans le blog d&#8217; <a href="http://arkzoyd.blogspot.com/2008/10/huge-pages-linux-et-oracle.html" target="_blank">arkzoyd</a>: à lire absolument !!!!!<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/" rel="bookmark" title="5 juin 2009">Création et utilisation d&#8217;OCFS2</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" rel="bookmark" title="3 mars 2010">Installation Oracle 11gR2 64 bits sur Red Hat 5 Partie 1</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/" rel="bookmark" title="12 juin 2008">Se connecter à SQL Server à travers Oracle, quelle drôle d&#8217;idée ?</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 3.666 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/ef0nuHwz2gg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/</feedburner:origLink></item>
		<item>
		<title>Principes d’une sauvegarde à chaud</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/weK0hjIbcTI/</link>
		<comments>http://blog.capdata.fr/index.php/sql-server-principes-dune-sauvegarde-a-chaud/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 15:00:47 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[backup database]]></category>
		<category><![CDATA[checkpoint]]></category>

		<guid isPermaLink="false">https://www.alldb.fr/blogs/?p=47</guid>
		<description><![CDATA[Rien de plus simple de que faire une sauvegarde sur SQL Server:
BACKUP DATABASE maBase to disk='D:\MSSQL.1\MSSQL\Backup\maBase.bak' with init, stats
10 percent processed.
21 percent processed.
32 percent processed.
43 percent processed.
54 percent processed.
60 percent processed.
71 percent processed.
82 percent processed.
93 percent processed.
Processed 144 pages for database 'maBase', file 'maBase' on file 1.
100 percent processed.
Processed 2 pages for database 'maBase', file [...]]]></description>
			<content:encoded><![CDATA[<p><span>Rien de plus simple de que faire une sauvegarde sur SQL Server:</span></p>
<pre><span lang="EN-GB">BACKUP DATABASE maBase to disk='D:\MSSQL.1\MSSQL\Backup\maBase.bak' with init, stats</span></pre>
<pre><span lang="EN-GB">10 percent processed.</span></pre>
<pre><span lang="EN-GB">21 percent processed.</span></pre>
<pre><span lang="EN-GB">32 percent processed.</span></pre>
<pre><span lang="EN-GB">43 percent processed.</span></pre>
<pre><span lang="EN-GB">54 percent processed.</span></pre>
<pre><span lang="EN-GB">60 percent processed.</span></pre>
<pre><span lang="EN-GB">71 percent processed.</span></pre>
<pre><span lang="EN-GB">82 percent processed.</span></pre>
<pre><span lang="EN-GB">93 percent processed.</span></pre>
<pre><span lang="EN-GB">Processed 144 pages for database 'maBase', file 'maBase' on file 1.</span></pre>
<pre><span lang="EN-GB">100 percent processed.</span></pre>
<pre><span lang="EN-GB">Processed 2 pages for database 'maBase', file 'maBase_log' on file 1.</span></pre>
<pre><span lang="EN-GB">BACKUP DATABASE successfully processed 146 pages in 0.816 seconds (1.463 MB/sec).</span></pre>
<p><span>Et voilà. L&#8217;avantage d&#8217;une telle sauvegarde est que je peux la lancer sans stopper mon service, sous entendu avec de l&#8217;activité: connexions utilisateurs, transactions en cours, etc&#8230; Et tout ça en me garantissant de restaurer une base transactionnellement cohérente. Pour y parvenir, elle commence par sauvegarder les données puis les transactions présentes dans le journal.</span></p>
<p><span>Avant de parler de ce que fait le BACKUP DATABASE, il faut parler un peu des rôles respectifs du <strong>CHECKPOINT </strong>et du <strong>COMMIT </strong>dans le processus de RECOVERY.</span></p>
<p class="MsoNormal"><!--[if !supportLists]--><span><span>i)<span> </span></span></span><!--[endif]--><span dir="ltr"><span>Lorsqu’un utilisateur initie une transaction, ses modifications sont d’abord journalisées en mémoire dans une zone qui est réservée pour sa session. Puis les pages de données et d’index concernées sont modifiées dans le cache de données. </span></span></p>
<p class="MsoNormal"><!--[if !supportLists]--><span><span>ii)<span> </span></span></span><!--[endif]--><span dir="ltr"><span>Lorsqu’il valide sa transaction de manière implicite ou explicite (avec COMMIT TRANSACTION), le contenu de son journal de session est enregistré physiquement dans le fichier LDF. Il est impératif de s’assurer que le COMMIT ne peut rendre la main à la commande appelante que lorsque la transaction a été véritablement écrite sur disque (le ‘write-ahead logging’ en d’autres termes). Ce mécanisme permet de pouvoir récupérer la transaction validée lorsqu’un problème survient avant que les pages de données n’aient pu être écrites.</span></span></p>
<p class="MsoNormal"><!--[if !supportLists]--><span><span>iii)<span> </span></span></span><!--[endif]--><span dir="ltr"><span>De manière complètement indépendante et asynchrone, le processus d’arrière plan CHECKPOINT écrit les pages de données et d’index modifiées (dirty pages) sur le disque, sans se préoccuper de savoir si elles appartiennent à une transaction validée ou non. </span></span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>A partir de là, deux situations peuvent se produire au point de crash: </span></p>
<p class="MsoNormal"><!--[if !supportLists]--><span> <span>1)<span> </span></span></span><!--[endif]--><span dir="ltr"><span>Une transaction peut être validée (committée) par l’utilisateur mais le CHECKPOINT n’a pas eu le temps d’écrire les pages de données / d’index sur disque. Il va falloir réécrire ces pages dans le fichier de données au redémarrage de l’instance (<strong>REDO </strong>ou ROLL-FORWARD). </span></span></p>
<p class="MsoNormal"><!--[if !supportLists]--><span><span>2)<span> </span></span></span><!--[endif]--><span dir="ltr"><span>Le CHECKPOINT qui n’a pas de vision sur l’état de la transaction peut avoir écrit ses pages sur disque avant qu’elle n’ait été validée par l’utilisateur. Auquel cas il faudra défaire les pages écrites car au point de crash car la transaction ne peut être considérée comme valide. (<strong>UNDO </strong>ou ROLLBACK). </span></span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>C’est la combinaison de ces deux actions que l’on appelle le <strong>RECOVERY</strong>. Ce processus intervient dans de nombreux changements d’état de la base, et notamment pour ce qui nous intéresse, lors de la phase de restauration d’une sauvegarde.</span></p>
<p class="MsoNormal"><span><span> </span> </span></p>
<p class="MsoNormal"><span>Lorsque le BACKUP DATABASE est exécuté, il commence par forcer l’exécution d’un CHECKPOINT dans la base concernée. Ce CHECKPOINT aura pour effet d’entériner des transactions validées depuis ma dernière sauvegarde de journal : Les pages de données / d’index sont écrites sur disque, la sauvegarde n’a donc plus besoin de s’en préoccuper. Bien sûr il peut aussi écrire les pages de données / d’index d’une transaction qui n’est pas encore validée. Immédiatement ensuite, il va relever un numéro de transaction (LSN pour Log Sequence Number)<span> </span>dans le journal pour s’en servir comme borne de départ pour le RECOVERY. Appelons-le <strong>LSN1</strong>. </span></p>
<p class="MsoNormal"><span> Puis il va lire et écrire les pages de données depuis le fichier MDF ou les différents filegroups, et les écrire dans le fichier de sauvegarde. Une fois terminées ces écritures, il renote le LSN courant (qui entre temps peut avoir<span> </span>évolué), et s’en sert comme borne de fin (<strong>LSN2</strong>). Puis il va sauvegarder tout ce qui se trouve entre (<strong>LSN2 – LSN1</strong>). Certaines transactions seront validées, certaines ne seront peut être pas terminées, mais peut importe, car au moment de la restauration, le processus de RECOVERY fera son œuvre pour ramener la base à un état transactionnel consistant. </span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>Si le LSN2 lui ne change pas car c’est toujours le dernier numéro généré dans le journal qui sera utilisé, le problème vient plus du calcul du LSN de départ car il va dépendre de la situation dans laquelle se trouve le BACKUP DATABASE au départ. <strong>Globalement, je peux me trouver dans deux cas :</strong></span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><!--[if !supportLists]--><span>-<span> </span></span><!--[endif]--><span dir="ltr"><strong><span>Soit il n’y a aucune transaction en cours au moment où commence la sauvegarde </span></strong></span><span>: auquel cas LSN1 sera égale à la valeur du LSN généré par le CHECKPOINT (lancé par le BACKUP):</span></p>
<p style="text-align: center;"><a href="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup1.png"><img class="size-medium wp-image-51 aligncenter" src="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup1-300x257.png" alt="hotbackup1" /></a></p>
<p class="MsoNormal"><span>L’effet du CHECKPOINT ici est de flusher les pages de données modifiées par T1, T2 et T3, pour ne pas à avoir à les prendre dans la sauvegarde du journal. Ces pages se retrouvent sur disque, et seront capturées lors de la copie de données. </span></p>
<p class="MsoNormal"><span> LSN2 est toujours le LSN courant capté dès la fin de la copie de données. Dans ce cas, T4 est terminée mais on est en plein milieu de T5, donc on prend quand même ce ‘fragment’ de T5. Lors de la restauration, T4 sera réappliquée et T5 sera rollbackée:</span></p>
<p class="MsoNormal" style="text-align: center;"><a href="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup5.png"><img class="aligncenter size-medium wp-image-52" src="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup5-300x117.png" alt="" /></a></p>
<p class="MsoNormal"><strong><span>Soit il y<span> </span>aura au moins une transaction en cours </span></strong><span>: auquel cas, SQL Server va aller rechercher le LSN de départ de la transaction active la plus ancienne. Dans l&#8217;exemple ci-dessous, il s&#8217;agit de T2:<br />
</span></p>
<p class="MsoNormal" style="text-align: center;"><a href="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup2.png"><img class="aligncenter size-medium wp-image-54" src="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup2-300x244.png" alt="" /> </a></p>
<p class="MsoNormal">
<p class="MsoNormal"><span>Dans ce cas, T2 et T4 qui sont terminées avant la fin de la copie de données seront réappliquées et T5 et T3 rollbackées:</span></p>
<p class="MsoNormal" style="text-align: center;"><a href="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup4.png"><img class="size-medium wp-image-56 aligncenter" src="https://www.alldb.fr/blog/wp-content/uploads/2008/12/hotbackup4-300x73.png" alt="" /></a></p>
<p class="MsoNormal">La table msdb.dbo.backupset qui stocke des données pour chaque sauvegarde effectuée permet de vérifier dans quel état se trouvait la base au moment de la sauvegarde. Pour le déterminer, il faut comparer les valeurs de checkpoint_lsn et first_lsn:</p>
<p class="MsoNormal"><strong>- checkpoint_lsn = first_lsn:</strong> alors il n&#8217;y avait pas de transaction en cours au moment du BACKUP DATABASE.</p>
<p class="MsoNormal">
<div>
<div class="O2">
<pre><span>select first_lsn, checkpoint_lsn, last_lsn from msdb.dbo.backupset where database_name<span>  </span>= ‘CAPDATA’
</span></pre>
</div>
<div class="O2">
<pre><span>first_lsn<span> </span><span>    </span>             checkpoint_lsn<span>       </span>      last_lsn
</span></pre>
</div>
<div class="O2">
<pre><span><em>--------------------       --------------------       --------------------
</em></span></pre>
</div>
<div class="O2">
<pre><span><em><strong>1341</strong> 0000000<strong>302</strong> 000<strong>51</strong><span>     </span><strong>1341</strong> 0000000<strong>302</strong> 000<strong>51</strong><span>       </span>1341 0000000323 00001</em><strong><em>
</em></strong></span></pre>
</div>
</div>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><strong>- first_lsn &lt; checkpoint_lsn:</strong> alors il y avait au moins une transaction en cours.</p>
<p class="MsoNormal">
<p class="MsoNormal">
<div class="O1">
<div>
<pre><span>select first_lsn, checkpoint_lsn, last_lsn from msdb.dbo.backupset where database_name<span>  </span>= ‘CAPDATA’
</span><span>
first_lsn<span> </span><span>               </span>checkpoint_lsn<span>          </span>last_lsn
</span></pre>
</div>
<div>
<pre><span><em>--------------------     ---------------         --------------------
</em></span></pre>
</div>
<div>
<pre><strong><span><em>1341</em></span></strong><span><em> 0000000</em></span><strong><span><em>510</em></span></strong><span><em> 000</em></span><strong><span><em>2</em></span></strong><span><em><span>     </span><strong>1341 </strong>0000000<strong>523</strong> 000<strong>98</strong><span>    </span>1341 0000000563 00001</em></span></pre>
</div>
</div>
<div class="O1">[ David B.]</div>
<p><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</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/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</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/xtradb-sauvegarde-votre-cache-et-ca-marche/" rel="bookmark" title="9 mars 2010">XtraDB sauvegarde votre cache, et ça marche !</a> (Cédric PEINTRE) [MySQL]</li>
</ul>
<p><!-- Similar Posts took 3.929 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/weK0hjIbcTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/sql-server-principes-dune-sauvegarde-a-chaud/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/sql-server-principes-dune-sauvegarde-a-chaud/</feedburner:origLink></item>
		<item>
		<title>Modes de récupération et journal de transactions, épisode 2</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/T8XFlLJHl2U/</link>
		<comments>http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 17:09:55 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[bulk logged]]></category>
		<category><![CDATA[journal de transactions]]></category>

		<guid isPermaLink="false">http://192.168.1.220:8080/blogs/sqlserver/?p=5</guid>
		<description><![CDATA[Dans l&#8217;article précédent, nous avons vu quels sont les principaux modes de récupération SIMPLE et FULL, et leur effet respectif sur le journal des transactions.
Ici nous allons aborder le troisième mode BULK-LOGGED, ses avantages, inconvénients et contextes d&#8217;utilisation. Quelques rappels du post précédent:
BULK-LOGGED: c&#8217;est un mode à combiner avec le mode FULL. Dans ce mode, [...]]]></description>
			<content:encoded><![CDATA[<p>Dans l&#8217;article précédent, nous avons vu quels sont les principaux modes de récupération SIMPLE et FULL, et leur effet respectif sur le journal des transactions.</p>
<p>Ici nous allons aborder le troisième mode BULK-LOGGED, ses avantages, inconvénients et contextes d&#8217;utilisation. Quelques rappels du post précédent:</p>
<p><strong>BULK-LOGGED: </strong>c&#8217;est un mode à combiner avec le mode FULL. Dans ce mode, les opérations de modification de masse ne sont pas complètement journalisées, et l&#8217;impact de telles opérations sur le journal est limité. Le fait de changer de FULL à BULK-LOGGED ne modifie en rien ma façon de sauvegarder mes bases. En mode BULK-LOGGED, mes sauvegardes transactionnelles horaires continuent de s&#8217;exécuter sans problème. Très utile lorsqu&#8217;on lance notre réorganisation des indexes hebdomadaire car on gagne un temps fou.</p>
<p>Quelles sont ces opérations de modification de masse:</p>
<ol>
<li>SELECT INTO</li>
<li>BCP IN / BULK INSERT</li>
<li>ALTER INDEX  &#8230; REBUILD</li>
<li>Manipulation de champs de type TEXT:</li>
</ol>
<p>On les appelle parfois par abus de langage opérations <em>non loggées</em>, le terme plus juste est <em>minimallement loggées</em>.</p>
<p class="MsoNormal">Lorsqu’une de ces opérations <em>minimalement loggée </em>est exécutée, seules les allocations de pages sont journalisées, mais elles seules ne suffisent pas à restaurer l’intégralité de mon reindex ou de mon select into en cas de crash. C’est pourquoi pour permettre de restaurer ces données modifiées, la sauvegarde embarque avec elle les pages de données allouées lors de l’opération.</p>
<p class="MsoNormal">Pour le vérifier, on se propose de comparer sous les deux modes de récupération FULL et BULK_LOGGED, deux opérations minimalement loggées :</p>
<ol>
<li>Un SELECT INTO d&#8217;une table de 2,6 millions de lignes dans une table d’archive.</li>
<li>Le rebuild d’un index clusterisé sur une table de 2,6 millions de lignes.</li>
</ol>
<p class="MsoNormal">Dans chaque cas, nous allons mesurer plusieurs choses :</p>
<ol>
<li> Le temps d’exécution de l’opération.</li>
<li>L’impact sur le journal de transactions (en Mb).</li>
<li>L’impact sur la taille de ma sauvegarde de transaction (en Mb).</li>
</ol>
<p class="MsoNormal"><!--[if !supportLists]--><strong><span>1)<span> </span></span><span dir="ltr">En mode de récupération FULL :</span></strong><!--[endif]--></p>
<p class="MsoNormal">Pour pouvoir exécuter la sauvegarde du journal à l’issue de chaque opération, il faut commencer par exécuter une sauvegarde complète (voir article <a title="recovery models, episode 1" href="https://www.alldb.fr/blogs/?p=5">précédent</a>) :</p>
<pre><span>ALTER DATABASE CAPDATA SET RECOVERY FULL

BACKUP DATABASE CAPDATA TO DISK='C:\YUKON\BACKUP\CAPDATA.bak'
WITH init, stats</span></pre>
<p class="MsoNormal">Ensuite on va vérifier que l’on part sur un journal vide :</p>
<pre><span>dbcc sqlperf(logspace)</span>

<span>Database Name        Log Size (MB) Log Space Used (%) Status
----------------------------------------------------------------------------------------------
CAPDATA            49,99219      2,951633           0</span></pre>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">Le journal fait 50Mb, il est vide (2%). On peut donc lancer le SELECT INTO :</p>
<pre><span>set statistics time on
select * into PIECEAPPARTEMENT2 from PIECEAPPARTEMENT
</span></pre>
<pre><span><span> SQL Server parse and compile time: </span></span></pre>
<pre><span><span><span> </span>CPU time = 0 ms, elapsed time = 48 ms.</span></span></pre>
<pre><span><span> <span> </span>SQL Server Execution Times:</span></span></pre>
<pre><span><span><span> </span>CPU time = 7641 ms,<span> </span>elapsed time = <strong>57673</strong> ms.</span></span></pre>
<pre><span><span> (<strong>2644317</strong> row(s) affected)</span></span></pre>
<p class="MsoNormal">Quelle est la taille du journal ?</p>
<pre><span><span lang="EN-GB">dbcc</span><span lang="EN-GB"> sqlperf(logspace)</span></span></pre>
<pre><span><span>
Database Name        Log Size (MB) Log Space Used (%) Status
----------------------------------------------------------------------------------------------
</span></span></pre>
<pre><span><span>CAPDATA<span> </span>            97,55469<span>       </span>93,43568<span> </span><span>           </span>0
</span></span></pre>
<p class="MsoNormal">
<p class="MsoNormal">Il est passé de 50 à 97 Mb, et il est plein. Sauvegardons la transaction pour le vider :</p>
<pre><span><span lang="EN-GB">BACKUP</span><span lang="EN-GB"> LOG CAPDATA <span>TO</span> DISK=<span>'C:\YUKON\BACKUP\CAPDATA.trn'</span> <span>with</span> init, stats</span></span></pre>
<pre><span><span lang="EN-GB">
(…)</span></span></pre>
<pre><span><span lang="EN-GB">BACKUP LOG successfully processed 11592 pages in 25.525 seconds (3.720 MB/sec).</span></span></pre>
<p class="MsoNormal">11592 * 8192 ~= <strong>93 Mb</strong>, soit la taille de ma transaction dans mon journal. Normal. Une fois la sauvegarde effectuée, on repart sur un journal vide. On peut donc lancer immédiatement le REBUILD de l’index sur PIECEAPPARTEMENT :</p>
<pre><span><span lang="EN-GB">ALTER</span><span lang="EN-GB"> <span>INDEX</span> PK_PIECEAPPARTEMENT <span>ON</span> PIECEAPPARTEMENT REBUILD WITH</span><span lang="EN-GB"> (SORT_IN_TEMPDB = <span>ON</span>)</span></span></pre>
<pre><span><span>
 SQL Server Execution Times:</span></span></pre>
<pre><span><span lang="EN-GB"><span> </span>CPU time = 11828 ms,<span> </span>elapsed time = <strong>66788</strong> ms.</span></span></pre>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">A nouveau le journal est plein et si je le sauvegarde encore, la taille du fichier sera égale à la taille de ma transaction.</p>
<pre><span><span lang="EN-GB">dbcc</span><span lang="EN-GB"> sqlperf(logspace)</span></span></pre>
<pre><span lang="EN-GB">
 <span>Database Name<span> </span>     Log Size (MB)     Log Space Used (%)    Status</span></span></pre>
<pre><span><span lang="EN-GB">----------------------------------------------------------------------------------------------</span></span></pre>
<pre><span><span>CAPDATA<span> </span>            97,55469<span>          </span>92,42763<span>               </span>0</span></span></pre>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><strong><span>2)<span> </span></span><span dir="ltr">En mode de récupération BULK_LOGGED :</span></strong><!--[endif]--></p>
<p class="MsoNormal">Même scénario mais cette fois la base est passée en mode de récupération BULK_LOGGED, et mon journal est vide. Pour partir sur la même enveloppe initiale, et ne pas fausser les résultats pour le SELECT INTO, je vais réduire la taille de mon journal à sa taille de départ (50Mb) :</p>
<pre><span><span>dbcc</span><span> shrinkfile(<span>'CAPDATA_log01'</span>,50)</span></span></pre>
<pre><span><span lang="EN-GB">
DbId<span> </span>  FileId<span>   </span>    CurrentSize MinimumSize UsedPages<span> </span>   EstimatedPages</span></span></pre>
<pre><span><span>------ ----------- ----------- ----------- ----------- --------------</span></span></pre>
<pre><span><span>6<span> </span>     2<span> </span>       6400<span> </span>          6400<span> </span><span> </span>      6400<span> </span>         6400</span></span></pre>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">Et je lance le SELECT INTO :</p>
<pre><span><span lang="EN-GB">
SQL Server Execution Times:</span></span></pre>
<pre><span><span lang="EN-GB"><span> </span>CPU time = 8235 ms,<span> </span>elapsed time = <strong>24353</strong> ms.</span></span></pre>
<pre><span><span> (<strong>2644317</strong> row(s) affected)</span></span></pre>
<p class="MsoNormal">
<p class="MsoNormal">Déjà, il a mis deux fois moins de temps. Voyons voir la situation du journal :</p>
<pre><span><span>dbcc</span><span> sqlperf(logspace)</span></span></pre>
<pre><span><span lang="EN-GB">
 Database Name<span> </span>Log Size (MB) Log Space Used (%) Status</span></span></pre>
<pre><span><span lang="EN-GB">----------------------------------------------------------------------------------------------</span></span></pre>
<pre><span><span>CAPDATA<span> </span>      49,99219<span>      </span>3,073722<span>             </span>0</span></span></pre>
<p class="MsoNormal">
<p class="MsoNormal">Quasiment rien n’a été utilisé !! Non seulement l’enveloppe n’a pas bougé mais en plus mon journal est toujours quasiment vide. J’en profite pour regarder ce qui se trouve dans ces 3% de<span> </span>journal utilisé:</p>
<p class="MsoNormal">
<pre><span lang="EN-GB">select</span><span lang="EN-GB"> Operation, COUNT(*) nr_records, SUM([Log Record Length]) totalsize</span></pre>
<pre><span lang="EN-GB">from</span><span lang="EN-GB"> <span>::</span>fn_dblog(<span>null</span>,<span>null</span>) </span></pre>
<pre><span lang="EN-GB">group</span><span lang="EN-GB"> <span>by</span> Operation <span>order</span> <span>by</span> COUNT(*) <span>desc</span></span></pre>
<pre><span lang="EN-GB"> </span></pre>
<pre><span lang="EN-GB">Operation<span>                       </span>nr_records<span> </span> totalsize</span></pre>
<pre><span lang="EN-GB">------------------------------- ----------- -----------</span></pre>
<pre><span lang="EN-GB">LOP_SET_FREE_SPACE</span><span lang="EN-GB"><span>             </span></span><span lang="EN-GB"><span> </span>11111<span> </span>      577772</span></pre>
<pre><span lang="EN-GB">LOP_SET_BITS<span>                    </span>5650<span> </span>       328272</span></pre>
<pre><span lang="EN-GB">LOP_MODIFY_ROW<span>                  </span>1570<span> </span>       138852</span></pre>
<pre><span lang="EN-GB">LOP_COUNT_DELTA<span>                 </span>33<span> </span>         6864</span></pre>
<pre><span lang="EN-GB">LOP_BUF_WRITE<span>                   </span>31<span> </span>         59512</span></pre>
<pre><span lang="NL">LOP_INSERT_ROWS<span>                 </span>27<span> </span>         4068</span></pre>
<pre><span lang="NL">LOP_ROOT_CHANGE<span>                 </span>5<span> </span>          480</span></pre>
<pre><span lang="NL">LOP_BEGIN_XACT<span>                  </span>4<span> </span>          432</span></pre>
<pre><span lang="NL">LOP_HOBT_DELTA<span>                  </span>4<span> </span>          256</span></pre>
<pre><span lang="NL">LOP_COMMIT_XACT<span>                 </span>4<span> </span>          208</span></pre>
<pre><span lang="NL">LOP_LOCK_XACT<span>                   </span>3<span> </span>          120</span></pre>
<pre><span lang="NL">LOP_HOBT_DDL<span>                    </span>2<span> </span>          72</span></pre>
<pre><span lang="EN-GB">LOP_PREP_XACT<span> </span><span>                  </span>1<span> </span>          68</span></pre>
<pre><span lang="EN-GB">LOP_END_CKPT<span>                    </span>1<span> </span>          136</span></pre>
<pre><span lang="NL">LOP_FORMAT_PAGE<span>                 </span>1<span> </span>          84</span></pre>
<pre><span lang="NL">LOP_BEGIN_CKPT<span>                  </span>1<span> </span>          96</span></pre>
<pre><span>LOP_CREATE_ALLOCCHAIN<span>           </span>1<span> </span>          40</span></pre>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">L’opérateur logique LOP_SET_FREE_SPACE est typiquement un opérateur d’allocation, qui met à jour la page PFS du fichier de donnée et indique quels sont les pages qui ne sont plus libres pour de futures allocations car elles ont été utilisées par le SELECT INTO. Si je lance la sauvegarde de mon journal :</p>
<pre><span lang="EN-GB">
Processed 149 pages for database 'CAPDATA', file 'CAPDATA_log01' on file 1.</span></pre>
<pre><span lang="EN-GB">BACKUP LOG successfully processed 11277 pages in 28.242 seconds (3.270 MB/sec).</span></pre>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">La sauvegarde fait 90Mb alors qu’il n’y a que 1,5Mb de transactions dans mon journal, parce qu’elle embarque les pages de données allouées par le SELECT INTO.</p>
<p class="MsoNormal">Exécutons maintenant le rebuild de l’index :</p>
<pre><span lang="EN-GB">
ALTER</span><span lang="EN-GB"> <span>INDEX</span> PK_PIECEAPPARTEMENT <span>ON</span> PIECEAPPARTEMENT REBUILD WITH</span><span lang="EN-GB"> (SORT_IN_TEMPDB = <span>ON</span>)</span></pre>
<pre><span>
 SQL Server Execution Times:</span></pre>
<pre><span lang="EN-GB"><span> </span>CPU time = 11594 ms,<span> </span>elapsed time = <strong>48860 ms</strong>.</span></pre>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">48 secondes au lieu de 66, et dans le journal:</p>
<pre><span lang="EN-GB">
dbcc</span><span lang="EN-GB"> sqlperf(logspace)</span></pre>
<pre><span lang="EN-GB">
 Database Name<span>   </span>Log Size (MB)     Log Space Used (%) Status</span></pre>
<pre><span lang="EN-GB">----------------------------------------------------------------------------------------------</span></pre>
<pre><span>CAPDATA<span> </span>        49,99219<span>           </span><strong>5,8515</strong><span> </span>            0</span></pre>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal">
<p class="MsoNormal">Et la sauvegarde de journal fait 91 Mb, loin des 5% utilisés. Là encore, les pages de données créées lors du rebuild sont embarquées dans la sauvegarde.</p>
<p><strong>Conclusion</strong>: en mode BULK_LOGGED, pour pouvoir restaurer une opération minimalement loggée, le BACKUP LOG est obligé de prendre avec lui les pages de données allouées dans l&#8217;opération. Ici, on ne voit pas de différence de taille des sauvegardes de journal entre les modes FULL et BULK_LOGGED, mais si en plus des opérations minimalement loggées, j&#8217;ai des ordres de modifications standards type INSERT/DELETE,UPDATE, la taille de ma sauvegarde va croître (et le temps de sauvegarde avec) en BULK_LOGGED et dépasser la taille d&#8217;une sauvegarde en mode FULL. Donc attention à l&#8217;espace disponible  sur les disques de sauvegardes le week end pendant la reorg !</p>
<p>David B.<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/regles-d%e2%80%99installation-de-base-episode-2/" rel="bookmark" title="6 janvier 2010">Règles d&#8217;installation de base (épisode 2)</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/" rel="bookmark" title="13 juin 2008">Modes de récupération et journal de transactions, épisode 1</a> (David BAFFALEUF) [SqlServer]</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>
</ul>
<p><!-- Similar Posts took 2.826 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/T8XFlLJHl2U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/</feedburner:origLink></item>
		<item>
		<title>Modes de récupération et journal de transactions, épisode 1</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/jydHVPNgyeY/</link>
		<comments>http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 12:16:18 +0000</pubDate>
		<dc:creator>David BAFFALEUF</dc:creator>
				<category><![CDATA[SqlServer]]></category>
		<category><![CDATA[journal de transactions]]></category>
		<category><![CDATA[mode de récupération]]></category>
		<category><![CDATA[Sauvegarde & Restauration]]></category>

		<guid isPermaLink="false">http://192.168.1.220:8080/blogs/sqlserver/?p=4</guid>
		<description><![CDATA[Une petite série de posts sur les différents modes de récupération des bases sous SQL Server 2005/2008, et leur impact sur le journal de transactions.
Dans ce premier épisode:

Qu&#8217;implique le passage de SIMPLE à COMPLET.
Que devient mon journal en mode COMPLET si je ne le sauvegarde pas régulièrement.

Le mode de récupération (recovery model en anglais) est [...]]]></description>
			<content:encoded><![CDATA[<p>Une petite série de posts sur les différents modes de récupération des bases sous SQL Server 2005/2008, et leur impact sur le journal de transactions.</p>
<p><strong>Dans ce premier épisode:</strong></p>
<ol>
<li>Qu&#8217;implique le passage de SIMPLE à COMPLET.</li>
<li>Que devient mon journal en mode COMPLET si je ne le sauvegarde pas régulièrement.</li>
</ol>
<p>Le mode de récupération (<em>recovery model</em> en anglais) est une propriété de base de données qui va préciser pour celle-ci deux choses essentielles:</p>
<ol>
<li>Le recyclage de l&#8217;espace consommé par les transactions validées dans son journal  de transactions.</li>
<li>La possibilité ou non de pouvoir sauvegarder ces transactions validées.</li>
</ol>
<p>Il existe trois modes de récupération: <strong>FULL</strong>,<strong> SIMPLE </strong>et <strong>BULK-LOGGED</strong>.</p>
<p><strong>FULL: </strong>c&#8217;est le mode par défaut. Dans ce mode, toutes les transactions sont journalisées, même les  opérations de modifications de masse (CREATE INDEX, BULK INSERT ou bcp.exe, SELECT INTO, et les opérations sur les champs TEXT). Dès l&#8217;instant où il y a eu au moins une sauvegarde complète sur la base, les transactions validées restent dans le journal. La seule façon de recycler l&#8217;espace occupé par ces transactions est de lancer régulièrement une sauvegarde du journal. Les transactions validées sont sauvegardées dans un fichier et sont alors supprimées du journal * .</p>
<p><strong>SIMPLE: </strong>dans ce mode, le recyclage des transactions validées est la responsabilité du checkpoint. En plus de flusher sur disque les pages de données modifiées dans le cache de données, le checkpoint supprime les transactions validées du journal sans les sauvegarder. Conséquence de celà, je n&#8217;ai pas la possibilité de sauvegarder mes transactions en mode SIMPLE. Je ne pourrai exécuter que des sauvegardes complètes ou différentielles (ou de fichier en lecture seule).</p>
<p><strong>BULK-LOGGED: </strong>c&#8217;est un mode à combiner avec le mode FULL. Dans ce mode, les opérations de modification de masse (citées plus haut) ne sont pas complètement journalisées, et l&#8217;impact de telles opérations sur le journal est limité. Le fait de changer de FULL à BULK-LOGGED ne modifie en rien ma façon de sauvegarder mes bases. En mode BULK-LOGGED, mes sauvegardes transactionnelles horaires continuent de s&#8217;exécuter sans problème. Très utile lorsqu&#8217;on lance notre réorganisation des indexes hebdomadaire car on gagne un temps fou.</p>
<table border="0">
<tbody>
<tr>
<td bgcolor="#dddddd"><em><strong>*: </strong>il existe au moins deux exceptions à cette règle: si la base est principale dans une session de miroir synchrone et que le site miroir est injoignable, où si la base est publiée dans le cadre d&#8217;une réplication transactionnelle et que la distribution ou l&#8217;agent de lecture du journal sont injoignables / inactifs. Dans ces deux cas, les transactions en attente (non envoyées au miroir, non écrites dans la base distribution) restent dans le journal et ne sont pas vidées par les sauvegardes de transactions.</em></td>
</tr>
</tbody>
</table>
<p><strong>Note: </strong>Attention à ne pas confondre mode de récupération FULL et sauvegarde FULL.</p>
<p><strong>Pour retrouver le mode de récupération d&#8217;une base:</strong></p>
<pre><span>SELECT</span><span> DATABASEPROPERTYEX(<span>'maBase'</span>,<span>'RECOVERY'</span>) <span>as</span> RECOVERYMODE</span></pre>
<p class="MsoNormal"><strong>Pour changer le mode d&#8217;une base:</strong></p>
<p class="MsoNormal">
<pre><span>ALTER</span><span> <span>DATABASE</span> maBase <span>SET</span> RECOVERY [ FULL | SIMPLE | BULK_LOGGED ]</span></pre>
<p class="MsoNormal">
<p><strong>1) Première remarque: il faudra obligatoirement (re)lancer une sauvegarde complète avant de sauvegarder le journal:</strong><br />
- Quand je créé ma base.<br />
- Quand je passe de SIMPLE à FULL.</p>
<p>La sauvegarde de transaction a besoin d&#8217;un numéro de transaction (LSN pour Log Sequence Number) de référence pour savoir à partir de quelle transaction commencer sa sauvegarde. Lorsqu&#8217;il n&#8217;y a pas eu d&#8217;autre sauvegarde de transactions avant elle, comme c&#8217;est le cas quand je passe de SIMPLE à FULL ou quand je viens de créer ma base, elle se base sur le LSN de fin de la dernière sauvegarde complète dans le même mode. Le fonctionnement précis de la sauvegarde à chaud fera l&#8217;objet d&#8217;un autre article prochainement.</p>
<p>Pour le mettre en évidence, créons-nous une petite base CRASHTEST:<br />
<span><br />
</span></p>
<pre><span>CREATE</span><span> <span>DATABASE</span> CRASHTEST</span></pre>
<pre><span>on</span><span> <span>PRIMARY</span></span></pre>
<pre><span>(NAME=<span>'CRASHTEST_data'</span>,</span></pre>
<pre><span>FILENAME=<span>'F:\KATMAI\MSSQL10.KATMAI\MSSQL\DATA\CRASHTEST_data.mdf'</span>,</span></pre>
<pre><span>SIZE=100MB, MAXSIZE=500MB)</span></pre>
<pre><span>LOG <span>ON</span></span></pre>
<pre><span>(NAME=<span>'CRASHTEST_log'</span>,</span></pre>
<pre><span>FILENAME=<span>'F:\KATMAI\MSSQL10.KATMAI\MSSQL\DATA\CRASHTEST_log.ldf'</span>,</span></pre>
<pre><span>SIZE=50MB,
MAXSIZE=500MB)</span></pre>
<p>Vérifions son mode de récupération:</p>
<pre><span>SELECT</span><span> DATABASEPROPERTYEX(<span>'CRASHTEST'</span>,<span>'RECOVERY'</span>) <span>as</span> RECOVERYMODE</span></pre>
<pre>RECOVERYMODE
---------------------------------------------------------
FULL</pre>
<p>Créons une petite transaction et essayons de la sauvegarder:</p>
<pre><span>use</span><span> CRASHTEST</span></pre>
<pre><span>create</span><span> <span>table</span> TABLE1 (A numeric <span>identity</span>, B varchar(5000))</span></pre>
<pre><span>insert</span><span> <span>into</span> TABLE1 <span>values</span> (replicate(<span>'b'</span>,5000))</span></pre>
<pre><span>backup</span><span> log CRASHTEST <span>to</span> disk=<span>'C:\CRASHTEST.log1.trn'</span> <span>with</span><span> </span>init, stats</span></pre>
<pre><span><em>Msg 4214, Level 16, State 1, Line 1</em></span></pre>
<pre><span><em>
BACKUP LOG cannot be performed because there is no current database backup.</em></span></pre>
<p><span><em> </em></span><br />
J&#8217;ai donc effectivement besoin d&#8217;avoir une sauvegarde complète pour initialiser ma chaîne:</p>
<pre><span>backup</span><span> <span>database</span> CRASHTEST <span>to</span> disk=<span>'C:\CRASHTEST.1.bak'</span> <span>with</span> init, stats</span></pre>
<pre><span><em>Processed 152 pages for database 'CRASHTEST', file 'CRASHTEST_data' on file 1.
100 percent processed.
Processed 1 pages for database 'CRASHTEST', file 'CRASHTEST_log' on file 1.
BACKUP DATABASE successfully processed 153 pages in 0.266 seconds (4.711 MB/sec).
</em></span></pre>
<p>OK, je retente de sauvegarder mon log:</p>
<pre><span>backup</span><span> log CRASHTEST <span>to</span> disk=<span>'C:\CRASHTEST.log1.trn'</span> <span>with</span><span> </span>init, stats</span></pre>
<pre><span><em>100 percent processed.</em></span></pre>
<pre><span><em>
Processed 6 pages for database 'CRASHTEST', file 'CRASHTEST_log' on file 1.</em></span></pre>
<pre><span><em>
BACKUP LOG successfully processed 6 pages in 0.161 seconds (0.283 MB/sec).</em></span></pre>
<p><span><em> </em></span><br />
Même problème lorsque je passe de SIMPLE à FULL:</p>
<pre><span>ALTER</span><span> <span>DATABASE</span> CRASHTEST <span>set</span> RECOVERY SIMPLE</span></pre>
<pre><span>ALTER</span><span> <span>DATABASE</span> CRASHTEST <span>set</span> RECOVERY <span>FULL</span></span></pre>
<pre><span>backup</span><span> log CRASHTEST <span>to</span> disk=<span>'C:\CRASHTEST.log2.trn'</span> <span>with</span> init, stats</span></pre>
<pre><span><em>Msg 4214, Level 16, State 1, Line 1
BACKUP LOG cannot be performed because there is no current database backup.</em></span></pre>
<p><strong>2) SAUVEGARDEZ VOS TRANSACTIONS !</strong></p>
<p>C&#8217;est un problème que l&#8217;on retrouve chez beaucoup de clients: grands comptes, PME&#8230; Il y a toujours chez eux au moins une base de données en mode de récupération FULL dont le journal n&#8217;a JAMAIS été sauvegardé. Ce n&#8217;est pas étonnant en un sens puisque FULL est le mode par défaut pour toutes les bases créées par l&#8217;utilisateur. Le résultat est un fichier LDF qui fait 80 Gb parce qu&#8217;il contient une année ou deux de transactions validées, sauvegardées dans des backup FULL depuis belle lurette, mais on le répète, en mode FULL, il n&#8217;y a qu&#8217;une sauvegarde de journal qui permet de recycler l&#8217;espace occupé par des transactions validées.</p>
<p>Reprenons notre base CRASHTEST, et créons un peu de volumétrie&#8230;</p>
<pre><span>USE</span><span> CRASHTEST</span></pre>
<pre><span>declare</span><span> @cpt int</span></pre>
<pre><span>set</span><span> @cpt=1</span></pre>
<pre><span>while</span><span>(@cpt&lt;=50000)</span></pre>
<pre><span>begin</span></pre>
<pre><span>insert</span><span> <span>into</span> TABLE1 <span>values</span> (replicate(<span>'b'</span>,5000))</span></pre>
<pre><span>set</span><span><span> </span>@cpt=@cpt+1</span></pre>
<pre><span>end</span></pre>
<pre><span>go</span></pre>
<p>&#8230;et vérifions quelle est la situation du journal à l&#8217;issue:</p>
<pre><span>DBCC</span><span> SQLPERF(LOGSPACE)</span></pre>
<pre>Database Name       Log Size (Mb)    Log Space Used (%)      Status
------------------  ---------------  ----------------------  --------
(...)               (...)            (...)                   (...)
CRASHTEST           253,3047         97,07731                0</pre>
<p>Il a plus que quadruplé de volume et il est plein.</p>
<p>Pour récupérer l&#8217;espace sur le disque, il faudra faire un DBCC SHRINKFILE en mode TRUNCATEONLY.<br />
Si je lance le DBCC SHRINKFILE tout de suite:</p>
<p><span><br />
</span></p>
<pre><span>DBCC</span><span> SHRINKFILE(’CRASHTEST_log’,<span>'TRUNCATEONLY’)</span></span></pre>
<pre>Dbid        Fileid        CurrentSize        MinimumSize    UsedPages         EstimatedPages
---------   ----------- ----------------  ---------------- ---------------   ------------------
8           2            31680            6400             31680             6400</pre>
<p>31680*8192Kb = 247,5 Mb, autant dire que presque rien n&#8217;a été fait. Celà vient du fait que le TRUNCATEONLY tronque la taille du fichier jusqu&#8217;au dernier extent alloué.<br />
Comme mon journal est plein, le dernier extent alloué est précisément à la fin du fichier.</p>
<p>Donc il faut commencer par vider ce journal: je sauvegarde ma transaction :</p>
<pre><span>backup</span><span> log CRASHTEST <span>to</span> disk=<span>'C:\CRASHTEST.log3.trn'</span> <span>with</span> init, stats, compression</span></pre>
<pre><span>go</span></pre>
<pre><span>
100 percent processed.</span></pre>
<pre><span>
Processed 31461 pages for database 'CRASHTEST', file 'CRASHTEST_log' on file 3.</span></pre>
<pre><span>
BACKUP LOG successfully processed 31461 pages in 16.391 seconds (15.723 MB/sec).</span></pre>
<p><span> </span><br />
Dans mon journal&#8230;</p>
<pre><span>DBCC</span><span> SQLPERF(LOGSPACE)</span></pre>
<pre>Database Name        Log Size (Mb)    Log Space Used (%)      Status
------------------   ---------------  ----------------------  --------
(...)                (...)            (...)                   (...)
CRASHTEST            247,4922         4,201521                 0</pre>
<p>Je retrouve mon enveloppe à 247,5Mb, et cette fois elle est bien vide. Je vais pouvoir ramener mon log à sa taille d&#8217;origine:</p>
<pre><span>DBCC</span><span> SHRINKFILE(’CRASHTEST_log’,<span>'TRUNCATEONLY’)</span></span></pre>
<p><span><br />
</span></p>
<pre>Dbid        Fileid        CurrentSize        MinimumSize    UsedPages         EstimatedPages
---------   ----------- ----------------  ---------------- ---------------   ------------------
8           2            6400               6400            6400              6400</pre>
<p>Attention, si je choisis de rester en mode FULL, je devrai programmer des sauvegardes de transactions (à travers le SQL Agent par exemple).</p>
<p>Dans le cas où ce journal fait plusieurs dizaines de Gb, je choisis de le vider en passant la base en mode SIMPLE:</p>
<pre><span lang="EN-GB">ALTER</span><span lang="EN-GB"> <span>DATABASE</span> CRASHTEST <span>SET</span> RECOVERY SIMPLE</span></pre>
<p>Un checkpoint initié dès la fin de l&#8217;ALTER se chargera de vider le contenu du journal, et il ne restera plus qu&#8217;à faire le SHRINKFILE.</p>
<p>A suivre l&#8217;effet du BULK-LOGGED sur la taille du journal&#8230;</p>
<p>[ David B. ]<strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/sqldiag-episode-1/" rel="bookmark" title="5 février 2010">SQLDIAG (épisode 1)</a> (David BAFFALEUF) [SqlServer]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/" rel="bookmark" title="11 décembre 2008">Modes de récupération et journal de transactions, épisode 2</a> (David BAFFALEUF) [SqlServer]</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>
</ul>
<p><!-- Similar Posts took 2.645 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/jydHVPNgyeY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/</feedburner:origLink></item>
		<item>
		<title>Se connecter à SQL Server à travers Oracle, quelle drôle d’idée ?</title>
		<link>http://feedproxy.google.com/~r/CapDataTeamBlog/~3/DvtPqEUUUz8/</link>
		<comments>http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 09:46:20 +0000</pubDate>
		<dc:creator>Thierry GASCARD</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[sql server oracle gateway ole db]]></category>

		<guid isPermaLink="false">http://192.168.1.220:8080/blogs/oracle/?p=6</guid>
		<description><![CDATA[Cet article est écrit par Thierry GASCARD.
La première solution est d&#8217;utiliser la &#171;&#160;gateway Oracle pour SQL SERVER &#160;&#187; (15000$ par serveur).
La deuxième gratuite est d&#8217;utiliser OLE DB.
Je vais m&#8217;intéresser à la deuxième solution, vous en devinez la raison  
1) créer un fichier UDL (vide puis ajouter l&#8217;extension .udl) sous C:\\Documents and Settings\\thierry\\Bureau\\client1.udl, puis double [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article est écrit par <a href="mailto:tgascard@capdata.fr" target="_blank">Thierry GASCARD.</a></p>
<p>La première solution est d&#8217;utiliser la &laquo;&nbsp;gateway Oracle pour SQL SERVER &nbsp;&raquo; (15000$ par serveur).</p>
<p>La deuxième gratuite est d&#8217;utiliser OLE DB.</p>
<p>Je vais m&#8217;intéresser à la deuxième solution, vous en devinez la raison <img src='http://blog.capdata.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>1) créer un fichier UDL (vide puis ajouter l&#8217;extension .udl) sous C:\\Documents and Settings\\thierry\\Bureau\\client1.udl, puis double cliquer</p>
<p>-onglet Fournisseur : choisir le fournisseur &laquo;&nbsp;Microsoft OLE DB Provider for SQL Server&nbsp;&raquo;</p>
<p>s&#8217;il n&#8217;est pas présent  téléchargez <a title="MDAC 2.8" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c&amp;displaylang=en" target="_blank">MDAC </a>(merci david)<br />
-onglet connexion : nom du serveur SQL (minsk\aquarium), utilisateur/mot de passe, base de données client1<br />
2) sous $ORACLE_HOME\hs\admin<br />
faire une copie du fichier inithsoledb.ora en initclient1.ora<br />
3) configuer initclient1.ora<br />
HS_FDS_CONNECT_INFO =&nbsp;&raquo;UDLFILE=C:\\Documents and Settings\\thierry\\Bureau\\client1.udl&nbsp;&raquo;<br />
HS_FDS_TRACE_LEVEL = 0<br />
HS_FDS_TRACE_FILE_NAME = client1.trc</p>
<p>attention doubler \ (merci manu..)<br />
4) configuer le fichier tnsnames.ora<br />
CLIENT1  =<br />
(DESCRIPTION=<br />
(ADDRESS=(PROTOCOL=tcp)(HOST=pc-thierry)(PORT=1524))<br />
(CONNECT_DATA=(SID=CLIENT1))<br />
(HS=OK)<br />
)<br />
5) configurer le fichier listener.ora<br />
ajouter aux services de votre listener<br />
(SID_DESC=<br />
(SID_NAME=CLIENT1)<br />
(ORACLE_HOME = D:\app\oracle\10.2.0\db_1)<br />
(PROGRAM=hsolesql)<br />
)<br />
6) créer le database link<br />
CREATE PUBLIC DATABASE LINK &laquo;&nbsp;CLIENT1&#8243; USING &#8216;CLIENT1&#8242;;</p>
<p>7) tester la connexion<br />
select * from sysobjects@client1;</p>
<p><em>remarque : en cas de souci, vous pouvez poser une trace.<br />
mettre le paramètre HS_FDS_TRACE_LEVEL = 4<br />
la trace se trouvera sous D:\app\oracle\10.2.0\db_1\hs\trace</em><strong>Autres articles à découvrir sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" rel="bookmark" title="3 mars 2010">Installation Oracle 11gR2 64 bits sur Red Hat 5 Partie 1</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-64-bits-sur-red-hat-5/" rel="bookmark" title="5 juin 2009">Installation Oracle 64 bits sur Red Hat 5</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/creation-et-utilisation-docfs2/" rel="bookmark" title="5 juin 2009">Création et utilisation d&#8217;OCFS2</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/installation-asm-sur-suse-10-en-64-bits-avec-multipathing-emc-powerpath/" rel="bookmark" title="5 juin 2009">Installation ASM sur SUSE 10 en 64 Bits avec multipathing (EMC Powerpath)</a> (Thierry GASCARD) [Oracle]</li>
<li><a href="http://blog.capdata.fr/index.php/utiliser-asmcmd/" rel="bookmark" title="5 juin 2009">Utiliser ASMCMD</a> (Thierry GASCARD) [Oracle]</li>
</ul>
<p><!-- Similar Posts took 3.732 ms --></p>
<img src="http://feeds.feedburner.com/~r/CapDataTeamBlog/~4/DvtPqEUUUz8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.capdata.fr/index.php/se-connecter-a-sql-server-a-travers-oracle-quelle-drale-didae/</feedburner:origLink></item>
	</channel>
</rss>
