Blog

Blog

Migration 10g->11G avec changement d'OS User

Le client pour lequel j'ai du faire cette migration a changé de stratégie pour la gestion des users OS et j'ai donc du faire une migration de 10gR2 vers 11gR2 sans dbua... Hé oui, c'est la surprise du chef, il n'est pas possible d'utiliser dbua dans ce cas... (cf note metalink 984511.1). D'accord, le plus dur dans un upgrade, c'est de convaincre son chef que c'est important, utile et que ça ne lui coûtera pas trop cher, mais une fois que c'est fait, on n'est pas arrivés pour autant! Voici donc la liste des étapes à effectuer (je passerai rapidement sur certaines choses triviales) :

Installer les binaires 11gR2

Je vous laisse faire cette action tout seul. C'est pas le plus compliqué (quoi que l'install des prérequis quand on n'a pas yum n'est pas ce que je préfère), mais la documentation Oracle est très complète sur ce point.

Lancer l'outil de pré-upgrade

Là encore, c'est assez simple, connecté en sqlplus as sysdba sur l'ancien user oracle, lancer les requêtes suivantes :
SPOOL log_file.log
@new_oracle_home/rdbms/admin/utlu112i.sql
SPOOL OFF

Vérifier que les vues matérialisées sont à jour

Requête toute simple : s'il n'y a pas de résultat, il n'y a rien à faire. Sinon il faudra rafraîchir les vues sorties :
SELECT * FROM sys.obj$ o, sys.user$ u, sys.sum$ s WHERE o.type# = 42 AND bitand(s.mflags, 8) = 8;

S'assurer qu'aucun fichier n'a besoin d'un recovery

Si la requête suivante ramène des résultats, lancer le recovery jusqu'à ce qu'elle n'en ramène plus.
SELECT * FROM v$recover_file;

Vérifier qu'aucun fichier n'est en mode Backup

Remettre les fichiers résultats de cette requête ne mode normal :
SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';

Résoudre les transactions en attente

Si la première requête ramène des résultats, lancer la procedure dbms_transaction.purge_lost_db_entry('id_trans') et commiter.
SELECT * FROM dba_2pc_pending;

Purger la corbeille

Il suffit de faire la commande suivante sous sqlplus :
PURGE dba_recyclebin;

Faire une sauvegarde (;-))

Je préfère faire une sauvegarde à froid pour ce genre de chose, mais il est parfaitement possible de faire une sauvegarde à chaud si on est en mode archive log.
rman target / nocatalog
RUN
{ 
    ALLOCATE CHANNEL c1 TYPE DISK; 
    SHUTDOWN IMMEDIATE; 
    STARTUP MOUNT; 
    BACKUP DATABASE FORMAT '/u01/app/backup_before_upgrade/%U' TAG before_upgrade; 
    BACKUP CURRENT CONTROLFILE FORMAT '/u01/app/backup_before_upgrade/control01.ctl'; 
}

Préparation du nouveau pfile

On commence par se connecter à la base pour créer le pfile.
CREATE PFILE='your_path_and_file_name' FROM SPFILE;
Puis, on regarde le pfile et on supprime les paramètres dépréciés (background_dump_dest, user_dump_dest) et on modifie également les paramètres permettant de bénéficier des nouvelles fonctionnalités (memory_max_target, memory_target vs sga_target, sga_max_target, pga_aggregate_target). On nn'oublie pas de mettre le paramètre de compatibilité (*.compatible='10.2.0.3.0').

Modifier /etc/oratab

Il faut penser à modifier le fichier /etc/oratab pour faire pointer le ORACLE_HOME de la base à migrer vers notre tout nouveau ORACLE_HOME 11G.

Modifier les droits sur les fichiers de la base

On commence par arrêter la base avant de manipuler les droits OS sur les fichiers.
shutdown immediate
Il faut ensuite mettre comme owner des répertoires de la base le nouveau user Oracle. Voici la liste des répertoires à modifier :
  • Répertoires des fichiers de données
  • Répertoires des fichiers de contrôles
  • Répertoires des pfile et spfile
  • Répertoires des archivelogs
  • Répertoires des redos
Commande système à passer sous Linux:
chown -R newUser:oinstall your_rep

Lancer l'outil d'upgrade

Avant de lancer l'outil, bien s'assurer que les variables suivantes sont settées correctement et si nécessaire sur l'environnement 11G :
  • ORACLE_HOME
  • PATH
  • ORACLE_SID
Aller dans le répertoire $ORACLE_HOME/rdbms/admin et démarrer l'instance via sqlplus (connecté as sysdba):
STARTUP MIGRATE PFILE='your_pfile_destination'
Lancer l'outil d'upgrade en mettant un fichier de spool :
SPOOL 'your_log_file'
@catupgrd.sql
SPOOL OFF
Cette exécution est TRES longue... L'outil arrête lorsqu'il a finit et vous déconnecte d'sqlplus. Il faut ensuite redémarrer la base et lancer les outils de post-upgrade :
STARTUP PFILE='your_pfile'
@utlu112s.sql
-> Tous les éléments doivent être valides Puis, on peut lancer la dernière phase de l'upgrade :
@catuppst.sql
Et on recompile les objets invalides :
@utlrp.sql
Et on peut regarder les objets invalides :
SELECT count(*) FROM dba_invalid_objects;
Si tout est bon, on peut créer le spfile :
CREATE SPFILE='your_spfile' FROM PFILE='your_pfile';
Il ne reste plus qu'à modifier les différents scripts qui tournent sur la base pour pointer sur le bon ORACLE_HOME et à s'assurer que les connecteurs JDBC ou autres sont compatibles Oracle 11gR2!