You are on page 1of 6

1.

Upgrading the Time Zone File Version After Upgrading Oracle


Databases:
If the Pre-Upgrade Information Tool instructed you to upgrade the time zone files after completing the
database upgrade, then we need to use the DBMS_DST PL/SQL package to upgrade the time zone
file.
The normal error we receive when upgrading to 11.2.0.4 is the below
WARNING: --> Database is using a timezone file older than version 14.
.... After the release migration, it is recommended that DBMS_DST package
.... be used to upgrade the 11.2.0.1.0 database timezone version
.... to the latest version which comes with the new release

This indicates that the version of the timezlrg_<version_number>.dat running on the database is a
lower version number than the current version 14. As we have just upgraded the database software
the version 14 of the file should be available in the $ORACLE_HOME/oracore/zoneinfo directory
oracle-ORCL11> ls -al /n1/$ORACLE_HOME/oracore/zoneinfo/
total 13460
drwxr-xr-x 4 oracle oinstall
4096 May 11 19:37 .
drwxr-xr-x 4 oracle oinstall
4096 May 11 19:36 ..
drwxr-xr-x 2 oracle oinstall
4096 May 11 19:37 big
drwxr-xr-x 2 oracle oinstall
4096 May 11 19:37 little
-rw-r--r-- 1 oracle oinstall
6068 Jun 7 2010 readme.txt
-rw-r--r-- 1 oracle oinstall 31525 Jun 7 2010 timezdif.csv
-rw-r--r-- 1 oracle oinstall 792894 Aug 22 2011 timezlrg_10.dat
-rw-r--r-- 1 oracle oinstall 787272 Aug 22 2011 timezlrg_11.dat
-rw-r--r-- 1 oracle oinstall 785621 Aug 22 2011 timezlrg_12.dat
-rw-r--r-- 1 oracle oinstall 782475 Aug 22 2011 timezlrg_13.dat
-rw-r--r-- 1 oracle oinstall 791430 Aug 22 2011 timezlrg_14.dat
-rw-r--r-- 1 oracle oinstall 493675 Aug 22 2011 timezlrg_1.dat
-rw-r--r-- 1 oracle oinstall 507957 Aug 22 2011 timezlrg_2.dat
-rw-r--r-- 1 oracle oinstall 527717 Aug 22 2011 timezlrg_3.dat
-rw-r--r-- 1 oracle oinstall 531137 Aug 22 2011 timezlrg_4.dat
-rw-r--r-- 1 oracle oinstall 587487 Aug 22 2011 timezlrg_5.dat
-rw-r--r-- 1 oracle oinstall 586750 Aug 22 2011 timezlrg_6.dat
-rw-r--r-- 1 oracle oinstall 601242 Aug 22 2011 timezlrg_7.dat
-rw-r--r-- 1 oracle oinstall 616723 Aug 22 2011 timezlrg_8.dat
-rw-r--r-- 1 oracle oinstall 801410 Aug 22 2011 timezlrg_9.dat
-rw-r--r-- 1 oracle oinstall 345637 Aug 22 2011 timezone_10.dat
-rw-r--r-- 1 oracle oinstall 345356 Aug 22 2011 timezone_11.dat
-rw-r--r-- 1 oracle oinstall 345024 Aug 22 2011 timezone_12.dat
-rw-r--r-- 1 oracle oinstall 344425 Aug 22 2011 timezone_13.dat
-rw-r--r-- 1 oracle oinstall 344448 Aug 22 2011 timezone_14.dat
-rw-r--r-- 1 oracle oinstall 274427 Aug 22 2011 timezone_1.dat
-rw-r--r-- 1 oracle oinstall 274900 Aug 22 2011 timezone_2.dat
-rw-r--r-- 1 oracle oinstall 286651 Aug 22 2011 timezone_3.dat
-rw-r--r-- 1 oracle oinstall 286264 Aug 22 2011 timezone_4.dat
-rw-r--r-- 1 oracle oinstall 286310 Aug 22 2011 timezone_5.dat
-rw-r--r-- 1 oracle oinstall 286217 Aug 22 2011 timezone_6.dat
-rw-r--r-- 1 oracle oinstall 286815 Aug 22 2011 timezone_7.dat
-rw-r--r-- 1 oracle oinstall 302100 Aug 22 2011 timezone_8.dat
-rw-r--r-- 1 oracle oinstall 351525 Aug 22 2011 timezone_9.dat

a) Create a Prepare Window to find the affected data:


Invoke DBMS_DST.BEGIN_PREPARE(<new_version>)
SQL> EXEC DBMS_DST.BEGIN_PREPARE(14);
A Prepare window has been successfully started.
PL/SQL procedure successfully completed

You can check that this has worked by entering the below SQL statement
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

This should give output something like the below


PROPERTY_NAME
--------------------------DST_PRIMARY_TT_VERSION
DST_SECONDARY_TT_VERSION

VALUE
--------4
14

DST_UPGRADE_STATE

PREPARE

Next you can invoke DBMS_DST.FIND_AFFECTED_TABLES to find all the tables in the database
that are affected if you upgrade from your current version.
set serveroutput on
BEGIN
DBMS_DST.FIND_AFFECTED_TABLES
(affected_tables => 'sys.dst$affected_tables',
log_errors => TRUE,
log_errors_table => 'sys.dst$error_table');
END;
/

Then check the affected table


SELECT * FROM sys.dst$affected_tables;
TABLE_OWNER
----------SCOTT

TABLE_NAME
---------T

COLUMN_NAM
---------TS

ROW_COUNT
--------3

ERROR_COUNT
----------2

Then, check the error table:


SELECT * FROM sys.dst$error_table;
TABLE_OWNER
----------SCOTT
SCOTT

TABLE_NAME
---------T
T

COLUMN_NAME
----------TS
TS

ROWID
-----------------AAAPW3AABAAANzoAAB
AAAPW3AABAAANzoAAE

ERROR_NUMBER
-----------1878
1883

Then we can end the prepare window


EXEC DBMS_DST.END_PREPARE;
A prepare window has been successfully ended.
PL/SQL procedure successfully completed.

You can check that this has worked by entering the below SQL statement
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

This should give output something like the below


PROPERTY_NAME
--------------------------DST_PRIMARY_TT_VERSION
DST_SECONDARY_TT_VERSION
DST_UPGRADE_STATE

VALUE
--------4
0
NONE

b) Begin Upgrade of the Time Zone File and Timestamp with Time Zone Data:
Shutdown the database and restart it in upgrade mode.
oracle-ORCL11> sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Wed May 16 14:27:18 2012
Copyright (c) 1982, 2011, Oracle.

All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup upgrade

ORACLE instance started.


Total System Global Area 1573527552 bytes
Fixed Size
1345184 bytes
Variable Size
721422688 bytes
Database Buffers
838860800 bytes
Redo Buffers
11898880 bytes
Database mounted.
Database opened.

Execute the DBMS_DST.BEGIN_UPGRADE(<new_version>). This will upgrade the system tables but
not the user tables
SQL> exec DBMS_DST.BEGIN_UPGRADE(14);
PL/SQL procedure successfully completed.
SQL> select * from sys.dst$error_table;
no rows selected

Then check that the upgrade window has been created successfully
SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;
PROPERTY_NAME
-----------------------------DST_PRIMARY_TT_VERSION
DST_SECONDARY_TT_VERSION
DST_UPGRADE_STATE

VALUE
-----------------------------14
11
UPGRADE

We can then check which user tables are marked with UPGRADE_IN_PROGRESS
SQL> SELECT OWNER, TABLE_NAME, UPGRADE_IN_PROGRESS FROM ALL_TSTZ_TABLES;
OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------ALERT_QT
KET$_AUTOTASK_STATUS
KET$_CLIENT_CONFIG
KET$_CLIENT_TASKS
OPTSTAT_HIST_CONTROL$
OPTSTAT_USER_PREFS$
AQ$_ALERT_QT_L
AQ$_ALERT_QT_S
AQ$_AQ$_MEM_MC_L
AQ$_AQ$_MEM_MC_S
AQ$_AQ_PROP_TABLE_L

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------AQ$_AQ_PROP_TABLE_S
AQ$_KUPC$DATAPUMP_QUETAB_L
AQ$_KUPC$DATAPUMP_QUETAB_S
FGR$_FILE_GROUPS
FGR$_FILE_GROUP_FILES
FGR$_FILE_GROUP_VERSIONS
REG$
SCHEDULER$_EVENT_LOG
SCHEDULER$_EVENT_QTAB
SCHEDULER$_FILEWATCHER_HISTORY
SCHEDULER$_FILEWATCHER_RESEND

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------SCHEDULER$_FILE_WATCHER
SCHEDULER$_GLOBAL_ATTRIBUTE
SCHEDULER$_JOB
SCHEDULER$_JOB_DESTINATIONS
SCHEDULER$_JOB_RUN_DETAILS
WRI$_OPTSTAT_AUX_HISTORY
WRI$_OPTSTAT_HISTGRM_HISTORY
WRI$_OPTSTAT_HISTHEAD_HISTORY
WRI$_OPTSTAT_IND_HISTORY

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO

SYS
SYS

WRI$_OPTSTAT_OPR
WRI$_OPTSTAT_TAB_HISTORY

NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------SCHEDULER$_LIGHTWEIGHT_JOB
SCHEDULER$_REMDB_JOBQTAB
SCHEDULER$_REMOTE_JOB_STATE
SCHEDULER$_SCHEDULE
SCHEDULER$_STEP_STATE
SCHEDULER$_WINDOW
SCHEDULER$_WINDOW_DETAILS
SCHEDULER_FILEWATCHER_QT
WRI$_ALERT_HISTORY
WRI$_ALERT_OUTSTANDING
WRR$_REPLAY_DIVERGENCE

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------TSM_DST$
TSM_SRC$
AQ$_SCHEDULER$_EVENT_QTAB_L
AQ$_SCHEDULER$_EVENT_QTAB_S
AQ$_SCHEDULER$_REMDB_JOBQTAB_L
AQ$_SCHEDULER$_REMDB_JOBQTAB_S
AQ$_SCHEDULER_FILEWATCHER_QT_L
AQ$_SCHEDULER_FILEWATCHER_QT_S
AQ$_SUBSCRIBER_TABLE
AQ$_SYS$SERVICE_METRICS_TAB_L
AQ$_SYS$SERVICE_METRICS_TAB_S

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------WMSYS
DBSNMP
WMSYS
WMSYS

TABLE_NAME
-----------------------------WM$VERSIONED_TABLES
MGMT_DB_FEATURE_LOG
AQ$_WM$EVENT_QUEUE_TABLE_L
AQ$_WM$EVENT_QUEUE_TABLE_S

UPG
--NO
NO
NO
NO

59 rows selected.

We now need to restart the database in normal mode so that we can upgrade the user tables as well
by using DBMS_DST.UPGRADE_DATABASE
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1573527552 bytes
Fixed Size
1345184 bytes
Variable Size
721422688 bytes
Database Buffers
838860800 bytes
Redo Buffers
11898880 bytes
Database mounted.
Database opened.
SQL>
VAR numfail number
BEGIN
DBMS_DST.UPGRADE_DATABASE(:numfail,
parallel
=> TRUE,
log_errors
=> TRUE,
log_errors_table
=> 'SYS.DST$ERROR_TABLE',
log_triggers_table
=> 'SYS.DST$TRIGGER_TABLE',
error_on_overlap_time
=> TRUE,
error_on_nonexisting_time => TRUE);
DBMS_OUTPUT.PUT_LINE('Failures:'|| :numfail);
END;
/
PL/SQL procedure successfully completed.

We can then check which user tables are marked with NO in the UPG field. This shows that the
upgrade has completed for the table

SQL> SELECT OWNER, TABLE_NAME, UPGRADE_IN_PROGRESS FROM ALL_TSTZ_TABLES;


OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------KET$_CLIENT_TASKS
AQ$_AQ_PROP_TABLE_S
SCHEDULER$_EVENT_LOG
SCHEDULER$_JOB_DESTINATIONS
SCHEDULER$_STEP_STATE
SCHEDULER_FILEWATCHER_QT
TSM_DST$
AQ$_KUPC$DATAPUMP_QUETAB_L
SCHEDULER$_FILEWATCHER_HISTORY
SCHEDULER$_JOB
WRI$_ALERT_OUTSTANDING

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------AQ$_SCHEDULER_FILEWATCHER_QT_L
AQ$_SUBSCRIBER_TABLE
ALERT_QT
KET$_CLIENT_CONFIG
OPTSTAT_USER_PREFS$
AQ$_AQ$_MEM_MC_L
FGR$_FILE_GROUP_VERSIONS
SCHEDULER$_EVENT_QTAB
WRI$_OPTSTAT_HISTHEAD_HISTORY
SCHEDULER$_WINDOW
AQ$_SCHEDULER$_REMDB_JOBQTAB_S

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------AQ$_AQ$_MEM_MC_S
SCHEDULER$_FILE_WATCHER
SCHEDULER$_GLOBAL_ATTRIBUTE
WRI$_OPTSTAT_IND_HISTORY
SCHEDULER$_LIGHTWEIGHT_JOB
SCHEDULER$_REMDB_JOBQTAB
SCHEDULER$_WINDOW_DETAILS
AQ$_SCHEDULER_FILEWATCHER_QT_S
FGR$_FILE_GROUP_FILES
SCHEDULER$_JOB_RUN_DETAILS
WRI$_OPTSTAT_OPR

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------AQ$_SYS$SERVICE_METRICS_TAB_L
FGR$_FILE_GROUPS
REG$
WRI$_OPTSTAT_AUX_HISTORY
WRI$_OPTSTAT_HISTGRM_HISTORY
SCHEDULER$_REMOTE_JOB_STATE
TSM_SRC$
AQ$_SYS$SERVICE_METRICS_TAB_S
KET$_AUTOTASK_STATUS
OPTSTAT_HIST_CONTROL$
AQ$_ALERT_QT_S

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS
SYS

TABLE_NAME
-----------------------------AQ$_KUPC$DATAPUMP_QUETAB_S
WRI$_OPTSTAT_TAB_HISTORY
SCHEDULER$_SCHEDULE
WRI$_ALERT_HISTORY
WRR$_REPLAY_DIVERGENCE
AQ$_SCHEDULER$_EVENT_QTAB_S
AQ$_SCHEDULER$_REMDB_JOBQTAB_L
AQ$_ALERT_QT_L
AQ$_AQ_PROP_TABLE_L
SCHEDULER$_FILEWATCHER_RESEND
AQ$_SCHEDULER$_EVENT_QTAB_L

UPG
--NO
NO
NO
NO
NO
NO
NO
NO
NO
NO
NO

OWNER
-----------------------------DBSNMP
WMSYS

TABLE_NAME
-----------------------------MGMT_DB_FEATURE_LOG
WM$VERSIONED_TABLES

UPG
--NO
NO

WMSYS
WMSYS

AQ$_WM$EVENT_QUEUE_TABLE_S
AQ$_WM$EVENT_QUEUE_TABLE_L

NO
NO

59 rows selected.

If this shows that all the tables are not being upgraded we can end the upgrade window and confirm
that it has completed
SQL> exec DBMS_DST.END_UPGRADE(:numfail);
PL/SQL procedure successfully completed.
SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME; 2
3
4
PROPERTY_NAME
-----------------------------DST_PRIMARY_TT_VERSION
DST_SECONDARY_TT_VERSION
DST_UPGRADE_STATE

VALUE
-----------------------------14
0
NONE

Update in registry$database
update registry$database set TZ_VERSION = (select version FROM
v$timezone_file);
commit;

You might also like