<?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; MicroLearning</title>
	<atom:link href="https://blog.developpez.com/pachot/category/microlearning/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>SOUG-Romand: Journée performance le 21 mai</title>
		<link>https://blog.developpez.com/pachot/soug-romand-journee-performance-le-21-mai/</link>
		<comments>https://blog.developpez.com/pachot/soug-romand-journee-performance-le-21-mai/#comments</comments>
		<pubDate>Mon, 12 Jan 2015 17:01:35 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1347</guid>
		<description><![CDATA[Bonne nouvelle pour les francophones: le SOUG-R est de plus en plus actif. Le 21 mai 2015 une journée performance est organisée sur Lausanne. Mon call for paper a été accepté: je vous parlerais des SQL Plan Directives &#8211; une &#8230; <a href="https://blog.developpez.com/pachot/soug-romand-journee-performance-le-21-mai/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bonne nouvelle pour les francophones: le SOUG-R est de plus en plus actif.</p>
<p>Le 21 mai 2015 une journée performance est organisée sur Lausanne.</p>
<p>Mon call for paper a été accepté: je vous parlerais des SQL Plan Directives &#8211; une nouvelle fonctionnalité 12c accessible aussi en Standard Edition!</p>
<p>Voici l&rsquo;abstract:</p>
<p><strong>SQL Plan Directives &#8211; la mémoire de l&rsquo;optimizeur<br />
</strong><em>L&rsquo;optimiseur 12c peut évaluer la précision de son estimation, et se souvenir de la raison de la divergence.<br />
C&rsquo;est le début de l&rsquo;intelligence artificielle pour le CBO: apprendre pour faire mieux dans le futur, même pour des requêtes différentes. Nous verrons l&rsquo;utilisation de SQL Plan Directives sur des exemples pratiques, au delà de ce qui est documenté.</em></p>
<p>Il y aura aussi des présentations de <strong>Chris Antonigni</strong>, <strong>Lothar Flatz</strong>, <strong>Luca Canali</strong> et <strong>Zbigniew Baranowski</strong></p>
<p>Donc à ne pas rater &#8211; réservez la date et venez nombreux !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technologies de réplications (physiques et logiques)</title>
		<link>https://blog.developpez.com/pachot/technologies-de-replications-physiques-et-logiques/</link>
		<comments>https://blog.developpez.com/pachot/technologies-de-replications-physiques-et-logiques/#comments</comments>
		<pubDate>Sun, 26 Oct 2014 18:48:43 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1248</guid>
		<description><![CDATA[Pour ceux qui sont en Suisse, le SOUG Romandie présente les technologies de réplication le 6 novembre à Lausanne. J&#8217;y présenterai Dbvisit replicate, une alternative bon marché à Golden Gate avec une demo pour montrer que la mise en place &#8230; <a href="https://blog.developpez.com/pachot/technologies-de-replications-physiques-et-logiques/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour ceux qui sont en Suisse, le SOUG Romandie présente les technologies de réplication le 6 novembre à Lausanne.<br />
J&rsquo;y présenterai Dbvisit replicate, une alternative bon marché à Golden Gate avec une demo pour montrer que la mise en place d&rsquo;un POC n&rsquo;est pas compliquée. Il y aura aussi une présentation de Data Guard 12c et de Golden Gate.<br />
Le programme complet: <a href="http://www.soug.ch/fr/evenements/sig-141106-agenda.html" title="agenda">agenda</a> sur le site du SOUG.</p>
<p><img src="http://www.soug.ch/fileadmin/user_upload/Bilder/Logos/SOUG_Logos/SOUG_Logo_transparent_Schrift_schwarz.gif" alt="SOUG" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cas de restore/recovery</title>
		<link>https://blog.developpez.com/pachot/cas-de-restorerecovery/</link>
		<comments>https://blog.developpez.com/pachot/cas-de-restorerecovery/#comments</comments>
		<pubDate>Thu, 23 Oct 2014 18:57:36 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1227</guid>
		<description><![CDATA[Vous faites des backups, mais savez-vous les restaurer? Il est important de d&#8217;entraîner à récupérer une base après une panne quelconque. Cette page est un index sur les cas de recovery que j&#8217;ai posté l&#8217;an dernier: Création de la base &#8230; <a href="https://blog.developpez.com/pachot/cas-de-restorerecovery/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Vous faites des backups, mais savez-vous les restaurer? Il est important de d&rsquo;entraîner à récupérer une base après une panne quelconque.</p>
<p>Cette page est un index sur les cas de recovery que j&rsquo;ai posté l&rsquo;an dernier:</p>
<blockquote><p>
   <a href="http://blog.developpez.com/pachot/cas-de-recovery-en-12c/" title="Cas de recovery en 12c">Création de la base 12c pour les cas de recovery</a><br />
   <a href="http://blog.developpez.com/pachot/dropuserdatafile_advisory/" title="Recovery cases: perte d’un datafile (non système)">perte d’un datafile (non système)</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-dun-datafile-sysaux/" title="Recovery cases: perte d’un datafile SYSAUX">perte d’un datafile SYSAUX</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-dun-datafile-system/" title="Recovery cases: perte d’un datafile SYSTEM">perte d’un datafile SYSTEM</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-dun-membre-de-redo-log/" title="Recovery cases: perte d’un membre de redo log">perte d’un membre de redo log</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-de-tous-les-redo-log/" title="Recovery cases: perte de tous les redo log">perte de tous les redo log</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-dun-controlfile-multiplexe/" title="Recovery cases: perte d’un controlfile multiplexé">perte d’un controlfile multiplexé</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-de-tous-les-controlfiles/" title="Recovery cases: perte de tous les controlfiles">perte de tous les controlfiles</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-du-spfile/" title="Recovery cases: perte du spfile">perte du spfile</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-perte-de-tous-les-fichiers/" title="Recovery cases: perte de tous les fichiers (sauf FRA)">perte de tous les fichiers (sauf FRA)</a><br />
   <a href="http://blog.developpez.com/pachot/recovery-cases-un-bloc-corrompu/" title="Recovery cases: un bloc corrompu">bloc corrompu</a>
</p></blockquote>
<p>Vous voulez en savoir plus? Le <strong>workshop Oracle Backup &amp; Recovery (3 jours)</strong><br />
de dbi services donne la théorie (RPO/RTO, tous les types de backups et recovery)<br />
et vous aurez aussi l&rsquo;occasion de pratiquer: scénarios de crash sur les bases du lab. </p>
<p><strong>Dernière date de l&rsquo;année: à Lausanne les 12,13,14 novembre.</strong><br />
Les supports sont en anglais mais le cours est en français. Renseignements/inscriptions:<br />
<a href="http://www.dbi-services.com/index.php/products/dbi-insite-workshops/oracle-backup-and-recovery-workshop" title="dbi services" target="_blank">http://www.dbi-services.com/index.php/products/dbi-insite-workshops/oracle-backup-and-recovery-workshop</p>
<blockquote><p><img src="http://www.dbi-services.com/images/stories/Newsflash_update/dbi-visuals-400x200-rgb-05-full.jpg" alt="dbi insite workshops" />
</p></blockquote>
<p></a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mécanismes internes du multitenant: liens objects et métadonnées</title>
		<link>https://blog.developpez.com/pachot/multitenant-metadata-object-link/</link>
		<comments>https://blog.developpez.com/pachot/multitenant-metadata-object-link/#comments</comments>
		<pubDate>Fri, 03 Oct 2014 14:07:43 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1216</guid>
		<description><![CDATA[ceci est la traduction de mon article sur le blog dbi-services Attention: il ne s&#8217;agit ici que de jouer avec les mécanismes internes non documentés. A ne faire que sur une base de test prête à être jetée. Jouer avec &#8230; <a href="https://blog.developpez.com/pachot/multitenant-metadata-object-link/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p>ceci est la traduction de mon article sur le blog <a href="http://www.dbi-services.com/index.php/blog/entry/oracle-12c-cdb-metadata-a-object-links-internals" title="Oracle 12c CDB - metadata &amp; object links internals">dbi-services</a></p></blockquote>
<p>Attention: il ne s&rsquo;agit ici que de jouer avec les mécanismes internes non documentés. A ne faire que sur une base de test prête à être jetée. Jouer avec ces mécanisme est le meilleur moyen de planter la base avec des ORA-600 et de corrompre le dictionnaire.</p>
<p>Sur une base multitenant (CDB) nous savons que chaque pluggable database est isolée afin d&rsquo;être vue comme une seule base lorsqu&rsquo;on est connecté à son service. Mais elles partagent des ressource communes puisque le but est de consolider plusieurs bases en une seule. Pas de problème pour la CPU, la mémoire, les journaux redo et undo: il ne sont gérés qu&rsquo;au niveau CDB. Le multitenant n&rsquo;a pas changé grand chose là dessus, à part qu&rsquo;on stocke l&rsquo;identificateur de conteneur dans différentes structures, par exemple dans les vecteurs de redo pour identifier les objets (object id peuvent être les mêmes entre plusieurs CDB). Au niveau des fichiers, pas de gros changements par rapport à ce qui avait été introduit avec les tablespaces transportables.</p>
<p>Mais ce qui a été un plus gros challenge pour les développeurs d&rsquo;Oracle 12c, c&rsquo;est surtout la manière d&rsquo;implémenter le dictionnaire. Il a été séparé:</p>
<ul>
<li>Tout ce qui est interne au fonctionnement d&rsquo;Oracle, les métadonnées du dictionnaire, les packages dbms_&#8230;, tout ce qui est stocké pour toute l&rsquo;instance: tables de références, repository AWR, etc. C&rsquo;est le but: consolider, ne pas répéter plusieurs fois ce qui est identique du moment qu&rsquo;on est sur la même version d&rsquo;Oracle</li>
<li>Toutes les métadonnées qui concernent l&rsquo;application: les tables et packages que vous avez créé. Celles-ci sont propres à chaque pluggable tablespace, et sont transportées, clonées avec les oprérations de plug/unplug</li>
</ul>
<p>et finalement, comme le but principal d&rsquo;Oracle étant de pouvoir faire dans une PDB tout ce qu&rsquo;on peut faire sur base, il faut pouvoir foir au niveau PDB les informations stockées au niveau CDB.</p>
<p>Tout ça semble un peu magique par rapport à ce qu&rsquo;on connait d&rsquo;Oracle qui n&rsquo;a jamais fait cette séparation. Par exemple depuis le début d&rsquo;Oracle on a dans la table SYS.TAB$ les informations de nos tables, ainsi que les informations des tables du dictionnaire &#8211; incluant les métadonnées de la table SYS.TAB$ elle-même. La documentation ne va pas très loin sur la manière dont ça a été implémenté. Heureusement on a quelques scripts dans ?/rdbms/admin qui donnes des idées là dessus. ils utilisent une syntaxe un peu particulière, non documentée, et qui n&rsquo;est disponible que lorsque les scripts internes mettent le paramètre non documenté &laquo;&nbsp;_ORACLE_SCRIPT&nbsp;&raquo;=true. </p>
<p>Maintenant, ce sont des trucs de geek qui arrivent. Rien à voir avec ce qu^&rsquo;on fait en production. Nous allons créer nos propres liens objet et métadonnée. Ce qui est fait dans la suite est fait dans une session avec &laquo;&nbsp;_ORACLE_SCRIPT&nbsp;&raquo;=true. On va voir des nouveaux éléments de syntaxe:  cdb$view(), sharing=metadata, sharing=object, common_data</p>
<h2>Container data objects</h2>
<p>D&rsquo;abord nous allons voir comment au niveau CDB la racine CDB$ROOT peut voir les informations des autres conteneurs (PDB)</p>
<p>Je suis au niveau CDB:</p>
<pre>SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
CDB$ROOT

SQL&gt; show con_id
CON_ID
------------------------------
1</pre>
<p>et je créé une table normale:</p>
<pre>
SQL&gt; create table DEMO_REG_TABLE sharing=none as select 111 dummy from dual;
Table created.

SQL&gt; select * from DEMO_REG_TABLE;
     DUMMY
----------
       111
</pre>
<p>Puis je fais exactement la même chose dans la PDB:</p>
<pre>
SQL&gt; alter session set container=pdb1;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
PDB1

SQL&gt; show con_id
CON_ID
------------------------------
3

SQL&gt; create table DEMO_REG_TABLE sharing=none as select 999 dummy from dual;
Table created.

SQL&gt; select * from DEMO_REG_TABLE;
     DUMMY
----------
       999
</pre>
<p>et de retour dans la racine, j&rsquo;utilse la fonction de table CDB$VIEW pour voir ce que j&rsquo;ai dans chacune de mes PDB:</p>
<pre>
SQL&gt; select * from  cdb$view(DEMO_REG_TABLE) where con_id in (1,3);
     DUMMY     CON_ID
---------- ----------
       999          3
       111          1
</pre>
<p>C&rsquo;est comme ça que les &lsquo;container objects&rsquo; sont définis: ils utilisent la fonction CDB$VIEW pour exécuter une requête sur chaque PDB, consolider le résultat et rajouter l&rsquo;identifiant de PDB: CON_ID pour montrer d&rsquo;où viennent les lignes.</p>
<p>Vous voulez savoir comment c&rsquo;est implémenté? Il semble que ce soit le mécanisme de parallel query qui soit utilisé. Voici la preuve: </p>
<pre>
SQL&gt; select * from  cdb$view(DEMO_REG_TABLE);
select * from  cdb$view(DEMO_REG_TABLE)
*
ERROR at line 1:
ORA-12801: error signaled in parallel query server P002
ORA-00942: table or view does not exist
</pre>
<p>Lorsque la table n&rsquo;est pas trouvée (j&rsquo;ai volontairement créé une table sur quelques conteneurs seulement) c&rsquo;est un process parallel query qui renvoit l&rsquo;erreur.</p>
<h2>Metadata links</h2>
<p>Maintenant, je vais créer une fonction PL/SQ dans la racine et dans une PDB, mais je n&rsquo;ai pas envie de dupliquer le code dans les deux tablespaces SYSTEM. Je vais utiliser SHARING=METADATA pour créer un metadata link.</p>
<pre>
SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
CDB$ROOT

SQL&gt; show con_id

CON_ID
------------------------------
1

SQL&gt; create function DEMO_MDL_FUNCTION sharing=metadata
  2  return varchar2 as dummy varchar2(100); begin select max(dummy) into dummy from DEMO_REG_TABLE; return dummy; end;
  3  /
Function created.

SQL&gt; select DEMO_MDL_FUNCTION from dual;
DEMO_MDL_FUNCTION
------------------------------
111
</pre>
<pre>
SQL&gt; alter session set container=pdb1;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
PDB1

SQL&gt; show con_id
CON_ID
------------------------------
3

SQL&gt; create function DEMO_MDL_FUNCTION sharing=metadata
  2  return varchar2 as dummy varchar2(100); begin select max(dummy) into dummy from DEMO_REG_TABLE; return dummy; end;
  3  /
Function created.

SQL&gt; select DEMO_MDL_FUNCTION from dual;
DEMO_MDL_FUNCTION
------------------------------
999
</pre>
<p>Je peux donc voir le code dans SYS.SOURCE$ de la racine:</p>
<pre>
SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; select * from source$ where obj# in (select obj# from obj$ where name like 'DEMO%');

      OBJ#       LINE SOURCE
---------- ---------- ------------------------------
     95789          1 function DEMO_MDL_FUNCTION
</pre>
<p>Mais rien dans ma PDB:</p>
<pre> 
SQL&gt; alter session set container=pdb1;
Session altered.

SQL&gt; select * from source$ where obj# in (select obj# from obj$ where name like 'DEMO%');

no rows selected
</pre>
<h2>Object links</h2>
<p>Ceci était pour ne stocker les métadonnées qu&rsquo;à un seul endroit, dans la racine, en ayant seulement un lien dessus dans les PDB. On peut aussi faire la même chose pour des données qu&rsquo;on ne veut stocker que dans la racine, en utilisant SHARING=METADATA pour créer la table et SHARING=OBJECT pour créer une vue dessus</p>
<pre>
SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
CDB$ROOT

SQL&gt; show con_id
CON_ID
------------------------------
1

SQL&gt; create table DEMO_MDL_TABLE sharing=metadata as select 111 dummy from dual;
Table created.

SQL&gt; alter session set container=pdb1;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
PDB1

SQL&gt; show con_id

CON_ID
------------------------------
3

SQL&gt; create table DEMO_MDL_TABLE sharing=metadata as select 999 dummy  from dual;
Table created.
</pre>
<pre> 
SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; select * from  cdb$view(DEMO_MDL_TABLE) where con_id in (1,3);

     DUMMY     CON_ID
---------- ----------
       999          3
       111          1
</pre>
<pre>
SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
CDB$ROOT

SQL&gt; show con_id
CON_ID
------------------------------
1

SQL&gt; create view DEMO_OBL_VIEW sharing=object as select * from DEMO_MDL_TABLE;
View created.

SQL&gt; select * from DEMO_OBL_VIEW;
     DUMMY
----------
       111
</pre>
<pre> 
SQL&gt; alter session set container=pdb1;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
PDB1

SQL&gt; show con_id
CON_ID
------------------------------
3

SQL&gt; create view DEMO_OBL_VIEW sharing=object as select * from DEMO_MDL_TABLE;
View created.

SQL&gt; select * from DEMO_OBL_VIEW;
     DUMMY
----------
       111
</pre>
<p>La vue montre les données stockées dans CDB$ROOT en suivant le &lsquo;object link&rsquo; au lieu de lire la table du container courant.</p>
<p>On ne peut pas insérer directement dans un &lsquo;object link':</p>
<pre>
SQL&gt; insert into DEMO_OBL_VIEW select 9999 dummy from dual;
insert into DEMO_OBL_VIEW select 9999 dummy from dual
            *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views
</pre>
<p>et on a une idée de l&rsquo;implémentation en regardant le plan d&rsquo;exécution:</p>
<pre>
---------------------------------------------
| Id  | Operation        | Name             |
---------------------------------------------
|   0 | SELECT STATEMENT |                  |
|   1 |  FIXED TABLE FULL| X$OBLNK$aed0818c |
---------------------------------------------
</pre>
<p>C&rsquo;est une table X$ qui va faire le lien </p>
<h2>Common data views</h2>
<p>finalement, comment une PDB peut voir les données de la racine? Nous avons vu au dessus que la fonction que j&rsquo;ai créé ci-dessus est stockée dans le SYS.SOURCE$ de la racine seulement. Par contre on peut la voir à partir du DBA_SOURCE de la PDB</p>
<pre>
SQL&gt; alter session set container=cdb$root;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
CDB$ROOT

SQL&gt; show con_id
CON_ID
------------------------------
1

SQL&gt; create or replace view DEMO_INT_VIEW common_data (dummy,sharing) as select dummy,case when dummy='222' then 0 else 1 end from DEMO_MDL_TABLE;
View created.

SQL&gt; select * from DEMO_INT_VIEW;

     DUMMY    SHARING
---------- ----------
       111          1
       222          0
</pre>
<p>J&rsquo;ai créé une &lsquo;common data view&rsquo; en rajoutant une colonne &lsquo;sharing&rsquo; pour montrer d&rsquo;où viennent les lignes.</p>
<pre>
SQL&gt; alter session set container=pdb1;
Session altered.

SQL&gt; show con_name
CON_NAME
------------------------------
PDB1

SQL&gt; show con_id
CON_ID
------------------------------
3

SQL&gt; create or replace view DEMO_INT_VIEW common_data (dummy,sharing) as select dummy,case when dummy='222' then 0 else 1 end from DEMO_MDL_TABLE;
View created.

SQL&gt; select * from DEMO_INT_VIEW;
     DUMMY    SHARING ORIGIN_CON_ID
---------- ---------- -------------
       999          1             3
       111          1             1
</pre>
<pre>
SQL&gt; set autotrace on
SQL&gt; select * from DEMO_INT_VIEW;

     DUMMY    SHARING ORIGIN_CON_ID
---------- ---------- -------------
       111          1             1
       999          1             3

Execution Plan
----------------------------------------------------------
Plan hash value: 3158883863

--------------------------------------------------------------------------------------------
|Id  | Operation               | Name            |Pstart|Pstop |   TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT        |                 |      |      |       |      |            |
|  1 |  PX COORDINATOR         |                 |      |      |       |      |            |
|  2 |   PX SEND QC (RANDOM)   | :TQ10000        |      |      | Q1,00 | P-&gt;S | QC (RAND)  |
|  3 |    PX PARTITION LIST ALL|                 |    1 |    2 | Q1,00 | PCWC |            |
|  4 |     FIXED TABLE FULL    | X$COMVW$e40eb386|      |      | Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------
</pre>
<p>On voit que les données de chaque conteneur est retourné comme une partition.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment fournir un plan d&#8217;exécution pertinent</title>
		<link>https://blog.developpez.com/pachot/comment-fournir-un-plan-dexecution-pertinent/</link>
		<comments>https://blog.developpez.com/pachot/comment-fournir-un-plan-dexecution-pertinent/#comments</comments>
		<pubDate>Thu, 10 Apr 2014 19:34:54 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1197</guid>
		<description><![CDATA[La version détaillée est en anglais sur mon blog à dbi services. Ici un résumé, laissez un commentaire pour plus de détail en français est nécessaire. Vous avez une requête qui prend trop de temps et vous voulez de l&#8217;aide &#8230; <a href="https://blog.developpez.com/pachot/comment-fournir-un-plan-dexecution-pertinent/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p>La version détaillée est en anglais sur mon blog à <a href="http://www.dbi-services.com/index.php/blog/entry/best-practice-to-send-an-oracle-execution-plan" title="dbi services">dbi services</a>.<br />
Ici un résumé, laissez un commentaire pour plus de détail en français est nécessaire.</p></blockquote>
<p>Vous avez une requête qui prend trop de temps et vous voulez de l&rsquo;aide pour analyser le plan d&rsquo;exécution ? Alors, vous devez fournir le plan avec toute les infos pertinentes, et correctement formatées. Pas de plan sans la partie prédicat. Pas d&rsquo;estimation de cardinalité sans les valeurs réelles. Pas de copie d&rsquo;écran: soit un plan venant de dbms_xplan.display_cursor, soit, si vous avez Tuning Pack, un plan SQL Monitor.</p>
<h1>Sans Tuning Pack</h1>
<p>Paramétrage de la session:</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">set pagesize 10000 linesize 300 trimspool on serveroutput off<br />
alter session set statistics_level=all;</div></div>
<p>Puis l&rsquo;exécution de la requête, en se mettant dans le bon schema et en assignant des valeurs aux bind variables:</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">-- set the schema<br />
alter session set current_schema=SCOTT;<br />
-- define variables<br />
variable minimum_salary number<br />
-- bind values<br />
exec :minimum_salary := 3000<br />
-- execute the query<br />
SELECT * FROM DEPT JOIN EMP USING(DEPTNO) WHERE SAL&amp;gt;:minimum_salary;</div></div>
<p>Et enfin, la sortie du plan en ficher texte:</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">spool plan.txt<br />
select * from table(dbms_xplan.display_cursor(format=&amp;gt;'allstats last +outline +peeked_binds'));<br />
spool off</div></div>
<h1>Avec Tuning Pack</h1>
<p>Paramétrage de la session:</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">set pagesize 0 linesize 10000 trimspool on serveroutput off long 1000000000 longc 1000000000 echo off feedback off</div></div>
<p>Puis l&rsquo;exécution de la requête, avec le hint MONITOR:</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">-- set the schema<br />
alter session set current_schema=SCOTT;<br />
-- define variables<br />
variable minimum_salary number<br />
-- bind values<br />
exec :minimum_salary := 3000<br />
-- execute the query<br />
SELECT /*+ monitor */ * FROM DEPT JOIN EMP USING(DEPTNO) WHERE SAL&amp;gt;:minimum_salary;</div></div>
<p>Et enfin, la sortie du plan en ficher html:</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">spool plan.htm<br />
select dbms_sqltune.report_sql_monitor(report_level=&amp;gt;'all',type=&amp;gt;'active') from dual;<br />
spool off</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;event 10704 pour tracer les verrous</title>
		<link>https://blog.developpez.com/pachot/event-10704/</link>
		<comments>https://blog.developpez.com/pachot/event-10704/#comments</comments>
		<pubDate>Sat, 15 Mar 2014 17:44:47 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1192</guid>
		<description><![CDATA[La version détaillée est en anglais sur mon blog à dbi services. Ici un résumé, laissez un commentaire ici pour plus de détail en français. On peut voir les verrous posés avec V$LOCK mais certaines verrous ne durent pas longtemps. &#8230; <a href="https://blog.developpez.com/pachot/event-10704/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p>La version détaillée est en anglais sur mon blog à <a href="http://www.dbi-services.com/index.php/blog/entry/investigating-oracle-lock-issues-with-event-10704" title="dbi services">dbi services</a>.<br />
Ici un résumé, laissez un commentaire ici pour plus de détail en français.</p></blockquote>
<p>On peut voir les verrous posés avec V$LOCK mais certaines verrous ne durent pas longtemps.<br />
Si on veut connaitre exactement les verrous posés par une commande SQL (pour vérifier si une opération est réellement online par exemple) on peut utiliser l&rsquo;event 10704.</p>
<p>On l&rsquo;active avec:</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 events='10704 trace name context forever, level 3';<br />
Session altered.</div></div>
<p>et le désactive avec</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 events='10704 trace name context off';<br />
Session altered.</div></div>
<p>Sur le dump généré, je récupère les lignes qui m&rsquo;intéressent avec un grep -E sur:</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">ksqgtl [*]{3}|ksqrcl: [A-Z]|ksqcnv: [A-Z]</div></div>
<p>Il faut aussi avoir les object_id en hexadécimal:</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">select object_id , to_char(object_id,'0XXXXXXX') , object_name,object_type from all_objects</div></div>
<p>Exemples:</p>
<p>On a l&rsquo;acquisition d&rsquo;un verrou (ici en mode 4 qui est Share):</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">ksqgtl *** TM-00017EA8-00000000-00000000-00000000 mode=4</div></div>
<p>La conversion du verrou vers un autre mode:</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">ksqcnv: TM-00017EA8-00000000-00000000-00000000 mode=3</div></div>
<p>La libération du verrou:</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">ksqrcl: TM-00017EA8-00000000-00000000-00000000</div></div>
<p>C&rsquo;est avec cet évent que j&rsquo;étudie le comportement des verrous de version en version, par exemple <a href="https://googledrive.com/host/0Bxhrc9V4eGzdd3liTDMwdmFmM2s/lock_dml_behaviour.html">ici</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Générer une clé avec une sequence &#8211; sans contention</title>
		<link>https://blog.developpez.com/pachot/12c_partitioned_sequence/</link>
		<comments>https://blog.developpez.com/pachot/12c_partitioned_sequence/#comments</comments>
		<pubDate>Sun, 23 Feb 2014 09:20:58 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1187</guid>
		<description><![CDATA[La version détaillée est en anglais sur mon blog à dbi services. Ici un résumé, laissez un commentaire ici pour plus de détail en français. Lorsqu&#8217;on génère une clé primaire à partir d&#8217;une sequence, le problème est que toutes les &#8230; <a href="https://blog.developpez.com/pachot/12c_partitioned_sequence/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p>La version détaillée est en anglais sur mon blog à <a href="http://www.dbi-services.com/index.php/blog/entry/oracle-partitioned-sequences-a-future-new-feature-in-12c" title="dbi services">dbi services</a>.<br />
Ici un résumé, laissez un commentaire ici pour plus de détail en français.</p></blockquote>
<p>Lorsqu&rsquo;on génère une clé primaire à partir d&rsquo;une sequence, le problème est que toutes les insertions concurrentes vont toucher au même bloc d&rsquo;index. Puisque les valeurs venant de la sequence s&rsquo;incrémentent elles vont toutes à la fin de l&rsquo;index.</p>
<p>Il est souvent conseillé d&rsquo;utiliser un index REVERSE pour disperser ces valeurs. Mais ce n&rsquo;est pas bon non plus car elles seront trop dispersées. Les inserts vont toucher à tous les blocs de l&rsquo;index et dès qu&rsquo;il y aura un peu de volume ça ne logera plus en buffer cache.</p>
<p>L&rsquo;autre conseil est alors de partitioner l&rsquo;index par HASH. Effectivement, on distribue les inserts sur quelques blocs. Mais en RAC on va voir passer ces blocs d&rsquo;un noeud à l&rsquo;autre, et on aura à nouveau des contentions.</p>
<p>Ce qu&rsquo;il faut, c&rsquo;est distribuer les inserts non pas en fonction des valeurs générées, mais en fonction de la session. Le but est qu&rsquo;une session touche au même bloc d&rsquo;index pour ses inserts, mais qu&rsquo;une autre session touche à un autre bloc, surtout si elle est sur un autre noeud du RAC. La solution est donc de préfixer le numéro qui vient de la sequence avec un ora_hash() ou un mod() du session_id. Et mettre devant le numéro d&rsquo;instance si on est en RAC.<br />
La clé sera un peu plus longue, mais c&rsquo;est toujours mieux qu&rsquo;un reverse index qui va faire grossir tout l&rsquo;index. Les numéros ne seront plus consécutifs, mais de toute façon ça n&rsquo;a jamais été le cas. Une sequence sert à fournir un nombre unique pour une clé générée, pas è numéroter dans l&rsquo;ordre.</p>
<p>En 12c il y a une option de la sequence qui permet de faire le préfixage automatiquement en donnant simplement le nombre de partition. Mais ce n&rsquo;est pas documenté&#8230; donc à ne pas utiliser. J&rsquo;espère le voir sur une prochaine version.</p>
<p>La demo est <a href="https://dl.dropboxusercontent.com/u/2326391/pachot.net/ora-demo/12c_partitioned_sequence.html" title="demo">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>N&#8217;oubliez-pas hanganalyze et systemstate</title>
		<link>https://blog.developpez.com/pachot/dbi-hanganalyze/</link>
		<comments>https://blog.developpez.com/pachot/dbi-hanganalyze/#comments</comments>
		<pubDate>Sat, 08 Feb 2014 20:13:26 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1170</guid>
		<description><![CDATA[La version détaillée est en anglais sur mon blog à dbi services. Ici un résumé, laissez un commentaire ici pour plus de détail en français. Il arrive parfois que l&#8217;instance soit bloquée et qu&#8217;il faille faire un shutdown abort puis &#8230; <a href="https://blog.developpez.com/pachot/dbi-hanganalyze/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p>La version détaillée est en anglais sur mon blog à <a href="http://www.dbi-services.com/index.php/blog/entry/oracle-is-hanging-dont-forget-hanganalyze-and-systemstate" title="dbi services">dbi services</a>.<br />
Ici un résumé, laissez un commentaire ici pour plus de détail en français.</p></blockquote>
<p>Il arrive parfois que l&rsquo;instance soit bloquée et qu&rsquo;il faille faire un shutdown abort puis redémarrer.<br />
Mais si on ne fait rien, on ne pourra pas analyser la root cause du problème.</p>
<p>Pour avoir les infos sur la situation de blocage (hanganalyze) et les infos complètes du système à ce moment là (systemstate), afin de pouvoir analyser et/ou ouvrir un SR, il faut penser à générer les dumps correspondants:</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">sqlplus / as sysdba<br />
&nbsp;oradebug setmypid<br />
&nbsp;oradebug unlimit<br />
&nbsp;oradebug hanganalyze 3<br />
&nbsp;oradebug dump ashdumpseconds 30<br />
&nbsp;oradebug systemstate 266<br />
&nbsp;oradebug tracefile_name</div></div>
<p>Si la situation est telle qu&rsquo;on n&rsquo;arrive même pas à se connecter sysdba, il est possible d&rsquo;essayer la connection -prelim et de s&rsquo;attacher à une session existante (le process DIAG par exemple):</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">sqlplus -prelim / as sysdba<br />
&nbsp;oradebug setorapname diag<br />
&nbsp;oradebug unlimit<br />
&nbsp;oradebug hanganalyze 3<br />
&nbsp;oradebug dump ashdumpseconds 30<br />
&nbsp;oradebug systemstate 266<br />
&nbsp;oradebug tracefile_name</div></div>
<p>Si par contre on peut se connecter et faire des requêtes, la vue V$WAIT_CHAINS donne les infos sur les sessions bloquées.<br />
Un exemple où une session a posé plusieurs verrous puis attend sur un dbms_lock.sleep (&lsquo;PL/SQL lock timer&rsquo;), bloquant des session qui attendent de poser leur verrou (enq: TM – contention)</p>
<table>
<tr>
<th>CHAIN_ID
  </th>
<th>CHAIN
  </th>
<th>CHAIN_SIGNATURE
  </th>
<th>INSTANCE
  </th>
<th>OSID
  </th>
<th>PID
  </th>
<th>SID
  </th>
<th>BLOCK
 </th>
</tr>
<tr>
<td>1</td>
<td>FALSE</td>
<td>&lsquo;PL/SQL lock timer&rsquo; &lt;=&#039;enq: TM<br />
  &#8211; contention&#039; &lt;=&#039;enq: TM &#8211; contention&#039;</td>
<td>1</td>
<td>7929</td>
<td>42</td>
<td>23</td>
<td>TRUE</td>
</tr>
<tr>
<td>1</td>
<td>FALSE</td>
<td>&lsquo;PL/SQL lock timer&rsquo; &lt;=&#039;enq: TM<br />
  &#8211; contention&#039; &lt;=&#039;enq: TM &#8211; contention&#039;</td>
<td>1</td>
<td>7927</td>
<td>41</td>
<td>254</td>
<td>TRUE</td>
</tr>
<tr>
<td>1</td>
<td>FALSE</td>
<td>&lsquo;PL/SQL lock timer&rsquo; &lt;=&#039;enq: TM<br />
  &#8211; contention&#039; &lt;=&#039;enq: TM &#8211; contention&#039;</td>
<td>1</td>
<td>7925</td>
<td>39</td>
<td>256</td>
<td>FALSE</td>
</tr>
<tr>
<td>2</td>
<td>FALSE</td>
<td>&lsquo;PL/SQL lock timer&rsquo; &lt;=&#039;enq: TM<br />
  &#8211; contention&#039; &lt;=&#039;enq: TM &#8211; contention&#039;</td>
<td>1</td>
<td>7933</td>
<td>46</td>
<td>25</td>
<td>TRUE</td>
</tr>
<tr>
<td>3</td>
<td>FALSE</td>
<td>&lsquo;PL/SQL lock timer&rsquo; &lt;=&#039;enq: TM<br />
  &#8211; contention&#039; &lt;=&#039;enq: TM &#8211; contention&#039;</td>
<td>1</td>
<td>7931</td>
<td>45</td>
<td>260</td>
<td>TRUE</td>
</tr>
<tr>
<td>4</td>
<td>FALSE</td>
<td>&lsquo;PL/SQL lock timer&rsquo; &lt;=&#039;enq: TM<br />
  &#8211; contention&#039; &lt;=&#039;enq: TM &#8211; contention&#039;</td>
<td>1</td>
<td>7935</td>
<td>47</td>
<td>262</td>
<td>TRUE</td>
</tr>
</table>
<p>On voit toute la chaîne des session bloquées, avec la racine. Et même lorsque qu&rsquo;il ne s&rsquo;agit pas d&rsquo;une session utilisateur active.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quels archived logs sont supprimables dans FRA ?</title>
		<link>https://blog.developpez.com/pachot/v_recovery_area_usage/</link>
		<comments>https://blog.developpez.com/pachot/v_recovery_area_usage/#comments</comments>
		<pubDate>Tue, 28 Jan 2014 19:18:13 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[archived logs]]></category>
		<category><![CDATA[FRA]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1157</guid>
		<description><![CDATA[English version on dbi services blog Avez-vous déjà vérifié si la FRA gère bien votre DELETION POLICY ? C&#8217;est important de ne pas supprimer de archived logs nécessaire même si on a besoin de place. Et c&#8217;est important aussi de &#8230; <a href="https://blog.developpez.com/pachot/v_recovery_area_usage/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p>English version on <a href="http://www.dbi-services.com/index.php/blog/entry/archivelog-deletion-policy-for-standby-database-in-oracle-data-guard" title="dbi services">dbi services</a> blog</p></blockquote>
<p>Avez-vous déjà vérifié si la FRA gère bien votre DELETION POLICY ? C&rsquo;est important de ne pas supprimer de archived logs nécessaire même si on a besoin de place. Et c&rsquo;est important aussi de ne pas se retrouver avec une FRA pleine. La vue v$recovery_area_usage montre le pourcentage de l&rsquo;espace qui est récupérable, mais aucune vue ne donne la liste, ou au moins les dates des archivelogs correspondant.</p>
<p>J&rsquo;ai eu besoin d&rsquo;aller dans le détail pour analyser pourquoi les archived logs de la standby n&rsquo;étaient pas supprimés. C&rsquo;est un bug en 11.2 qui fait que même avec CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY une standby en MOUNT ne rafraîchit pas le flag des archived logs récupérables.<br />
Tout le détail est <a href="http://www.dbi-services.com/index.php/blog/entry/archivelog-deletion-policy-for-standby-database-in-oracle-data-guard" title="blog dbi services">ici</a>.</p>
<p>Voici la requête (issue de la définition interne de la vue v$recovery_area_usage ) qui permet de voir lesquels sont récupérables en fonction du nombre de backups et du fait qu&rsquo;ils ont été appliqués sur les standby:</p>
<pre>column deleted format a7 
column reclaimable format a11 
set linesize 120 
select applied,deleted,backup_count 
 ,decode(rectype,11,'YES','NO') reclaimable,count(*) 
 ,to_char(min(completion_time),'dd-mon hh24:mi') first_time 
 ,to_char(max(completion_time),'dd-mon hh24:mi') last_time 
 ,min(sequence#) first_seq,max(sequence#) last_seq 
from v$archived_log left outer join sys.x$kccagf using(recid) 
where is_recovery_dest_file='YES' 
group by applied,deleted,backup_count,decode(rectype,11,'YES','NO') order by min(sequence#) 
/</pre>
<p>Un exemple du résultat sur la Primaire, en CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO DISK:</p>
<pre>APPLIED   DELETED BACKUP_COUNT RECLAIMABLE COUNT(*) FIRST_TIME   LAST_TIME    FIRST_SEQ LAST_SEQ 
--------- ------- ------------ ----------- -------- ------------ ------------ --------- -------- 
NO        YES                1 NO               277 15-jan 17:56 19-jan 09:49      5936     6212 
NO        NO                 1 YES              339 19-jan 10:09 22-jan 21:07      6213     6516 
NO        NO                 0 NO                33 22-jan 21:27 23-jan 07:57      6517     6549</pre>
<p>Les redo logs archivés avant le 19-jan 09:49 ont été supprimés. Ceux qui ont été backupés sont toujours là mais supprimables. Les autres doivent rester jusqu&rsquo;à leur backup.</p>
<p>Et un exemple sur la Standby en CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY:</p>
<pre>APPLIED   DELETED BACKUP_COUNT RECLAIMABLE COUNT(*) FIRST_TIME   LAST_TIME    FIRST_SEQ LAST_SEQ 
--------- ------- ------------ ----------- -------- ------------ ------------ --------- -------- 
YES       YES                0 NO               746 07-jan 13:27 17-jan 11:17      5320     6065 
YES       NO                 0 YES              477 17-jan 11:37 23-jan 05:37      6066     6542 
YES       NO                 0 NO                 8 23-jan 05:57 23-jan 08:14      6543     6550 
IN-MEMORY NO                 0 NO                 1 23-jan 08:15 23-jan 08:15      6551     6551</pre>
<p>Normalement, seul le redo en cours d&rsquo;application (je suis en SYNC) ne serait pas récupérable. A cause d&rsquo;un bug le flag &lsquo;récupérable&rsquo; n&rsquo;a pas été mis à jour depuis le 23-jan 05:57, date où le job de backup refait un CONFIGURE ARCHIVELOG DELETION POLICY qui rafraîchit ce flag.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recovery cases: un bloc corrompu</title>
		<link>https://blog.developpez.com/pachot/recovery-cases-un-bloc-corrompu/</link>
		<comments>https://blog.developpez.com/pachot/recovery-cases-un-bloc-corrompu/#comments</comments>
		<pubDate>Sun, 24 Nov 2013 22:00:11 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Recovery Cases]]></category>
		<category><![CDATA[bloc corrompu]]></category>
		<category><![CDATA[RMAN]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=1049</guid>
		<description><![CDATA[Recovery en cas de bloc corrompu. Au lieu de restaurer tout un datafile, on peut ne restaurer que les blocs corrompus. S&#8217;il y en a peu, c&#8217;est plus rapide et évite de mettre le datafile offline. Ici un exemple sur &#8230; <a href="https://blog.developpez.com/pachot/recovery-cases-un-bloc-corrompu/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Recovery en cas de bloc corrompu. Au lieu de restaurer tout un datafile, on peut ne restaurer que les blocs corrompus. S&rsquo;il y en a peu, c&rsquo;est plus rapide et évite de mettre le datafile offline.<br />
<span id="more-1049"></span><br />
Ici un exemple sur une base de demo créée <a href="http://blog.developpez.com/pachot/cas-de-recovery-en-12c/" title="Cas de recovery en 12c">ici</a>.</p>
<p>Voici les blocs qui stokent les données de OE.ORDERS:</p>
<pre>
RMAN&gt; select file_id,block_id,blocks from dba_extents where owner='OE' and segment_name='ORDERS';
using target database control file instead of recovery catalog
   FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         2        968          8
</pre>
<p>8 blocs alloués à partir du bloc 968. Je vais corrompre le bloc 971 en lui mettant des données aléatoires avec la commande dd, et je vérivie avec dbv:</p>
<pre>
+ dd if=/dev/urandom count=1 bs=8k seek=971 of=/u/DEMO/DATA/DEMO100/example01.dbf conv=notrunc
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 0.00157981 s, 5.2 MB/s

+ dbv /u/DEMO/DATA/DEMO100/example01.dbf
DBVERIFY - Verification starting : FILE = /u/DEMO/DATA/DEMO100/example01.dbf
Page 971 is marked corrupt
Corrupt block relative dba: 0x028003cb (file 10, block 971)
Bad header found during dbv:
Data in bad block:
 type: 90 format: 3 rdba: 0xfd75bf2c
 last change scn: 0xd97e.9447efe5 seq: 0xc7 flg: 0x96
 spare1: 0x80 spare2: 0x4f spare3: 0x225f
 consistency value in tail: 0x767ce7f0
 check value in block header: 0xe831
 computed block checksum: 0x9a28
</pre>
<p>Le bloc est bien corrompu, d’où l’erreur suivante lors d&rsquo;un select:</p>
<pre>
RMAN&gt; alter system flush buffer_cache;
using target database control file instead of recovery catalog
Statement processed
RMAN&gt; select /*+ FULL(ORDERS) */ count(*) from OE.ORDERS;
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of sql statement command at 11/17/2013 20:16:06
ORA-01578: ORACLE data block corrupted (file # 2, block # 971)
ORA-01110: data file 2: '/u/DEMO/DATA/DEMO100/example01.dbf'
</pre>
<p>On va d&rsquo;abord tester Recovery Advisor:</p>
<h4>RMAN&gt; list failure;</h4>
<pre>
RMAN&gt; list failure;
using target database control file instead of recovery catalog
Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
8098       HIGH     OPEN      17-NOV-13     Datafile 2: '/u/DEMO/DATA/DEMO100/example01.dbf' contains one or more corrupt blocks
</pre>
<h4>RMAN&gt; advise failure;</h4>
<pre>
RMAN&gt; advise failure;
Database Role: PRIMARY

List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
8098       HIGH     OPEN      17-NOV-13     Datafile 2: '/u/DEMO/DATA/DEMO100/example01.dbf' contains one or more corrupt blocks

analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=378 device type=DISK
analyzing automatic repair options complete

Mandatory Manual Actions
========================
no manual actions available

Optional Manual Actions
=======================
no manual actions available

Automated Repair Options
========================
Option Repair Description
------ ------------------
1      Perform block media recovery of block 971 in file 2  
  Strategy: The repair includes complete media recovery with no data loss
  Repair script: /u/DEMO/diag/rdbms/demo100/DEMO100/hm/reco_3695178258.hm
</pre>
<p>mais Recovery Advisor ne propose que le restore/recover du datafile entier.</p>
<p>Je vérifie d&rsquo;abord qu&rsquo;il n&rsquo;y a pas d&rsquo;autres blocs corrompus:</p>
<h4>RMAN&gt; validate datafile 2;</h4>
<pre>
RMAN&gt; validate datafile 2;
Starting validate at 17-NOV-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00002 name=/u/DEMO/DATA/DEMO100/example01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
2    FAILED 0              31954        45841           1913733   
  File Name: /u/DEMO/DATA/DEMO100/example01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              4534            
  Index      0              1219            
  Other      1              8133            

validate found one or more corrupt blocks
See trace file /u/DEMO/diag/rdbms/demo100/DEMO100/trace/DEMO100_ora_14863.trc for details
Finished validate at 17-NOV-13
</pre>
<h4>RMAN&gt; select * from v$database_block_corruption;</h4>
<pre>
RMAN&gt; select * from v$database_block_corruption;
     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO     CON_ID
---------- ---------- ---------- ------------------ --------- ----------
         2        971          1                  0 CORRUPT            0
</pre>
<p>Un seul bloc, donc je préfère faire un BLOCKRECOVER:</p>
<h4>RMAN&gt; blockrecover datafile 2 block 971;</h4>
<pre>
RMAN&gt; blockrecover datafile 2 block 971;
Starting recover at 17-NOV-13
using channel ORA_DISK_1

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00002
channel ORA_DISK_1: reading from backup piece /u/DEMO/backup/12op4mt1_1_1
channel ORA_DISK_1: piece handle=/u/DEMO/backup/12op4mt1_1_1 tag=TAG20131116T205457
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:15

starting media recovery

archived log for thread 1 with sequence 2 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_2_98hmq0s6_.arc
archived log for thread 1 with sequence 1 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_1_98hmwbsf_.arc
archived log for thread 1 with sequence 2 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_2_98hp41w7_.arc
archived log for thread 1 with sequence 3 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_3_98hpgdt4_.arc
archived log for thread 1 with sequence 4 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_4_98hpgd5z_.arc
archived log for thread 1 with sequence 5 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_5_98hpgdh8_.arc
archived log for thread 1 with sequence 1 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_1_98hr6zvl_.arc
archived log for thread 1 with sequence 2 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_2_98hr701w_.arc
archived log for thread 1 with sequence 3 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_3_98hr70cc_.arc
archived log for thread 1 with sequence 1 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_1_98hrcjy5_.arc
archived log for thread 1 with sequence 2 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_2_98hrck57_.arc
archived log for thread 1 with sequence 3 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_3_98hrckdn_.arc
archived log for thread 1 with sequence 1 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_16/o1_mf_1_1_98hrcrp5_.arc
archived log for thread 1 with sequence 2 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_17/o1_mf_1_2_98kwmzy5_.arc
archived log for thread 1 with sequence 3 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_17/o1_mf_1_3_98l3gos8_.arc
archived log for thread 1 with sequence 4 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_17/o1_mf_1_4_98l3xxyc_.arc
archived log for thread 1 with sequence 5 is already on disk as file /u/DEMO/FRA/DEMO100/archivelog/2013_11_17/o1_mf_1_5_98l5hjrn_.arc
media recovery complete, elapsed time: 00:00:15
Finished recover at 17-NOV-13
</pre>
<p>C&rsquo;est fait, on vérifie le datafile:</p>
<h4>RMAN&gt; validate datafile 2;</h4>
<pre>
RMAN&gt; validate datafile 2;
Starting validate at 17-NOV-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00002 name=/u/DEMO/DATA/DEMO100/example01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
2    OK     0              31954        45841           1913733   
  File Name: /u/DEMO/DATA/DEMO100/example01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              4535            
  Index      0              1219            
  Other      0              8132            

Finished validate at 17-NOV-13


</pre>
<p>Plus de corruption. On peut relancer la requête:
<pre>
</pre>
<h4>RMAN&gt; select /*+ FULL(ORDERS) */ count(*) from OE.ORDERS;</h4>
<pre>
RMAN&gt; select /*+ FULL(ORDERS) */ count(*) from OE.ORDERS;
  COUNT(*)
----------
       105
</pre>
<p><strong>La base est restée ouverte, le datafile est resté online.</strong><br />
C&rsquo;est le dépannage le plus rapide, malheureusement il n&rsquo;est pas proposé par Recovery Advisor.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
