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

<channel>
	<title>Oracle - Concepts et Exemples &#187; redo</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/redo/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/pachot</link>
	<description>Les fonctionalités et concepts d&#039;Oracle à partir de traductions et de démos</description>
	<lastBuildDate>Sun, 03 Apr 2016 20:36:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>12c: possibilité de ne plus générer de redo sur les GTT</title>
		<link>https://blog.developpez.com/pachot/redosize/</link>
		<comments>https://blog.developpez.com/pachot/redosize/#comments</comments>
		<pubDate>Thu, 04 Jul 2013 15:30:28 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[GTT]]></category>
		<category><![CDATA[redo]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=433</guid>
		<description><![CDATA[Sur une Global Temporary Table, il n&#8217;est pas nécessaire de générer du redo car les données ne sont pas persistantes. Les données (table et index) sont dans un tablespace temporaire sur lequel il n&#8217;y a pas de recovery. Par contre &#8230; <a href="https://blog.developpez.com/pachot/redosize/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Sur une Global Temporary Table, il n&rsquo;est pas nécessaire de générer du redo car les données ne sont pas persistantes. Les données (table et index) sont dans un tablespace temporaire sur lequel il n&rsquo;y a pas de recovery.<br />
Par contre le undo est nécessaire, pas pour des raisons de consistent reads (puisque les données ne sont pas partagées avec d&rsquo;autres sessions), mais simplement parce qu&rsquo;on peut faire un rollback dans notre session.</p>
<p>Et malheureusement cet undo est généré dans le tablespace UNDO qui est permanent, donc protégé par du redo.</p>
<p>En 12c, c&rsquo;est toujours le comportement par défaut, mais on a la possibilité de faire en sorte que le UNDO généré par des opérations sur des GTT soit écrit dans le tablespace temporaire Et donc de ne plus générer de redo du tout (Sauf un minimum, pour les modifications du dictionnaire par exemple).</p>
<p>Il suffit de positionner le paramètre suivant:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">alter session set temp_undo_enabled =true;</div></div>
<p>Cette fonctionnalité a été introduite pour pouvoir utiliser les GTT dans une standby Active DataGuard (où les datafiles sont ouverts en read-only seulement). Le paramètre est par défaut à FALSE sur une base primaire.</p>
<p>J&rsquo;ai repris une <a href="http://ora-demo.pachot.net/redosize.html" title="demo" target="_blank">demo</a> complète qui mesure le redo généré par chaque opération sur une table permanentes et sur une table temporaire. Si on laisse temp_undo_enabled à sa valeur par défaut, il n&rsquo;y a pas de différence entre le redo généré en 11g et en 12c sur toutes les opérations de cette demo.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Undo et Redo et Recovery en quelques mots, par Jonathan Lewis</title>
		<link>https://blog.developpez.com/pachot/jl_nutshell1/</link>
		<comments>https://blog.developpez.com/pachot/jl_nutshell1/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 18:08:04 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Jonathan Lewis]]></category>
		<category><![CDATA[redo]]></category>
		<category><![CDATA[undo]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cet article est la traduction d&#8217;un article de Jonathan Lewis publié sur son blog. L&#8217;article original en anglais se trouve ici. Lorsque vous modifiez un bloc de donnée, en modifiant une ligne d&#8217;une table par exemple, ou en marquant une &#8230; <a href="https://blog.developpez.com/pachot/jl_nutshell1/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p><ins>Cet article est la traduction d&rsquo;un article de Jonathan Lewis publié sur son blog. L&rsquo;article original en anglais se trouve <a href="http://jonathanlewis.wordpress.com/2009/10/14/nutshell-1/">ici</a>.<br />
</ins></p></blockquote>
<p>Lorsque vous modifiez un bloc de donnée, en modifiant une ligne d&rsquo;une table par exemple, ou en marquant une entrée d&rsquo;index comme supprimée, voici ce que fait Oracle:</p>
<ol>
<li>génération d&rsquo;information <b><i>redo</i></b> sous forme d&rsquo;un vecteur de modification (<i>change vector</i> pour décrire les modifications qui doivent être faites sur le bloc</li>
<li>génération d&rsquo;information <b><i>undo</i></b> pour décrire l&rsquo;ancienne version des données qui vont changer.<br />
Cet undo est en réalité une information <b><i>redo</i></b> (un autre <i>change vector</i>) qui décrit comment créer cette information <b><i>undo</i></b></li>
<li>écriture de ces informations dans le buffer de journalisation (<i>redo log buffer</i>)<br />
Ces 2 <i>change vectors</i> sont regroupés (celui de l&rsquo;<i>undo</i> est toujours en premier) en un seul enregistrement <b><i>redo record</i></b></li>
<li>la modification sur le <strong>bloc d&rsquo;undo</strong> est effectuée</li>
<li>la modification sur le <strong>bloc de données</strong> (table ou index) est effectuée</li>
</ol>
<p>Le <b><i>redo</i></b> doit être écrit sur disque avant que le bloc de donnée et le bloc d&rsquo;undo ne le soient. <ins>[voir note ci-dessous]</ins><br />
Le bloc d&rsquo;undo et le bloc de donnée seront écrits sur disque plus tard, et ce même si la transaction n&rsquo;est pas encore commitée.</p>
<p><strong>Question</strong>: Si l&rsquo;instance se plante avant que la transaction ne soit commitée, comment Oracle va pouvoir récupérer l&rsquo;ancienne version des données, puisque elle a été écrasée par la nouvelle version non commitée ?<br />
<span id="more-22"></span><br />
<strong>Réponse</strong>: Après le plantage, le processus de récupération (<i>instance recovery</i>) connait l&rsquo;heure du dernier checkpoint de chaque fichier de données (<i>datafile</i>) et va appliquer le <b><i>redo</i></b> sur les fichiers de la tablespace d&rsquo;<b><i>undo</i></b>, de la même manière qu&rsquo;il le fait sur les autres fichiers des tablespaces &lsquo;permanentes&rsquo;.</p>
<p>A partir de là, la base est à jour, et le processus de recovery voit alors voir les dernières versions aussi bien pour les blocs de données que pour les blocs d&rsquo;<b><i>undo</i></b>.</p>
<p>La tablespace d&rsquo;undo contient la table des transactions (<i>transaction table</i>) dans le bloc d&rsquo;entête du segment d&rsquo;undo (<i>undo segment header</i>) et, comme elle est maintenant à jour, le processus de recovery peur détecter que la transaction n&rsquo;a pas été commitée. Il peut alors faire un <b>rollback</b>, en utilisant les informations contenues dans les blocs d&rsquo;<b><i>undo</i></b> afin de récupérer les anciennes données de la table.</p>
<p><strong>Notes</strong>:</p>
<p>Cette description d&rsquo;une modification de donnée est un schéma général général. Il y a des cas particuliers qui rendent ce mécanisme un peu plus complexe. Entre autres, il y a un traitement particulier quand le changement est fait juste au début de la transaction: en 10g les quelques premières modifications que fait une transaction vont utiliser un mécanisme spécial &#8211; à condition qu&rsquo;il n&rsquo;y ait qu&rsquo;une seule instance (donc pas en RAC). Ce mécanisme est optimisé en utilisant la gestion de l&rsquo;undo en mémoire (private redo threads et in-memory undo)</p>
<p>Voire aussi le <a href="http://blog.developpez.com/pachot/p8681/concepts/jl-glossary-undo/">glossaire undo</a> à propos du <i>undo segment header</i> et de la <i>transaction table</i></p>
<p><ins><br />
Oracle s&rsquo;assure toujours que lorsque les modifications faites en mémoire (dans le <i>buffer cache</i>) sont écrites sur disque (dans les <i>datafiles</i>), alors le <i>redo</i> associé qui a été écrit en mémoire (dans le <i>log buffer</i>) a auparavant été flushé sur disque, dans les fichiers <i>redo log</i>.<br />
Si besoin DBWR (database writer) va attendre que LGWR (log writer) ait terminé cette écriture.<br />
C&rsquo;est ce mécanisme (écriture du log en premier &#8211; connu comme le protocole <i>Write Ahead Log</i>) qui assure que les journaux (<i>redo logs</i>) ont toujours l&rsquo;information nécessaire pour défaire (undo) les modifications écrites sur disque.<br />
</ins></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
