Buenos días a todos, hoy os vamos a enseñar cómo solucionar el error ORA-39405: Oracle Data Pump Does not support Importing From a Source Database With TSTZ Version.
Este error nos ha dado al intentar hacer una importación de una BBDD a otra con Data Pump.
Para solucionarlo vamos a parchear la base de datos con versión 34 a la versión 40 del TIMEZONE. Comprobamos la versión de cada BBDD:
BBDD1
SQL> SELECT version FROM v$timezone_file;
VERSION
----------
34
BBDD2
VERSION
----------
40
Descargamos el parche de Oracle para la versión 40 de Oracle Support y lo llevamos a nuestro servidor
Patch 34698179: RDBMS - DSTV40 UPDATE - TZDATA2022E https://support.oracle.com/epmos/faces/PatchDetail?requestId=24977711&_afrLoop=366631506616206&patchId=34698179&_afrWindowMode=0&_adf.ctrl-state=15rhm6b9o8_158
Descomprimimos:
unzip -d /u01/app/oracle/product/19.0.0/dbhome_1/Time_Zone_Patc p34698179_190000_Linux-x86-64.zip
Aplicamos el parche con la utilidad opatch:
[oracle@BBDD1 /u01/app/oracle/product/19.0.0/dbhome_1/OPatch]$ ./opatch apply /u01/app/oracle/product/19.0.0/dbhome_1/34698179
Comprobamos el estado actual tras ejectutar el parche. Tendremos que ejecutar varios reinicios en modo upgrade para lograr nuestro objetivo:
SQL> SELECT * FROM v$timezone_file; FILENAME VERSION CON_ID -------------------- ---------- ---------- timezlrg_34.dat 34 0
Aunque hemos aplicado el parche, para la BBDD aún no es visible, con estas sentencias lo comprobamos:
COLUMN property_name FORMAT A30
COLUMN property_value FORMAT A20
SELECT property_name, property_value
FROM database_properties
WHERE property_name LIKE 'DST_%'
ORDER BY property_name;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
DST_PRIMARY_TT_VERSION 34
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE
SQL> SELECT DBMS_DST.get_latest_timezone_version FROM dual;
GET_LATEST_TIMEZONE_VERSION
---------------------------
34
Reiniciamos y comprobamos la BBDD en modo upgrade:
SQL> SHUTDOWN IMMEDIATE ORACLE instance shut down. SQL> startup upgrade Database opened. SQL> select instance_name,status from v$instance; INSTANCE_NAME STATUS ---------------- ---------- test OPEN MIGRATE

Preparamos la BBDD para aplicar el parche con este procedimiento:
SQL> DECLARE
l_tz_version PLS_INTEGER;
BEGIN
l_tz_version := DBMS_DST.get_latest_timezone_version;
DBMS_OUTPUT.put_line('l_tz_version=' || l_tz_version);
DBMS_DST.begin_prepare(l_tz_version);
END;
/
PL/SQL procedure successfully completed.
El parche aún no está aplicado pero ya es visible para la BBDD
SQL> COLUMN property_name FORMAT A30 COLUMN property_value FORMAT A20 SELECT property_name, property_value FROM database_properties WHERE property_name LIKE 'DST_%' ORDER BY property_name; PROPERTY_NAME PROPERTY_VALUE ------------------------------ -------------------- DST_PRIMARY_TT_VERSION 34 DST_SECONDARY_TT_VERSION 40 DST_UPGRADE_STATE PREPARE
Comprobamos que no hay tablas con error con las siguientes sentencias:
SQL> select * from sys.dst$error_table;
no rows selected
SQL> select count(*) from sys.dst$affected_tables;
COUNT(*)
----------
0
Terminamos la fase de preparación ejecutando este procedimiento:
SQL> EXEC DBMS_DST.end_prepare; PL/SQL procedure successfully completed.
Reiniciamos la base de datos de nuevo en modo upgrade y ejecutamos el procedimiento para subir el timezone:
SQL> SHUTDOWN IMMEDIATE
ORACLE instance shut down.
SQL> startup upgrade
Database opened.
SET SERVEROUTPUT ON
DECLARE
l_tz_version PLS_INTEGER;
BEGIN
SELECT DBMS_DST.get_latest_timezone_version
INTO l_tz_version
FROM dual;
DBMS_OUTPUT.put_line('l_tz_version=' || l_tz_version);
DBMS_DST.begin_upgrade(l_tz_version);
END;
/
l_tz_version=40
An upgrade window has been successfully started.
PL/SQL procedure successfully completed.
Ahora para finalizar reiniciamos esta vez en modo normal y comprobamos si el parcheado ha tenido fallos:
SQL> shutdown immediate
ORACLE instance shut down.
SQL> startup
Database opened.
SQL> SET SERVEROUTPUT ON
DECLARE
l_failures PLS_INTEGER;
BEGIN
DBMS_DST.upgrade_database(l_failures);
DBMS_OUTPUT.put_line('DBMS_DST.upgrade_database : l_failures=' || l_failures);
DBMS_DST.end_upgrade(l_failures);
DBMS_OUTPUT.put_line('DBMS_DST.end_upgrade : l_failures=' || l_failures);
END;
/
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
Table list: "MDSYS"."SDO_DIAG_MESSAGES_TABLE"
Number of failures: 0
Table list: "DVSYS"."AUDIT_TRAIL$"
Number of failures: 0
Table list: "DVSYS"."SIMULATION_LOG$"
Number of failures: 0
DBMS_DST.upgrade_database : l_failures=0
An upgrade window has been successfully ended.
DBMS_DST.end_upgrade : l_failures=0
PL/SQL procedure successfully completed.
Comprobamos que la nueva timezone es la 40 y que la BBDD ha cerrado la ventana de la instalación del parche:
SQL> SELECT * FROM v$timezone_file; FILENAME VERSION CON_ID -------------------- ---------- ---------- timezlrg_40.dat 40 0 SQL> COLUMN property_name FORMAT A30 COLUMN property_value FORMAT A20 SELECT property_name, property_value FROM database_properties WHERE property_name LIKE 'DST_%' ORDER BY property_name; PROPERTY_NAME PROPERTY_VALUE ------------------------------ -------------------- DST_PRIMARY_TT_VERSION 40 DST_SECONDARY_TT_VERSION 0 DST_UPGRADE_STATE NONE
Ya lo tienes!! Esperamos que os haya sido de ayuda. Y recordad, que si estáis teniendo problemas con vuestras BBDD, desde GPS podemos ayudaros. No dudéis en poneros en contacto con nosotros.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn
