Actualice a 26ai sin sorpresas (Data Guard)

Tabla de Contenidos

En un artículo anterior les había mostrado el procedimiento a seguir para ejecutar la actualización de una base de datos 19c non-CDB a 26ai, lo cual resultó relativamente simple, pero ¿y si la base de datos tiene configurado un physical standby?

Pues sí, ese escenario es bastante más complejo, y aun más si tienes tablespaces encriptados (TDE), pero no te preocupes: si sigues estos pasos al pie de la letra, no tendrás problemas y ¡quedarás como un héroe!

Advertencia

Al redactar este artículo, estaba disponible AU 26.4.260701, pero fue imposible pasar de la fase analyze ya que falla indicando: checkName=”PLUG_NK_TBS_BLKSZ_TARGET_NK_CACHE_ZERO”.

Esto es una incidencia del bug 39758946 (ver KB921107), lo que nos obliga a usar AU 26.3.260401.

Situación inicial

Partimos con la base de datos Oracle RAC orcl1 y su physical standby orcl2, que están en pleno funcionamiento, y ya preparamos los containers orcl3 y su physical standby orcl4, que serán nuestros destinos finales tras la actualización a 26ai.

Reutilizaremos los datafiles existentes y, además, contamos con TDE (Transparent Data Encryption) configurado para mayor seguridad.

sourcetarget
db_nameorclorcl
db_unique_nameorcl1orcl2orcl3orcl4
roleprimarystandbyprimarystandby
instance_nameorcl1_1, orcl1_2orcl2_1orcl3_1, orcl3_2orcl4_1
servicesorcl_rw orcl_ro
version19.3123.26.2
TDE keystore passwordRigyoTasEnuhyu5#TarojoxobOv#n4Wo

Preparativos en el primary

Como primer paso, vamos a crear el archivo de configuración de AutoUpgrade, que llamaremos upg_dg.cfg. Es necesario incluir el parámetro manage_standbys_clause para asegurar que todo funcione correctamente en nuestro escenario.

# Created by AutoUpgrade Composer
# Upgrade, UpgType: noncdb2cdb, FileNameConvert: nocopy

global.global_log_dir=/home/oracle/autoupgrade/log
global.keystore=/home/oracle/autoupgrade/keystore

upg1.sid=orcl1_1
upg1.log_dir=/home/oracle/autoupgrade/log/orcl1_Upgrade
upg1.source_home=/u01/app/oracle/19.0.0/db_1
upg1.target_home=/u01/app/oracle/23.0.0/db_1
upg1.target_cdb=orcl3_1
upg1.target_pdb_name=orcl
upg1.manage_standbys_clause=standbys=all

Con standbys=all estamos indicando que  todo el redo generado por el plug-in de la base de datos orcl1 en la base de datos orcl3 debe aplicarse de forma inmediata en su physical standby orcl4.

Como usamos TDE no podemos olvidar registrar los keystore password en el wallet de AutoUpgrade, primero para la base de datos orcl1 (instancia orcl1_1) y luego para la base de datos orcl3 (instancia orcl3_1).

Si en tu instalación no usan TDE puedes ignorar este paso.

java -jar autoupgrade.jar \
-config upg_dg.cfg \
-load_password

Processing config file ...

Starting AutoUpgrade Password Loader - Type help for available options
Creating new AutoUpgrade keystore - Password required
Enter password: *************
Enter password again: *************
AutoUpgrade keystore was successfully created

TDE> save
Convert the AutoUpgrade keystore to auto-login [YES|NO] ? YES
TDE>

TDE> add orcl1_1
Enter your secret/Password: *************
Re-enter your secret/Password: *************

TDE> add orcl3_1
Enter your secret/Password: *************
Re-enter your secret/Password: *************
TDE> save
TDE> exit

AutoUpgrade Password Loader finished - Exiting AutoUpgrade

Preparativos en el standby

Como ya vimos en el artículo anterior, AutoUpgrade se encargará de registrar los datafiles de orcl1 en el container orcl3, pero en el lado de su physical standby tenemos un pequeño inconveniente: el container orcl4 no tiene forma de conocer la ubicación de los datafiles de orcl2.

Para permitir que Oracle pueda localizar los datafiles del futuro PDB y así aplicar sobre ellos el redo proveniente de orcl3, vamos a tener que recurrir a la creación manual de directorios y de alias de ASM, de forma que quede algo así:

Usaremos el siguiente script, que llamaremos alias.sql, que, en resumen, obtiene el GUID de orcl2 y un listado de sus datafiles para, con ellos, crear los comandos mkdir y mkalias necesarios.

set pagesize 0
set linesize 300
set feedback off
set trimspool on
spool alias_noncdb.cmd
set serveroutput on size unlimited
DECLARE
  v_DG_CDB  varchar2(10) := 'DATA';
  v_CDB     varchar2(10) := 'ORCL4';
  v_GUID    varchar2(32);
  v_PDB_DIR varchar2(100);
  v_DF_DIR  varchar2(100);
BEGIN
  SELECT guid 
    INTO v_GUID
    FROM v$containers;
  v_PDB_DIR := '+'||v_DG_CDB|| '/' || v_CDB || '/' || v_GUID;
  v_DF_DIR := v_PDB_DIR ||'/DATAFILE/';
    
  dbms_output.put_line( 'mkdir '|| v_PDB_DIR );
  dbms_output.put_line( 'mkdir '|| v_DF_DIR );
  FOR df in (
              SELECT
                name,
                REGEXP_SUBSTR(
                  REPLACE(name, '.', '_'),
                  '[^/]+$'
                ) alias
                FROM v$datafile
               ORDER BY file#
            )    
  LOOP
    dbms_output.put_line(
      'mkalias ' || df.name ||' '|| v_DF_DIR || df.alias );
  END LOOP;
  dbms_output.put_line(
      'ls -l '|| v_DF_DIR );  
END;
/
exit

Estando conectados a la base de datos orcl2, ejecutamos el script alias.sql y, como resultado, se genera el archivo alias_noncdb.cmd.

$ . orcl2.env
Oracle Home: /u01/app/oracle/19.0.0/db_1
Oracle SID: orcl2_1

$ sqlplus / as sysdba @alias.sql

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 5 14:10:22 2026
Version 19.31.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.31.0.0.0

mkdir +DATA/ORCL4/584193FA481692D6E0638200A8C0A234
mkdir +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/
mkalias +DATA/ORCL2/DATAFILE/system.306.1240425485 +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/system_306_1240425485
mkalias +DATA/ORCL2/DATAFILE/sysaux.315.1240425485 +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/sysaux_315_1240425485
mkalias +DATA/ORCL2/DATAFILE/undotbs1.280.1240425487 +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/undotbs1_280_1240425487
mkalias +DATA/ORCL2/DATAFILE/undotbs2.310.1240425487 +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/undotbs2_310_1240425487
mkalias +DATA/ORCL2/DATAFILE/users.275.1240427129 +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/users_275_1240427129
ls -l +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/

Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.31.0.0.0

$ ls -la alias_noncdb.cmd
-rw-r--r--. 1 oracle oinstall 814 Aug  5 14:10 alias_noncdb.cmd

Ahora utilizaremos asmcmd para ejecutar los comandos contenidos en alias_noncdb.cmd, con lo cual finalizamos los preparativos correspondientes a orcl4.

$ . grid.env
Oracle Home: /u01/app/grid/23.0.0/grid_1
Oracle SID: +ASM

$ asmcmd < alias_noncdb.cmd
ASMCMD> ASMCMD> ASMCMD> ASMCMD> ASMCMD> ASMCMD> ASMCMD> ASMCMD>
Type      Redund  Striped  Time             Sys  Name
DATAFILE  UNPROT  COARSE   AUG 05 14:00:00  N    sysaux_315_1240425485 => +DATA/ORCL2/DATAFILE/SYSAUX.315.1240425485
DATAFILE  UNPROT  COARSE   AUG 05 14:00:00  N    system_306_1240425485 => +DATA/ORCL2/DATAFILE/SYSTEM.306.1240425485
DATAFILE  UNPROT  COARSE   AUG 05 14:00:00  N    undotbs1_280_1240425487 => +DATA/ORCL2/DATAFILE/UNDOTBS1.280.1240425487
DATAFILE  UNPROT  COARSE   AUG 05 14:00:00  N    undotbs2_310_1240425487 => +DATA/ORCL2/DATAFILE/UNDOTBS2.310.1240425487
DATAFILE  UNPROT  COARSE   AUG 05 14:00:00  N    users_275_1240427129 => +DATA/ORCL2/DATAFILE/USERS.275.1240427129
ASMCMD> exit
$

Validación inicial

Ya estamos listos para la actualización a 26ai, por lo que le pedimos a AutoUpgrade que revise nuestra configuración y nos confirme que todo está en orden.

java -jar autoupgrade.jar \
-config upg_dg.cfg \
-mode analyze

AutoUpgrade 26.3.260401 launched with default internal options
Processing config file ...
Loading AutoUpgrade keystore
AutoUpgrade keystore is loaded
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 Non-CDB(s) will be analyzed
Type 'help' to list console commands
upg> Job 100 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]

Please check the summary report at:
/home/oracle/autoupgrade/log/cfgtoollogs/upgrade/auto/status/status.html
/home/oracle/autoupgrade/log/cfgtoollogs/upgrade/auto/status/status.log

Concluido el análisis, inspeccionamos el archivo status.log para comprobar que no se presentaron errores:

==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Aug 05 14:17:17 PET 2026
[Number of Jobs] 1
==========================================
[Job ID] 100
==========================================
[DB Name]                orcl1
[Version Before Upgrade] 19.31.0.0.0
[Version After Upgrade]  23.26.2.0.0
------------------------------------------
[Stage Name]    PRECHECKS
[Status]        SUCCESS
[Start Time]    2026-08-05 14:16:53
[Duration]      0:00:24
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/100/prechecks
[Detail]        /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/100/prechecks/orcl1_preupgrade.log
                Check passed and no manual intervention needed
------------------------------------------

Es hora del upgrade

Primero, detenemos la sincronización desde orcl1 hacia orcl2 y luego reiniciamos orcl2 para que quede en estado mount.
$ dgmgrl sys/*********@orcl1_dg
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Aug 05 14:20:12 2026
Version 19.31.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "orcl1"
Connected as SYSDBA.
DGMGRL> show configuration

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl1 - Primary database
    orcl2 - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 34 seconds ago)

DGMGRL> edit database orcl2 set state='apply-off';
Succeeded.

DGMGRL> show database orcl2

Database - orcl2

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-OFF
  Transport Lag:      0 seconds (computed 0 seconds ago)
  Apply Lag:          3 minutes 3 seconds (computed 0 seconds ago)
  Average Apply Rate: (unknown)
  Real Time Query:    OFF
  Instance(s):
    orcl2

Database Status:
SUCCESS

$ srvctl stop database -db orcl2 -stopoption immediate

$ srvctl start database -db orcl2 -startoption mount

Gráficamente, la situación actual es la siguiente:

Llegó el momento clave: ejecutamos AutoUpgrade con -mode deploy y solo nos queda esperar con paciencia.

java -jar autoupgrade.jar \
-config upg_dg.cfg \
-mode deploy

AutoUpgrade 26.3.260401 launched with default internal options
Processing config file ...
Loading AutoUpgrade keystore
AutoUpgrade keystore is loaded
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 Non-CDB(s) will be processed
Type 'help' to list console commands
upg>

Minutos después, AutoUpgrade se detiene temporalmente y nos indica que antes de proseguir debemos ir a orcl2 y ejecutar un recovery:

..
.
----------------- Continue with the manual steps -----------------
There is a job with manual steps pending.
The checkpoint change number is 1064946 for database orcl1_1.
For the standby database <orcl2>, use the checkpoint SCN <1064946> to recover the database.

You can find the SCN information in:
/home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/drain/scn.json
Once these manual steps are completed, you can resume job 101
------------------------------------------------------------------

Nos conectamos a orcl2 y ejecutamos la recuperación hasta el SCN 1064946; luego, nos aseguramos de que todos los datafiles estén sincronizados hasta ese SCN.

$ . orcl2.env
Oracle Home: /u01/app/oracle/19.0.0/db_1
Oracle SID: orcl2_1

$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 5 14:30:10 2026
Version 19.31.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.31.0.0.0

SQL> alter database recover managed standby database until change 1064946;

Database altered.

SQL> select checkpoint_change#, count(*)
from v$datafile_header
group by checkpoint_change#
order by checkpoint_change#;

CHECKPOINT_CHANGE#   COUNT(*)
------------------ ----------
           1064946          5

A partir de ahora, ya no necesitamos la base de datos orcl2, así que la vamos a detener y desactivar para asegurarnos de que nadie la reinicie por accidente. De esta manera, evitamos que se interrumpa el proceso de plug-in hacia orcl4.

$ srvctl stop database -db orcl2 -stopoption immediate

$ srvctl disable database -db orcl2

Gráficamente, la situación actual es la siguiente:

Ahora sí, tenemos todo listo para regresar a AutoUpgrade y reiniciar el trabajo con resume.

..
.
upg> resume -job 101
Resuming job: [101][orcl1_1]
upg>
-----------------------Resuming AutoUpgrade-----------------------
AutoUpgrade is resuming the execution for job 101
------------------------------------------------------------------

A continuación, se ejecutan el upgrade y la conversión de non-CDB a CDB.

Después de unos minutos, la actualización a 26ai ha finalizado con éxito, pero, para estar seguros, procedemos a comprobarlo revisando el archivo status.log y, posteriormente, el archivo orcl1_postupgrade.log, que nos indica los siguientes pasos.
..
.
Job 101 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]
Jobs restored                  [0]
Jobs pending                   [0]


Please check the summary report at:
/home/oracle/autoupgrade/log/cfgtoollogs/upgrade/auto/status/status.html
/home/oracle/autoupgrade/log/cfgtoollogs/upgrade/auto/status/status.log
status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Aug 05 15:00:08 PET 2026
[Number of Jobs] 1
==========================================
[Job ID] 101
==========================================
[DB Name]                orcl1
[Version Before Upgrade] 19.31.0.0.0
[Version After Upgrade]  23.26.2.0.0
------------------------------------------
[Stage Name]    GRP
[Status]        SUCCESS
[Start Time]    2026-08-05 14:19:40
[Duration]      0:00:06
[Detail]        Please drop the following GRPs after Autoupgrade completes:
                 AUTOUPGRADE_9212_ORCL11931000
------------------------------------------
[Stage Name]    PREUPGRADE
[Status]        SUCCESS
[Start Time]    2026-08-05 14:19:47
[Duration]      0:00:00
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/preupgrade
------------------------------------------
[Stage Name]    PRECHECKS
[Status]        SUCCESS
[Start Time]    2026-08-05 14:19:47
[Duration]      0:00:30
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/prechecks
[Detail]        /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/prechecks/orcl1_preupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
[Stage Name]    PREFIXUPS
[Status]        SUCCESS
[Start Time]    2026-08-05 14:20:17
[Duration]      0:00:28
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/prefixups
[Detail]        /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/prefixups/prefixups.html
------------------------------------------
[Stage Name]    DRAIN
[Status]        SUCCESS
[Start Time]    2026-08-05 14:38:21
[Duration]      0:00:05
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/drain
------------------------------------------
[Stage Name]    DBUPGRADE
[Status]        SUCCESS
[Start Time]    2026-08-05 14:38:26
[Duration]      0:14:33
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/dbupgrade
------------------------------------------
[Stage Name]    NONCDBTOPDB
[Status]        SUCCESS
[Start Time]    2026-08-05 14:58:32
[Duration]      0:00:03
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/noncdbtopdb
------------------------------------------
[Stage Name]    POSTCHECKS
[Status]        SUCCESS
[Start Time]    2026-08-05 14:58:35
[Duration]      0:00:01
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/postchecks
[Detail]        /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/postchecks/orcl1_postupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
[Stage Name]    POSTFIXUPS
[Status]        SUCCESS
[Start Time]    2026-08-05 14:58:36
[Duration]      0:01:15
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/postfixups
[Detail]        /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/postfixups/postfixups.html
------------------------------------------
[Stage Name]    POSTUPGRADE
[Status]        SUCCESS
[Start Time]    2026-08-05 14:59:52
[Duration]      0:00:15
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/postupgrade
------------------------------------------
[Stage Name]    SYSUPDATES
[Status]        SUCCESS
[Start Time]    2026-08-05 15:00:08
[Duration]      0:00:00
[Log Directory] /home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/sysupdates
------------------------------------------
Summary:/home/oracle/autoupgrade/log/orcl1_Upgrade/orcl1_1/101/dbupgrade/upg_summary.log
[dbname]          [orcl1]
==========================================
[container]          [ORCL]
==========================================
[checkname]          TIMESTAMP_MISMATCH
[stage]              POSTCHECKS
[fixup_available]    YES
[runfix]             YES
[severity]           WARNING
[action]             Recompile the objects with timestamp mismatch. Refer to MOS note 781959.1 for more details.
[broken rule]        There are objects whose timestamp are mismatched with its parent objects.
[rule]               Timestamp of dependent objects must coincide with the timestamp of parent objects.
----------------------------------------------------

[checkname]          POST_DICTIONARY
[stage]              POSTCHECKS
[fixup_available]    YES
[runfix]             YES
[severity]           RECOMMEND
[action]             Gather dictionary statistics after the upgrade using the command:    EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;
[broken rule]        Oracle recommends gathering dictionary statistics after upgrade.
[rule]               Dictionary statistics provide essential information to the Oracle optimizer to help it find efficient SQL execution plans. After a database upgrade, statistics need to be re-gathered as there can now be tables that have significantly changed during the upgrade or new tables that do not have statistics gathered yet.
----------------------------------------------------

[checkname]          POST_FIXED_OBJECTS
[stage]              POSTCHECKS
[fixup_available]    NO
[runfix]             N/A
[severity]           RECOMMEND
[action]             Gather statistics on fixed objects after the upgrade and when there is a representative workload on the system using the command:    EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
[broken rule]        Oracle recommends gathering fixed object statistics after upgrade. This recommendation is given for all preupgrade runs.
[rule]               Fixed object statistics provide essential information to the Oracle optimizer to help it find efficient SQL execution plans. Those statistics are specific to the Oracle Database release that generates them, and can be stale upon database upgrade.  For information on managing optimizer statistics, refer to the 19.0.0.0 Oracle Database Upgrade Guide.
----------------------------------------------------

¿Sincronización detenida ?

Para el caso de orcl1, AutoUpgrade se  encarga de agregar sus TDE keys al unified keystore de orcl3, pero al tratarse de archivos externos a la base de datos, estos cambios no se replican y, por consiguiente, estas TDE keys no están presentes en el unified keystore de orcl4.

El efecto inmediato es que los datafiles encriptados no pueden ser reconocidos adecuadamente, tal como observamos que se registra en el archivo alert_orcl4.log (líneas 31 a 35):

2026-08-05T14:38:22.272467-05:00
Recovery created pluggable database ORCL
ORCL(3):Recovery scanning directory +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE for any matching files.
ORCL(3):KZTDE:kztsmptc: Missing Key ID: AXzXtD9MUU/Mv7nOMOs4MC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORCL(3):KZTDE:kztsmptc: keystore_type: 3, wallet_type: 1,wallet location: file:+DATA/orcl4/tde/
ORCL(3):KZTDE:kztsmptc: keystore mode: United
ORCL(3):Recovery created file +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/system_306_1240425485
ORCL(3):Successfully added datafile 8 to media recovery
ORCL(3):Datafile #8: '+DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/system_306_1240425485'
ORCL(3):KZTDE:kztsmptc: Missing Key ID: AXzXtD9MUU/Mv7nOMOs4MC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORCL(3):KZTDE:kztsmptc: keystore_type: 3, wallet_type: 1,wallet location: file:+DATA/orcl4/tde/
ORCL(3):KZTDE:kztsmptc: keystore mode: United
ORCL(3):Recovery created file +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/sysaux_315_1240425485
ORCL(3):Successfully added datafile 9 to media recovery
ORCL(3):Datafile #9: '+DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/sysaux_315_1240425485'
ORCL(3):KZTDE:kztsmptc: Missing Key ID: AXzXtD9MUU/Mv7nOMOs4MC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORCL(3):KZTDE:kztsmptc: keystore_type: 3, wallet_type: 1,wallet location: file:+DATA/orcl4/tde/
ORCL(3):KZTDE:kztsmptc: keystore mode: United
ORCL(3):Recovery created file +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/undotbs1_280_1240425487
ORCL(3):Successfully added datafile 10 to media recovery
ORCL(3):Datafile #10: '+DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/undotbs1_280_1240425487'
ORCL(3):KZTDE:kztsmptc: Missing Key ID: AXzXtD9MUU/Mv7nOMOs4MC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORCL(3):KZTDE:kztsmptc: keystore_type: 3, wallet_type: 1,wallet location: file:+DATA/orcl4/tde/
ORCL(3):KZTDE:kztsmptc: keystore mode: United
ORCL(3):Recovery created file +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/undotbs2_310_1240425487
ORCL(3):Successfully added datafile 11 to media recovery
ORCL(3):Datafile #11: '+DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/undotbs2_310_1240425487'
ORCL(3):KZTDE:kztsmptc: Missing Key ID: AXzXtD9MUU/Mv7nOMOs4MC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORCL(3):KZTDE:kztsmptc: keystore_type: 3, wallet_type: 1,wallet location: file:+DATA/orcl4/tde/
ORCL(3):KZTDE:kztsmptc: keystore mode: United
ORCL(3):WARNING: the following master key for pluggable database 3 tablespace 5 (file # 12) does not exist in the current keystore.
Please check if the master key is successfully imported from the source keystore.
ORCL(3):kcbtse_populate_tbskey: ena 4 flag 0x2f mkloc 0x1
ORCL(3):   encrypted key 102634419002081e5e428baf89376ca72b91f53334e8c84bdd79ca905ffef8f2
ORCL(3):   mkid 7cd7b43f4c514fccbfb9ce30eb38302d
ORCL(3):Recovery created file +DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/users_275_1240427129
ORCL(3):Successfully added datafile 12 to media recovery
ORCL(3):Datafile #12: '+DATA/ORCL4/584193FA481692D6E0638200A8C0A234/DATAFILE/users_275_1240427129'

Al no poder procesar el redo encriptado, la sincronización de orcl4 se detiene automáticamente, como podemos comprobar fácilmente con DGMGRL:

DGMGRL> show configuration

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl3 - Primary database
    orcl4 - Physical standby database
      Error: ORA-16810: Multiple errors or warnings detected for the member.

Fast-Start Failover:  Disabled

Configuration Status:
ERROR   (status updated 36 seconds ago)

DGMGRL> show database orcl4

Database - orcl4

  Role:                PHYSICAL STANDBY
  Intended State:      APPLY-ON
  Transport Lag:       0 seconds (computed 1 second ago)
  Apply Lag:           22 minutes 33 seconds (computed 1 second ago)
  Average Apply Rate:  4.97 MByte/s
  Real Time Query:     OFF
  Instance(s):
    orcl4_1

  Database Error(s):
    ORA-16766: Redo Apply is stopped.

  Database Warning(s):
    ORA-16853: apply lag has exceeded specified threshold

Database Status:
ERROR

Para resolverlo, vamos a actualizar manualmente los archivos del TDE keystore, así que primero detendremos la sincronización y bajaremos la base de datos orcl4.

DGMGRL> edit database orcl4 set state='apply-off';
Succeeded.

$ srvctl stop database -db orcl4 -stopoption immediate

A continuación, copiamos los archivos del TDE keystore de orcl3 (wallet_root=’+DATA/orcl3′) al servidor en el que corre orcl4.

$ . grid.env
Oracle Home: /u01/app/grid/23.0.0/grid_1
Oracle SID: +ASM1

$ asmcmd kscopy +data/orcl3/tde/ewallet.p12 /home/oracle/tde/orcl3
copying +data/orcl3/tde/ewallet.p12 -> /home/oracle/tde/orcl3/ewallet.p12

$ asmcmd kscopy +data/orcl3/tde/cwallet.sso /home/oracle/tde/orcl3
copying +data/orcl3/tde/cwallet.sso -> /home/oracle/tde/orcl3/cwallet.sso

$ scp /home/oracle/tde/orcl3/ewallet.p12 oracle@stdb-vm:/home/oracle/tde/orcl4/. 
ewallet.p12                                            100% 5091     7.4MB/s   00:00
$ scp /home/oracle/tde/orcl3/cwallet.sso oracle@stdb-vm:/home/oracle/tde/orcl4/. 
cwallet.sso                                            100% 5136     7.7MB/s   00:00

Ahora copiamos los archivos al TDE keystore de orcl4 (wallet_root=’+DATA/orcl4′), asegurándonos de borrar primero los archivos antiguos. Luego levantamos la base de datos.

$ . grid.env
Oracle Home: /u01/app/grid/23.0.0/grid_1
Oracle SID: +ASM

$ asmcmd rm +data/orcl4/tde/ewallet.p12
$ asmcmd rm +data/orcl4/tde/cwallet.sso 

$ asmcmd kscopy /home/oracle/tde/orcl4/ewallet.p12 +data/orcl4/tde --dbuniquename orcl4
copying /home/oracle/tde/orcl4/ewallet.p12 -> +data/orcl4/tde/ewallet.p12

$ asmcmd kscopy /home/oracle/tde/orcl4/cwallet.sso +data/orcl4/tde --dbuniquename orcl4 --autologin
copying /home/oracle/tde/orcl4/cwallet.sso -> +data/orcl4/tde/cwallet.sso

$ . orcl4.env
Oracle Home: /u01/app/oracle/23.0.0/db_1
Oracle SID: orcl4_1

$ srvctl start database -db orcl4

Finalmente, reactivamos la sincronización y verificamos que ya no hayan problemas.

$ dgmgrl sys/*******@orcl3_dg
DGMGRL for Linux: Release 23.26.2.0.0 - Production on Wed Aug 5 15:34:19 2026
Version 23.26.2.0.0

Copyright (c) 1982, 2026, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "orcl3"
Connected as SYSDBA.

DGMGRL> edit database orcl4 set state='apply-on';
Succeeded.

DGMGRL> show configuration

Configuration - dg_orcl

  Protection Mode: MaxPerformance
  Members:
  orcl3 - Primary database
    orcl4 - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 18 seconds ago)

DGMGRL> show database orcl4

Database - orcl4

  Role:                PHYSICAL STANDBY
  Intended State:      APPLY-ON
  Transport Lag:       0 seconds (computed 1 second ago)
  Apply Lag:           0 seconds (computed 1 second ago)
  Average Apply Rate:  8.62 MByte/s
  Real Time Query:     ON
  Instance(s):
    orcl4_1

Database Status:
SUCCESS

Pasos finales

En orcl1_postugrade.log se nos hizo recordar que debemos actualizar las estadísticas del diccionario y de los objetos fijos, por lo que ejecutamos:

execute DBMS_STATS.GATHER_DICTIONARY_STATS;
execute DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

Por supuesto, toca revisar si quedan problemas pendientes tras el plug-in de la base de datos y, si todo está resuelto, podemos limpiar la tabla.

SELECT message, status
  FROM pdb_plug_in_violations 
 WHERE name = 'ORCL'
 ORDER BY time DESC;

exec DBMS_PDB.CLEAR_PLUGIN_VIOLATIONS;

Si bien los servicios de la base de datos orcl1 están registrados en el flamante PDB orcl, con_id=3 en orcl3, los servicios a nivel de clusterware no se han creado, por lo que hay que registrarlos manualmente con srvctl.

column name format a20
column network_name format a20

SELECT con_id, name, network_name 
  FROM v$services
 ORDER by con_id, name;

    CON_ID NAME                 NETWORK_NAME
---------- -------------------- --------------------
         1 SYS$BACKGROUND
         1 SYS$USERS
         1 orcl3                orcl3
         1 orcl3XDB             orcl3XDB
         3 orcl                 orcl
         3 orcl1                orcl1
         3 orcl1XDB             orcl1XDB
         3 orcl_ro              orcl_ro
         3 orcl_rw              orcl_rw
$ srvctl config service -db orcl3

$ srvctl add service -db orcl3 -service orcl_rw -pdb orcl -role primary -preferred orcl3_1,orcl3_2
$ srvctl add service -db orcl3 -service orcl_ro -pdb orcl -role physical_standby -preferred orcl3_1,orcl3_2

$ srvctl start service -db orcl3 -service orcl_rw
$ srvctl start service -db orcl3 -service orcl_ro
$ srvctl stop service -db orcl3 -service orcl_ro

$ srvctl status service -db orcl3
Service orcl_ro is not running.
Service orcl_rw is running on instances orcl3_1,orcl3_2
De forma similar, para la base de datos orcl4 no se han creado los servicios a nivel de clusterware, por lo que hay que registrarlos manualmente con srvctl.
$ srvctl config service -db orcl4

$ srvctl add service -db orcl4 -service orcl_rw -pdb orcl -role primary
$ srvctl add service -db orcl4 -service orcl_ro -pdb orcl -role physical_standby

$ srvctl start service -db orcl4 -service orcl_rw
$ srvctl start service -db orcl4 -service orcl_ro
$ srvctl stop service -db orcl4 -service orcl_rw

$ srvctl status service -db orcl4
Service orcl_ro is running
Service orcl_rw is not running.
Se ha cumplido el objetivo: orcl ahora opera con normalidad, pero ya con Oracle Database Server 26ai.

Conclusiones

En My Oracle Support encontrarás la nota KB117147: Reusing the Source Standby Database Files When Plugging a non-CDB as a PDB into the Primary Database of a Data Guard Configuration, en la que se detallan todos los pasos manuales para el escenario que acabamos de presentar.

Luego de que lo leas, coincidirás en que hay demasiados pasos, pero ya viste lo fácil que es con la ayuda de AutoUpgrade: solo necesitas crear el archivo de configuración, ejecutarlo un par de veces y ¡listo! Todo se hace solo y sin errores. Solo nos resta la creación de directorios y de alias de ASM, así como el copiado de las TDE keys, y en unos minutos tendremos nuestra base de datos actualizada a 26ai.

Posts Recientes

https://www.magnific.com/free-vector/man-working-telecommuting-with-laptop-couch_7451000.htm
Mi selección de los cinco mejores artículos sobre Oracle Database, publicados en julio de 2026.
errors BPF
Estás instalando un Cluster Oracle 12c+ en AIX y te topaste con PRVE-0474 / PRVE-0473, sigue estos pasos y olvídate del asunto.
AU rollback: rollback
Parchar con AutoUpgrade se hizo muy fácil, pero un rollback había que hacerlo a mano. Pues no más, aprende cómo hacerlo con AutoUpgrade.
Plugin non-CDB
En Oracle 26ai, multitenant es obligatorio. Aprenda a actualizar de 19c non-CDB a 26ai, migrando correctamente a esta nueva arquitectura.
www.vecteezy.com/free-vector/girl
Aquí tienes mi selección de los cinco mejores artículos sobre Oracle publicados en junio de 2026.
www.magnific.com/free-vector/man-using-laptop-computer_136881009.htm
Aquí tienes mi selección de los cinco mejores artículos sobre Oracle publicados en mayo de 2026.

¿Necesitas Ayuda?

Completa estos datos y estaré en contacto a la brevedad.