How To : Installation / déploiement d’un agent OEM 12c en SILENT MODE sur LINUX

Il peut arriver certaines fois qu’il soit nécessaire d’installer un agent OEM (Enterprise Manager) en mode silencieux, c’est à dire en ne passant pas par l’interface web du grid control, mais en le déployant depuis le serveur où il doit être installé.

Voyons cependant brièvement comment déployer un agent 12c depuis le Grid Control OEM, afin de permettre de comparer les deux méthodes.

Tout d’abord, le serveur, sur lequel l’agent sera déployé, doit respecter un certain nombre de prérequis.

Sur Linux, il faut en effet veiller à paramétrer correctement les autorisations de type sudo, compléter le fichier host (également sur le serveur OMS d’ailleurs) et disposer d’un emplacement dédié sur lequel l’agent pourra être déployé (un Filesystem de préférence)

Cf DOC pour davantage d’informations sur ces prérequis.

Attention : il est conseillé d’utiliser le FQDN (Fully Qualified Domain Name) des serveurs plutôt que le nom court.

Dans mon contexte, tous mes prérequis sont respectés, je passe directement sur la méthode pour déployer l’agent.

Sur la page d’accueil du grid control, aller sur

-> SETUP en haut à droite

-> cliquer sur ADD TARGET

-> cliquer ADD TARGETS MANUALY.

1

Note : Le mode « auto discovery result » ne peut être utilisé qu’une fois que l’agent ait été déployé, pour faciliter l’ajout des « targets » secondaires (bases / listener et autres)

=> Laisser le mode « Add Hosts Targets » de sélectionné, puis cliquer sur ADD HOST.

2

Cliquer ensuite sur ADD et indiquer les informations du serveur client (dans mon cas SRVCLNT.mydomain.com) puis cliquer sur NEXT.

3

4

Renseigner les informations liées au déploiement de l’agent : emplacement , port d’écoute et les CREDENTIALS pour que l’OMS puisse s’y connecter. Cliquer ensuite sur NEXT.

5

Une page de récapitulatif et de confirmation apparaît. Une fois les informations contrôlées, cliquer sur DEPLOY pour lancer la procédure de déploiement.

67

Il reste maintenant à patienter que le déploiement soit terminé

Passons maintenant à la seconde méthode, plus technique quant à elle, pour déployer l’agent en mode silencieux.

La première chose à faire est de se connecter à notre serveur OMS avec le user système qui gère l’OMS (dans mon cas le user est « oracle »), et de lancer l’utilitaire de gestion EMCLI, alternative non graphique à l’interface web du grid control.

Note : il faut disposer du password du compte SYSMAN.

[root@SRVOMS1.mydomain.com ~]# su - oracle
[oracle@SRVOMS1.mydomain.com ~]$ cat .envoms
export ORACLE_HOME=/oracle/oms/em/oms
export PATH=$ORACLE_HOME/bin:$PATH
set -o vi

[oracle@SRVOMS1.mydomain.com ~]$ . .envoms
[oracle@SRVOMS1.mydomain.com ~]$
[oracle@SRVOMS1.mydomain.com ~]$ emcli login -username=sysman
Enter password :

Login successful
[oracle@SRVOMS1.mydomain.com ~]$ emcli sync
Synchronized successfully

Il faut ensuite interroger la liste des agents que peut gérer l’OMS, à savoir que s’il manque un agent il peut être installé via les méthodes conventionnelles (via « self update » du grid control) .

[oracle@SRVOMS1.mydomain.com ~]$ emcli get_supported_platforms
-----------------------------------------------
Version = 12.1.0.5.0
Platform = Microsoft Windows x64 (64-bit)
-----------------------------------------------
Version = 12.1.0.5.0
Platform = Linux x86-64
-----------------------------------------------
Platforms list displayed successfully.

Dans mon cas, je souhaite déployer un agent Linux 64Bit, je vais donc faire générer un ZIP de l’agent Linux via la commande ci dessous :

[oracle@SRVOMS1.mydomain.com ~]$ emcli get_agentimage -destination=/oracle/soft_library/agent -platform="Linux x86-64" -version="12.1.0.5.0"
=== Partition Detail ===
Space free : 8 GB
Space required : 1 GB
Check the logs at /home/oracle/.emcli/get_agentimage_2017-01-17_15-41-51-PM.log
Downloading /oracle/soft_library/agent/12.1.0.5.0_AgentCore_226.zip
File saved as /oracle/soft_library/agent/12.1.0.5.0_AgentCore_226.zip
Downloading /oracle/soft_library/agent/12.1.0.5.0_PluginsOneoffs_226.zip
File saved as /oracle/soft_library/agent/12.1.0.5.0_PluginsOneoffs_226.zip
Downloading /oracle/soft_library/agent/unzip
File saved as /oracle/soft_library/agent/unzip
Agent Image Download completed successfully.

Ce ZIP peut maintenant être copié directement sur le serveur cible, où l’agent doit y être installé :

[oracle@SRVOMS1.mydomain.com agent]$ ls -ltr
total 251080
-rw-r--r-- 1 oracle dba 257102519 17 janv. 15:43 12.1.0.5.0_AgentCore_226.zip
[oracle@SRVOMS1.mydomain.com agent]$ scp 12.1.0.5.0_AgentCore_226.zip SRVCLNT.mydomain.com:/home/oracle/.
The authenticity of host 'SRVCLNT.mydomain.com (192.168.1.10)' can't be established.
RSA key fingerprint is dc:88:a3:b0:09:38:71:0a:04:78:22:e7:ce:81:c4:5d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'SRVCLNT.mydomain.com,192.168.1.10' (RSA) to the list of known hosts.
oracle@SRVCLNT.mydomain.com's password:
12.1.0.5.0_AgentCore_226.zip 100% 245MB 4.6MB/s 00:53

On se connecte maintenant sur le serveur cible (« SRVCLNT.mydomain.com« ) pour passer à l’étape de configuration de l’installation, en décompressant tout d’abord l’archive qui a été envoyée précédemment.

[SRVCLNT.mydomain.com]<oracle>:cd /home/oracle
[SRVCLNT.mydomain.com]<oracle>:unzip 12.1.0.5.0_AgentCore_226.zip
Archive: 12.1.0.5.0_AgentCore_226.zip
inflating: unzip
inflating: agentDeploy.sh
inflating: agentimage.properties
inflating: agent.rsp
extracting: agentcoreimage.zip
extracting: 12.1.0.5.0_PluginsOneoffs_226.zip

Il faut ensuite configurer le fichier de « réponse » AGENT.RSP en fonction du contexte technique (Nom du serveur OMS, port et autres informations)

La partie à modifier étant :

#OMS_HOST=<Value Unspecified>
#EM_UPLOAD_PORT=<Value Unspecified>
#AGENT_REGISTRATION_PASSWORD=<Value Unspecified>
#AGENT_INSTANCE_HOME=<Value Unspecified>
#AGENT_PORT=<Value Unspecified>
b_startAgent=true
#ORACLE_HOSTNAME=<Value Unspecified>

Qui devient (dans mon cas) :

OMS_HOST=SRVOMS1.mydomain.com
EM_UPLOAD_PORT=4889
AGENT_REGISTRATION_PASSWORD=xxxxxxxxx
AGENT_INSTANCE_HOME=/agent12c/agt
AGENT_PORT=3872
b_startAgent=true
ORACLE_HOSTNAME=SRVCLNT.mydomain.com

Une fois ce fichier complété, il suffit maintenant de lancer l’installation.

Note : Veillez à remplacer le répertoire /home/oracle par votre répertoire où a été dézippé l’agent 

[SRVCLNT.mydomain.com]<oracle>:cd /home/oracle
[SRVCLNT.mydomain.com]<oracle>:./agentDeploy.sh AGENT_BASE_DIR=/agent12c/agt RESPONSE_FILE=/home/oracle/agent.rsp
Validating the OMS_HOST & EM_UPLOAD_PORT
Executing command : /agent12c/agt/core/12.1.0.5.0/jdk/bin/java -classpath /agent12c/agt/core/12.1.0.5.0/jlib/agentInstaller.jar:/agent12c/agt/core/12.1.0.5.0/oui/jlib/OraInstaller.jar oracle.sysman.agent.installer.AgentInstaller /agent12c/agt/core/12.1.0.5.0 /home/oracle /agent12c/agt AGENT_BASE_DIR=/agent12c/agt RESPONSE_FILE=/home/oracle/agent.rsp -prereq

Validation de l'hote et du port OMS avec l'URL : http://SRVOMS1.mydomain.com.localdomain.fr:4889/empbs/genwallet
Validation de l'hote et du port OMS avec l'URL : https://SRVOMS1.mydomain.com.localdomain.fr:4889/empbs/genwallet
Return status:0-oms http port is passed
Unzipping the agentcoreimage.zip to /agent12c/agt ....
12.1.0.5.0_PluginsOneoffs_226.zip
Executing command : /home/oracle/unzip -o /home/oracle/12.1.0.5.0_PluginsOneoffs_226.zip -d /agent12c/agt
Successfully unzipped /home/oracle/12.1.0.5.0_PluginsOneoffs_226.zip to /agent12c/agt !
Executing command : /agent12c/agt/core/12.1.0.5.0/jdk/bin/java -classpath /agent12c/agt/core/12.1.0.5.0/oui/jlib/OraInstaller.jar:/agent12c/agt/core/12.1.0.5.0/oui/jlib/xmlparserv2.jar:/agent12c/agt/core/12.1.0.5.0/oui/jlib/srvm.jar:/agent12c/agt/core/12.1.0.5.0/oui/jlib/emCfg.jar:/agent12c/agt/core/12.1.0.5.0/jlib/agentInstaller.jar:/agent12c/agt/core/12.1.0.5.0/oui/jlib/share.jar oracle.sysman.agent.installer.AgentInstaller /agent12c/agt/core/12.1.0.5.0 /home/oracle /agent12c/agt /agent12c/agt AGENT_BASE_DIR=/agent12c/agt


Exécution des prérequis pour l'installation de l'agent...
Exécution de la commande : /agent12c/agt/core/12.1.0.5.0/oui/bin/runInstaller -debug -ignoreSysPrereqs -prereqchecker -silent -ignoreSysPrereqs -waitForCompletion -prereqlogloc /agent12c/agt/core/12.1.0.5.0/cfgtoollogs/agentDeploy -entryPoint oracle.sysman.top.agent_Complete -detailedExitCodes PREREQ_CONFIG_LOCATION=/agent12c/agt/core/12.1.0.5.0/prereqs -J-DORACLE_HOSTNAME=SRVCLNT.mydomain.com.appclient.asp -J-DAGENT_PORT=3872 -J-DAGENT_BASE_DIR=/agent12c/agt
Les prérequis pour l'installation de l'agent ont été appliqués

Clonage du répertoire d'origine Oracle Home de l'agent...
Exécution de la commande : /agent12c/agt/core/12.1.0.5.0/oui/bin/runInstaller -debug -ignoreSysPrereqs -clone -forceClone -silent -waitForCompletion -nowait ORACLE_HOME=/agent12c/agt/core/12.1.0.5.0 -responseFile /home/oracle/agent.rsp AGENT_BASE_DIR=/agent12c/agt AGENT_BASE_DIR=/agent12c/agt RESPONSE_FILE=/home/oracle/agent.rsp -noconfig ORACLE_HOME_NAME=agent12c2 -force b_noUpgrade=true EMCTLCFG_MODE=NONE
Répertoire de base de l'agent cloné

Attachement du répertoire d'origine Oracle Home sbin...
Exécution de la commande : /agent12c/agt/core/12.1.0.5.0/oui/bin/runInstaller -debug -ignoreSysPrereqs -attachHome -waitForCompletion -nowait ORACLE_HOME=/agent12c/agt/sbin ORACLE_HOME_NAME=sbin12c2 -force
...
...

Une fois le déploiement réalisé, il reste une dernière action pour terminer l’installation, à savoir exécuter le ROOT.SH, depuis le compte ROOT du serveur :

[SRVCLNT.mydomain.com]<oracle>:sudo -i
[SRVCLNT.mydomain.com]<root>:/agent12c/agt/core/12.1.0.5.0/root.sh

Un dernier petit contrôle :

[SRVCLNT.mydomain.com]<oracle>:/agent12c/agt/core/12.1.0.5.0/bin/emctl status agent

Oracle Enterprise Manager Cloud Control 12c Release 5
Copyright (c) 1996, 2015 Oracle Corporation. All rights reserved.
---------------------------------------------------------------
Agent Version : 12.1.0.5.0
OMS Version : 12.1.0.5.0
Protocol Version : 12.1.0.1.0
Agent Home : /agent12c/agt
Agent Log Directory : /agent12c/agt/sysman/log
Agent Binaries : /agent12c/agt/core/12.1.0.5.0
Agent Process ID : 38659
Parent Process ID : 38597
Agent URL : https://SRVCLNT.mydomain.com:3872/emd/main/
Local Agent URL in NAT : https://SRVCLNT.mydomain.com:3872/emd/main/
Repository URL : https://SRVOMS1.mydomain.com:4903/empbs/upload
Started at : 2017-01-17 10:51:38
Started by user : oracle
Operating System : Linux version 3.10.0-514.el7.x86_64 (amd64)
Last Reload : (none)
Last successful upload : 2017-01-23 14:23:26
Last attempted upload : 2017-01-23 14:23:26
Total Megabytes of XML files uploaded so far : 6.21
Number of XML files pending upload : 0
Size of XML files pending upload(MB) : 0
Available disk space on upload filesystem : 62.75%
Collection Status : Collections enabled
Heartbeat Status : Ok
Last attempted heartbeat to OMS : 2017-01-23 14:28:57
Last successful heartbeat to OMS : 2017-01-23 14:28:57
Next scheduled heartbeat to OMS : 2017-01-23 14:29:58

---------------------------------------------------------------
Agent is Running and Ready

[SRVCLNT.mydomain.com]<oracle>:/agent12c/agt/core/12.1.0.5.0/bin/emctl upload agent
Oracle Enterprise Manager Cloud Control 12c Release 5
Copyright (c) 1996, 2015 Oracle Corporation. All rights reserved.
---------------------------------------------------------------
EMD upload completed successfully

[SRVCLNT.mydomain.com]<oracle>:/agent12c/agt/core/12.1.0.5.0/bin/emctl config agent listtargets
Oracle Enterprise Manager Cloud Control 12c Release 5
Copyright (c) 1996, 2015 Oracle Corporation. All rights reserved.
[SRVCLNT.mydomain.com, host]
[SRVCLNT.mydomain.com:3872, oracle_emd]
[SRVCLNT.mydomain.com:3872_proxy, oracle_emd_proxy]

Et voilà ! notre agent est installé, il est maintenant possible d’y ajouter d’autres cibles comme une base de données, un listener, un RAC etc..

Micka

 

 

How to : Oracle ASM – Ajout d’un disque SAN à un diskgroup sur Windows

Comme premier article de l’année, je me suis lancé dans un petit tuto pour montrer au mieux comment ajouter un nouvel espace de stockage SAN à un diskgroup ASM sur un environnement RAC 11G windows (à partir de 2008). Rien de bien complexe, mais cela reste des opérations courantes qui méritent d’avoir leur petit tuto 😉

Pour ce qui est du contexte technique, j’ai donc un cluster Oracle (sur machine physique) à deux noeuds, en 11.2.0.3 (Grid + RDBMS), sur un windows 2008R2.

L’objectif est d’ajouter un espace de stockage SAN de 250Go à mon diskgroup « DATA » utilisé par ASM, sans provoquer d’incident ou d’indisponibilité.

Attention :

Il faut s’assurer que le zoning soit bien réalisé depuis le SAN sur les 2 noeuds, sans accès EXCLUSIF, si si cela peu arriver …

=> Pour la petite note, l’accès « exclusif » se caractérise par le fait de réaliser des opérations sur un nouveau disque depuis un nœud du RAC, qui ne seraient pas propagées sur le ou les autres nœuds.

Tout d’abord, dès que l’espace SAN a été mappé sur les 2 serveurs, il faut s’assurer de la visibilité du disque depuis l’utilitaire DISKPART.

L’utilisation de cet utilitaire est préconisé par Oracle pour gérer les disques qui seront affectés à ASM, il faut en effet éviter d’utiliser le GUI « diskmgmt.msc » pour éviter des problèmes de FREEZE (que j’ai d’ailleurs rencontré quelques fois), qui feraient que le simple ajout -d’un disque devient une opération complexe pour ne pas dire d’autres mots.

On lance donc DISKPART depuis une commande dos sur l’un des noeuds du RAC, et on affiche l’ensemble des disques identifiés par le System pour ensuite s’occuper du nouvel espace ajouté.

Nota : il se peut que le nouveau disque ne soit pas visible sur les noeuds du cluster. Pas de panique, un RESCAN permet de rafraîchir le gestionnaire de disques Windows

1

Dans cette liste, on visualise 2 disques Offline qui sont à ajouter. Nous allons ajouter le disque 5 de 250Go à notre groupe de disque ASM « DATA ».

-> Toujours à travers DISKPART, on sélectionne le disque et débutons la création de 2 partitions en passant tout d’abord le disque ONLINE (la mise ONLINE du disque doit être réalisé sur l’ensemble des noeuds du RAC).

Note : Pour les stockages windows ASM, il faut avoir un disque ayant une partition ETENDUE puis LOGIQUE (soit à la taille globale du disque, ou non)

2

On créée la partition ETENDUE :

3

Ah … dommage . Le volume est en READ ONLY il est donc impossible de créer quoique ce soit dessus.

L’origine de ce problème est connu de Microsoft (KB), et fait référence à de nouvelles stratégies de groupes windows relatif à la gestion des disques SAN. En 2008 et 2008R2 les stratégies de groupes SAN attribuent le mode READ ONLY à tout nouveaux disques partagés SAN (mode VDS_SP_OFFLINE_SHARED) , alors que dans les versions plus récentes, le mode READ WRITE (VDS_SP_ONLINE) est le mode par défaut.

Les différentes stratégie de groupes SAN :

VDS_SP_ONLINE: All newly discovered disks are brought online and made read-write.
VDS_SP_OFFLINE_SHARED: All newly discovered disks that do not reside on a shared bus are brought online and made read-write.
VDS_SP_OFFLINE: All newly discovered disks remain offline and read-only.

Le contournement proposé est donc de modifier les attributs du disque, pour le forcer à être en READ WRITE via la commande « ATTRIBUTE DISK CLEAR READONLY« 

Qu’à cela ne tienne, passons le disque 5 en READ WRITE , et continuons la création de nos partitions.

5

=> Attention : Ceci est à faire sur l’ensemble des noeuds du cluster RAC.

Pour la création des deux partitions, il faut suivre les commandes ci dessous sauf pour la partition logique, dans le cas où une limite d’espace disque serait à fixer (ce qui n’est pas mon cas)

Création de la partition étendue :

CREATE PARTITITON EXTENDED

Création de la partition logique en utilisant tout l’espace disque de la partition étendue :

CREATE PARTITION LOGICAL 

Ou si une taille doit être spécifiée (exemple pour 10Go, la SIZE étant spécifiée en MB)

CREATE PARTITION LOGICAL SIZE=10000

Ce qui donne dans mon cas :

6

=> Après cette étape il faut s’assurer que les partitions soient BIEN VISIBLES des autres noeuds du cluster. Dans mon cas je vérifie sur mon second node toujours via DiskPart, après avoir fait en revanche un petit RESCAN pour rafraîchir le gestionnaire de disque.

7

Histoire d’être sur (car normalement depuis windows 2008 c’est du par défaut), on lance une commande « AUTOMOUNT ENABLE » pour être sur que le disque sera monté au prochain reboot.

23

Maintenant que cette étape est faite, il faut vérifier un point certes peu impactant mais qui peut être gênant pour oracle,  windows et les applications :

A chaque découverte de nouvelles partitions, Windows attribue AUTOMATIQUEMENT une nouvelle lettre de lecteur. En soi, pour des partitions classiques (primary) ce n’est pas bien grave, mais pour les partitions étendues (que va utiliser ASM) cela peut poser problème.

=> Il faut donc veiller à RETIRER la LETTRE qui a du être automatiquement ajoutée sur le second noeud (en effet, le nœud d’où a été créée la partition n’a quand à lui pas cette lettre d’automatiquement associée)

Après avoir cliqué droit sur la partition, puis sélectionné « Change drive letter and path » :

20

=> on remove !

21

On dit YES bien sur ..

22

Hop, plus de lettre, c’est tout bon, je peux maintenant passer à la partie Oracle, et plus particulièrement ASM, pour agrandir mon DISKGROUP existant avec cette nouvelle partition LOGIQUE précédemment créée.

La première action est, sous windows (et oui car pas besoin sous Unix) est de labelliser cette partition, pour être ensuite CANDIDATE sous ASM.

Pour cela, il faut lancer l’utilitaire ASMTOOL (disponible dans le répertoire d’installation du GRID CONTROL) soit en mode graphique ou en ligne de commande. Etant sous windows je ne vais pas me compliquer la vie, j’utilise la méthode graphique via ASMTOOLG :

8

On continue (NEXT) et on arrive sur la liste des partitions visibles par le system, et celles qui sont candidates à être formatées « ASM » :

9

La partition 1 du Disk5, qui est CANDIDATE, est bien celle qui a été précédemment créée.

Note :

Je garde le même PREFIX pour la labellisation ASM « DATA » puisque je vais procéder à une augmentation du diskgroup de ce même nom. Ceci étant j’aurais pu mettre « DATA2″ ou « TOTO », cela n’aurait pas empêché l’opération d’agrandissement, il s’agit plus de normes et conventions, autant les respecter alors 😉

Je sélectionne donc ma partition 1 du disk5, et lance la « labellisation » du disk en format ASM :

10

1112

 

Je peux enfin passer sous ASM pour agrandir mon diskgroup !

Mais faisons au préalable un petit état des lieux, pour avoir un état avant et après, et également identifier le disque ASM qui sera à ajouter.

13

14

J’ai donc bien d’identifié par ASM mon disque en statut PROVISIONED et non utilisé, qui peut être ajouté au diskgroup DATA, auquel cas je lance ma commande :

15

Tout juste une fois cette commande lancée, nous pouvons interroger les opérations de REBALANCE en cours sur le diskgroup DATA :

16

Tiens mais qu’est ce le REBALANCE au fait ?

->  A chaque ajout de disque (un ou plusieurs) au sein d’un même diskgroup, il y a des opérations de redistribution des données qui sont automatiquement réalisées par ASM, l’objectif étant que les données soient réparties au mieux à travers tous les disques qui composent le diskgroup.

Les opérations de REBALANCE se découpent en 3 phases :

1. Analyse des données à répartir : « PLANNING »
2. Ré-allocation des EXTENTS des fichiers de données : « File extents relocation »
3. Compactage : « Disk compacting »

Par défaut, le niveau de REBALANCE est fixé à 1 via le paramètre ASM_POWER_LIMIT

17

Ce qui signifie que les opérations ne vont pas « trop » solliciter les ressources machines / SAN (CPU / IO) pour ne pas impacter les performances, dans le cas où par exemple cette opération serait lancée en pleine journée.

Mais l’impact de laisser tel quel ce paramètre à sa valeur par défaut peut être majeur, puisque autant sur une base de 100G, répartir les données sur l’ensemble des disques va prendre un temps probablement acceptable, dans lequel peu de risques peuvent survenir, mais autant sur une base de quelques To, cela ne va pas être la même limonade…

Si l’opération met plusieurs heures à se réaliser, les facteurs risquent augmentent (risques de pannes disques, machines, coupure lien SAN, reboot et j’en passe) ce qui peut provoquer un doux bazar au sein des données stockées par ASM.

Il est donc important de vérifier le temps que va mettre ASM à effectuer ses opérations de réorganisation, pour adapter au mieux et éviter ainsi un certain nombres de risques.

La gestion de la REBALANCE est dynamique, nous pouvons augmenter ou diminuer ASM_POWER_LIMIT, via une commande du type « alter diskgroup MYDISK rebalance power 3;« , voyons donc ce que cela donne pour moi :

18

On voit que le temps estimé ne descend pas, c’est plutôt le contraire (et c’est normal car c’est la première phase de « Planning« ). Nous allons donc passer au niveau rebalance 4 :

19

Tout de suite, en montant le niveau de rebalance à 4, on divise par deux le temps nécessaire à la réorganisation des données.

24

Nous avons donc maintenant notre diskgroup DATA pleinement opérationnel avec ces 250 nouveaux Go !

Enjoy !

Micka

 

How To : Modifier le nom du SCAN d’un cluster oracle RAC 11g

L’objectif de cet article est de donner une méthode simple permettant de modifier le nom du SCAN d’un cluster oracle RAC à 2 nodes.

Contexte technique :

– RAC 2 Node
– 3 SCAN_LISTENER
– Scan actuel : clustoriginal.mydomain.fr
– Futur Scan : clustnewscan.mydomain.fr

Le premier réflexe est d’identifier les IPs associées au SCAN, et donc indirectement du DNS qui permet la redirection depuis les serveurs applicatifs.

[NODE1]/home/oracle[]:export ORACLE_SID=/oracle/product/11.2.0/grid ; export PATH=$PATH:$ORACLE_HOME/bin
[NODE1]/home/oracle[]:srvctl config scan
SCAN name: clustoriginal.mydomain.fr, Network: 1/192.168.1.0/255.255.255.0/eth0
SCAN VIP name: scan1, IP: /clustoriginal.mydomain.fr/192.168.1.12
SCAN VIP name: scan2, IP: /clustoriginal.mydomain.fr/192.168.1.11
SCAN VIP name: scan3, IP: /clustoriginal.mydomain.fr/192.168.1.10

[NODE1]/home/oracle[]:nslookup clustoriginal.mydomain.fr
Server: 192.168.50.10
Address: 192.168.50.10#53

Name: clustoriginal.mydomain.fr
Address: 192.168.1.10
Name: clustoriginal.mydomain.fr
Address: 192.168.1.11
Name: clustoriginal.mydomain.fr
Address: 192.168.1.12

On vérifie maintenant que le futur scan (ou plutôt le DNS de ce futur scan) pointe bien vers les mêmes IPs :

[NODE1]/home/oracle[]:nslookup clustnewscan.mydomain.fr
Server: 192.168.50.10
Address: 192.168.50.10#53

Name: clustnewscan.mydomain.fr
Address: 192.168.1.12
Name: clustnewscan.mydomain.fr
Address: 192.168.1.10
Name: clustnewscan.mydomain.fr
Address: 192.168.1.11

Ok, nous pouvons donc réaliser la modification, en débutant tout d’abord par l’arrêt des 3 listener_scan, et ensuite du scan :

[NODE1]/home/oracle[]:srvctl stop scan_listener
[NODE1]/home/oracle[]:srvctl stop scan

[NODE1]/home/oracle[]:srvctl status scan_listener
SCAN Listener LISTENER_SCAN1 is enabled
SCAN listener LISTENER_SCAN1 is not running
SCAN Listener LISTENER_SCAN2 is enabled
SCAN listener LISTENER_SCAN2 is not running
SCAN Listener LISTENER_SCAN3 is enabled
SCAN listener LISTENER_SCAN3 is not running

[NODE1]/home/oracle[]:srvctl status scan
SCAN VIP scan1 is enabled
SCAN VIP scan1 is not running
SCAN VIP scan2 is enabled
SCAN VIP scan2 is not running
SCAN VIP scan3 is enabled
SCAN VIP scan3 is not running

On modifie le scan, mais pour ce faire il faut être en super user (root). En effet cette modification ce fait coté CRS, car elle agit sur des processus server lancé par root (crsd) :

[]/root[]:export ORACLE_HOME=/oracle/product/11.2.0/grid
[]/root[]:$ORACLE_HOME/bin/srvctl modify scan -n clustnewscan.mydomain.fr

Ensuite, on revient sur le compte système du Grid (dans mon exemple « oracle ») pour relancer le scan, et ensuite les scan_listener (on pourrait le faire en root, mais par convenance je reviens sur le compte propriétaire) :

[NODE1]/home/oracle[]:srvctl start scan
[NODE1]/home/oracle[]:srvctl start scan_listener

Quelques vérifications, pour être sur que la modification soit bien effective :

[NODE1]/home/oracle[]:srvctl config scan
SCAN name: clustnewscan.mydomain.fr, Network: 1/192.168.1.0/255.255.255.0/eth0
SCAN VIP name: scan1, IP: /clustnewscan.mydomain.fr/192.168.1.11
SCAN VIP name: scan2, IP: /clustnewscan.mydomain.fr/192.168.1.12
SCAN VIP name: scan3, IP: /clustnewscan.mydomain.fr/192.168.1.10

OK. Comme dernier test, on peut se connecter à distance sur la base via ce nouveau SCAN / DNS, soit en easy connect ou via tnsnames. Dans mon cas je passe par le tnsnames, pour me rapprocher d’un existant en production :

NEW_SCAN_ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = clustnewscan.mydomain.fr)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 20)
(DELAY = 1)
)
)
)

C:\Users\Mickael>tnsping NEW_SCAN_ORCL

TNS Ping Utility for 64-bit Windows: Version 12.1.0.2.0 - Production on 12-SEPT.-2016 10:34:08

Copyright (c) 1997, 2014, Oracle. All rights reserved.

Fichiers de parametres utilises :
C:\Oracle\product\12.1.0\client_1\network\admin\sqlnet.ora

Adaptateur TNSNAMES utilisé pour la rÚsolution de l'alias
Tentative de contact de (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = clustnewscan.mydomain.fr)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES = 20) (DELAY = 1))))
OK (90 msec)

C:\Users\Mickael>sqlplus system@NEW_SCAN_ORCL

SQL*Plus: Release 12.1.0.2.0 Production on Lun. Sept. 12 10:34:26 2016

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Entrez le mot de passe :

ConnectÚ Ó :
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
With the Real Application Clusters and Automatic Storage Management options

SQL> select instance_name,host_name from v$instance;

INSTANCE_NAME HOST_NAME
----------- ------------------
ORCL1 NODE1

OK ! Mais il ne faut pas oublier de configurer le remote_listener de chaque instance Oracle en activité, en passant par la modification du tnsnames.ora sur chaque nodes.

SQL> alter system set remote_listener="clustnewscan:1521" scope=both sid='*';
System altered.

Enfin, ne pas oublier de modifier les outils de monitoring du cluster (s’il y en a) pour tenir compte de cette modification 😉

Cette méthode reste simple, elle peut se compliquer quelque peu si en plus nous sommes dans un cas où les IP des VIPs devraient être modifiées, auquel cas il faudrait jouer avec oifcfg.. Cela fera l’objet d’un futur article !

Micka

Oracle 12c Multitenant Part 2 : Rman Sauvegarde et Restauration PDB

Suite de l’article « Oracle 12C Multitenant Part 1 : export / import 11G sur une PDB 12C » : ici

Nous avons vu précédemment la création d’une pluggable database, et son alimentation via import Datapump. Attaquons nous maintenant à RMAN.

En 12c Enterprise, option Multitenant, Rman permet de sauvegarder 3 éléments distincts : La CDB,les PDBs ou les métadatas.

Dans cet article, nous allons étudier la partie Pluggable database, à mon sens la plus courante dans le monde de la production.

Prenons le cas d’un backup complet de notre CDB qui inclut donc toutes les PDBs :

Petit passage en archivelog avant toutes choses :

SQL> alter system set log_archive_dest='/oradata/CDB/arch' scope=both ;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount ;
ORACLE instance started.

Total System Global Area 1.0503E+10 bytes
Fixed Size 5294664 bytes
Variable Size 5737809336 bytes
Database Buffers 4731174912 bytes
Redo Buffers 28258304 bytes
Database mounted.
SQL>alter database archivelog ;
Database altered.

SQL> alter database open;
Database altered.

SQL>alter pluggable database all open read write ;
Pluggable database altered.

SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /oradata/CDB/arch
Oldest online log sequence 208
Next log sequence to archive 210
Current log sequence 210

SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 MYPDB1 READ WRITE NO

Go pour un petit backup full

RMAN> sql 'alter system switch logfile';

using target database control file instead of recovery catalog
sql statement: alter system switch logfile

RMAN> backup database format '/oratmp/Backup/bkpfull_svg_DB_on%_%t%U.bkp' plus archivelog ;

Starting backup at 18-SEP-15
current log archived
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=423 device type=DISK
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=210 RECID=1 STAMP=890684562
input archived log thread=1 sequence=211 RECID=2 STAMP=890684585
input archived log thread=1 sequence=212 RECID=3 STAMP=890684599
input archived log thread=1 sequence=213 RECID=4 STAMP=890685090
input archived log thread=1 sequence=214 RECID=5 STAMP=890685099
..
..
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oracle/product/12.1.0.2/dbs/0gqhesqa_1_1 tag=TAG20150918T084810 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
Finished backup at 18-SEP-15

Starting backup at 18-SEP-15
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/oradata/CDB/undotbs01.dbf
input datafile file number=00001 name=/oradata/CDB/system01.dbf
input datafile file number=00003 name=/oradata/CDB/sysaux01.dbf
input datafile file number=00006 name=/oradata/CDB/users01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_svg_DB_on%_8907292970hqhesqh_1_1.bkp tag=TAG20150918T084817 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00009 name=/oradata/CDB/MYPDB1/tbs_mrsadmin_01.dbf
input datafile file number=00008 name=/oradata/CDB/MYPDB1/sysaux01.dbf
input datafile file number=00007 name=/oradata/CDB/MYPDB1/system01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_svg_DB_on%_8907293040iqhesqo_1_1.bkp tag=TAG20150918T084817 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00014 name=/oradata/CDB/MYPDB1/sysaux01.dbf
input datafile file number=00015 name=/oradata/CDB/MYPDB1/tbs_MYPDB1_01.dbf
input datafile file number=00013 name=/oradata/CDB/MYPDB1/system01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_svg_DB_on%_8907293070jqhesqr_1_1.bkp tag=TAG20150918T084817 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00004 name=/oradata/CDB/pdbseed/sysaux01.dbf
input datafile file number=00002 name=/oradata/CDB/pdbseed/system01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_svg_DB_on%_8907293100kqhesqu_1_1.bkp tag=TAG20150918T084817 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 18-SEP-15

Starting backup at 18-SEP-15
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=267 RECID=58 STAMP=890729313
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oracle/product/12.1.0.2/dbs/0lqhesr2_1_1 tag=TAG20150918T084833 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 18-SEP-15

Starting Control File and SPFILE Autobackup at 18-SEP-15
piece handle=/oracle/product/12.1.0.2/dbs/c-3858261253-20150918-00 comment=NONE
Finished Control File and SPFILE Autobackup at 18-SEP-15

Ok, nous allons maintenant créer une petite panne « utilisateur » sur la PDB MYPDB1 :

SQL> alter session set container=MYPDB1;
Session altered.

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
5296

SQL> delete from MRS_EXECUTED_BLOCKS;
5296 rows deleted
SQL> commit;
SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
0

Là, nous avons une simple erreur utilisateur… Deux choix s’offrent principalement à nous :

– La restauration complète de la PDB
ou
– La restauration incomplète, ou encore restauration d’une ou plusieurs tables dans le cas de cet article.

Voyons voir tout d’abord la restauration complète de la PDB dans laquelle se trouve la table ci dessus.

Note : Bien sur pour ce type d’opération, la PDB se doit d’être CLOSE.

RMAN> sql 'alter pluggable database MYPDB1 close immediate';
using target database control file instead of recovery catalog
sql statement: alter pluggable database MYPDB1 close immediate

RMAN> run {
set until time "to_date('18-09-2015:08:50:00', 'DD-MM-YYYY:hh24:mi:ss')";
restore pluggable database MYPDB1;
recover pluggable database MYPDB1
AUXILIARY DESTINATION '/oratmp';
}2> 3> 4> 5> 6>

Note :
En PITR, si la flash_recovery n’est pas configurée, l’utilisation du paramètre « AUXILIARY DESTINATION » est obligatoire pour effectuer le Recover.

Starting restore at 18-SEP-15
using channel ORA_DISK_1

skipping datafile 13; already restored to file /oradata/CDB/MYPDB1/system01.dbf
skipping datafile 14; already restored to file /oradata/CDB/MYPDB1/sysaux01.dbf
skipping datafile 15; already restored to file /oradata/CDB/MYPDB1/tbs_MYPDB1_01.dbf
restore not done; all files read only, offline, or already restored
Finished restore at 18-SEP-15

Starting recover at 18-SEP-15
using channel ORA_DISK_1
RMAN-05026: WARNING: presuming following set of tablespaces applies to specified Point-in-Time

List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1

Creating automatic instance, with SID='twsh'

initialization parameters used for automatic instance:
db_name=CDB
db_unique_name=twsh_pitr_MYPDB1_CDB
compatible=12.1.0.2.0
db_block_size=8192
db_files=200
diagnostic_dest=/oracle
_system_trig_enabled=FALSE
sga_target=2560M
processes=200
db_create_file_dest=/oratmp
log_archive_dest_1='location=/oratmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true
#No auxiliary parameter file used

starting up automatic instance CDB

Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 654312056 bytes
Database Buffers 2013265920 bytes
Redo Buffers 13062144 bytes
Automatic instance created

contents of Memory Script:
{
# set requested point in time
set until time "to_date('18-09-2015:08:50:00', 'DD-MM-YYYY:hh24:mi:ss')";
# restore the controlfile
restore clone controlfile;

# mount the controlfile
sql clone 'alter database mount clone database';
}
executing Memory Script

executing command: SET until clause

Starting restore at 18-SEP-15
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=191 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /oracle/product/12.1.0.2/dbs/c-3858261253-20150918-00
channel ORA_AUX_DISK_1: piece handle=/oracle/product/12.1.0.2/dbs/c-3858261253-20150918-00 tag=TAG20150918T084835
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/oratmp/CDB/controlfile/o1_mf_bzqgo9fp_.ctl
Finished restore at 18-SEP-15

sql statement: alter database mount clone database

contents of Memory Script:
{
# set requested point in time
set until time "to_date('18-09-2015:08:50:00', 'DD-MM-YYYY:hh24:mi:ss')";
# switch to valid datafilecopies
switch clone datafile 13 to datafilecopy
"/oradata/CDB/MYPDB1/system01.dbf";
switch clone datafile 14 to datafilecopy
"/oradata/CDB/MYPDB1/sysaux01.dbf";
switch clone datafile 15 to datafilecopy
"/oradata/CDB/MYPDB1/tbs_MYPDB1_01.dbf";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 5 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 6 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 5, 3, 6;

switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

datafile 13 switched to datafile copy
input datafile copy RECID=1 STAMP=890731086 file name=/oradata/CDB/MYPDB1/system01.dbf

datafile 14 switched to datafile copy
input datafile copy RECID=2 STAMP=890731086 file name=/oradata/CDB/MYPDB1/sysaux01.dbf

datafile 15 switched to datafile copy
input datafile copy RECID=3 STAMP=890731086 file name=/oradata/CDB/MYPDB1/tbs_MYPDB1_01.dbf

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 18-SEP-15
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oratmp/CDB/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00005 to /oratmp/CDB/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oratmp/CDB/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00006 to /oratmp/CDB/datafile/o1_mf_users_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/bkpfull_svg_DB_on%_8907292970hqhesqh_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/bkpfull_svg_DB_on%_8907292970hqhesqh_1_1.bkp tag=TAG20150918T084817
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
Finished restore at 18-SEP-15

datafile 1 switched to datafile copy
input datafile copy RECID=8 STAMP=890731102 file name=/oratmp/CDB/datafile/o1_mf_system_bzqgogyy_.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=9 STAMP=890731102 file name=/oratmp/CDB/datafile/o1_mf_undotbs1_bzqgogyx_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=10 STAMP=890731102 file name=/oratmp/CDB/datafile/o1_mf_sysaux_bzqgogyz_.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=11 STAMP=890731102 file name=/oratmp/CDB/datafile/o1_mf_users_bzqgogz0_.dbf

contents of Memory Script:
{
# set requested point in time
set until time "to_date('18-09-2015:08:50:00', 'DD-MM-YYYY:hh24:mi:ss')";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 5 online";
sql clone "alter database datafile 3 online";
sql clone 'MYPDB1' "alter database datafile
13 online";
sql clone 'MYPDB1' "alter database datafile
14 online";
sql clone 'MYPDB1' "alter database datafile
15 online";
sql clone "alter database datafile 6 online";
# recover pdb
recover clone database tablespace "SYSTEM", "UNDOTBS1", "SYSAUX", "USERS" pluggable database
'MYPDB1' delete archivelog;
sql clone 'alter database open read only';
plsql <>;
plsql <>;
# shutdown clone before import
shutdown clone abort
plsql <>>;
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile 1 online
sql statement: alter database datafile 5 online
sql statement: alter database datafile 3 online
sql statement: alter database datafile 13 online
sql statement: alter database datafile 14 online
sql statement: alter database datafile 15 online
sql statement: alter database datafile 6 online

Section Recover :

Starting recover at 18-SEP-15
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 267 is already on disk as file /oradata/CDB/arch/1_267_890666181.dbf
archived log for thread 1 with sequence 268 is already on disk as file /oradata/CDB/arch/1_268_890666181.dbf
archived log file name=/oradata/CDB/arch/1_267_890666181.dbf thread=1 sequence=267
archived log file name=/oradata/CDB/arch/1_268_890666181.dbf thread=1 sequence=268
media recovery complete, elapsed time: 00:00:00
Finished recover at 18-SEP-15

sql statement: alter database open read only
Oracle instance shut down
Removing automatic instance

Automatic instance removed
auxiliary instance file /oratmp/CDB/datafile/o1_mf_sysaux_bzqgogyz_.dbf deleted
auxiliary instance file /oratmp/CDB/controlfile/o1_mf_bzqgo9fp_.ctl deleted
Finished recover at 18-SEP-15

Cette log est assez intéressante … On s’aperçoit qu’RMAN va créer une instance temporaire « clone » de l’instance CDB pour effectuer ONLINE, sans aucun arrêt de l’instance principale (imaginons une prod), un recover en PITR de notre PDB.

Cela veut dire aussi en langage « stockage » qu’il faut prévoir du disque sur un FS (soit unitairement comme l’exemple ci dessus, ou soit fixe pour une Flash_recovery), et cela peut monter vite en Go en fonction de la taille de notre PDB ..

RMAN> sql 'alter pluggable database MYPDB1 open resetlogs';
sql statement: alter pluggable database MYPDB1 open resetlogs

RMAN>exit;

/oratmp/CDB[CDB]:sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Fri Sep 18 09:20:33 2015

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> set lines 200
SQL> select DBID,NAME,OPEN_MODE,OPEN_TIME from v$pdbs;

DBID NAME OPEN_MODE OPEN_TIME
---------- ------------------------------ ---------- ---------------------------------------------------------------------------
548741631 PDB$SEED READ ONLY 17-SEP-15 07.56.27.384 PM +02:00
888812708 MYPDB1 READ WRITE 18-SEP-15 09.20.02.391 AM +02:00

SQL> alter session set container=MYPDB1 ;
Session altered.

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
5296

=> Ok, nous avons retrouvé nos datas, restauré uniquement notre PDB sans impact sur la dispo de l’instance CDB principale, et donc de facto sur les autres PDBs (dans le cas où nous en aurions eu plusieurs), mais nous avons quand même du générer une indisponibilité de la PDB cible.

Nous aurions pu donc passer par une restauration table uniquement, puisque RMAN (en 12c) permet la restauration d’une table directement !

Mais qu’allons nous faire de Datapump alors me direz vous ? Et bien le conserver, car il est toujours utile d’avoir un dump à coté au cas ou (par expérience, avec les joies de la robotique ..)

Note :
Attention, pour Datapump sur une PDB, il faut là encore utiliser un ALIAS TNS pour le réaliser, car un datapump full de la CDB ne permet en effet pas de réaliser un export des PDBs.

Vu que nous avons restauré la PDB, il faut re-simuler une panne, on refait donc un petit backup de notre PDB, avec une gestion des archivelogs car dans ce second exemple je vais utiliser le until sequence ..

SQL> alter session set container=cdb$root;
Session altered.

SQL> alter system switch logfile ;
System altered.

SQL> exit

RMAN> run {
backup pluggable database MYPDB1 format '/oratmp/Backup/bkpfull_MYPDB1_on%_%t%U.bkp' ;
backup archivelog all format '/oratmp/Backup/bkpfull_MYPDB1_ARCH_%t%U.bkp' ;
}

Starting backup at 18-SEP-15
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00014 name=/oradata/CDB/MYPDB1/sysaux01.dbf
input datafile file number=00015 name=/oradata/CDB/MYPDB1/tbs_MYPDB1_01.dbf
input datafile file number=00013 name=/oradata/CDB/MYPDB1/system01.dbf
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp tag=TAG20150918T101728 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 18-SEP-15

Starting backup at 18-SEP-15
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=313 RECID=104 STAMP=890732742
input archived log thread=1 sequence=314 RECID=105 STAMP=890732754
input archived log thread=1 sequence=315 RECID=106 STAMP=890732763
input archived log thread=1 sequence=316 RECID=107 STAMP=890732769
input archived log thread=1 sequence=317 RECID=108 STAMP=890732780
input archived log thread=1 sequence=318 RECID=109 STAMP=890732790
input archived log thread=1 sequence=319 RECID=110 STAMP=890732823
input archived log thread=1 sequence=320 RECID=111 STAMP=890732835
input archived log thread=1 sequence=321 RECID=112 STAMP=890732847
input archived log thread=1 sequence=322 RECID=113 STAMP=890732861
input archived log thread=1 sequence=323 RECID=114 STAMP=890732869
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_MYPDB1_ARCH_89073465222qhf21s_1_1.bkp tag=TAG20150918T101731 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=253 RECID=44 STAMP=890727333
input archived log thread=1 sequence=254 RECID=45 STAMP=890727345
input archived log thread=1 sequence=255 RECID=46 STAMP=890727375
input archived log thread=1 sequence=256 RECID=47 STAMP=890727387
input archived log thread=1 sequence=257 RECID=48 STAMP=890727402
input archived log thread=1 sequence=258 RECID=49 STAMP=890727413
input archived log thread=1 sequence=259 RECID=50 STAMP=890727421
input archived log thread=1 sequence=260 RECID=51 STAMP=890727428
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_MYPDB1_ARCH_89073465923qhf223_1_1.bkp tag=TAG20150918T101731 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=366 RECID=157 STAMP=890734079
input archived log thread=1 sequence=367 RECID=158 STAMP=890734088
input archived log thread=1 sequence=368 RECID=159 STAMP=890734101
input archived log thread=1 sequence=369 RECID=160 STAMP=890734116
input archived log thread=1 sequence=370 RECID=161 STAMP=890734551
input archived log thread=1 sequence=371 RECID=162 STAMP=890734589
input archived log thread=1 sequence=372 RECID=163 STAMP=890734610
input archived log thread=1 sequence=373 RECID=164 STAMP=890734651
channel ORA_DISK_1: starting piece 1 at 18-SEP-15
channel ORA_DISK_1: finished piece 1 at 18-SEP-15
piece handle=/oratmp/Backup/bkpfull_MYPDB1_ARCH_89073466624qhf22a_1_1.bkp tag=TAG20150918T101731 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
Finished backup at 18-SEP-15

Starting Control File and SPFILE Autobackup at 18-SEP-15
piece handle=/oracle/product/12.1.0.2/dbs/c-3858261253-20150918-08 comment=NONE
Finished Control File and SPFILE Autobackup at 18-SEP-15

RMAN> exit

-> On génère une petite archivelog histoire de nous arrêter à la précédente

/home/oracle[CDB]:sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Fri Sep 18 09:25:55 2015

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> alter system switch logfile ;
System altered.

SQL> select sequence#,to_char(completion_time,'DD-MM-YYYY HH24:MI:SS') from v$archived_log where to_char(completion_time,'DD-MM-YYYY HH24:MI:SS') > '18-09-2015 10:10:00';

SEQUENCE# TO_CHAR(COMPLETION_
---------- -------------------
370 18-09-2015 10:15:51
371 18-09-2015 10:16:29
372 18-09-2015 10:16:50
373 18-09-2015 10:17:31
374 18-09-2015 10:18:41

SQL> alter session set container=MYPDB1 ;
Session altered.

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
5296

SQL> delete from "MYPDB1"."MRS_EXECUTED_BLOCKS";
5296 rows deleted.

SQL> commit;
Commit complete.

==> Lançons donc notre restauration de cette table à partir de RMAN, en s’arrêtant à la séquence 330 qui ne contient donc pas l’opération de delete ci dessus ..

Ici, pas besoin de faire un close de la pluggable database, la restauration n’étant pas complète et étant directement sur un objet précis. Par contre, il faut spécifier sur quelle PDB les tables concernées sont stockées :

Note :
J’ai volontairement fait un DELETE et non pas un DROP TABLE, car dans le cas d’un drop table, il n’est pas nécessaire de passer par une table temporaire via la génération d’un dump, comme je le fais ci dessous. En effet, RMAN ne permet pas de restaurer le contenu de la table sur elle même, il faut passer par une table temporaire sinon cela plante.

Bien sur vous me direz que si toutes les lignes ont été supprimées, on peut dropper la table et la restaurer entièrement… oui pourquoi pas ! Mais imaginons que seules quelques lignes soient impactées, nous pourrions faire du rattrapage à partir d’une table temporaire, et éviter ainsi d’avoir à restaurer l’intégralité de notre table.

RMAN> recover table MYPDB1.MRS_EXECUTED_BLOCKS of pluggable database MYPDB1
until sequence 374
auxiliary destination '/oratmp' ;

Starting recover at 18-SEP-15
using target database control file instead of recovery catalog
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 09/18/2015 11:20:05
RMAN-05063: Cannot recover specified tables
RMAN-05112: table "MYPDB1"."MRS_EXECUTED_BLOCKS" already exists

Donc on fait :

RMAN> recover table MYPDB1.MRS_EXECUTED_BLOCKS of pluggable database MYPDB1

2> until sequence 374
3> auxiliary destination '/oratmp'
4> remap table MYPDB1.MRS_EXECUTED_BLOCKS:MRS_EXECUTED_BLOCKS_TMP;

Starting recover at 18-SEP-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=36 device type=DISK
RMAN-05026: WARNING: presuming following set of tablespaces applies to specified Point-in-Time

List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1

Creating automatic instance, with SID='zhkk'

initialization parameters used for automatic instance:
db_name=CDB
db_unique_name=zhkk_pitr_MYPDB1_CDB
compatible=12.1.0.2.0
db_block_size=8192
db_files=200
diagnostic_dest=/oracle
_system_trig_enabled=FALSE
sga_target=2560M
processes=200
db_create_file_dest=/oratmp
log_archive_dest_1='location=/oratmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true
#No auxiliary parameter file used

starting up automatic instance CDB

Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 654312056 bytes
Database Buffers 2013265920 bytes
Redo Buffers 13062144 bytes
Automatic instance created

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# restore the controlfile
restore clone controlfile;

# mount the controlfile
sql clone 'alter database mount clone database';

# archive current online log
sql 'alter system archive log current';
}
executing Memory Script

executing command: SET until clause

Starting restore at 18-SEP-15
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=191 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /oracle/product/12.1.0.2/dbs/c-3858261253-20150918-07
channel ORA_AUX_DISK_1: piece handle=/oracle/product/12.1.0.2/dbs/c-3858261253-20150918-07 tag=TAG20150918T101630
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/oratmp/CDB/controlfile/o1_mf_bzqo91sv_.ctl
Finished restore at 18-SEP-15

sql statement: alter database mount clone database

sql statement: alter system archive log current

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 5 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 13 to new;
set newname for clone datafile 14 to new;
set newname for clone tempfile 1 to new;
set newname for clone tempfile 4 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 5, 3, 13, 14;

switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

renamed tempfile 1 to /oratmp/CDB/datafile/o1_mf_temp_%u_.tmp in control file
renamed tempfile 4 to /oratmp/CDB/datafile/o1_mf_temp_%u_.tmp in control file

Starting restore at 18-SEP-15
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oratmp/CDB/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00005 to /oratmp/CDB/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oratmp/CDB/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/backup_full_on%_8907345731rqhf1vd_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/backup_full_on%_8907345731rqhf1vd_1_1.bkp tag=TAG20150918T101613
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00013 to /oratmp/CDB/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00014 to /oratmp/CDB/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp tag=TAG20150918T101728
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 18-SEP-15

datafile 1 switched to datafile copy
input datafile copy RECID=6 STAMP=890737881 file name=/oratmp/CDB/datafile/o1_mf_system_bzqo975w_.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=7 STAMP=890737881 file name=/oratmp/CDB/datafile/o1_mf_undotbs1_bzqo975t_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=8 STAMP=890737881 file name=/oratmp/CDB/datafile/o1_mf_sysaux_bzqo975w_.dbf
datafile 13 switched to datafile copy
input datafile copy RECID=9 STAMP=890737881 file name=/oratmp/CDB/datafile/o1_mf_system_bzqo9p7f_.dbf
datafile 14 switched to datafile copy
input datafile copy RECID=10 STAMP=890737881 file name=/oratmp/CDB/datafile/o1_mf_sysaux_bzqo9p7d_.dbf

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 5 online";
sql clone "alter database datafile 3 online";
sql clone 'MYPDB1' "alter database datafile
13 online";
sql clone 'MYPDB1' "alter database datafile
14 online";
# recover and open database read only
recover clone database tablespace "SYSTEM", "UNDOTBS1", "SYSAUX", "MYPDB1":"SYSTEM", "MYPDB1":"SYSAUX";
sql clone 'alter database open read only';
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile 1 online
sql statement: alter database datafile 5 online
sql statement: alter database datafile 3 online
sql statement: alter database datafile 13 online
sql statement: alter database datafile 14 online

Starting recover at 18-SEP-15
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 371 is already on disk as file /oradata/CDB/arch/1_371_890666181.dbf
archived log for thread 1 with sequence 372 is already on disk as file /oradata/CDB/arch/1_372_890666181.dbf
archived log for thread 1 with sequence 373 is already on disk as file /oradata/CDB/arch/1_373_890666181.dbf
archived log file name=/oradata/CDB/arch/1_371_890666181.dbf thread=1 sequence=371
archived log file name=/oradata/CDB/arch/1_372_890666181.dbf thread=1 sequence=372
archived log file name=/oradata/CDB/arch/1_373_890666181.dbf thread=1 sequence=373
media recovery complete, elapsed time: 00:00:00
Finished recover at 18-SEP-15

sql statement: alter database open read only

contents of Memory Script:
{
sql clone 'alter pluggable database MYPDB1 open read only';
}
executing Memory Script

sql statement: alter pluggable database MYPDB1 open read only

contents of Memory Script:
{
sql clone "create spfile from memory";
shutdown clone immediate;
startup clone nomount;
sql clone "alter system set control_files =
''/oratmp/CDB/controlfile/o1_mf_bzqo91sv_.ctl'' comment=
''RMAN set'' scope=spfile";
shutdown clone immediate;
startup clone nomount;
# mount database
sql clone 'alter database mount clone database';
}
executing Memory Script

sql statement: create spfile from memory

database closed
database dismounted
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 671089272 bytes
Database Buffers 1996488704 bytes
Redo Buffers 13062144 bytes

sql statement: alter system set control_files = ''/oratmp/CDB/controlfile/o1_mf_bzqo91sv_.ctl'' comment= ''RMAN set'' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 671089272 bytes
Database Buffers 1996488704 bytes
Redo Buffers 13062144 bytes

sql statement: alter database mount clone database

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile 15 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 15;

switch clone datafile all;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME

Starting restore at 18-SEP-15
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=191 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00015 to /oratmp/ZHKK_PITR_MYPDB1_CDB/datafile/o1_mf_aedifica_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp tag=TAG20150918T101728
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 18-SEP-15

datafile 15 switched to datafile copy
input datafile copy RECID=12 STAMP=890737926 file name=/oratmp/ZHKK_PITR_MYPDB1_CDB/datafile/o1_mf_aedifica_bzqoc5kb_.dbf

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# online the datafiles restored or switched
sql clone 'MYPDB1' "alter database datafile
15 online";
# recover and open resetlogs
recover clone database tablespace "MYPDB1":"MYPDB1", "SYSTEM", "UNDOTBS1", "SYSAUX", "MYPDB1":"SYSTEM", "MYPDB1":"SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script
executing command: SET until clause
sql statement: alter database datafile 15 online

Starting recover at 18-SEP-15
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 373 is already on disk as file /oradata/CDB/arch/1_373_890666181.dbf
archived log file name=/oradata/CDB/arch/1_373_890666181.dbf thread=1 sequence=373
media recovery complete, elapsed time: 00:00:00
Finished recover at 18-SEP-15

database opened

contents of Memory Script:
{
sql clone 'alter pluggable database MYPDB1 open';
}
executing Memory Script

sql statement: alter pluggable database MYPDB1 open

Un petit Focus sur la partie « datapump » de RMAN :

contents of Memory Script:

{
# create directory for datapump import
sql 'MYPDB1' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/oratmp''";
# create directory for datapump export
sql clone 'MYPDB1' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/oratmp''";
}
executing Memory Script

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/oratmp''

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/oratmp''

Performing export of tables...
EXPDP> Starting "SYS"."TSPITR_EXP_zhkk_Avay":
EXPDP> Estimate in progress using BLOCKS method...
EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
EXPDP> Total estimation using BLOCKS method: 12 MB
EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
EXPDP> Processing object type TABLE_EXPORT/TABLE/COMMENT
EXPDP> Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
EXPDP> . . exported "MYPDB1"."MRS_EXECUTED_BLOCKS" 9.598 MB 438313 rows
EXPDP> Master table "SYS"."TSPITR_EXP_zhkk_Avay" successfully loaded/unloaded
EXPDP> ******************************************************************************
EXPDP> Dump file set for SYS.TSPITR_EXP_zhkk_Avay is:
EXPDP> /oratmp/tspitr_zhkk_58836.dmp
EXPDP> Job "SYS"."TSPITR_EXP_zhkk_Avay" successfully completed at Fri Sep 18 11:12:21 2015 elapsed 0 00:00:11
Export completed

Import avec le remap table :

contents of Memory Script:
{
# shutdown clone before import
shutdown clone abort
}
executing Memory Script

Oracle instance shut down

Performing import of tables...
IMPDP> Master table "SYS"."TSPITR_IMP_zhkk_wCBw" successfully loaded/unloaded
IMPDP> Starting "SYS"."TSPITR_IMP_zhkk_wCBw":
IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
IMPDP> . . imported "MYPDB1"."MRS_EXECUTED_BLOCKS_TMP" 9.598 MB 438313 rows
IMPDP> Processing object type TABLE_EXPORT/TABLE/COMMENT
IMPDP> Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
IMPDP> Job "SYS"."TSPITR_IMP_zhkk_wCBw" successfully completed at Fri Sep 18 11:12:24 2015 elapsed 0 00:00:01

Et maintenant, RMAN supprime son espace de travail :

Removing automatic instance

Automatic instance removed
auxiliary instance file /oratmp/CDB/datafile/o1_mf_temp_bzqo9tv9_.tmp deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_temp_bzqo9th7_.tmp deleted
auxiliary instance file /oratmp/ZHKK_PITR_MYPDB1_CDB/onlinelog/o1_mf_3_bzqoc7g4_.log deleted
auxiliary instance file /oratmp/ZHKK_PITR_MYPDB1_CDB/onlinelog/o1_mf_2_bzqoc7dz_.log deleted
auxiliary instance file /oratmp/ZHKK_PITR_MYPDB1_CDB/onlinelog/o1_mf_1_bzqoc7cq_.log deleted
auxiliary instance file /oratmp/ZHKK_PITR_MYPDB1_CDB/datafile/o1_mf_aedifica_bzqoc5kb_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_sysaux_bzqo9p7d_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_system_bzqo9p7f_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_sysaux_bzqo975w_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_undotbs1_bzqo975t_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_system_bzqo975w_.dbf deleted
auxiliary instance file /oratmp/CDB/controlfile/o1_mf_bzqo91sv_.ctl deleted
Finished recover at 18-SEP-15

On vérifie :

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
0

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS_TMP";
COUNT(*)
----------
5296

SQL> insert into "MYPDB1"."MRS_EXECUTED_BLOCKS" select * from "MYPDB1"."MRS_EXECUTED_BLOCKS_TMP" ;
5296 rows created.

SQL> commit ;

Commit complete.

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
5296

SQL> drop table "MYPDB1"."MRS_EXECUTED_BLOCKS_TMP";
Table dropped.

Comme je le mentionnais plus haut, dans le cas d’un drop direct d’une table, l’instruction de recover est plus simple :

SQL> alter session set container=MYPDB1;
Session altered.

SQL> drop table "MYPDB1"."MRS_EXECUTED_BLOCKS";
Table dropped.

La restauration complète de la table :

RMAN> recover table MYPDB1.MRS_EXECUTED_BLOCKS of pluggable database MYPDB1
until sequence 374
auxiliary destination '/oratmp' ;2> 3>

Starting recover at 18-SEP-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=36 device type=DISK
RMAN-05026: WARNING: presuming following set of tablespaces applies to specified Point-in-Time

List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1

Creating automatic instance, with SID='otsm'

initialization parameters used for automatic instance:
db_name=CDB
db_unique_name=otsm_pitr_MYPDB1_CDB
compatible=12.1.0.2.0
db_block_size=8192
db_files=200
diagnostic_dest=/oracle
_system_trig_enabled=FALSE
sga_target=2560M
processes=200
db_create_file_dest=/oratmp
log_archive_dest_1='location=/oratmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true
#No auxiliary parameter file used

starting up automatic instance CDB

Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 654312056 bytes
Database Buffers 2013265920 bytes
Redo Buffers 13062144 bytes
Automatic instance created

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# restore the controlfile
restore clone controlfile;

# mount the controlfile
sql clone 'alter database mount clone database';

# archive current online log
sql 'alter system archive log current';
}
executing Memory Script

executing command: SET until clause

Starting restore at 18-SEP-15
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=191 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /oracle/product/12.1.0.2/dbs/c-3858261253-20150918-07
channel ORA_AUX_DISK_1: piece handle=/oracle/product/12.1.0.2/dbs/c-3858261253-20150918-07 tag=TAG20150918T101630
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/oratmp/CDB/controlfile/o1_mf_bzqoxp4w_.ctl
Finished restore at 18-SEP-15

sql statement: alter database mount clone database

sql statement: alter system archive log current

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 5 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 13 to new;
set newname for clone datafile 14 to new;
set newname for clone tempfile 1 to new;
set newname for clone tempfile 4 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 5, 3, 13, 14;

switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

renamed tempfile 1 to /oratmp/CDB/datafile/o1_mf_temp_%u_.tmp in control file
renamed tempfile 4 to /oratmp/CDB/datafile/o1_mf_temp_%u_.tmp in control file

Starting restore at 18-SEP-15
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oratmp/CDB/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00005 to /oratmp/CDB/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oratmp/CDB/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/backup_full_on%_8907345731rqhf1vd_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/backup_full_on%_8907345731rqhf1vd_1_1.bkp tag=TAG20150918T101613
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00013 to /oratmp/CDB/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00014 to /oratmp/CDB/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp tag=TAG20150918T101728
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 18-SEP-15

datafile 1 switched to datafile copy
input datafile copy RECID=6 STAMP=890738541 file name=/oratmp/CDB/datafile/o1_mf_system_bzqoxvhv_.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=7 STAMP=890738541 file name=/oratmp/CDB/datafile/o1_mf_undotbs1_bzqoxvhs_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=8 STAMP=890738541 file name=/oratmp/CDB/datafile/o1_mf_sysaux_bzqoxvhv_.dbf
datafile 13 switched to datafile copy
input datafile copy RECID=9 STAMP=890738541 file name=/oratmp/CDB/datafile/o1_mf_system_bzqoybkd_.dbf
datafile 14 switched to datafile copy
input datafile copy RECID=10 STAMP=890738541 file name=/oratmp/CDB/datafile/o1_mf_sysaux_bzqoybkc_.dbf

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 5 online";
sql clone "alter database datafile 3 online";
sql clone 'MYPDB1' "alter database datafile
13 online";
sql clone 'MYPDB1' "alter database datafile
14 online";
# recover and open database read only
recover clone database tablespace "SYSTEM", "UNDOTBS1", "SYSAUX", "MYPDB1":"SYSTEM", "MYPDB1":"SYSAUX";
sql clone 'alter database open read only';
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile 1 online

sql statement: alter database datafile 5 online

sql statement: alter database datafile 3 online

sql statement: alter database datafile 13 online

sql statement: alter database datafile 14 online

Starting recover at 18-SEP-15
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 371 is already on disk as file /oradata/CDB/arch/1_371_890666181.dbf
archived log for thread 1 with sequence 372 is already on disk as file /oradata/CDB/arch/1_372_890666181.dbf
archived log for thread 1 with sequence 373 is already on disk as file /oradata/CDB/arch/1_373_890666181.dbf
archived log file name=/oradata/CDB/arch/1_371_890666181.dbf thread=1 sequence=371
archived log file name=/oradata/CDB/arch/1_372_890666181.dbf thread=1 sequence=372
archived log file name=/oradata/CDB/arch/1_373_890666181.dbf thread=1 sequence=373
media recovery complete, elapsed time: 00:00:00
Finished recover at 18-SEP-15

sql statement: alter database open read only

contents of Memory Script:
{
sql clone 'alter pluggable database MYPDB1 open read only';
}
executing Memory Script

sql statement: alter pluggable database MYPDB1 open read only

contents of Memory Script:
{
sql clone "create spfile from memory";
shutdown clone immediate;
startup clone nomount;
sql clone "alter system set control_files =
''/oratmp/CDB/controlfile/o1_mf_bzqoxp4w_.ctl'' comment=
''RMAN set'' scope=spfile";
shutdown clone immediate;
startup clone nomount;
# mount database
sql clone 'alter database mount clone database';
}
executing Memory Script

sql statement: create spfile from memory

database closed
database dismounted
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 671089272 bytes
Database Buffers 1996488704 bytes
Redo Buffers 13062144 bytes

sql statement: alter system set control_files = ''/oratmp/CDB/controlfile/o1_mf_bzqoxp4w_.ctl'' comment= ''RMAN set'' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 2684354560 bytes

Fixed Size 3714440 bytes
Variable Size 671089272 bytes
Database Buffers 1996488704 bytes
Redo Buffers 13062144 bytes

sql statement: alter database mount clone database

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile 15 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 15;

switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

Starting restore at 18-SEP-15
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=191 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00015 to /oratmp/OTSM_PITR_MYPDB1_CDB/datafile/o1_mf_aedifica_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oratmp/Backup/bkpfull_MYPDB1_on%_89073464821qhf21o_1_1.bkp tag=TAG20150918T101728
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 18-SEP-15

datafile 15 switched to datafile copy
input datafile copy RECID=12 STAMP=890738587 file name=/oratmp/OTSM_PITR_MYPDB1_CDB/datafile/o1_mf_aedifica_bzqozsvz_.dbf

contents of Memory Script:
{
# set requested point in time
set until logseq 374 thread 1;
# online the datafiles restored or switched
sql clone 'MYPDB1' "alter database datafile
15 online";
# recover and open resetlogs
recover clone database tablespace "MYPDB1":"MYPDB1", "SYSTEM", "UNDOTBS1", "SYSAUX", "MYPDB1":"SYSTEM", "MYPDB1":"SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile 15 online

Starting recover at 18-SEP-15
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 373 is already on disk as file /oradata/CDB/arch/1_373_890666181.dbf
archived log file name=/oradata/CDB/arch/1_373_890666181.dbf thread=1 sequence=373
media recovery complete, elapsed time: 00:00:00
Finished recover at 18-SEP-15

database opened

contents of Memory Script:
{
sql clone 'alter pluggable database MYPDB1 open';
}
executing Memory Script

sql statement: alter pluggable database MYPDB1 open

contents of Memory Script:
{
# create directory for datapump import
sql 'MYPDB1' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/oratmp''";
# create directory for datapump export
sql clone 'MYPDB1' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/oratmp''";
}
executing Memory Script

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/oratmp''

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/oratmp''

Performing export of tables...
EXPDP> Starting "SYS"."TSPITR_EXP_otsm_qbiz":
EXPDP> Estimate in progress using BLOCKS method...
EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
EXPDP> Total estimation using BLOCKS method: 320 KB
EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
EXPDP> Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
EXPDP> Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
EXPDP> Processing object type TABLE_EXPORT/TABLE/TRIGGER
EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
EXPDP> . . exported "MYPDB1"."MRS_EXECUTED_BLOCKS" 218.4 KB 5296 rows
EXPDP> Master table "SYS"."TSPITR_EXP_otsm_qbiz" successfully loaded/unloaded
EXPDP> ******************************************************************************
EXPDP> Dump file set for SYS.TSPITR_EXP_otsm_qbiz is:
EXPDP> /oratmp/tspitr_otsm_34847.dmp
EXPDP> Job "SYS"."TSPITR_EXP_otsm_qbiz" successfully completed at Fri Sep 18 11:23:21 2015 elapsed 0 00:00:11
Export completed

contents of Memory Script:
{
# shutdown clone before import
shutdown clone abort
}
executing Memory Script

Oracle instance shut down

Performing import of tables...
IMPDP> Master table "SYS"."TSPITR_IMP_otsm_xfFz" successfully loaded/unloaded
IMPDP> Starting "SYS"."TSPITR_IMP_otsm_xfFz":
IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
IMPDP> . . imported "MYPDB1"."MRS_EXECUTED_BLOCKS" 218.4 KB 5296 rows
IMPDP> Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
IMPDP> Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
IMPDP> Processing object type TABLE_EXPORT/TABLE/TRIGGER
IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
IMPDP> Job "SYS"."TSPITR_IMP_otsm_xfFz" successfully completed at Fri Sep 18 11:23:24 2015 elapsed 0 00:00:01
Import completed

Removing automatic instance
Automatic instance removed
auxiliary instance file /oratmp/CDB/datafile/o1_mf_temp_bzqoyh6m_.tmp deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_temp_bzqoygsp_.tmp deleted
auxiliary instance file /oratmp/OTSM_PITR_MYPDB1_CDB/onlinelog/o1_mf_3_bzqozvs0_.log deleted
auxiliary instance file /oratmp/OTSM_PITR_MYPDB1_CDB/onlinelog/o1_mf_2_bzqozvqz_.log deleted
auxiliary instance file /oratmp/OTSM_PITR_MYPDB1_CDB/onlinelog/o1_mf_1_bzqozvpt_.log deleted
auxiliary instance file /oratmp/OTSM_PITR_MYPDB1_CDB/datafile/o1_mf_aedifica_bzqozsvz_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_sysaux_bzqoybkc_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_system_bzqoybkd_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_sysaux_bzqoxvhv_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_undotbs1_bzqoxvhs_.dbf deleted
auxiliary instance file /oratmp/CDB/datafile/o1_mf_system_bzqoxvhv_.dbf deleted
auxiliary instance file /oratmp/CDB/controlfile/o1_mf_bzqoxp4w_.ctl deleted
auxiliary instance file tspitr_otsm_34847.dmp deleted
Finished recover at 18-SEP-15

Et voila, nous avons retrouvé notre table complète :

SQL> select count(*) from "MYPDB1"."MRS_EXECUTED_BLOCKS";
COUNT(*)
----------
5296

Il va de soi qu’il y a plein d’autres tests à faire avec notre ami RMAN, mais cela donne déja une bonne idée de ce que la version 12c permet de faire !

Micka

HOW TO : Oracle RAC : Déplacement OCR – Voting – ASM SPFILE sur New DISKGROUP ASM

Lors d’une installation de Oracle RAC 11GR2, il y a la partie ASM où l’on doit configurer le DISKGROUP qui sera créée en vue de stocker différents éléments nécessaires au fonctionnement du cluster, à savoir la registry (OCR), le voting et le spfile de l’instance ASM.

Dans la configuration de cette partie j’ai laissé le nom du diskgroup ASM à sa valeur par défaut : DATA, alors que j’ai utilisé un disk ASM labellisé « OCR »

[oracle@rac1 ~]$ oracleasm listdisks
OCR
[oracle@rac1 ~]$ oracleasm querydisk -v -d OCR
Disk "OCR" is a valid ASM disk on device [8,21]
[oracle@rac1 ~]$ ls -l /dev/oracleasm/disks/OCR
brw-rw---- 1 oracle dba 8, 21 Jun 16 19:26 /dev/oracleasm/disks/OCR

Sauf qu’au final j’aime quand c’est clair, je vais donc l’appeler OCR pour y stocker ma registry et mon voting, pour correspondre ainsi au label OracleASM.
L’idée est donc de déplacer tout cela dans un second diskgroup ASM, pour ensuite renommer le diskgroup DATA en OCR.

Tout d’abord, quelques vérifications de base, histoire de savoir ce que nous avons :

Informations sur le VOTING :

[root@RAC2 export]# /oracle/product/11.2.0/grid/bin/crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 924d1d9d1d124fd8bf9f457431a42ea4 (/dev/oracleasm/disks/OCR) [DATA]

Informations sur la Registry du Cluster « OCR » :

[root@RAC2 export]# /oracle/product/11.2.0/grid/bin/ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2668
Available space (kbytes) : 259452
ID : 1827476825
Device/File Name : +DATA
Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

Informations sur le device ASM utilisé :

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 4096 1048576 5130 4734 0 4734 0 Y DATA/

ASMCMD> lsdsk
Path
/dev/oracleasm/disks/OCR

En résumé j’ai donc là un seul Diskgroup ASM utilisé, nommé « DATA » qui correspond au disk ASM labellisé « OCR », qui héberge actuellement la Registry du cluster, ainsi que le Voting. Ma première étape sera donc de créer un second diskgroup ASM afin de pouvoir par la suite déplacer l’OCR et le VOTING.

SQL> select group_number,name from v$asm_diskgroup;

GROUP_NUMBER NAME
------------ ------------------------------
1 DATA
SQL> SELECT MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,TOTAL_MB,FREE_MB,NAME,PATH,LABEL FROM V$ASM_DISK;

MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB FREE_MB NAME PATH LABEL
------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------------------------------------- -------------------------------
CLOSED PROVISIONED ONLINE NORMAL 0 0 /dev/oracleasm/disks/DATA
CACHED MEMBER ONLINE NORMAL 5130 4734 DATA_0000 /dev/oracleasm/disks/OCR

Mon disque OracleASM labellisé « DATA » est bien disponible, je l’utilise pour créer un diskgroup ASM que je nomme « DATADG », en EXTERNAL REDUNDANCY

SQL> create diskgroup DATADG external redundancy disk '/dev/oracleasm/disks/DATA';
Diskgroup created.

SQL> SELECT MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,TOTAL_MB,FREE_MB,NAME,PATH,LABEL FROM V$ASM_DISK;
MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB FREE_MB NAME PATH LABEL
------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------------------------------------- -------------------------------
CACHED MEMBER ONLINE NORMAL 455663 455609 DATADG_0000 /dev/oracleasm/disks/DATA
CACHED MEMBER ONLINE NORMAL 5130 4734 DATA_0000 /dev/oracleasm/disks/OCR

ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 4096 1048576 5130 4734 0 4734 0 Y DATA/
MOUNTED EXTERN N 512 4096 1048576 455663 455609 0 455609 0 N DATADG/
ASMCMD> lsdsk
Path
/dev/oracleasm/disks/DATA
/dev/oracleasm/disks/OCR

[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.DATADG.dg
NAME=ora.DATADG.dg
TYPE=ora.diskgroup.type
TARGET=ONLINE , OFFLINE
STATE=ONLINE on RAC1, OFFLINE

On identifie que sur le second node, mon nouveau diskgroup n’est pas vu :

SQL> SELECT MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,TOTAL_MB,FREE_MB,NAME,PATH,LABEL FROM V$ASM_DISK;

MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB FREE_MB NAME PATH LABEL
------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------------------------------------- -------------------------------
CLOSED MEMBER ONLINE NORMAL 0 0 /dev/oracleasm/disks/DATA
CACHED MEMBER ONLINE NORMAL 5130 4734 DATA_0000 /dev/oracleasm/disks/OCR

SQL> exit

[RAC2]/home/oracle[+ASM2]:crsctl stat res ora.DATADG.ora
CRS-2613: Could not find resource 'ora.DATADG.ora'.

Normal, un petit coup de start depuis notre noeud « principal » :

[RAC1]/home/oracle[+ASM1]: crsctl start res ora.DATADG.dg -n RAC2
CRS-2672: Attempting to start 'ora.DATADG.dg' on 'RAC2'
CRS-2676: Start of 'ora.DATADG.dg' on 'RAC2' succeeded

[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.DATADG.dg
NAME=ora.DATADG.dg
TYPE=ora.diskgroup.type
TARGET=ONLINE , ONLINE
STATE=ONLINE on RAC1, ONLINE on RAC2

Good, donc seconde étape, déplacer l’OCR, et pour cela on va ajouter un second emplacement qui sera +DATADG :

[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/ocrconfig -add +DATADG
PROT-30: The Oracle Cluster Registry location to be added is not usable
PROC-8: Cannot perform cluster registry operation because one of the parameters is invalid.
ORA-15056: additional error message
ORA-17502: ksfdcre:4 Failed to create file +DATADG.255.1
ORA-15221: ASM operation requires compatible.asm of 11.1.0.0.0 or higher
ORA-06512: at line 4

Oups, j’ai du creer le ASM DISKGROUP en compatible.asm 10.1 !

SQL> select name,ALLOCATION_UNIT_SIZE,STATE,COMPATIBILITY from v$asm_diskgroup ;
NAME ALLOCATION_UNIT_SIZE STATE COMPATIBILITY
------------------------------ -------------------- ----------- ------------------------------------------------------------
DATADG 1048576 MOUNTED 10.1.0.0.0
DATA 1048576 MOUNTED 11.2.0.0.0

Et oui, je suis tombé en plein dans le piege ! En RAC 11G, tous les nouveaux diskgroup ASM sont crées par défaut avec la compatibilité ASM en 10.1, ce qui n’a rien de gênant en soi, sauf pour y stocker notre OCR et Voting (oui, on ne peux stocker ça quand dans un diskgroup avec une compatibilité au minima 11.1.0, puisqu’il s’agit d’un Cluster 11G) !

Modifions donc cela :

SQL> alter diskgroup DATADG SET ATTRIBUTE 'compatible.asm' = '11.2.0.0.0';
Diskgroup altered.

SQL> select name,ALLOCATION_UNIT_SIZE,STATE,COMPATIBILITY from v$asm_diskgroup ;
NAME ALLOCATION_UNIT_SIZE STATE COMPATIBILITY
------------------------------ -------------------- ----------- ------------------------------------------------------------
DATADG 1048576 MOUNTED 11.2.0.0.0
DATA 1048576 MOUNTED 11.2.0.0.0

Relançons maintenant la commande précédente pour ajouter un emplacement à mon OCR :

[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2684
Available space (kbytes) : 259436
ID : 1827476825
Device/File Name : +DATA
Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/ocrconfig -add +DATADG
[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2684
Available space (kbytes) : 259436
ID : 1827476825
Device/File Name : +DATA
Device/File integrity check succeeded
Device/File Name : +DATADG
Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

Impeccable, maintenant supprimons l’ancien emplacement, de sorte à ce que l’OCR ne soit uniquement stocké que dans le disk DATADG :

[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/ocrconfig -delete +DATA
[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2684
Available space (kbytes) : 259436
ID : 1827476825
Device/File Name : +DATADG
Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

Ok, passons maintenant au Voting :

SQL> select adg.name, ad.disk_number, ad.header_status, ad.mode_status,
ad.path, ad.voting_file
from v$asm_diskgroup adg, v$asm_disk ad
where ad.voting_file='Y'
and adg.group_number = ad.group_number
order by ad.disk_number;

NAME DISK_NUMBER HEADER_STATU MODE_ST PATH V
------------------------------ ----------- ------------ ------- ---------------------------------------- -
DATA 0 MEMBER ONLINE /dev/oracleasm/disks/OCR Y

[RAC1]/home/oracle[+ASM1]:crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 924d1d9d1d124fd8bf9f457431a42ea4 (/dev/oracleasm/disks/OCR) [DATA]
Located 1 voting disk(s).

Je vais directement déplacer, via la commande REPLACE, le voting :

[RAC1]/home/oracle[+ASM1]:crsctl replace votedisk +DATADG
Successful addition of voting disk aef4e6b7c55b4f3cbf11e09d5c3143f8.
Successful deletion of voting disk 924d1d9d1d124fd8bf9f457431a42ea4.
Successfully replaced voting disk group with +DATADG.
CRS-4266: Voting file(s) successfully replaced

[RAC1]/home/oracle[+ASM1]:crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE aef4e6b7c55b4f3cbf11e09d5c3143f8 (/dev/oracleasm/disks/DATA) [DATADG]
Located 1 voting disk(s).

Parfait, on vérifie cependant sur ASM :

[RAC1]/home/oracle[+ASM1]:sqlplus / as sysasm
SQL> select adg.name, ad.disk_number, ad.header_status, ad.mode_status,
ad.path, ad.voting_file
from v$asm_diskgroup adg, v$asm_disk ad
where ad.voting_file='Y'
and adg.group_number = ad.group_number
order by ad.disk_number; 2 3 4 5 6

NAME DISK_NUMBER HEADER_STATU MODE_ST PATH V
------------------------------ ----------- ------------ ------- -------------------------------------------------- -
DATADG 0 MEMBER ONLINE /dev/oracleasm/disks/DATA Y

On tient le bon bout, il ne reste maintenant qu’à s’occuper des 2 instances ASM car son spfile est également stocké dans le diskgroup DATA.

SQL> sho parameter pfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATA/clust2/asmparameterfile/registry.253.914670117

SQL> create pfile='/tmp/asminit.ora' from spfile;
File created.

SQL> create spfile='+DATADG' from pfile='/tmp/asminit.ora';
File created.

A ce stade, les instance ASM utilisent toujours le SPFILE qui est sur le diskgroup DATA, il faut donc faire un A/R d’ASM pour que les instances utilisent le nouveau spfile.
On peut cependant s’assurer que le spfile qui sera utilisé est bien celui dans +DATADG :


[RAC1]/oracle/product/11.2.0/grid/dbs[+ASM1]:asmcmd spget
+DATADG/clustdatacly2/asmparameterfile/registry.253.914689389

On fait donc un A/R d’ASM, et on vérifie que le Spfile est bien au bon endroit


[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/crsctl stop crs

[root@RAC1 database]# /oracle/product/11.2.0/grid/bin/crsctl start crs

Une fois le cluster de nouveau UP, une petite vérification :

SQL> sho parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATADG/clustdatacly2/asmparameterfile/registry.253.914689389

Ok, on peut désormais démonter le diskgroup DATA, en vue de le renommer :

SQL> alter diskgroup data dismount ;
Diskgroup altered.

[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.DATA.dg
NAME=ora.DATA.dg
TYPE=ora.diskgroup.type
TARGET=OFFLINE, OFFLINE
STATE=OFFLINE, OFFLINE

Go pour renommer le diskgroup :

[RAC1]/home/oracle[+ASM1]:renamedg dgname=DATA newdgname=OCR asm_diskstring='/dev/oracleasm/disks/*' verbose=true
NOTE: No asm libraries found in the system

Parsing parameters..

Parameters in effect:

Old DG name : DATA
New DG name : OCR
Phases :
Phase 1
Phase 2
Discovery str : /dev/oracleasm/disks/*
Clean : TRUE
Raw only : TRUE
renamedg operation: dgname=DATA newdgname=OCR asm_diskstring=/dev/oracleasm/disks/* verbose=true
Executing phase 1
Discovering the group
Performing discovery with string:/dev/oracleasm/disks/*
Identified disk UFS:/dev/oracleasm/disks/OCR with disk number:0 and timestamp (33036811 117883904)
Checking for hearbeat...
Re-discovering the group
Performing discovery with string:/dev/oracleasm/disks/*
Identified disk UFS:/dev/oracleasm/disks/OCR with disk number:0 and timestamp (33036811 117883904)
Checking if the diskgroup is mounted or used by CSS
Checking disk number:0
Generating configuration file..
Completed phase 1
Executing phase 2
Looking for /dev/oracleasm/disks/OCR
Modifying the header
Completed phase 2
Terminating kgfd context 0x7ff8759030a0

Impeccable, on monte le diskgroup :

[RAC1]/home/oracle[+ASM1]:sqlplus / as sysasm

SQL> alter diskgroup OCR mount;
Diskgroup altered.

[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.OCR.dg
NAME=ora.OCR.dg
TYPE=ora.diskgroup.type
TARGET=ONLINE , OFFLINE
STATE=ONLINE on RAC1, OFFLINE

[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.DATA.dg
NAME=ora.DATA.dg
TYPE=ora.diskgroup.type
TARGET=OFFLINE, OFFLINE
STATE=OFFLINE, OFFLINE

Ici, on visualise d’une part que le diskgroup OCR n’est pas monté sur le second node, et qu’il reste l’ancien Diskgroup DATA visible du CRS.

Pour que le diskgroup OCR soit monté sur le second node, soit on démarre la ressource cluster, soit on fait un MOUNT du diskgroup depuis l’instance ASM du second noeud.

Pour cette fois, j’aime bien les commabdes donc je passe par ASM :

[RAC2]/home/oracle[+ASM2]:sqlplus / as sysasm

SQL> alter diskgroup OCR mount ;
Diskgroup altered.

[RAC2]/home/oracle[+ASM2]:crsctl stat res ora.OCR.dg
NAME=ora.OCR.dg
TYPE=ora.diskgroup.type
TARGET=ONLINE , ONLINE
STATE=ONLINE on RAC1, ONLINE on RAC2

On supprime maintenant l’ancienne ressource cluster du diskgroup DATA :

[RAC1]/home/oracle[+ASM1]:crsctl delete res ora.DATA.dg
[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.DATA.dg
CRS-2613: Could not find resource 'ora.DATA.dg'.

on vérifie sur le second noeud, histoire d’être sur :


[RAC2]/home/oracle[+ASM2]:crsctl stat res ora.DATA.dg
CRS-2613: Could not find resource 'ora.DATA.dg'.

Une vérification coté ASM :

SQL> SELECT MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,TOTAL_MB,FREE_MB,NAME,PATH,LABEL FROM V$ASM_DISK;

MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB FREE_MB NAME PATH LABEL
——- ———— ——- ——– ———- ———- —————————— ————————————————– ——————————-
CACHED MEMBER ONLINE NORMAL 455663 455263 DATADG_0000 /dev/oracleasm/disks/DATA
CACHED MEMBER ONLINE NORMAL 5130 4766 DATA_0000 /dev/oracleasm/disks/OCR

Ok nous avons donc maintenant des diskgroup ASM quasi cohérent, en effet, il me manque le renommage du disk asm « DATA_0000 » qui doit se nommer « OCR_0000« .

Mais là, pour le renommer, il n’y a pas trente six solutions que j’ai pu identifier :
– Soit on migre en RAC ASM 12c car depuis cette relase, ASM offre la possibilité de renommer directement les disks d’un Diskgroup « alter diskgroup DATADG rename disk OLD to NEW » ou encore «  alter diskgroup DATADG rename disks all« ,
– Soit on casse le DISKGROUP, et on le refait correctement (ce qui sous entend qu’une partie de ce que j’ai fait jusque la serait alors inutile, quoique intéressante cependant..)

Etant joueur et dans un contexte de test, je refait le diskgroup.

Démontage du diskgroup OCR sur les 2 nodes :

SQL> alter diskgroup OCR dismount ;
Diskgroup altered.

Ensuite :

SQL> drop diskgroup OCR force including contents;
Diskgroup dropped.

On vire la ressource cluster :

[RAC2]/home/oracle[+ASM2]:crsctl stat res ora.OCR.dg
NAME=ora.OCR.dg
TYPE=ora.diskgroup.type
TARGET=OFFLINE, OFFLINE
STATE=OFFLINE, OFFLINE

[RAC2]/home/oracle[+ASM2]:crsctl delete res ora.OCR.dg

On passe à la création du diskgroup, avec directement la compatibilité ASM en 11.2 histoire d’éviter les surprises quand je vais rebasculer mes fichiers.

SQL> create diskgroup OCR external redundancy disk '/dev/oracleasm/disks/OCR' attribute 'compatible.asm'='11.2.0.0.0';
Diskgroup created.

SQL> SELECT MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,TOTAL_MB,FREE_MB,NAME,PATH,LABEL FROM V$ASM_DISK;

MOUNT_S HEADER_STATU MODE_ST STATE TOTAL_MB FREE_MB NAME PATH LABEL
------- ------------ ------- -------- ---------- ---------- ------------------------------ -------------------------------------------------- -------------------------------
CACHED MEMBER ONLINE NORMAL 455663 455263 DATADG_0000 /dev/oracleasm/disks/DATA
CACHED MEMBER ONLINE NORMAL 5130 5078 OCR_0000 /dev/oracleasm/disks/OCR

[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.OCR.dg
NAME=ora.OCR.dg
TYPE=ora.diskgroup.type
TARGET=ONLINE , OFFLINE
STATE=ONLINE on RAC1, OFFLINE

On monte le diskgroup sur le second noeud, ou bien on démarre la ressource cluster qui lui est liée. Pour cette seconde fois, je fait un start de la ressource :

[RAC1]/home/oracle[+ASM1]:crsctl start res ora.OCR.dg -n RAC2
CRS-2672: Attempting to start 'ora.OCR.dg' on 'RAC2'
CRS-2676: Start of 'ora.OCR.dg' on 'RAC2' succeeded
[RAC1]/home/oracle[+ASM1]:crsctl stat res ora.OCR.dg
NAME=ora.OCR.dg
TYPE=ora.diskgroup.type
TARGET=ONLINE , ONLINE
STATE=ONLINE on RAC1, ONLINE on RAC2

Et voila, il ne me reste plus qu’a remettre l’OCR, le voting et enfin le spfile ASM dans ce nouveau diskgroup OCR , afin que cela soit indépendant du groupe de disque DATADG, qui lui hébergera de la Database.

Enjoy !

Micka