Sauter au contenu

Qualité de service et réduction des coûts: Les solutions EASYTEAM / ORACLE pour les PME et les collectivités

17 avril 2012

EASYTEAM organise 2 séminaires à destination des PME et des collectivités:  le 5 juillet à Marseille et le 10 Juillet Paris La Défense
Ces séminaires seront l’occasion de présenter les solutions EASYTEAM / ORACLE particulièrement adaptées au contexte des entreprises de taille moyenne et des collectivités:
- GOLDENGATE pour la migration et l’intégration de données
- ODA et les solutions infrastructures et bases de données ORACLE, pour l’exploitation des applications SAP
- EASYTRUST la solution d’infogérance d’EASYTEAM
Je m’inscris

11g et EMail : Consommer (avec modération) via UMS [1/2]

22 mai 2012
tags :, , ,
by

Souvent on souhaite permettre à nos services de notifier les utilisateurs… moins souvent, on souhaite pouvoir notifier nos services via emails… et forcément quand c’est une pratique moins fréquente, on trouve moins d’informations…

Cette problématique était prise en compte dans la version 10g via les « activation agents », cependant cette méthode n’est plus valable en 11g…

Aujourd’hui plus besoin de chercher ! Vous n’avez plus qu’à lire la suite !

Lire la suite…

Clonage de base de données Oracle

8 mai 2012
tags :, , ,

Le but du clonage est de mettre à disposition des équipes de développement ou de recette une copie de la base de production a un instant T. Pour ce faire, on part d’une sauvegarde de la base faite à l’aide de l’utilitaire RMAN. L’intérêt de partir d’une sauvegarde plutôt que de dupliquer directement la base de production ( ce qui est possible sans sauvegarde depuis la version 11gR2) est que l’on ne perturbe pas le fonctionnement de la base d’origine qui est généralement une base de production.

On abordera ici le clonage d’une base en standalone vers une base en standalone , d’une base en RAC vers une base en standalone , une base en RAC vers une base en RAC et une base en standalone vers une base en RAC.

Attention, Il s’agit ici d’une copie physique d’une base sur une autre. Une fois le clonage terminé, les users et password de la base clonée sont les mêmes que sur la base d’origine. Tout ce qui pouvait faire la spécificité de la base de destination, et qui n’est pas un paramètre d’initialisation, a disparu.

Partons du principe que l’on veuille cloner la base de production BDDPROD sur la base de recette BDDR7.

Les prérequis :

Cela peut paraître trivial, mais les versions des bases de données doivent être identique.

  • Recherche de l’espace disque nécessaire.

Pour cela on exécutera la requête suivante sur la base BDDPROD

select fs_name ||’@#@’||to_char( floor((sum(vol)/1024/1024)+0.5))
from
(
select substr(f.file_name,1,instr(f.file_name ,’/',-2)-1) fs_name , sum(bytes) vol
from dba_data_files f
group by substr(f.file_name,1,instr(f.file_name ,’/',-2)-1)
union
select substr(member,1,instr(member,’/',-1)-1) fs_name,sum(bytes) vol
from v$logfile m,v$log l
where l.group#=m.group#
and type = ‘ONLINE’
group by substr(member,1,instr(member,’/',-1)-1)
union
select substr(name,1,instr(name,’/',-1)-1) fs_name,0 vol
from v$controlfile
where IS_RECOVERY_DEST_FILE = ‘NO’
group by substr(name,1,instr(name,’/',-1)-1)
union
select substr(name,1,instr(name,’/',-1)-1) fs_name,sum(bytes) vol
from v$tempfile
group by substr(name,1,instr(name,’/',-1)-1)
)
group by fs_name;

Cette requête ramène le volume de fichier de base de données par filesystem ou volume ASM. On a donc une bonne estimation de la volumétrie minimum à mettre en place sur l’environnement clone
Par exemple

/localisation/control/file 0M
/localisation/redo/log 600M
/localisation/data/files_1 500G
/localisation/temp/files 32G
/localisation/undo/dbf 64G

A partir des informations recueillies précédemment, on peut contrôler que l’on dispose bien des volumes disques sur l’environnement clone.

Par exemple

/nouvelle/localisation/control/file 600M
/nouvelle/localisation/redo/log 10240M
/nouvelle/localisation/data/files_1 600G
/nouvelle/localisation/temp/files 64G
/nouvelle/localisation/undo/dbf 120G

  • Mise a jour du paramétrage de la base clone.

Suivant le cas de figure les modifications sont les suivantes :

Dans le cas de clonage de base standalone vers une base standalone pas de modifications de paramétrage à faire du coté de la base BDDR7.

Dans le cas de clonage d’une base en standlone vers une base en RAC, il faut modifier les paramètres suivants dans le fichier d’initialisation ( pfile ou spfile ) de la base BDDR7.

*._no_recovery_through_resetlogs=TRUE
*.cluster_database=false

Dans le cas de clonage d’une base en RAC vers une base en RAC, il faut modifier les paramètres suivants dans le fichier d’initialisation ( pfile ou spfile ) de la base BDDR7.

*._no_recovery_through_resetlogs=TRUE
*.cluster_database=false

Dans le cas de clonage d’une base en RAC vers une base en standalone, il faut modifier le paramètre suivant dans le fichier d’initialisation ( pfile ou spfile ) de la base BDDR7

*._no_recovery_through_resetlogs=TRUE

  • Mise a jour du fichier tnsnames.ora

Le serveur sur lequel la base de recette est installée doit pouvoir se connecter à la base de données de production. Il faut donc configurer le fichier tnsnames.ora en conséquence.

  • mise en place de l’environnement TSM si TSM est utilisé

Si on utilise TSM et TDPO pour effectuer les sauvegardes, il faut que le serveur supportant la base clone puisse lire les sauvegardes de la base de production. Pour cela, il faut récupérer des fichiers de paramétrage TDPO du le serveur de production pour les copier sur le serveur de recette en les renommant.

Les fichiers à récupérer sont :

/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt

à renommer en

/opt/tivoli/tsm/client/oracle/bin64/tdpo_${TARGET_HOST}.opt

et

/opt/tivoli/tsm/client/oracle/bin64/TDPO.${TARGET_HOST}_ORA

à ne surtout pas renommer.

  • Dans le cas de sauvegarde sur disque,

les fichiers de sauvegardes doivent être visibles des 2 environnements recette et production.

création du script de clonage mon_scripts_rman.

CONNECT TARGET sys/${SYS_PWD}@${TARGET_SID};
CONNECT AUXILIARY / ;
run
{
allocate auxiliary channel c1 type ‘SBT_TAPE’ parms ‘ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo_${TARGET_HOST}.opt)’;
allocate auxiliary channel c2 type ‘SBT_TAPE’ parms ‘ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo_${TARGET_HOST}.opt)’;
duplicate target database to ${ORACLE_SID}
db_file_name_convert = (
‘/localisation/control/file’,'/nouvelle/localisation/control/file’
,’/localisation/data/files_1′,’/nouvelle/localisation/data/files_1′
,’/localisation/temp/files’,'/nouvelle/localisation/temp/files’
,’/localisation/undo/dbf}’,'/nouvelle/localisation/undo/dbf’
)
until time “to_date(’2012-03-03:14:00:00′,’YYYY-MM-DD:HH24:MI:SS’)”
logfile
GROUP 1 ( ‘/localisation/redo/log/redo1a.rdo’ , ‘/nouvelle/localisation/redo/log/redo1b.rdo’ ) size 204800K ,
GROUP 2 ( ‘/localisation/redo/log/redo2b.rdo’ , ‘/nouvelle/localisation/redo/log/redo2a.rdo’ ) size 204800K ,
GROUP 3 ( ‘/localisation/redo/log/redo3b.rdo’ , ‘/nouvelle/localisation/redo/log/redo3a.rdo’ ) size 204800K ;
}

Lancement du scripts de clonage

  • avec catalogue Rman

rman rcvcat ${RMAN_USR}/${RMAN_PWD}@${RMAN_BDD}
@mon_script_rman

  • Sans catalogue Rman

rman
@mon_script_rman

  1. mise a jour du paramétrage de la base clone

Dans le cas de clonage d’une base en standlone vers une base en RAC, il faut modifier les paramètres suivants dans le fichier d’initialisation ( pfile ou spfile ) de la base BDDR7.

*.cluster_database=TRUE

et supprimer le paramètre *._no_recovery_through_resetlogs des paramètres d’initialisation
Dans le cas de clonage d’une base en RAC vers une base en RAC, il faut modifier les paramètres suivants dans le fichier d’initialisation ( pfile ou spfile ) de la base BDDR7.

*.cluster_database=TRUE

et supprimer le paramètre *._no_recovery_through_resetlogs des paramètres d’initialisation
Dans le cas de clonage d’une base en RAC vers une base en standalone, il faut
supprimer le paramètre *._no_recovery_through_resetlogs des paramètres d’initialisation de la base BDDR7

Actions complémentaires liées au clonage de base standalone vers RAC

Une fois l’instance 1 du RAC cloné démarrée, il y a des opérations supplémentaires à effectuer. En effet lors du clonage d’une base en standalone, les redologs associés aux threads utilisés par les autres instances du RAC ne sont pas créés. Ils n’existent pas sur l’instance d’origine. Il faut donc les créés de toute pièce.
Pour cela, on se connecte sys sur l’instance1 du RAC.
On crée de nouveaux groupes de redologs attachés au thread des autres instances du RAC

ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 21 (+NOUVELLE/localisation/redo/log/redo_21.log') SIZE 10240K

On Active les différents threads ainsi créés.

ALTER DATABASE ENABLE THREAD 2

On crée les undos tablespaces supplémentaires, 1 par instance supplémentaire du RAC :

CREATE SMALLFILE UNDO TABLESPACE "UNDOTBS2" DATAFILE '+NOUVELLE/localisation/undo/dbf/undotbs02.dbf' SIZE 1024M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE 10240M

 On peut maintenant démarrer les autres instances du RAC.

 

Bascule automatique des clients Oracle dans un environnement MAA 11gR2

3 mai 2012

Cet article décrit les bonnes pratiques à mettre en oeuvre dans un environnement Maximum Availability Architecture (MAA) pour que les clients Oracle basculent automatiquement sur la base de secours lorsque la base de production devient inaccessible soit du fait que le ou les serveurs de la base de données soient défaillants ou que nous soyons en présence d’un désastre partiel de site.

Environnement Oracle Maximum Availability Architecture (MAA)

 L’environnement Oracle se compose de deux clusters Oracle RAC 11gr2 constitués chacun de deux nœuds qui sont répartis sur deux sites distincts.

 Un site héberge la base de production que nous désignons par ‘PRODUCTION’ alors que l’autre site héberge la base de secours dont la synchronisation repose sur les mécanismes Dataguard et que nous dénommons ‘SECOURS’.

 Un service ‘oltp’ spécialisé dans les transactions est associé à la base de production alors qu’un service de ‘reporting’ est publié sur la base de secours qui utilise la nouvelle option d’Oracle 11gR2 ‘Active Dataguard’ qui permet d’accéder en lecture la base de secours en même temps que celle-ci est synchronisée (RECOVER).

Configuration des services Oracle au niveau du clusterware

 La définition des services doit être unique en fonction de la nature de la connexion du client qui peut être soit OCI ou JDBC, ainsi chaque type de client dispose d’un dispositif de notification différent pour détecter la disponibilité ou non du service. Le dispositif de notification pour les clients OCI  repose sur Oracle Advanced Queue (AQ) alors que les clients JDBC utilisent Oracle Notification Service (ONS).

 En premier lieu il convient de configurer par exemple les services oltp, reporting au niveau du cluster Oracle pour que l’application puisse se connecter à la base de données. Le service devra être créé et accessible en fonction du rôle de la base de données (Primary, Standby). Ainsi le service oltp sera disponible pour la base de données primaire (Primary) alors que le service reporting sera uniquement accessible sur la base de données de données de secours (Standby).

Configuration des services client OCI

La configuration des services sera donc fonction du rôle de la base de données dans le cluster Oracle.

  • Cluster de production
srvctl add service –d production –s oltp_oci –r instance1,instance2 –l PRIMARY –q TRUE –e SESSION –m BASIC –w 10 –z 150
srvctl add service –d production –s reporting_oci –r instance1,instance2 –l PHYSICAL_STANDBY –q TRUE –e SESSION –m BASIC –w 10 –z 150
  • Cluster de secours
srvctl add service –d secours –s oltp_oci –r instance1, instance2 –l PRIMARY –q TRUE –e SESSION –m BASIC –w 10 –z 150
srvctl add service –d secours –s reporting_oci –r instance1, instance2 –l PHYSICAL_STANDBY –q TRUE –e SESSION –m BASIC –w 10 –z 150
  • Au niveau de la base de production (Primary) les services doivent être déclarés pour qu’ils soient propagés et appliqués sur la base de secours (Standby), ainsi tout client OCI qui se connecte au service hérite implicitement des attributs du service définis au niveau de la base de données, aussi il n’est pas utile de configurer TAF du côté du client dans le fichier tnsnames.ora
SQL> exec dbms_service.create_service(‘oltp_oci’,’oltp_oci’,NULL,NULL,TRUE,’BASIC’,’SESSION’,150,10,NULL);
exec dbms_service.create_service(‘reporting_oci’,’reporting_oci’,NULL,NULL,TRUE,’BASIC’,’SESSION’,150,10,NULL);

Configuration des services pour client JDBC

Les clients JDBC ne supportent pas TAF, aussi la configuration des services jdbc devraient être la suivante :

  • Cluster de production
srvctl add service –d production –s oltp_jdbc –r instance1, instance2 –l PRIMARY –q NONE –e NONE –m BASIC –w 0 –z 0
srvctl add service –d production –s reporting_jdbc –r instance1, instance2 –l PHYSICAL_STANDBY –q NONE –e NONE –m BASIC –w 0 –z 0
  • Cluster de secours
srvctl add service –d secours –s oltp_jdbc –r instance1, instance2 –l PRIMARY –q NONE –e NONE –m BASIC –w 0 –z 0
srvctl add service –d secours –s reporting_jdbc –r instance1, instance2 –l PHYSICAL_STANDBY –q NONE –e NONE –m BASIC –w 0 –z 0
  • Au niveau de la base de production (Primary) les services doivent être déclarés pour qu’ils soient propagés et appliqués sur la base de secours (Standby)
SQL> exec dbms_service.create_service(‘oltp_jdbc’,’oltp_jdbc’,NULL,NULL,FALSE,’NONE’,’NONE’,0,0,NULL);
exec dbms_service.create_service(‘olpt_jdbc’,’reporting_oci’,NULL,NULL,FALSE,’NONE’,’NONE’,0,0,NULL);

Configuration de la bascule pour les clients OCI et JDBC sans FAN

Dans cette section nous nous concentrerons uniquement sur la bascule automatique des clients qui ne supportent pas Fast Application Notification (FAN).

Bascule automatique pour les clients OCI

Pour une meilleure exécution l’alias réseau d’Oracle Net devrait initialiser l’option LOAD_BALANCE=OFF au niveau DESCRIPTION_LIST ainsi avec cette configuration les tentatives de connexion sur la deuxième DESCRIPTION ne seront effectives que si toutes les tentatives de connexion sur la première DESCRIPTION ont échoué.

  • Les clients OCI 11gR2 peuvent directement faire référence à l’alias réseau du SCAN introduit avec cette nouvelle version.
oltp_oci =
(DESCRIPTION_LIST=
   (LOAD_BALANCE=OFF)
   (FAILOVER=ON)
   (DESCRIPTION=
       (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
       (ADDRESS_LIST=
          (LOAD_BALANCE=ON)
          (ADDRESS=(PROTOCOL=TCP)(HOST=production-scan)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=oltp_oci)))
   (DESCRIPTION=
       (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
       (ADDRESS_LIST=
          (LOAD_BALANCE=ON)
          (ADDRESS=(PROTOCOL=TCP)(HOST=secours-scan)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=oltp_oci))))

Le SCAN est constituée de 3 adresses IP si la connexion essayée à l’adresse IP ne répond pas dans les 3 secondes TRANSPORT_CONNECT_TIMEOUT l’adresse IP suivante sera alors tentée. Toutes les 3 adresses IP seront essayées pour un total de quatre fois (la tentative initiale plus RETRY_COUNT dans cet exemple). Si la tentative de connexion est infructueuse sur le site de production la connexion sera alors basculée sur le site de secours avec le même mécanisme d’exécution de la connexion.

  • Alors que les clients OCI dont la version est antérieure à la 11gR2  doivent faire référence à l’alias réseau de la VIP ou l’adresse IP du SCAN.
oltp_oci =
(DESCRIPTION_LIST=
   (LOAD_BALANCE=OFF)
   (FAILOVER=ON)
   (DESCRIPTION=
       (ADDRESS_LIST=
          (LOAD_BALANCE=ON)
          (ADDRESS=(PROTOCOL=TCP)(HOST=production-vip1)(PORT=1521))
          (ADDRESS=(PROTOCOL=TCP)(HOST=production-vip2)(PORT=1521)))
          (CONNECT_DATA=(SERVICE_NAME=oltp_oci)))
   (DESCRIPTION=
       (ADDRESS_LIST=
          (LOAD_BALANCE=ON)
          (ADDRESS=(PROTOCOL=TCP)(HOST=secours-vip1)(PORT=1521))
          (ADDRESS=(PROTOCOL=TCP)(HOST=secours-vip2)(PORT=1521)))
          (CONNECT_DATA=(SERVICE_NAME=oltp_oci))))

Du coté du client il est recommandé d’initialiser dans le fichier ‘sqlnet.ora ‘ le paramètre SQLNET.OUTBOUND_CONNECT_TIMEOUT, ce paramètre permet de réduire la durée de tentative de connexion à chacun des serveurs indisponibles qui sont définis dans ADDRESS_LIST. Une valeur à 3 secondes pour ce paramètre convient dans la plupart des environnements.

Bascule automatique pour les clients JDBC

Comme nous l’avons dit précédemment les clients JDBC ne supportent pas TAF, aussi la logique de reconnexion doit être prise en compte par l’application pour répondre convenablement en cas de défaillance. Par exemple, quand une session du pool de connexion reçoit une exception qui engendre une déconnexion (comme une erreur ORA-3113), l’application devrait automatiquement essayer de reconnecter cette session. Les tentatives de reconnexion devraient être configurées pour qu’elles puissent durer aussi longtemps que la bascule des services est effective.

  • Client JDBC 11gR2
String dbURL =
   "jdbc:oracle:thin:@" +
   "(DESCRIPTION_LIST=" +
   “(LOAD_BALANCE=off)” +
   "(FAILOVER=on)" +
   "(DESCRIPTION=" +
     "(ADDRESS_LIST=" +
       "(LOAD_BALANCE=on)" +
       "(ADDRESS=(PROTOCOL=TCP)(HOST=production-scan)(PORT=1521)))" +
     "(CONNECT_DATA=(SERVICE_NAME=oltp-jdbc)))" +
   "(DESCRIPTION=" +
     "(ADDRESS_LIST=" +
       "(LOAD_BALANCE=on)" +
       "(ADDRESS=(PROTOCOL=TCP)(HOST=secours-scan)(PORT=1521)))" +
     "(CONNECT_DATA=(SERVICE_NAME=oltp-jdbc))))";
  •  Client JDBC antérieur à la version 11gR2
String dbURL =
  "jdbc:oracle:thin:@" +
  "(DESCRIPTION_LIST=" +
   “(LOAD_BALANCE=off)” +
   "(FAILOVER=on)" +
   "(DESCRIPTION=" +
     "(ADDRESS_LIST=" +
       "(LOAD_BALANCE=on)" +
       "(ADDRESS=(PROTOCOL=TCP)(HOST=production-vip1)(PORT=1521))" +
       "(ADDRESS=(PROTOCOL=TCP)(HOST=production-vip2)(PORT=1521)))" +
     "(CONNECT_DATA=(SERVICE_NAME=oltp-jdbc)))" +
   "(DESCRIPTION=" +
     "(ADDRESS_LIST=" +
       "(LOAD_BALANCE=on)" +
       "(ADDRESS=(PROTOCOL=TCP)(HOST=secours-vip1)(PORT=1521))" +
       "(ADDRESS=(PROTOCOL=TCP)(HOST=secours-vip2)(PORT=1521)))" +
     "(CONNECT_DATA=(SERVICE_NAME=oltp-jdbc))))";

Dans un prochain article nous verrons comment configurer les clients Oracle avec FAN

ADF : Copier/Coller un ViewObject

3 mai 2012

Effectuer la copie

Il peut arriver de temps en temps de vouloir dupliquer un ViewObject pour une raison X ou Y. Ou plus particulièrement un Row dans un ViewObject.

La méthode de copie est très simple, la voici :

ViewObject bookVO = /* récupération du ViewObject */;
Row foundBookRow = /* récupération du Row à copier */;
Row newBookRow = bookVO.createRow(); // Le Row dans lequel on va coller

// On parcours tous les attributs du Row trouvé
for (String name : foundBookRow.getAttributeNames()) {

	// On ne prend pas en compte l'ID du Row
	// Sinon on va dupliquer la clé primaire
	if (!"BookId".equals(name)) {
		// On effectue la copie de l'attribut
		newBookRow.setAttribute(name, foundBookRow.getAttribute(name));
	}

}

// On génère un faux ID (un trigger en BDD génèrera le bon tout seul)
newBookRow.setAttribute("BookId", new Number(-new Random().nextInt(999999999)));

// On insère notre Row dans le ViewObject
bookVO.insertRow(newBookRow);

// N'oubliez pas d'effectuer un commit si besoin.

Le 14 Juin, tirez parti de L’EXASTACK ORACLE dans votre organisation !

23 avril 2012

EASYTEAM organise le 14 Juin à PARIS un séminaire autour des solutions EXADATA et EXALOGIC, avec la présence des meilleurs experts de ces sujets. Ce séminaire vous permettra de découvrir les produits et les services d’EASYTEAM autour des solutions EXADATA et EXALOGIC, ainsi que d’appréhender plusieurs cas d’utilisation: Business Intelligence, Transactionnel, Exploitation SAP, Batchs etc…
Voir l’agenda du séminaire

My Oracle Support (MOS) : Premium et Extended Support

23 avril 2012

Aujourd’hui, je vais vous raconter une mésaventure survenue à un de nos clients, peut être se reconnaîtra-t-il, mais je resterais discret, en tout cas cela peut arriver à tous un jour ou l’autre et comme pour les contrats d’assurance c’est le petit détail auquel on a pas fait attention qui fait toute la différence ;  intérêt supplémentaire cela donne l’occasion de parcourir le chemin qui serpente autour de toutes les informations sur le support des versions des produits Oracle, et particulièrement de la base de données. Voici les faits : Lire la suite…

DUPLICATE…FROM ACTIVE DATABASE

17 avril 2012

Avez-vous déjà tenté de cloner une base à chaud…sans aucune sauvegarde RMAN? Vous pensez peut être à un “DUPLICATE” RMAN ? Et bien oui, mais pas tout à fait ! Pourquoi ? Un duplicate nécessite une sauvegarde RMAN disponible pour pouvoir créer la copie de la base. Mais la solution qui vous est proposée ici est de cloner une base sans avoir au préalable une sauvegarde RMAN.

Avec la 11g, Oracle offre cette possibilité avec la commande “DUPLICATE….FROM ACTIVE DATABASE”. Dans ce chapitre, vous trouverez les différentes étapes pour implémenter cette solution.

Dans l’exemple ci-dessous, vous allez dupliquez une base en version 11.2.0.1 sur un serveur Windows (XP/64bits).

  • Préparez l’arborescence qui va accueillir la nouvelle base :
C:\ORACLE_DB\SATURNE
C:\ORACLE_DB\SATURNE\DATA
C:\ORACLE_DB\SATURNE\REDO
C:\ORACLE_DB\SATURNE\CTRL
  • Générez un pfile de la base source :
C:\>set ORACLE_SID=NEPTUNE
C:\>sqlplus / as sysdba
SQL>create pfile='C:\app\oracle\product\11.2.0\dbhome_1\database\init_SATURNE.ora' from spfile;
Fichier créé.

SQL>exit
  • Ouvrez le fichier init_SATURNE.ora généré sous “%ORACLE_HOME%/database”

Modifiez toutes les entrées du fichier en remplaçant le nom de la base source par le nom de la base dupliquée :
Dans l’exemple, la chaîne NEPTUNE est remplacée par SATURNE, vous obtenez un fichier de ce style là :

*.audit_file_dest='C:\app\oracle\admin\saturne\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='C:\ORACLE_DB\SATURNE\DATA\control01.ctl','C:\ORACLE_DB\SATURNE\CTRL\control02.ctl'
*.db_block_size=8192
*.db_domain='world'
*.db_name='saturne'
*.db_recovery_file_dest='C:\app\oracle\flash_recovery_area'
*.db_recovery_file_dest_size=3117416448
*.diagnostic_dest='C:\app\oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=saturneXDB)'
*.nls_language='FRENCH'
*.nls_territory='FRANCE'
*.open_cursors=300
*.pga_aggregate_target=106954752
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=220864256
*.undo_tablespace='UNDOTBS1'
  • Créez le service windows associé à la nouvelle base
C:\oradim -new -sid SATURNE
Instance créé.
  • Créez un fichier passwordfile avec l’utilitaire “orapwd”:
C:\orapwd file=PWDSATURNE password=sys_pass01
  • Ajoutez le descripteur de connexion dans le fichier TNSNAMES.ora
SATURNE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = saturne)
)
)
  • Ajoutez uen entrée dans le fichier LISTENER.ora pour éviter que la nouvelle base bloque les connexions lorsqu’elle est en mode NOMOUNT :
(SID_DESC =
(SID_NAME = SATURNE)
(ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
)
  • Rafraichissez les services du listener :
C:\lsnrctl reload
...
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
La commande a réussi
  • Testez la connexion au service SATURNE
C:\tnsping SATURNE
...
Adaptateur TNSNAMES utilisé pour la résolution de l'alias
Tentative de contact de (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = hostname
)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SID = saturne)))
OK (90 msec)
  • Démarrez la base en mode NOMOUNT avec le fichier init_SATURNE.ora
C:\ sqlplus / as sysdba
SQL>startup nomount pfile='C:\app\oracle\product\11.2.0\dbhome_1\database\init_SATURNE.ora'
Instance ORACLE lancée.

Total System Global Area 221790208 bytes
Fixed Size 1373684 bytes
Variable Size 83888652 bytes
Database Buffers 134217728 bytes
Redo Buffers 2310144 bytes
SQL>exit
  • Connectez-vous à RMAN sur la base source (target) et sur la base cible (auxiliary) :
C:\rman
RMAN> connect target sys/sys_pass123@NEPTUNE

connecté à la base de données cible : NEPTUNE (DBID=123456789)

RMAN> connect auxiliary sys/sys_pass01@SATURNE

connexion établie avec la base de données auxiliaire : SATURNE (non montée)

RMAN>
  • Lancez la commande de duplication :
RMAN> duplicate target database to SATURNE from active database
2>db_file_name_convert ‘C:\ORACLE_DB\NEPTUNE\DATA\','C:\ORACLE_DB\SATURNE\DATA\';

executing command: SET NEWNAME

executing command: SET NEWNAME

....

contenu de script mémoire:
{
Alter clone database open resetlogs;
}
exécution de script mémoire

base de données ouverte
Fin de Duplicate Db dans 27/03/12

RMAN>
  • Vérifiez l’état de votre nouvelle base :
C:\sqlplus / as sysdba
SQL> select name from v$database;
NAME
---------
SATURNE

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> select file_name from dba_data_files;

FILE_NAME
-------------------------------------------------------

C:\ORACLE_DB\SATURNE\DATA\SYSTEM01.DBF
C:\ORACLE_DB\SATURNE\DATA\SYSAUX01.DBF
C:\ORACLE_DB\SATURNE\DATA\UNDOTBS01.DBF
C:\ORACLE_DB\SATURNE\DATA\USERS01.DBF
C:\ORACLE_DB\SATURNE\DATA\DATA01.DBF
C:\ORACLE_DB\SATURNE\DATA\INDXS01.DBF

SQL>

Et voilà, la nouvelle base est prête !
Pensez donc à cette solution lorsque vous avez une base à cloner. Cette fonctionnalité permet aussi de créer une STANDBY. L’option ‘FROM ACTIVE DATABASE’ offre donc un gain de temps sur la duplication d’une base de données. Vous disposez de données récentes et d’une image parfaite de la base source. Si vous prenez le temps d’éplucher la log RMAN vous comprendrez mieux la notion “ACTIVE DATABASE”. En effet, vous y verrez les différentes étapes de duplication. Il n’est pas nécessaire d’analyser la totalité de la log, mais vous constaterez qu’à un moment, RMAN effectue une sauvegarde de la base source. C’est cette sauvegarde qui sert à la duplication.

Sources :
Oracle® Database Backup and Recovery Reference
11g Release 1 (11.1)

ADF : Comparer Number et Integer dans une Expression Language

11 avril 2012

Vous qui développez avec le framework ADF, il vous est déjà arrivé – ou vous arrivera un jour – de vouloir comparer un oracle.jbo.domain.Number avec un nombre entier dans une Expression Language. Sûrement pour afficher un nombre d’éléments quelconques.

Supposons que vous ayez un bindings nommé CountElements de type Number qui vous fourni ce nombre. Vous avez envie d’écrire la ligne suivante dans votre jsff.

<af:outputText value="#{bindings.CountElements.inputValue} elements in my page" id="ot1"/>

Dans la ligne ci-dessus, vous remarquez que le mot “elements” sera toujours au pluriel, alors vous allez me proposer la solution suivante :

<af:outputText value="#{bindings.CountElements.inputValue} #{bindings.CountElements.inputValue>1?'elements':'element'} in my page" id="ot1"/>

Mais si vous testez ce code, vous obtiendrez dès la première exécution l’exception suivante :

java.lang.IllegalArgumentException: Cannot convert 5 of type class oracle.jbo.domain.Number to class java.lang.Long

Lire la suite…

Vérifier le fonctionnement du multicast sur le réseau privé de votre infrastructure Grid

5 avril 2012
by

Depuis, la version 11g (11.2.0.2), l’infrastructure Grid d’Oracle qui gère la couche de mise en grappe de “Oracle Real Application Cluster” ainsi que le stockage via “Oracle Automatic Storage Management” permet de créer de la redondance d’interfaces dans le réseau privé de la grappe  (ie le plus important car il gère les échanges entre les noeuds). L’infrastructure Grid s’appuie pour cela sur le multicast IP et est nécessaire à l’installation. Il est donc important de bien vérifier que le multicast fonctionne correctement sur les commutateurs réseau avant de lancer un déploiement afin de pouvoir anticiper et résoudre les éventuels problèmes. Lire la suite…

Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 384 followers