Migration manuelle d'une instance Oracle 8.1.7.x vers 9.2.x

Introduction

Cet article présente la migration manuelle d'une instance Oracle de la version 8.1.7.4 vers la version 9.2.0.6. La plateforme est un environnement Unix Solaris 2.8, le composant Jserver n'est pas installé sur l'instance, la réplication et le RAC (Real Application Cluster) ne sont pas mis en œuvre.

Prérequis

Upgrade des colonnes utilisateur de type nchar (nchar, nvarchar2, nclob)

Avec Oracle 9i, les types de données NCHAR (NCHAR, NVARCHAR2 et NCLOB) sont désormais limités à UTF8 et AL16UTF16. En version 8, la compatibilité des jeux de caractère autres que UTF8 et AL16UTF16 avec les types de données NCHAR (comme par exemple JA16SJISFIXED) n'est plus supportée.

Si initialement le jeu de caractères est UTF8, il demeure en UTF8 après migration Oracle 9, dans tous les autres cas, le jeu de caractères est migrée vers le jeu AL16UTF16 pour ces colonnes NCHAR. Oracle recommande d'utiliser l'outil « character set scanner » sur les colonnes de types NCHAR avant migration afin d'identifier les caractères invalides potentiels pour la conversion.

Des actions spécifiques sont nécessaires au cours de la migration vers la version 9 pour les colonnes utilisateur nchar, nvarchar2 et nclob (étape décrite dans ce document). Les colonnes système de type nchar sont prises en charge par la migration.

Pour savoir si des colonnes de type NCHAR sont mises en œuvre dans l'instance :

select table_name, owner, data_type
from dba_tables
where owner not in ('SYS','SYSTEM')
and data_type in ('NCHAR', 'NVARCHAR2', 'NCLOB');

Dimensionnement du tablespace system

Avant d'opérer la migration, il faut s'assurer qu'il reste assez d'espace libre dans le tablespace SYSTEM. Le tableau ci-dessous récapitule l'espace nécessaire pour le tablespace SYSTEM en fonction de la version initiale de l'instance.

Version Espace additionnel nécessaire pour le tablespace SYSTEM
9.0.1 16 Mb
8.1.7 52 Mb
8.0.6 70 Mb
7.3.4 85 Mb

La vue dba_free_space donne l'espace libre dans le tablespace SYSTEM :

select sum(bytes/1024000) as "Free space (Mb)",
       tablespace_name
from dba_free_space
group by tablespace_name; Free space (Mb) tablespace_name
  --------------- -----------------------
             2.04 INDX
           19.592 RBS
            223.8 SYSTEM
             3.88 USERS

Dimensionnement des rollback segments pour l'upgrade

Un large segment d'annulation public (rollback segment) est nécessaire pour migrer les bases de données contenant un large nombre d'objets (packages, tables etc...). Un segment d'annulation d'au moins 70 Mb est recommandé lorsque le nombre d'objets dans la base excède 5000.

Pour déterminer le nombre total d'objets dans une base de données :

select count(*) from dba_objects;
COUNT(*)
----------
2947

Lorsque ce nombre dépasse 5000. Il est préférable de créer un large segment d'annulation public (public rollback segment) pour la migration, pour créer ce dernier :

create publick rollback segment rbs_upgrade tablespace rbs storage (maxextents unlimited);
alter rollback segment rbs_upgrade online;

Pour vérifier le statut ONLINE de ce nouveau segment d'annulation :

select segment_name, tablespace_name,status from dba_rollback_segs
where segment_name='RBS_UPGRADE';
SEGMENT_NAME TABLESPACE_NAME STATUS
------------ --------------- -------------
RBS_UPGRADE  RBS             ONLINE 

Au prochain redémarrage de l'instance à migrer, pour spécifier que ce segment d'annulation doit être en ligne, public et unique, modifier le fichier d'initialisation de l'instance init<INSTANCE_NAME>.ora pour ne mettre que le segment d'annulation rbs_upgrade dans le paramètre rollback_segments :

init<INSTANCE_NAME>.ora
# Fichier d'initialisation de l'instance
# rollback_segments=(RBS01,RBS02,RBS03,RBS04)
rollback_segments=(RBS_UPGRADE)

Migration manuelle

Sauvegarde à froid de l'instance 8.1.7

Avant la migration, une sauvegarde à froid de l'instance 8.1.7 doit être faite. Cette sauvegarde à froid consiste à sauvegarder tous les fichiers (fichiers de données, fichiers de redo log et fichiers de contrôle).

Pour récupérer tous les fichiers de données :

select name from v$datafile union select name from v$tempfile;
/cgcdb/oracle/OEMD1ORA/INDX_01.DBF
/cgcdb/oracle/OEMD1ORA/RBS_01.DBF
/cgcdb/oracle/OEMD1ORA/SYSTEM_01.DBF
/cgcdb/oracle/OEMD1ORA/TEMP_01.DBF
/cgcdb/oracle/OEMD1ORA/USERS_01.DBF
/cgcdb/ora