Error ORA-39405

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *