Oracle-Upgrade auf 11.2.0.4

Die schlechte Nachricht: Man vergisst jedes Mal was. IMMER.
Die gute Nachricht: Ist nicht so schlimm. Kann nachgeholt werden. Kostet aber Zeit.

Im Folgenden wird von einer Windows-Installation mit zwei Instanzen ausgegangen. Das Upgrade wird von remote ausgeführt, deshalb alle Aktionen soweit als möglich per Skript.
Gesamte Zeitdauer: Backup + 3 Stunden

Parameter:
Setup-CDs wurden nach c:\temp\11.2.0.4 entpackt. Patches aus dem OTN nach c:\temp\patch, neuer opatch nach c:\temp\opatch
altes ORACLE_HOME: c:\oracle\product\11.2.0\db_home1
neues ORACLE_HOME: c:\oracle\product\11.2.0.4\db_home1
Instanzen heißen im Beispiel Inst1 und Inst2

cmd „Als Administrator ausführen“
cd c:\temp
net stop „OracleMTSRecoveryService“
net stop „Distributed Transaction Coordinator“
.\11.2.0.4\database\setup.exe
Hier alle Optionen wie bei der „letzten“ Installation.

set ORACLE_HOME=c:\oracle\product\11.2.0.4\dbhome_1
move %ORACLE_HOME%\opatch %ORACLE_HOME%\opatch.old
move c:\temp\opatch %ORACLE_HOME%\
cd .\patch\20833831
%ORACLE_HOME%\Opatch\opatch apply
Datum des Patches überprüfen mit %ORACLE_HOME%\Opatch\opatch lsinventory.

set ORACLE_HOME=c:\oracle\product\11.2.0\dbhome_1
set ORACLE_SID=INST1
sqlplus sys/ as sysdba
select count(*) from all_objects where status=’INVALID‘;
@?\rdbms\admin\utlrp.sq
@C:\oracle\product\11.2.0.4\dbhome_1\RDBMS\ADMIN\utlu112i.sql
create pfile=’C:\oracle\product\11.2.0.4\dbhome_1\database\initINST1.ora‘ from spfile;
create spfile=’C:\oracle\product\11.2.0.4\dbhome_1\database\SPFILEINST1.ORA‘ from pfile=’C:\oracle\product\11.2.0.4\dbhome_1\database\initINST1.ora‘;
exit

copy C:\oracle\product\11.2.0\dbhome_1\database\PWDINST1.ora C:\oracle\product\11.2.0.4\dbhome_1\database

Gleich werden die Instanzen runtergefahren. Mit dem Verzeichnis der Datenbankfiles selbst (c:\u01\…) passiert nichts.

set ORACLE_SID=INST2
sqlplus sys/ as sysdba
select count(*) from all_objects where status=’INVALID‘;
@?\rdbms\admin\utlrp.sq
@C:\oracle\product\11.2.0.4\dbhome_1\RDBMS\ADMIN\utlu112i.sql
create pfile=’C:\oracle\product\11.2.0.4\dbhome_1\database\initINST2.ora‘ from spfile;
create spfile=’C:\oracle\product\11.2.0.4\dbhome_1\database\SPFILEINST2.ORA‘ from pfile=’C:\oracle\product\11.2.0.4\dbhome_1\database\initINST2.ora‘;
shutdown immediate
exit

copy C:\oracle\product\11.2.0\dbhome_1\database\PWDINST2.ora C:\oracle\product\11.2.0.4\dbhome_1\database

set ORACLE_SID=INST1
sqlplus sys/ as sysdba
shutdown immediate
exit

lsnrctl stop
copy C:\oracle\product\11.2.0\dbhome_1\network\admin\*.ora C:\oracle\product\11.2.0.4\dbhome_1\network\admin
ACHTUNG FALLE: In der sqlnet.ora steht wahrscheinlich noch der Pfad zum alten ORACLE_HOME. Verhindert am Ende fröhlich die Deinstallation der alten Software. Anpassen.

sc delete OracleOraDb11g_home1TNSListener
set ORACLE_HOME=c:\oracle\product\11.2.0.4\dbhome_1
cd %ORACLE_HOME%\bin
lsnrctl start
(Neuer Listener wird dadurch automatisch angelegt.)

set ORACLE_HOME=c:\oracle\product\11.2.0\dbhome_1
oradim -DELETE -SID INST1
oradim -DELETE -SID INST2

set ORACLE_HOME=c:\oracle\product\11.2.0.4\dbhome_1
oradim -new -sid INST1 -startmode manual -srvcstart system -spfile
oradim -new -sid INST1 -startmode manual -srvcstart system -spfile
(Ich würde Oracle-Instanzen immer manuell starten. Glaubenssache.)

Ab jetzt parallel in zwei Terminals. Skripte laufen ca. 2 Stunden. Die meiste Zeit wird der Server damit beschäftigt sein, Archivelogs auf die Platte(n) zu schreiben.

cd %ORACLE_HOME%\rdbms\admin
set ORACLE_SID=INST1
sqlplus sys/ as sysdba
startup upgrade
spool c:\temp\INST1_11.2.0.4.log
@catupgrd.sql

sqlplus sys/ as sysdba
startup
@?/rdbms/admin/utlrp.sql
execute dbms_stats.gather_fixed_objects_stats;
@?/rdbms/admin/catuppst.sql

@?/rdbms/admin/utlu112s.sql

set ORACLE_SID=INST2
sqlplus sys/ as sysdba
startup upgrade
spool c:\temp\INST2_11.2.0.4.log
@catupgrd.sql

sqlplus sys/ as sysdba
startup
@?/rdbms/admin/utlrp.sql
execute dbms_stats.gather_fixed_objects_stats;
@?/rdbms/admin/catuppst.sql

@?/rdbms/admin/utlu112s.sql

set ORACLE_HOME=c:\oracle\product\11.2.0\dbhome_1
cd %ORACLE_HOME%\deinstall
.\deinstall.bat
Wenn das nicht funktioniert:
set ORACLE_HOME=
c:\oracle\product\11.2.0\dbhome_1\deinstall\deinstall.bat
net start „OracleMTSRecoveryService“
net start „Distributed Transaction Coordinator“

Auf invalid_objects prüfen. Bei uns waren die ctx-Packages fehlerhaft:
grant select on SYS.DBA_INDEXES to ctxsys;
grant select on SYS.DBA_TRIGGERS to ctxsys;
grant select on SYS.DBA_PART_KEY_COLUMNS to ctxsys;
grant select on SYS.DBA_SEGMENTS to ctxsys;

ACHTUNG FALLE: Die Config der dbconsole ist im alten ORACLE_HOME. Also im Zweifel schon gelöscht. Möglicherweise steht aber noch was in der Registry, was auf den alten Standort verweist. Bei uns stand der SYSMAN-Key mit den alten Pfaden noch unter HKLM\Software\Oracle. Key löschen.

set ORACLE_SID=INST1
set ORACLE_UNQNAME=INST1
set ORACLE_HOME=c:\oracle\product\11.2.0.4\dbhome_1
%ORACLE_HOME%\bin\emca -config dbcontrol db -repos recreate
(Erste Instanz wird automatisch auf Port 1158 erzeugt, zweite Instanz auf Port 5500).
Wenn ORA-01017 kommt: In sqlnet.ora die Authentifizierung von NONE auf NTS umstellen).

Pro Instanz im normalen Betrieb für ca. 1 Stunde laufen lassen:
DBMS_STATS.gather_system_stats(‚Start‘);
DBMS_STATS.gather_system_stats(‚Stop‘);

Datenbank-Directories valide, oder steht da noch der alte Pfad?
SELECT * FROM dba_directories;