catupgrade sans utlu112i.sql

Lors d’une mise à jour manuelle vers une version 11.2.xx de votre base de données, il vous est demandé de passer au préalable le script utlu112i.sql fourni avec la nouvelle distribution, mais sur votre ancien environnement 10G,  ceci est clairement décrit comme étape 1) dans la note MOS 837570.1 “Complete Checklist for Manual Upgrades to 11gR2” . Très facile lorsque l’on est sur le serveur d’origine, mais que faire lorsque l’on vient d’installer une nouvelle machine et que l’ancienne distribution n’est plus là. Si vous tentez d’exécuter le script catupgrade vous aller vous retrouver avec l’erreur suivante en provenance du script catupstr qui est chargé de faire les vérifications préalables à la mise à jour et ne pas pouvoir continuer :

SQL> SELECT TO_NUMBER('MUST_BE_SAME_TIMEZONE_FILE_VERSION')
2 FROM registry$database
3 WHERE tz_version != (SELECT version from v$timezone_file);
SELECT TO_NUMBER('MUST_BE_SAME_TIMEZONE_FILE_VERSION')
*
ERROR at line 1:
ORA-01722: invalid number

Oracle donne pour seul moyen de correction la restauration de la base dans la version d’origine, pour ensuite absolument exécuter le script utlu112i.sql.
On peut cependant s’en sortir, surtout si vous n’utilisez pas les types TIMESTAMP WITH TIMEZONE ; dans le cas contraire c’est plus compliqué, il faudra se référer à la documentation Oracle, particulièrement le manuel “Oracle® Database Globalization Support Guide 11g Release 2 (11.2) 10729-04” et  le chapitre “Upgrading the Time Zone File and Timestamp with Time Zone Data” pour terminer la mise à jour correctement.
Donc si vous n’utilisez pas les types TIMESTAMP WITH TIMEZONE,  vous pouvez prendre par défaut n’import quelle valeur inférieur à 14 pour la définition de la zone de temps, admettons que nous choisissions le “4” ,
il vous suffit alors de faire la série de commandes SQL suivantes, avec les droits SYSDBA bien sur :

SQL>UPDATE registry$database set tz_version = 4 ;
SQL> DELETE sys.props$ WHERE name IN ('DST_UPGRADE_STATE','DST_PRIMARY_TT_VERSION','DST_SECONDARY_TT_VERSION') ;
4 rows deleted.
SQL>INSERT INTO sys.props$ (name, value$, comment$) values ('DST_UPGRADE_STATE','NONE','State of Day Light Saving Time Upgrade');
1 row created.
SQL> INSERT INTO sys.props$ (name, value$, comment$) VALUES ('DST_PRIMARY_TT_VERSION',TO_CHAR(4,'FM999'),'Version of primary timezone data file');
SQL> INSERT INTO sys.props$ (name, value$, comment$) VALUES ('DST_SECONDARY_TT_VERSION','0','Version of secondary timezone data file');
SQL> commit;

Une fois ces opérations terminées, le script catupgrd.sql passe comme une lettre à la poste, à la condition que les autres pré-requis et actions de la note citée précédemment soient bien respectés : espace disponible dans les tablespaces SYSTEM et SYSAUX , objets invalides etc…
En souhaitant que cette petite entrée débloque certain d’entre vous et permette une mise à jour sereine.