Upgrade Database From 11g To 12c Manually

A database can be upgraded either using DBUA or manual method. But for major production databases, it is better to do it manually, so that troubleshooting will be easy. Here we will provide steps for upgrading from 11gr2 to 12c database manually.

Before starting the upgrade make sure Oracle 12c database binary already installed on the database server.

You can refer the Installation steps here: https://dbaclass.com/article/how-to-install-oracle-12c-on-linux/

SEE ALSO : Upgrade database from 11g to 12c using OEM cloud control

SEE ALSO: Upgrade database from 11g to 12c using DBUA ( GUI method)

Current ORACLE_HOME= /apps/oracle/product/11.2.0.3

Target ORACLE_HOME=/apps/oracle/product/12.1.0.2

PRECHECKS:

1.CHECK THE INVALID OBJECTS( ALL SHOULD BE VALID)


SQL>  select comp_id,status from dba_registry;

COMP_ID                        STATUS
------------------------------ -----------
CATALOG                        VALID
CATPROC                        VALID

2. Check duplicate objects owned by system and sys


select object_name, object_type
from dba_objects
where object_name||object_type in
   (select object_name||object_type
    from dba_objects
    where owner = 'SYS')
and owner = 'SYSTEM';SP2-0734: unknown command beginning "olumn obje..." - rest of line ignored.
SQL> SQL>   2    3    4    5    6    7


OBJECT_NAME                                              OBJECT_TYPE
---------------------------------------------------   -------------------
DBMS_REPCAT_AUTH                                         PACKAGE BODY
AQ$_SCHEDULES_PRIMARY                                       INDEX
AQ$_SCHEDULES                                               TABLE
DBMS_REPCAT_AUTH                                           PACKAGE

     If you found any other objects other than these four, then those need to be cleaned up.

3.Check the integrity of the database by running dbupgdiag-2

SQL >@dbupgdiag.sql

*** Start of LogFile ***

Oracle Database Upgrade Diagnostic Utility 05-13-2015 09:09:57

===============
Hostname
===============

primary-host

===============
Database Name
===============

PROD

===============
Database Uptime
===============

22:31 10-MAY-15

=================
Database Wordsize
=================

This is a 64-bit database

================
Software Version
================

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for Solaris: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

=============
Compatibility
=============

Compatibility is set as 11.2.0

================
Archive Log Mode
================

Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /uv1172/apps/oracle/product/11.2.0.2.2013Q4/dbs/arch
Oldest online log sequence 15143
Current log sequence 15145

================
Auditing Check
================


NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /uv1172/ofaroot/PROD/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string NONE

================
Cluster Check
================

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database boolean FALSE
cluster_database_instances integer 1

DOC>################################################################
DOC>
DOC> If CLUSTER_DATABASE is set to TRUE, change it to FALSE before
DOC> upgrading the database
DOC>
DOC>################################################################
DOC>#

===========================================
Tablespace and the owner of the aud$ table
===========================================

OWNER TABLESPACE_NAME
------------ ------------------------------
SYS SYSTEM

============================================================================
count of records in the sys.aud$ table where dbid is null- Standard Auditing
============================================================================


0


============================================================================================
count of records in the system.aud$ when dbid is null, Std Auditing with OLS or DV installed
============================================================================================
select count(*) from system.aud$ where dbid is null
*
ERROR at line 1:
ORA-00942: table or view does not exist




======================================================
List of Invalid Database Objects Owned by SYS / SYSTEM
======================================================


Number of Invalid Objects
------------------------------------------------------------------
There are 2 Invalid objects


================
Component Status
================

Comp ID Component Status Version Org_Version Prv_Version
------- ---------------------------------- --------- -------------- -------------- --------------
CATALOG Oracle Database Catalog Views VALID 11.2.0.2.0 10.2.0.1.0 10.2.0.1.0
CATALOG Oracle Database Catalog Views VALID 11.2.0.2.0 10.2.0.1.0 10.2.0.1.0
Oracle Multimedia/interMedia is installed and listed with the following version: 11.2.0.2.0 and status: VALID
.
Checking for installed Database Schemas...
ORDSYS user exists.
ORDPLUGINS user exists.
MDSYS user exists.
SI_INFORMTN_SCHEMA user exists.
ORDDATA user exists.
.
Checking for Prerequisite Components...
JAVAVM installed and listed as valid
XDK installed and listed as valid
XDB installed and listed as valid
Validating Oracle Multimedia/interMedia...(no output if component status is valid)
ORDIM INVALID OBJECTS: CARTRIDGE - 5 - 11
ORDIM DICOM repository has 0 documents.
The following default DICOM repository documents are not installed:
ordcman.xml
ordcmcmc.xml
ordcmcmd.xml
ordcmct.xml
ordcmmp.xml
ordcmpf.xml
ordcmpv.xml
ordcmsd.xml
ordcmui.xml

PL/SQL procedure successfully completed.


*** End of LogFile ***

Check the output log for invalid objects and make a note of them.
4. Run utlrp.sql to validate invalid objects

SQL>@/apps/oracle/product/11.2.0.3/utlrp.sql

5. Run preupgrade tool

Copy the Pre-Upgrade Information Tool script preupgrd.sql and utluppkg.sql from the Oracle Database 12c Release 1 (12.1) i.e /apps/oracle/product/12.1.0.2/rdbms/admin   to /apps/oracle/product/11.2.0.3/rdbms/admin

SQL> @$ORACLE_HOME/rdbms/admin/preupgrd.sql
----It will generate below files

$ cd /apps/oracle/cfgtoollogs/PROD/preupgrade/
$ ls -ltr
total 28
-rw-r--r-- 1 oracle dba 7068 Apr 21 03:56 preupgrade.log
-rw-r--r-- 1 oracle dba 3568 Apr 21 03:56 preupgrade_fixups.sql
-rw-r--r-- 1 oracle dba 2637 Apr 21 03:56 postupgrade_fixups.sql

Execute the preupgrade_fixup.sql and check whether changes are reflecting or not.

SQL> @ /apps/oracle/cfgtoollogs/PROD/preupgrade/preupgrade_fixups.sql

If still, changes are not reflecting  Check the preupgrade_fixups.sql script and do the changes manually.

In my case, it recommended changing parameters as below.

– Alter system set PROCESSES=300 SCOPE=SPFILE
– Execute dbms_preup.purge_recyclebin_fixup;
– Alter system set JOB_QUEUE_PROCESSES= 100
– Execute dbms_stats.gather_dictionary_stats;

So let’s do the above changes before proceeding with the next step.

6. Dependencies on Network Utility Packages

SQL> SELECT * FROM DBA_DEPENDENCIES
WHERE referenced_name IN ('UTL_TCP','UTL_SMTP','UTL_MAIL','UTL_HTTP','UTL_
INADDR','DBMS_LDAP')
AND owner NOT IN ('SYS','PUBLIC','ORDPLUGINS'); 2 3 4

no rows selected

6. Take ddl backup of db_link backups:

    During the upgrade to Oracle Database 12c any passwords in database links are encrypted.
To downgrade to the original release, all of the database links with encrypted passwords must be dropped prior to the downgrade.

7. Check the timezone version:

SQL> SELECT version FROM v$timezone_file;

VERSION
----------
14

For 12c, the new timezone is 18. So after the db upgrade is completed, we will upgrade the dst timezone from 14 to 18.
8. Optimizer Statistics

SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

PL/SQL procedure successfully completed.

9. Verify That Materialized View Refreshes Have Completed Before Upgrading

SQL> select s.obj#,o.obj#,s.containerobj#,lastrefreshdate,pflags,xpflags,o.name,o.owner#, bitand(s.mflags, 8) from obj$ o, sum$ s
where o.obj# = s.obj# and o.type# = 42 AND bitand(s.mflags, 8) = 8; 2

no rows selected

10. Ensure That No Files Need Media Recovery Before Upgrading

SQL> SELECT * FROM v$recover_file;

no rows selected

11. Ensure That No Files Are in Backup Mode Before Upgrading

SQL> SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';

no rows selected

12. Resolve Outstanding Distributed Transactions Before Upgrading

SQL> SELECT * FROM dba_2pc_pending;

no rows selected

13. Purge the Database Recycle Bin Before Upgrading :

SQL> PURGE DBA_RECYCLEBIN;

DBA Recyclebin purged.

14. Synchronize the Standby Database with the Primary Database When Upgrading

SQL> SELECT SUBSTR(value,INSTR(value,'=',INSTR(UPPER(value),'SERVICE'))+1)
FROM v$parameter
WHERE name LIKE 'log_archive_dest%' AND UPPER(value) LIKE 'SERVICE%'; 2 3

no rows selected

15. Disable cronjob,

Take backup of crontab and comment the same.

16. Disable dbms_schduler jobs:


SQL> set pagesize 2000
SQL> set lines 2000
SQL> set long 99999
SQL> select owner,JOB_NAME,ENABLED,state from dba_scheduler_jobs;

OWNER                          JOB_NAME                       ENABL STATE
------------------------------ ------------------------------ ----- ---------------
SYS                            SM$CLEAN_AUTO_SPLIT_MERGE      FALSE DISABLED
SYS                            RSE$CLEAN_RECOVERABLE_SCRIPT   FALSE DISABLED
SYS                            BSLN_MAINTAIN_STATS_JOB        FALSE DISABLED
SYS                            DRA_REEVALUATE_OPEN_FAILURES   TRUE  SCHEDULED
SYS                            ORA$AUTOTASK_CLEAN             FALSE DISABLED
SYS                            FILE_WATCHER                   FALSE DISABLED
SYS                            HM_CREATE_OFFLINE_DICTIONARY   FALSE DISABLED
SYS                            AUTO_SPACE_ADVISOR_JOB         FALSE DISABLED
SYS                            GATHER_STATS_JOB               FALSE DISABLED
SYS                            FGR$AUTOPURGE_JOB              FALSE DISABLED
SYS                            PURGE_LOG                      FALSE DISABLED
ORACLE_OCM                     MGMT_STATS_CONFIG_JOB          FALSE DISABLED


13 rows selected.

--- Disable the scheduled jobs by using below command

SQL> execute dbms_scheduler.disable('DRA_REEVALUATE_OPEN_FAILURES);

17. Verify system and sys default tablespace.(Both should be system tablespace)


SQL> SELECT username, default_tablespace
FROM dba_users
WHERE username in ('SYS','SYSTEM'); 2 3

USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SYSTEM SYSTEM
SYS SYSTEM

18. Check whether database has any externally authenticated SSL users

SQL> SELECT name FROM sys.user$
WHERE ext_username IS NOT NULL
AND password = 'GLOBAL';
2 3
no rows selected

19. Remove EM repository

----Enterprise Manager Database Control is superseded in 12c by Oracle Enterprise Manager Express . Therefore no repository is needed anymore .

---Run the below script

$emctl stop dbcontrol
SQL> @ ?/rdbms/admin/emremove.sql

20. Review and Remove any unnecessary hidden/underscore parameters

SQL> SELECT name, value from SYS.V$PARAMETER WHERE name LIKE '\_%' ESCAPE '\' order by name;

no rows selected

With this our precheck completes. 

Before starting the upgrade, enable flashback and create restore point, so that in case upgrade fails, we can restore it using guarantee restore point.

Enable flashback

SQL> alter system set db_recovery_file_dest_size=10G scope=both;

System altered.

SQL> alter system set db_recovery_file_dest='/dumparea/FRA/B2BRBMT3' scope=both;

System altered.

SQL> alter database flashback on;

Database altered.

SQL> startup force

Now create restore point:

CREATE RESTORE POINT BEF_UPGRADE GUARANTEE FLASHBACK DATABASE;

Restore point created.

UPGRADE:

21. stop the listener and shutdown the database.

lsnrctl stop LISTENER_PROD

SQL>shutdown immediate

22.Update the ORACLE_HOME,PATH pointing to 12C Home.

export ORACLE_HOME= /apps/oracle/product/12.1.0.2
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE= /apps/oracle

23. Move the spfile and password file from 11g oracle_home/dbs location to 12cHome/dbs location.

24. start the database in upgrade mode.

$ cd $ORACLE_HOME/rdbms/admin
$ pwd
/apps/oracle/product/12.1.0.2.2015PSUQ2/rdbms/admin

$ sqlplus "/ as sysdba"
SQL> startup UPGRADE
SQL> exit

25.Run catupgrade script from os level with paralle=6 as below.

cd $ORACLE_HOME/rdbms/admin
$ORACLE_HOME/perl/bin/perl catctl.pl -n 6 -l $ORACLE_HOME/diagnostics catupgrd.sql

Open another window and check the log.

cd /uv1172/apps/oracle/product/12.1.0.2/diagnostics
tail -100f catupgrd0.log

26. Run the Post-Upgrade Status Tool

---Run the Post-Upgrade Status Tool $ORACLE_HOME/rdbms/admin/utlu121s.sql which provides a summary of the upgrade

$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @utlu121s.sql

27.Run Catuppst.sql

              The catuppst.sql script is run as part of the upgrade process unless the upgrade returns errors during the process. Check the log file for “BEGIN catuppst.sql” to verify that catuppst.sql ran during the upgrade process. If catuppst.sql has not run, then proceed to run catuppst.sql as shown in this step. Warning messages are also displayed when running catctl.pl indicating that catuppst.sql was not run during the upgrade.

SQL>@$ORACLE_HOME/rdbms/admin/catuppst.sql

Now upgrade is completed. Now Proceed with POST CHECK.

27. UPGRADE DST TIME ZONE:

Download the dst upgrade script from oracle

--- unzip the file in
$ unzip DBMS_DST_scriptsV1.9.zip
Archive: DBMS_DST_scriptsV1.9.zip
creating: DBMS_DST_scriptsV1.9/
inflating: DBMS_DST_scriptsV1.9/countstarTSTZ.sql
inflating: DBMS_DST_scriptsV1.9/countstatsTSTZ.sql
inflating: DBMS_DST_scriptsV1.9/upg_tzv_apply.sql
inflating: DBMS_DST_scriptsV1.9/upg_tzv_check.sql

----

$ cd DBMS_DST_scriptsV1.9

-- run countstatsTSTZ.sql script.

SQL*Plus: Release 12.1.0.2.0 Production on Thu Apr 23 09:13:24 2015

Copyright (c) 1982, 2014, Oracle. All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> spool countstatsTSTZ.log
SQL> @countstatsTSTZ.sql
.
Amount of TSTZ data using num_rows stats info in DBA_TABLES.
.
For SYS tables first...
Note: empty tables are not listed.
Stat date - Owner.Tablename.Columnname - num_rows
09/11/2012 - SYS.AQ$_ALERT_QT_S.CREATION_TIME - 4
09/11/2012 - SYS.AQ$_ALERT_QT_S.DELETION_TIME - 4
09/11/2012 - SYS.AQ$_ALERT_QT_S.MODIFICATION_TIME - 4
09/11/2012 - SYS.AQ$_AQ$_MEM_MC_S.CREATION_TIME - 3
09/11/2012 - SYS.AQ$_AQ$_MEM_MC_S.DELETION_TIME - 3
09/11/2012 - SYS.AQ$_AQ$_MEM_MC_S.MODIFICATION_TIME - 3
09/11/2012 - SYS.AQ$_AQ_PROP_TABLE_S.CREATION_TIME - 1
09/11/2012 - SYS.AQ$_AQ_PROP_TABLE_S.DELETION_TIME - 1
09/11/2012 - SYS.AQ$_AQ_PROP_TABLE_S.MODIFICATION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER$_EVENT_QTAB_S.CREATION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER$_EVENT_QTAB_S.DELETION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER$_EVENT_QTAB_S.MODIFICATION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER$_REMDB_JOBQTAB_S.CREATION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER$_REMDB_JOBQTAB_S.DELETION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER$_REMDB_JOBQTAB_S.MODIFICATION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER_FILEWATCHER_QT_S.CREATION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER_FILEWATCHER_QT_S.DELETION_TIME - 1
09/11/2012 - SYS.AQ$_SCHEDULER_FILEWATCHER_QT_S.MODIFICATION_TIME - 1
15/04/2015 - SYS.AQ$_SUBSCRIBER_TABLE.CREATION_TIME - 1
15/04/2015 - SYS.AQ$_SUBSCRIBER_TABLE.DELETION_TIME - 1
15/04/2015 - SYS.AQ$_SUBSCRIBER_TABLE.MODIFICATION_TIME - 1
23/04/2015 - SYS.KET$_AUTOTASK_STATUS.ABA_START_TIME - 1
23/04/2015 - SYS.KET$_AUTOTASK_STATUS.ABA_STATE_TIME - 1
23/04/2015 - SYS.KET$_AUTOTASK_STATUS.MW_RECORD_TIME - 1
23/04/2015 - SYS.KET$_AUTOTASK_STATUS.MW_START_TIME - 1
23/04/2015 - SYS.KET$_AUTOTASK_STATUS.RECONCILE_TIME - 1
09/11/2012 - SYS.KET$_CLIENT_CONFIG.FIELD_2 - 7
09/11/2012 - SYS.KET$_CLIENT_CONFIG.LAST_CHANGE - 7
23/04/2015 - SYS.KET$_CLIENT_TASKS.CURR_WIN_START - 3
23/04/2015 - SYS.KET$_CLIENT_TASKS.LG_DATE - 3
23/04/2015 - SYS.KET$_CLIENT_TASKS.LT_DATE - 3
22/04/2015 - SYS.OPTSTAT_HIST_CONTROL$.SPARE6 - 18
22/04/2015 - SYS.OPTSTAT_HIST_CONTROL$.SVAL2 - 18
25/03/2015 - SYS.SCHEDULER$_EVENT_LOG.LOG_DATE - 26865
22/04/2015 - SYS.SCHEDULER$_GLOBAL_ATTRIBUTE.ATTR_TSTAMP - 11
23/04/2015 - SYS.SCHEDULER$_JOB.END_DATE - 13
23/04/2015 - SYS.SCHEDULER$_JOB.LAST_ENABLED_TIME - 13
23/04/2015 - SYS.SCHEDULER$_JOB.LAST_END_DATE - 13
23/04/2015 - SYS.SCHEDULER$_JOB.LAST_START_DATE - 13
23/04/2015 - SYS.SCHEDULER$_JOB.NEXT_RUN_DATE - 13
23/04/2015 - SYS.SCHEDULER$_JOB.START_DATE - 13
09/04/2015 - SYS.SCHEDULER$_JOB_RUN_DETAILS.LOG_DATE - 4869
09/04/2015 - SYS.SCHEDULER$_JOB_RUN_DETAILS.REQ_START_DATE - 4869
09/04/2015 - SYS.SCHEDULER$_JOB_RUN_DETAILS.START_DATE - 4869
09/11/2012 - SYS.SCHEDULER$_SCHEDULE.END_DATE - 3
09/11/2012 - SYS.SCHEDULER$_SCHEDULE.REFERENCE_DATE - 3
23/04/2015 - SYS.SCHEDULER$_WINDOW.ACTUAL_START_DATE - 9
23/04/2015 - SYS.SCHEDULER$_WINDOW.END_DATE - 9
23/04/2015 - SYS.SCHEDULER$_WINDOW.LAST_START_DATE - 9
23/04/2015 - SYS.SCHEDULER$_WINDOW.MANUAL_OPEN_TIME - 9
23/04/2015 - SYS.SCHEDULER$_WINDOW.NEXT_START_DATE - 9
23/04/2015 - SYS.SCHEDULER$_WINDOW.START_DATE - 9
22/04/2015 - SYS.SCHEDULER$_WINDOW_DETAILS.LOG_DATE - 30
22/04/2015 - SYS.SCHEDULER$_WINDOW_DETAILS.REQ_START_DATE - 30
22/04/2015 - SYS.SCHEDULER$_WINDOW_DETAILS.START_DATE - 30
23/04/2015 - SYS.STATS_TARGET$.END_TIME - 718
23/04/2015 - SYS.STATS_TARGET$.START_TIME - 718
23/04/2015 - SYS.WRI$_ALERT_HISTORY.CREATION_TIME - 6
23/04/2015 - SYS.WRI$_ALERT_HISTORY.TIME_SUGGESTED - 6
23/04/2015 - SYS.WRI$_ALERT_OUTSTANDING.CREATION_TIME - 4
23/04/2015 - SYS.WRI$_ALERT_OUTSTANDING.TIME_SUGGESTED - 4
22/04/2015 - SYS.WRI$_OPTSTAT_IND_HISTORY.SAVTIME - 6147
22/04/2015 - SYS.WRI$_OPTSTAT_IND_HISTORY.SPARE6 - 6147
23/04/2015 - SYS.WRI$_OPTSTAT_OPR.END_TIME - 681
23/04/2015 - SYS.WRI$_OPTSTAT_OPR.SPARE6 - 681
23/04/2015 - SYS.WRI$_OPTSTAT_OPR.START_TIME - 681
22/04/2015 - SYS.WRI$_OPTSTAT_TAB_HISTORY.SAVTIME - 6534
22/04/2015 - SYS.WRI$_OPTSTAT_TAB_HISTORY.SPARE6 - 6534
Total numrow of SYS TSTZ columns is : 70672
There are in total 145 non-SYS TSTZ columns.
.
For non-SYS tables ...
Note: empty tables are not listed.
Stat date - Owner.Tablename.Columnname - num_rows
Total numrow of non-SYS TSTZ columns is : 0
There are in total 5 non-SYS TSTZ columns.
Total Minutes elapsed : 0
SQL> spool off

Purge the scheduler jobs

SQL> exec dbms_scheduler.purge_log;

PL/SQL procedure successfully completed.

Run upg_tzv_check.sql ( it will detect the highest installed DST patch automatically)

SQL> spool upg_tzv_check.log
SQL> @upg_tzv_check.sql
INFO: Starting with RDBMS DST update preparation.
INFO: NO actual RDBMS DST update will be done by this script.
INFO: If an ERROR occurs the script will EXIT sqlplus.
INFO: Doing checks for known issues ...
INFO: Database version is 12.1.0.2 .
INFO: Database RDBMS DST version is DSTv14 .
INFO: No known issues detected.
INFO: Now detecting new RDBMS DST version.
A prepare window has been successfully started.
INFO: Newest RDBMS DST version detected is DSTv18 .
INFO: Next step is checking all TSTZ data.
INFO: It might take a while before any further output is seen ...
A prepare window has been successfully ended.
INFO: A newer RDBMS DST version than the one currently used is found.
INFO: Note that NO DST update was yet done.
INFO: Now run upg_tzv_apply.sql to do the actual RDBMS DST update.
INFO: Note that the upg_tzv_apply.sql script will
INFO: restart the database 2 times WITHOUT any confirmation or prompt.
SQL> spool off
SQL> spool upg_tzv_apply.log

Run upg_tzv_apply.sql ( It will do the actual dst upgrade)

SQL> spool upg_tzv_apply.log
SQL> @upg_tzv_apply.sql
INFO: If an ERROR occurs the script will EXIT sqlplus.
INFO: The database RDBMS DST version will be updated to DSTv18 .
WARNING: This script will restart the database 2 times
WARNING: WITHOUT asking ANY confirmation.
WARNING: Hit control-c NOW if this is not intended.
INFO: Restarting the database in UPGRADE mode to start the DST upgrade.
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size 2916104 bytes
Variable Size 1677721848 bytes
Database Buffers 452984832 bytes
Redo Buffers 13860864 bytes
Database mounted.
Database opened.
INFO: Starting the RDBMS DST upgrade.
INFO: Upgrading all SYS owned TSTZ data.
INFO: It might take time before any further output is seen ...
An upgrade window has been successfully started.
INFO: Restarting the database in NORMAL mode to upgrade non-SYS TSTZ data.
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size 2916104 bytes
Variable Size 1677721848 bytes
Database Buffers 452984832 bytes
Redo Buffers 13860864 bytes
Database mounted.
Database opened.
INFO: Upgrading all non-SYS TSTZ data.
INFO: It might take time before any further output is seen ...
INFO: Do NOT start any application yet that uses TSTZ data!
INFO: Next is a list of all upgraded tables:
Table list: "GSMADMIN_INTERNAL"."AQ$_CHANGE_LOG_QUEUE_TABLE_S"
Number of failures: 0
Table list: "GSMADMIN_INTERNAL"."AQ$_CHANGE_LOG_QUEUE_TABLE_L"
Number of failures: 0
INFO: Total failures during update of TSTZ data: 0 .
An upgrade window has been successfully ended.
INFO: Your new Server RDBMS DST version is DSTv18 .
INFO: The RDBMS DST update is successfully finished.
INFO: Make sure to exit this sqlplus session.
INFO: Do not use it for timezone related selects.


Once dst upgrade is successful , validate the time_zone(It should be 18)

1. SQL>@/apps/oracle/cfgtoollogs/PROD/preupgrade/postupgrade_fixup.sql

2. Change the ORACLE_HOME to 12c in listener.ora file.

3. Uncomment the crontab

4.Enable the jobs in dba_scheduler_jobs which we disabled before the upgrade.

5. Run utluiobj.sql from $ORACLE_HOME/rdbms/admin/ to identify/compare any new invalid objects due to the upgrade.

6. Run $ORACLE_HOME/rdbms/admin/utlrp.sql script

SQL> SELECT version FROM v$timezone_file;

VERSION
----------
18

SQL> drop restore point BEF_UPGRADE;

7. Update the compatible parameter and restart database.

NOTE- Database cannot be downgraded once compatible parameter is updated. 

--- MAKE SURE TO DROP THE RESTORE POINT:


SQL> drop restore point BEF_UPGRADE;

Restore point dropped.

-- Now alter the compatible parameter

SQL>alter system set compatible='12.1.0.2' scope=spfile;

shutdown immediate;
startup

NOTE – Once compatible is set to higher version, downgrade is not possible.

With this our upgrade activity completes.

IF UPGRADE FAILS

If you have done the prechecks properly, then chances are very less that, upgrade will fail. But even if it fails for any other reasons like server crash during upgrade, then follow below steps to revert to back to 11g version . 

1. Shutdown immediate;

2. set ORACLE_HOME to 11g 

3. Start up mount ( with the 11g spfile)

4. select * from v$restore_point;

5. flashback database to restore point bef_upgrade. ( this restore point was created before upgrade)

6. alter database open resetlogs;

credit: https://dbaclass.com/article/upgrade-database-from-11g-to-12c-manually/