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.
| source | target | |||
|---|---|---|---|---|
| db_name | orcl | orcl | ||
| db_unique_name | orcl1 | orcl2 | orcl3 | orcl4 |
| role | primary | standby | primary | standby |
| instance_name | orcl1_1, orcl1_2 | orcl2_1 | orcl3_1, orcl3_2 | orcl4_1 |
| services | orcl_rw | orcl_ro | ||
| version | 19.31 | 23.26.2 | ||
| TDE keystore password | RigyoTasEnuhyu5# | 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
$ 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.
..
.
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
orcl1_postupgrade.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
$ 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.
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.