martes, 29 de abril de 2025

Oracle Hot Topics: 29 Abril 2025

Bugs

Bug Product Area Bug ID Last Updated

ORA-600[EVAOPN2.H:KAF_QEECOL] AFTER COMMON SUB-EXPRESSION ELIMINATION

Oracle Database - Enterprise Edition 33838741 Tue, 29 Apr 2025 03:34 GMT-06:00

Knowledge Articles

Knowledge Article Product Area Last Updated

gDBClone Powerful Database Clone/Snapshot Management Tool

Oracle Database Exadata Express Cloud Service Oracle Database Cloud Exadata Service Oracle Database Cloud Service Oracle Cloud Infrastructure - Database Service Oracle Database Cloud Schema Service Oracle Database - Enterprise Edition Gen 1 Exadata Cloud at Customer (Oracle Exadata Database Cloud Machine) Oracle Database Backup Service Tue, 29 Apr 2025 04:45 GMT-06:00


lunes, 28 de abril de 2025

Validar si un servicio HTTP esta respondiendo a un llamado.

A veces necesitamos notificar si un URL esta respondiendo correctamente.

Desde una máquina en linux o unix, puedes crear un archivo que contenga el siguiente código y agregarlo a tu CRONTAB.

recuerda al inicio agregar la línea: MAILTO="correo.notificacion@miempresa.com" y si configuras adecuadamente el servicio de Postfix, te llegará a tu cuenta, la notificación del estado del servicio.

 #!/bin/bash

#URL="http://google.com:9073"
URL="https://www.google.com"

HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" $URL)

if [ "$HTTP_CODE" -eq 200 ]; then
  echo "OK - URL $URL esta respondiendo con HTTP 200"
  exit 0
else
  echo "CRITICAL - URL $URL no esta respondiendo apropiadamente. HTTP Code: $HTTP_CODE"
  exit 2
fi

[oracle@taller-capacitacion-111797 ~]$ sh validar_http.sh
OK - URL https://www.google.com esta respondiendo con HTTP 200

viernes, 25 de abril de 2025

Cómo modificar la prioridad de ejecución de un proceso BACKGROUND de la base de datos a nivel de sistema operativo Linux.

En Oracle Linux (y en general en sistemas Linux), TS (Time Sharing) y RR (Round Robin) son dos tipos de políticas de planificación de procesos (scheduling policies) que definen cómo el kernel decide cuándo y cuánto tiempo ejecuta un proceso en la CPU.

TS - Time Sharing (SCHED_OTHER)

  • Es la política por defecto para los procesos normales (no tiempo real).

  • Diseñada para equilibrar el uso de CPU entre muchos procesos de forma justa.

  • Usa un algoritmo de prioridad dinámica, es decir:

    • Si un proceso consume mucha CPU, su prioridad puede bajar temporalmente.

    • Si está inactivo (esperando E/S), puede ganar prioridad.

  • Ideal para entornos multitarea tradicionales donde se busca mantener buena respuesta del sistema.

🔹 Ejemplo: procesos de usuario, shell scripts, editores de texto, sesiones SQL*Plus, etc.

RR - Round Robin (SCHED_RR)

  • Es una política de tiempo real.

  • Usa prioridades fijas (estáticas) entre 1 y 99 (más alta = más prioridad).

  • Todos los procesos con la misma prioridad se ejecutan en orden, uno después del otro, por intervalos de tiempo iguales (el "quantum").

  • No se ajusta automáticamente como TS.

  • Debe ser usado con precaución, porque puede acaparar la CPU y afectar procesos normales.

🔹 Ejemplo: procesos críticos de tiempo real, como servicios industriales, controladores de dispositivos en baja latencia, etc.

Cuando un proceso se ejecuta en RR (Tiempo real) su prioridad es fija entre un valor 1 y 99 y la característica de "justicia" o convivencia con otros procesos es baja, lo que puede producir que se bloqueen otros procesos. También se corre el riesgo , de que se acapare el CPU si se utiliza mal.

En Oracle Database, dependiendo de la versión que estés utilizando y las características configuradas, puedes tener una cantidad importante de procesos background ejecutándose.

Puedes validar la información de los procesos en ejecución a través de una consulta a la vista dinámica V$PROCESS.

Hablemos de 3 de ellos que es común encontrar en nuestros servidores: LMS, VKTM y LGWR

LMS – Lock Manager Server Process

Función principal:

LMS es el proceso clave del subsistema de Oracle RAC (Real Application Clusters). Se encarga de la gestión de bloqueos globales (Global Cache Management) y coherencia de buffer entre instancias.

Roles y responsabilidades:

  • Coordina los accesos a bloques de datos compartidos entre nodos RAC.

  • Si un nodo necesita un bloque que otro nodo posee en su buffer cache, LMS orquesta la transferencia.

  • Usa GCS (Global Cache Services) y GES (Global Enqueue Services).

Escenario típico:

Cuando una sesión en el nodo A necesita leer un bloque actualizado en el nodo B:

  1. Se genera una solicitud remota.

  2. LMS de ambos nodos se comunican.

  3. Se transfiere el bloque actualizado, asegurando consistencia.

Importancia en rendimiento:

  • Alta latencia en LMS puede causar esperas en gc cr request o gc buffer busy acquire.

  • Se recomienda monitorear con GV$ACTIVE_SESSION_HISTORY.

VKTM – Virtual Keeper of Time

Función principal:

VKTM mantiene la precisión del tiempo interno de la instancia de base de datos Oracle.

Roles y responsabilidades:

  • Proporciona una referencia de tiempo altamente precisa para los procesos internos.

  • Sincroniza los timestamps usados en trace files, diagnósticos, ejecución de SQL, etc.

  • Reduce el número de llamadas al sistema operativo para obtener el tiempo (gettimeofday()), mejorando el rendimiento.

Escenario típico:

Cuando múltiples procesos necesitan timestamps (por ejemplo, para medir latencias), en lugar de llamar directamente al sistema operativo, obtienen la hora desde VKTM, que actúa como reloj compartido.

Importancia:

  • Especialmente útil en sistemas con múltiples CPUs/threads, ya que evita inconsistencias de tiempo en eventos concurrentes.

LGWR – Log Writer

Función principal:

LGWR escribe los redo entries (registros de cambios) desde el log buffer en la SGA hacia los redo log files en disco.

Roles y responsabilidades:

  • Asegura la durabilidad de las transacciones: cuando una transacción hace COMMIT, LGWR garantiza que sus cambios están en disco.

  • Escribe en los archivos redo log en:

    • COMMITs

    • Checkpoints

    • Cada 3 segundos o cuando el log buffer está 1/3 lleno

    • Cuando un proceso necesita espacio en el buffer

Escenario típico:

Durante una transacción:

  1. Los cambios se almacenan en el log buffer.

  2. Al ejecutar COMMIT, el proceso de usuario espera hasta que LGWR escriba esos cambios al archivo redo log.

  3. Luego se confirma el COMMIT al cliente.

Importancia en recuperación y performance:

  • En caso de fallo, Oracle usa los redo logs para recuperar los cambios no grabados en los datafiles.

  • LGWR debe ser rápido: el almacenamiento de redo logs debería ser de alta velocidad y baja latencia.

En Oracle Database 19c E.E., 19.27, el proceso VKTM corre en tiempo real (RR):

SQL> host ps -eo pid,class,pri,nice,time,args |grep vktm

20624 RR 41 - 00:34:51 ora_vktm_cdb
189777 TS 19 0 00:00:00 /bin/bash -c ps -eo pid,class,pri,nice,time,args |grep vktm
189779 TS 19 0 00:00:00 grep vktm

Pero en el caso del resto de procesos, lo hacen en tiempo compartido.

SQL> host ps -eo pid,class,pri,nice,time,args |grep ora_lg*
  20666 TS   19   0 00:00:26 ora_lgwr_cdb
  20674 TS   19   0 00:00:02 ora_lg00_cdb
  20680 TS   19   0 00:00:02 ora_lg01_cdb
  20688 TS   19   0 00:00:10 ora_lreg_cdb
 189780 TS   19   0 00:00:00 /bin/bash -c ps -eo pid,class,pri,nice,time,args |grep ora_lg*
 189782 TS   19   0 00:00:00 grep ora_lg*

Como hemos mencionado en líneas previas, el LGWR y el proceso LMS podrían ser sumamente críticos para un sistema con alta demanda, pero se ejecutan en tiempo compartido (TS).

Como ya he mencionado en muchas notas anteriores, Oracle Database tiene una gran cantidad de parámetros de configuración, llamados "OCULTOS" que pueden ser configurados con ayuda del equipo técnico del MOS, si se llegan a presentar inconvenientes como cuellos de botella.

En este caso, vamos a hablar de "high_priority_processes" que puede ser utilizado, para cambiar la prioridad de ejecución de un proceso de la base de datos.

Recuerden que esto primero debe ser bien analizado y altamente recomendado probar inicialmente en un ambiente de testeo.

Lo primero que tenemos que hacer es validar si el parámetro ha sido previamente configurado. Si no existe vamos a declararlo en el archivo de parámetros SPFILE. Este párametro no es dinámico, por lo que será necesario reiniciar la base de datos para que tome efecto.

SQL> show parameter high
SQL> alter system set "_high_priority_processes"='LMS*|VKTM|LGWR' scope=spfile;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.0.0
[oracle@laboratorio-investigacion admin]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 25 22:16:00 2025
Version 19.27.0.0.0

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

SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 1.2281E+10 bytes
Fixed Size                  9191424 bytes
Variable Size            1912602624 bytes
Database Buffers         1.0335E+10 bytes
Redo Buffers               24363008 bytes
Database mounted.
Database opened.
SQL> show parameter high

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_high_priority_processes             string      LMS*|VKTM|LGWR

SQL> host ps -eo pid,class,pri,nice,time,args |grep vktm
 189903 RR   41   - 00:00:00 ora_vktm_cdb
 190227 TS   19   0 00:00:00 /bin/bash -c ps -eo pid,class,pri,nice,time,args |grep vktm
 190229 TS   19   0 00:00:00 grep vktm

SQL> host ps -eo pid,class,pri,nice,time,args |grep ora_lg*
 189945 RR   41   - 00:00:00 ora_lgwr_cdb
 189955 TS   19   0 00:00:00 ora_lg00_cdb
 189961 TS   19   0 00:00:00 ora_lg01_cdb
 189969 TS   19   0 00:00:00 ora_lreg_cdb
 190232 TS   19   0 00:00:00 /bin/bash -c ps -eo pid,class,pri,nice,time,args |grep ora_lg*
 190234 TS   19   0 00:00:00 grep ora_lg*

Como pueden observar, ahora el proceso LGWR se encuentra corriendo en tiempo real (RR).

Existe alguna información importante de monitoreo que podemos obtener directamente desde el director de procesos del sistema operativo /proc, relacionados con los procesos en ejecución.

Para encontrar la información que necesitamos de un proceso, tomamos el ID del proceso y lo ponemos a continuación de la ruta /proc.


SQL> host ps -eo pid,class,pri,nice,time,args |grep ora_lg*
 189945 RR   41   - 00:00:00 ora_lgwr_cdb
 189955 TS   19   0 00:00:00 ora_lg00_cdb
 189961 TS   19   0 00:00:00 ora_lg01_cdb
 189969 TS   19   0 00:00:00 ora_lreg_cdb
 190232 TS   19   0 00:00:00 /bin/bash -c ps -eo pid,class,pri,nice,time,args |grep ora_lg*
 190234 TS   19   0 00:00:00 grep ora_lg*

SQL> host

[oracle@laboratorio-investigacion admin]$ cd /proc
[oracle@laboratorio-investigacion proc]$ cd 189945
[oracle@laboratorio-investigacion 189945]$ ls -la
total 0
dr-xr-xr-x.   9 oracle oinstall 0 Apr 25 22:16 .
dr-xr-xr-x. 290 root   root     0 Apr 22 00:20 ..
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 arch_status
dr-xr-xr-x.   2 oracle oinstall 0 Apr 25 22:18 attr
-r--------.   1 oracle oinstall 0 Apr 25 22:18 auxv
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 cgroup
--w-------.   1 oracle oinstall 0 Apr 25 22:18 clear_refs
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 cmdline
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 comm
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 coredump_filter
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 cpu_resctrl_groups
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 cpuset
lrwxrwxrwx.   1 oracle oinstall 0 Apr 25 22:18 cwd -> /opt/app/oracle/product/19c/dbs
-r--------.   1 oracle oinstall 0 Apr 25 22:18 environ
lrwxrwxrwx.   1 oracle oinstall 0 Apr 25 22:16 exe -> /opt/app/oracle/product/19c/bin/oracle
dr-x------.   2 oracle oinstall 0 Apr 25 22:16 fd
dr-xr-xr-x.   2 oracle oinstall 0 Apr 25 22:18 fdinfo
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 gid_map
-r--------.   1 oracle oinstall 0 Apr 25 22:16 io
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 limits
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 loginuid
dr-x------.   2 oracle oinstall 0 Apr 25 22:18 map_files
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 maps
-rw-------.   1 oracle oinstall 0 Apr 25 22:18 mem
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 mountinfo
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 mounts
-r--------.   1 oracle oinstall 0 Apr 25 22:18 mountstats
dr-xr-xr-x.  55 oracle oinstall 0 Apr 25 22:18 net
dr-x--x--x.   2 oracle oinstall 0 Apr 25 22:16 ns
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 numa_maps
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 oom_adj
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 oom_score
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:16 oom_score_adj
-r--------.   1 oracle oinstall 0 Apr 25 22:18 pagemap
-r--------.   1 oracle oinstall 0 Apr 25 22:18 personality
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 projid_map
lrwxrwxrwx.   1 oracle oinstall 0 Apr 25 22:18 root -> /
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 sched
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 schedstat
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 sessionid
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 setgroups
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 smaps
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 smaps_rollup
-r--------.   1 oracle oinstall 0 Apr 25 22:18 stack
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 stat
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 statm
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 status
-r--------.   1 oracle oinstall 0 Apr 25 22:18 syscall
dr-xr-xr-x.   3 oracle oinstall 0 Apr 25 22:18 task
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 timens_offsets
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:18 timers
-rw-rw-rw-.   1 oracle oinstall 0 Apr 25 22:18 timerslack_ns
-rw-r--r--.   1 oracle oinstall 0 Apr 25 22:18 uid_map
-r--r--r--.   1 oracle oinstall 0 Apr 25 22:16 wchan
[oracle@laboratorio-investigacion 189945]$ more sched
ora_lgwr_cdb (189945, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :     338122544.299222
se.vruntime                                  :            -5.974001
se.sum_exec_runtime                          :            70.000650
se.nr_migrations                             :                    1
nr_switches                                  :                 1435
nr_voluntary_switches                        :                 1432
nr_involuntary_switches                      :                    3
se.load.weight                               :              1048576
se.avg.load_sum                              :                42637
se.avg.runnable_sum                          :             11051218
se.avg.util_sum                              :             10976185
se.avg.load_avg                              :                  922
se.avg.runnable_avg                          :                  233
se.avg.util_avg                              :                  231
se.avg.last_update_time                      :      337975686315008
se.avg.util_est.ewma                         :                  243
se.avg.util_est.enqueued                     :                  231
policy                                       :                    2
prio                                         :                   98
clock-delta                                  :                   60
mm->numa_scan_seq                            :                    0
numa_pages_migrated                          :                    0
numa_preferred_nid                           :                   -1
total_numa_faults                            :                    0
current_node=0, numa_group_id=0
numa_faults node=0 task_private=0 task_shared=0 group_private=0 group_shared=0
Los valores de variables del contenido del archivo pueden variar.

El archivo /proc/<PID>/sched en sistemas Linux (como Oracle Linux) contiene información detallada del planificador (scheduler) del kernel para un proceso específico. Este archivo es extremadamente útil para análisis de rendimiento, especialmente en entornos donde quieres investigar cómo el kernel ha gestionado un proceso individual.

El archivo SCHED, es un archivo de texto generado dinámicamente por el kernel que contiene métricas relacionadas con:

  • La planificación del proceso.

  • El tiempo de ejecución.

  • La interacción con CPUs.

  • Cómo se comportó dentro del planificador

Explicación de los campos clave:
Campo	                    Descripción
bash (1234, #threads: 1)    Nombre del proceso, PID y número de threads
se.exec_start	            Timestamp del último inicio de ejecución (en nanosegundos desde el arranque del sistema)
se.vruntime	            Tiempo de CPU utilizado, ajustado por peso (usado en CFS para decisiones de scheduling)
se.sum_exec_runtime	    Total de tiempo en CPU en nanosegundos
nr_switches	            Total de cambios de contexto realizados
nr_voluntary_switches	    Cambios de contexto voluntarios (por espera o sleep)
nr_involuntary_switches	    Cambios de contexto forzados por el scheduler
nr_wakeups	            Cantidad de veces que fue despertado desde estado de sleep
se.avg.last_update_time	    Última vez que se actualizaron los promedios del proceso (en nanosegundos)
se.avg.load_sum	            Suma acumulada del peso (carga) del proceso desde el último reinicio del promedio
se.avg.runnable_avg_sum	    Suma del tiempo que el proceso estuvo listo para correr (runnable)
se.avg.runnable_avg_period  Período total en que se ha observado la “runnable average”
se.avg.util_avg	            Promedio de utilización de CPU por parte del proceso (base para CPU utilization tracking)
se.avg.load_avg	            Promedio móvil de carga del proceso, ajustado por peso (weight)
se.avg.decay_count	    Cuántas veces se ha aplicado el factor de decaimiento exponencial a los promedios
Algunos de los valores de estos parámetros nos ayuda a validar si un proceso espera mucho tiempo por disco o red como lo hace iowait_sum.

Comparar los valores de sum_exec_runtime entre procesos te muestra quién ha consumido más CPU realmente.

Si nr_involuntary_switches es alto el kernel está forzando al proceso a dejar la CPU.

El campo se.avg.last_update_time es sumamente importante. Este parámetro muestra el timestamp en nanosegundos que indica cuándo fue la última vez que se actualizó la información promedio del proceso, particularmente los promedios que el Completely Fair Scheduler (CFS) usa para calcular la equidad y el reparto de tiempo de CPU.

Mi recomendación es buscar la información oficial relacionada con tu versión de sistema operativo, para conocer más, de como esta ejecutándose los procesos en tu servidor o servicio, que aloja a tu base de datos.

No olviden por favor, implementar este tipo de cambios en ambientes controlados, antes de aplicar en producción.

Oracle Database Container Database: Renombrando el nombre de una PDB

Es posible cambiar el nombre a una base de datos acoplada dentro de un contenedor, despues de haber sido creada.?

La respuesta es si y el procedimiento no es para nada complejo.

Vamos a ver, tenemos el siguiente grupo de PDBs dentro de un contenedor de base de datos.
Tenemos la PDB "LABDEV"  y queremos cambiar su nombre a "LABVA",  estos son los pasos que debes seguir para hacerlo:
  1. Es necesario que cierre la PDB que deseas cambiar el nombre.
  2. Procede luego a abrir el PDB en modo restrictivo.
  3. Conectarse a la PDB que vamos a renombrar.
  4. Con el comando ALTER PLUGGABLE DATABASE vamos a renombrar el "global_name".
  5. Una vez ejecutado el comando, vamos a cerrar nuevamente el PDB
  6. Volver a abrir la PDB en modo normal y verifica que el modo de restricción en la columna RESTRICTED tenga como valor "NO".
Ahora haz renombrado tu PDB !!!.

Veamos un ejemplo.

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 LABOR1DEV                      READ WRITE NO
         4 LABORATOR2DEV                  READ WRITE NO
         5 LAB3DEV                        READ WRITE NO
         6 LABORO4DEV                     READ WRITE NO
         7 LABO5DEV                       READ WRITE NO
         8 LAB6DEV                        READ WRITE NO
         9 LAB7DEV                        READ WRITE NO
        10 LABDEV                         READ WRITE NO

SQL> alter pluggable database all close;

Pluggable database altered.

SQL> alter pluggable database all save state;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 LABOR1DEV                      MOUNTED
         4 LABORATOR2DEV                  MOUNTED
         5 LAB3DEV                        MOUNTED
         6 LABORO4DEV                     MOUNTED
         7 LABO5DEV                       MOUNTED
         8 LAB6DEV                        MOUNTED
         9 LAB7DEV                        MOUNTED
        10 LABDEV                         MOUNTED

SQL> alter pluggable database LABDEV open restricted;

Pluggable database altered.

SQL> alter session set container=LABDEV;

Session altered.

SQL> alter pluggable  database rename global_name to LABVAL;

Pluggable database altered.

SQL> connect / as sysdba
Connected.
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 LABOR1DEV                      MOUNTED
         4 LABORATOR2DEV                  MOUNTED
         5 LAB3DEV                        MOUNTED
         6 LABORO4DEV                     MOUNTED
         7 LABO5DEV                       MOUNTED
         8 LAB6DEV                        MOUNTED
         9 LAB7DEV                        MOUNTED
        10 LABVAL                         READ WRITE YES

SQL> alter pluggable database LABVAL close immediate;

Pluggable database altered.

SQL> alter pluggable database LABVAL open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 LABOR1DEV                      MOUNTED
         4 LABORATOR2DEV                  MOUNTED
         5 LAB3DEV                        MOUNTED
         6 LABORO4DEV                     MOUNTED
         7 LABO5DEV                       MOUNTED
         8 LAB6DEV                        MOUNTED
         9 LAB7DEV                        MOUNTED
        10 LABVAL                         READ WRITE NO

SQL> alter pluggable database LABVAL close;

Pluggable database altered.

SQL>

Nota importante:

Los archivos de la base de datos, van a mantener los nombres originales del PDB inicial. Si se ha utilizado el nombre del PDB o alguna referencia específica en alguno de los archivos, es recomendable renombrar dicho archivo para evitar confusiones.

Veamos un ejemplo nuevamente:

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         4 LAB2                           READ WRITE NO

SQL> alter session set container=lab2;

Session altered.

SQL>  select tablespace_name, status, contents from dba_tablespaces;

TABLESPACE_NAME                STATUS    CONTENTS
------------------------------ --------- ---------------------
SYSTEM                         ONLINE    PERMANENT
SYSAUX                         ONLINE    PERMANENT
UNDOTBS1                       ONLINE    UNDO
TEMP                           ONLINE    TEMPORARY
USERS                          ONLINE    PERMANENT

SQL> select NAME from v$datafile;

NAME
---------------------------------------------------------------------------------------------------
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_system_n0qysyf6_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_sysaux_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_undotbs1_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_users_n0qysyfc_.dbf

SQL> create tablespace tbs_data datafile 
'/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/tbs_data_lab2_01.dbf' 
size 10M;

Tablespace created.

SQL> select NAME from v$datafile;

NAME
---------------------------------------------------------------------------------------------------
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_system_n0qysyf6_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_sysaux_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_undotbs1_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_users_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/tbs_data_lab2_01.dbf

SQL> connect / as sysdba
Connected.

SQL> alter pluggable database lab2 close immediate;

Pluggable database altered.

SQL> alter pluggable database lab2 open restricted;

Pluggable database altered.

SQL> alter session set container=lab2;

Session altered.

SQL> alter pluggable database rename global_name to pdb2;

Pluggable database altered.

SQL> connect / as sysdba
Connected.
SQL> alter pluggable database pdb2 close immediate;

Pluggable database altered.

SQL> alter pluggable database pdb2 open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         4 PDB2                           READ WRITE NO
SQL> alter session set container=pdb2;

Session altered.

SQL>  select NAME from v$datafile;

NAME
---------------------------------------------------------------------------------------------------
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_system_n0qysyf6_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_sysaux_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_undotbs1_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_users_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/tbs_data_lab2_01.dbf

SQL> alter database move datafile 
'/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/tbs_data_lab2_01.dbf' to 
'/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/tbs_data_pdb2_01.dbf';

Database altered.

SQL>  select NAME from v$datafile;

NAME
---------------------------------------------------------------------------------------------------
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_system_n0qysyf6_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_sysaux_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_undotbs1_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/o1_mf_users_n0qysyfc_.dbf
/opt/app/oracle/oradata/CDB/33A1D26BA92BDE59E063AA00000B07F0/datafile/tbs_data_pdb2_01.dbf

SQL>

Simplificando la gestión de cambio de contraseñas en ambientes de base de datos Oracle 19c o superior arquitectura CDB

Han hecho un registro de las horas que dedican constantemente a brindar soporte en el cambio de contraseñas de usuarios, a los cuáles se les ha vencido su vigencia o que olvidaron la clave y hay que cambiar o bien que simplemente, por el tema de complejidad que tengamos implementada en la base de datos, los usuarios finales tomen la opción de dejar que pase el período de gracia y solicitar una nueva contraseña, por "pereza" a pensar en la complejidad que debe llevar la contraseña.?

Si es cierto, es una pregunta muy grande la que he hecho. Tienen toda la razón.

Pero han pensando tan sólo un segundo, realmente cuanto tiempo han dedicado a este tipo de tareas que son "cajoneras".?

A ver, cuando tienes decenas de bases de datos y cientos de usuarios y no confías la autenticación a un servicio LDAP para que otros sean los que sufran con el mantenimiento de vencimiento de contraseñas, la verdad es que uno busca como simplificar ciertas tareas.

Incluso, muchas veces, las acciones más comúnes tiene que ver con los vencimientos de los propios compañeros del área de TI en los ambientes de UAT o DEV.

Una manera de mitigar esta sobrecarga de trabajo es "semi-automatizando" la tarea.

Veamos a ver como lo podemos hacer.

Primero que todo, vamos a crear una PROFILE en la raiz de contenedor de base de datos, para que este disponible para todos los PDBs que tengamos que gestionar.

No vamos a ser tan rigurosos con los tiempos de vigencia y tiempo ocioso.

Nuestro PERFIL a crear, tendrá como parámetros 30 minutos de tiempo ocioso antes de ser desconectado, soporta hasta 5 fallas en el ingreso de la contraseña antes de bloquear la cuenta, va a tener un período de vida de 45 días y un período de gracia de 5. El usuario no podrá reutilizar la contraseña hasta que no se hayan cumplido 365 días y máximo podrá reutilizarla 10 veces.


CREATE PROFILE "C##PERFIL_USUARIOS_TI" LIMIT
COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER DEFAULT
CPU_PER_SESSION DEFAULT
CPU_PER_CALL DEFAULT
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL DEFAULT
IDLE_TIME 30
CONNECT_TIME DEFAULT
PRIVATE_SGA DEFAULT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 45
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 10
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function
PASSWORD_LOCK_TIME UNLIMITED 
PASSWORD_GRACE_TIME 5;

Una vez creado el perfil en la raíz de contenedor de base de datos, vamos a crear una función y un procedimiento en cada PDB que exista en el CDB, cambiando unicamente unos cuantos datos.

La función será la misma para todas las bases de datos acopladas. Esta función se encargará de crear por nosotros las contraseñas asignadas durante el cambio de la misma. Complijidad completa con caracteres en mayúscula, minúscula, números y caracteres especiales.

create or replace NONEDITIONABLE function generate_password(
no_of_digits in number,
no_of_special_characters in number,
no_of_lower in number,
no_of_upper in number
) return varchar2
AS

password VARCHAR2(40);
password_redefine VARCHAR2(40);
password_final VARCHAR2(40);
digits CONSTANT VARCHAR2(10) := '123456789';
lower CONSTANT VARCHAR2(26) := 'abcdefghijklmnpqrstuvwxyz';
upper CONSTANT VARCHAR2(26) := 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
special CONSTANT VARCHAR2(32) := '!$+{}[]?#';

BEGIN
SELECT LISTAGG(letter, NULL) WITHIN GROUP (ORDER BY DBMS_RANDOM.VALUE)
INTO password
FROM (
SELECT SUBSTR(
digits,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(digits) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_digits
UNION ALL
SELECT SUBSTR(
lower,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(lower) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_lower
UNION ALL
SELECT SUBSTR(
upper,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(upper) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_upper
UNION ALL
SELECT SUBSTR(
special,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(special) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_special_characters
);
password_redefine :=dbms_random.string('U',2)||password;
RETURN password_redefine;
END;

Esta función estaría generando contraseñas parecidas a esta: MH46$1g+6p5dCr7ClZB5bQ5C3

Ahora bien, cada vez que cambiamos una contraseña a un usuario, a través del método de solicitud que tengamos en nuestra organización, debemos notificar personalmente al dueño de la contraseña por correo electrónico, con la información de la nueva contraseña.

Dentro de una buena gestión de contraseñas, es importante, que solo el custodio del usuario a nivel de la base de datos, sea conocedor de dicha contraseña, independientemente si es un ambiente de desarrollo o UAT. Muchas veces estos ambientes cuentan con información proveniente del ambiente de producción y aún cuando sea información desactualizada, puede generar una brecha de seguridad.

Mi recomendación, utilizar siempre el correo electrónico, como método informativo, para suministrar la nueva información de conexión.

Este es el procedimiento que vamos a utilizar para cambiar la contraseña al usuario, aceptando como parámetro el nombre del usuario y teniendo como salida, la nueva contraseña y la información básica de conexión al servicio en donde fue modificada la misma.

create or replace NONEDITIONABLE procedure cambiar_contrasena_user(p_usuario varchar2)
as

pwd varchar2(30);
uname varchar2(20) := p_usuario;
v_user dba_users.username%TYPE;
v_estado dba_users.account_status%TYPE;

begin
pwd := generate_password(9,2,6,6);
execute immediate 'alter user '||uname||' identified by "'||pwd||'"';
dbms_output.put_line('done=> user: '||uname||' | new password: '||pwd);
select username, account_status into v_user, v_estado from dba_users
where username=uname;
dbms_output.put_line('Ambiente=> BD:LABORATORIO_PDB1');
dbms_output.put_line('User=> user: '||uname||' estado: '|| v_estado);
dbms_output.put_line('jdbc:oracle:thin:@//127.0.0.1:1521/pdb1.sub12180050100.vcnlab1.oraclevcn.com');
end;

Lo único que debemos cambiar con cada PDB en donde vayamos a implementar esta opción, es el mensaje de salida en el "DBMS_OUTPUT" donde se indique el ambiente correspondiente y la conexión JDBC a la base de datos.

Veamos como quedaría implementado a nivel de un PDB.


SQL> alter session set container=pdb1;

Session altered.

SQL> create user test identified by oracle;

SQL> alter user test profile C##PERFIL_USUARIOS_TI;

User altered.

SQL>

Ahora si, cuando tengamos que cambiar la contraseña, vamos a utilizar el procedimiento para facilitar nuestra tarea y hacer un "COPY PASTE" de la información necesaria para enviar al dueño de la cuenta.


set serveroutput on
execute cambiar_contrasena_user('TEST');

A la hora de ejecutar el proceso, obtendremos la siguiente salida, que podemos cortar y pegar en el correo enviado al interesado.

done=> user: TEST | new password: MH46$1g+6p5dCr7ClZB5bQ5C3
Ambiente=> BD:LABORATORIO_PDB1
User=> user: TEST estado: OPEN
jdbc:oracle:thin:@//127.0.0.1:1521/pdb1.sub12180050100.vcnlab1.oraclevcn.com

Procedimiento PL/SQL terminado correctamente.

Te aseguro que te estarás ahorrando una buena cantidad de tiempo.


domingo, 20 de abril de 2025

Explorando la Potencia de Procesamiento en Oracle Cloud: Calculando 50000 dígitos para el valor de PI.

 


Es un gusto encontrarnos nuevamente hoy y esta vez para hablar de un tema que, aunque ocurre bajo la superficie de nuestras plataformas digitales, es el corazón con el que palpita toda transformación tecnológica: hablamos sin duda alguna del poder computacional. 


En este momento, mientras cada uno de nosotros revisa mensajes, lanza consultas SQL o despliega microservicios, hay una fuerza invisible—pero absolutamente crítica— trabajando detrás de escena. Me refiero, por supuesto, a los procesadores. No hablo solo de máquinas virtuales, o conteos de núcleos o a velocidades de procesamiento.

Estoy hablando de procesadores especializados, diseñados para cargas OLTP extremas, para cómputo de IA, para análisis masivo de datos, y hasta para cargas HPC que antes solo existían en entornos gubernamentales o científicos. Y aquí es donde se pone interesante… 

Dentro de OCI ustedes pueden elegir entre silicio de Intel, AMD, Ampere cada uno con perfiles de rendimiento finamente ajustados para los distintos tipos de despliegue, pero: 
¿Sabían que pueden provisionar entornos que compiten —y superan— a los data centers tradicionales, con una latencia que parece magia y una elasticidad que antes creíamos imposible? 

Hoy haremos un pequeño viaje técnico y estratégico. 

Vamos a abrir esa caja negra. 

Vamos a descubrir juntos, cuál procesador podría ser la mejor opción para ustedes, tomando en cuenta el rendimiento de cada procesador en su uso para cálculos matemáticos. Así que listos, porque al final de esta presentación, no volverán a ver a un procesador como "simple hardware", lo verán como lo que realmente es: un instrumento de poder, precisión y ventaja competitiva. 

¡Comencemos!

miércoles, 16 de abril de 2025

Oracle despliega nuevo paquete de parches de abril de 2025 y un nuevo OPatch

Nueva versión de OPATCH de abril de 2025 y también hay una versión 11.2 disponible para quienes aún no se hayan actualizado a la versión 19c.

Para todos los RDBMS 12*/18*/19*/21* – OPatch 12.2.0.1.46

Para RDBMS 11.2* – OPatch 11.2.0.3.50

¿Qué novedades hay en esta versión ?

-Optimización del rendimiento y la memoria
-Validación para comprobar la versión incompatible de OPatch
-Manejar enlaces simbólicos durante la reversión de parches
-OPatchAuto implementó la opción de tiempo de espera de drenaje durante la acción de detención de srvctl
-OPatchAuto para permitir la aplicación de parches paralelos (n-1) (modo no continuo) en un entorno de múltiples nodos

Más info:
https://lnkd.in/e-q7ke-A

martes, 15 de abril de 2025

Oracle Critical Patch Update for April 2025

April 15, 2025
Oracle Critical Patch Update for April 2025

Dear Oracle Customer,

Critical Patch Update for April 2025 was released on April 15, 2025.

Oracle strongly recommends applying the patches as soon as possible.

If you are new to this process, please review Oracle's Security Fixing Policies and the Critical Patch Update Advisory. After reviewing these resources, if you are unable to determine if you require a software update, or how to apply it, please contact Oracle Support.

The Critical Patch Update Advisory is the starting point for relevant information. It includes the list of products affected, pointers to obtain the patches, a summary of the security vulnerabilities for each product suite, and links to other important documents. Supported products that are not listed in the "Affected Products and Components" section of the advisory do not require new patches to be applied.

Also, it is essential to review the Critical Patch Update supporting documentation referenced in the Advisory before applying patches, as this is where you can find important pertinent information.

Critical Patch Update Advisories are available at the following location:


Oracle Technical Resources:

Oracle Cloud Customers should review:

The Critical Patch Update Advisory for April 2025 is available at the following location:

Oracle Technical Resources:

Important information can also be found at:

Oracle's Security Fixing Policies are available at the following location:

The next four dates for Critical Patch Updates are:
  • July 15, 2025
  • October 21, 2025
  • January 20, 2026
  • April 21, 2026

Thank you,
Customer Support of Oracle Corporation




"¡Santas omisiones en parches, Batman!"

Hola gente buen inicio de semana para todos y todas.
Mike Dietrich publicó temprano el día de hoy, que mañana se tendrá una actualización trimestral de la versión de base de datos Oracle 23ai con la denominación 23.8.0.

Sin embargo, existe un omisión importante en esta liberación: "Falta el parche de zona horaria DST en la actualización".

Mike menciona, que en enero del 2023, había publicado en su blog, la inclusión de parches para zonas horarias. Sin embargo, más tarde descubró que esto sólo se aplicaba a Oracle Database 19c, no a la 21c o versiones superiores. El mismo hace el comentario que no tiene explicación alguna para esto. Posteriormente se le indicó que se incluiría solo en las versiones con soporte a largo término, pero al parecer no fue así.

La inclusión de correcciones de horario de verano en las RU tuvo un efecto secundario no deseado. El DBCA (Asistente de Configuración de Bases de Datos) no cuenta con un interruptor para seleccionar la versión de zona horaria deseada al crear una nueva base de datos o CDB. Se puede modificar con una variable de entorno. Sin embargo, esto no es ideal y, a veces, simplemente impracticable, menciona Mike en su post del día de hoy.

Cuál es la mala noticia.?
Al menos hasta Oracle Database 23.8, la versión DST debe actualizarse por separado. Oracle Database 23ai, de facto incluye DST versión 43, sin embargo, si estás en alguna de las zonas horarias que tuvo cambios el pasado 22 de marzo, no incluye dichos cambios, como por ejemplo en Paraguay. De igual manera, si estás en versión Oracle Linux 7.x te tengo malas noticias (ver_nota_actualizada), la actualización del paquete TZDATA, no esta disponible para el cambio de horario de verano para el Paraguay. Así que, aunque apliques el parche en la base de datos y tienes OL V7.x, no te sirve de nada. Tendrás que forzar la zona en el sistema operativo. Recuerda que OL V7.x quedó sin soporte en diciembre del año pasado y solo podrás recibir las actualizaciones, si tienes un contrato de soporte extendido.

Para aquellos con Oracle Linux V8.10, si existe la actualización del paquete a 2025b-1.0.1.el8 que contiene dicho cambio.

Así que una recomendación immediata, es migrar su sistema operativo, si tienes una base de datos Oracle 12c o superior.

El fin de Docker ??? Oracle Cloud Infrastructure Resource Manager - Oracle Resource Manager Transitioning from Docker to Podman


Oracle Cloud Infrastructure Resource Manager - Oracle Resource Manager Transitioning from Docker to Podman

Oracle Cloud Infrastructure Customer,
Starting May 8, 2025, Oracle Resource Manager will transition its Terraform job execution environment from Oracle Linux 7 to Oracle Linux 8. 

As part of this transition:
Docker commands will no longer be supported after May 8, 2025.

Podman will be available starting May 8, 2025 as the supported alternative to Docker.


What does this mean for you?
Until May 8, 2025, you can continue to use Docker commands (such as docker build, docker run, or docker buildx) in your Terraform configurations.

Podman is not available before May 8, so no changes are required until then.
After May 8, you must update your Terraform configurations to use Podman instead of Docker for any local-exec or custom scripts.

Learn more about Podman: Getting Started with Podman

Do you need to take any action?
Yes, if you plan to continue using Oracle Resource Manager after May 8, update your configurations to replace Docker commands with Podman equivalents.
No, if you no longer use Oracle Resource Manager or do not rely on Docker in your automation.

Oracle Linux V7.x actualizando paquete tzdata-2025b-1 con cambios zonas horarias Paraguay y Chile.

Imagen: leonardo.ai

Hace unos días atrás publiqué una nota en mi perfil de Linkedin, sobre el tema de las zonas horarias, sobre todo llamando la atención al cambio de horario en #Paraguay y #Chile America/Coyhaique, a partir del 22 de marzo de este año.

Les comenté que el paquete tzdata-2025b-1.el7 no esta disponible para descargar de los repositorios de Oracle Linux 7 y que había realizado la revisión en la ruta https://lnkd.in/euuhDb-E en donde sólo estaba el paquete tzdata-2025a-1.el7 en formato origen, que no contempla el cambio.

Esto porque Oracle Linux V7 ya no tiene soporte desde diciembre 2024.

Hoy revisando les tengo una buena noticia a todos aquellos que tienen Oracle Linux 7. !!!!

El paquete tzdata-2025b-1.el7.src.rpm para se compilado en su servidor, ya esta disponible. !!!

Recuerden este es un paquete que de origen que debe ser compilado.

Es requerido que tengas instalados los siguientes grupos de paquetes para poder compilar:

-groupinstall "Development Tools"
-rpm-build rpmdevtools
-java-devel

Bajamos el código que debemos compilar del paquete y recuerda hacerlo con el usuario "root".
wget https://oss.oracle.com/ol7/SRPMS-updates/tzdata-2025b-1.el7.src.rpm

Instalamos los paquetes prerequisto:

yum groupinstall "Development Tools" -y
yum install rpm-build rpmdevtools -y
yum install java-devel -y

Luego vamos a ejecutar:
rpmdev-setuptree

Esto genera la siguiente estructura de directorios en el lugar en donde estas ejecutando el proceso.

~/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

Luego ejecutas:
rpm -ivh tzdata-2025b-1.el7.src.rpm

Esto colocará:

El archivo .spec en ~/rpmbuild/SPECS/
El código fuente en ~/rpmbuild/SOURCES/

Para compilar:

cd ~/rpmbuild/SPECS
rpmbuild -ba tzdata.spec

Esto generará los binarios en ~/rpmbuild/RPMS/.

Parte de la compilación del paquete:

-                        12:00  -       +12
+                        12:00  -       %z

 # Kiribati (except Gilbert Is)
 # See Pacific/Tarawa for the Gilbert Is.
 # Zone NAME            STDOFF  RULES   FORMAT  [UNTIL]
 Zone Pacific/Kanton      0     -       -00     1937 Aug 31
-                       -12:00  -       -12     1979 Oct
-                       -11:00  -       -11     1994 Dec 31
-....


+ exit 0
Provides: tzdata = 2025b-1.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PartialHardlinkSets) <= 4.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Conflicts: glibc-common <= 2.3.2-63
Processing files: tzdata-java-2025b-1.el7.noarch
Provides: tzdata-java = 2025b-1.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/tzdata-2025b-1.el7.x86_64
Wrote: /root/rpmbuild/SRPMS/tzdata-2025b-1.el7.src.rpm
Wrote: /root/rpmbuild/RPMS/noarch/tzdata-2025b-1.el7.noarch.rpm
Wrote: /root/rpmbuild/RPMS/noarch/tzdata-java-2025b-1.el7.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.q0FDYz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd tzdata-2025b
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/tzdata-2025b-1.el7.x86_64
+ exit 0
[root@lab-ol7-timezone SPECS]# cd ..
[root@lab-ol7-timezone rpmbuild]# ls -la
total 12
drwxr-xr-x. 8 root root 4096 Apr 15 16:50 .
dr-xr-x---. 7 root root 4096 Apr 15 16:49 ..
drwxr-xr-x. 3 root root   34 Apr 15 16:51 BUILD
drwxr-xr-x. 2 root root   10 Apr 15 16:51 BUILDROOT
drwxr-xr-x. 3 root root   28 Apr 15 16:51 RPMS
drwxr-xr-x. 2 root root 4096 Apr 15 16:50 SOURCES
drwxr-xr-x. 2 root root   33 Apr 15 16:50 SPECS
drwxr-xr-x. 2 root root   48 Apr 15 16:51 SRPMS
[root@lab-ol7-timezone rpmbuild]# cd RPMS
[root@lab-ol7-timezone RPMS]# ls -lat
total 4
drwxr-xr-x. 2 root root   97 Apr 15 16:51 noarch
drwxr-xr-x. 3 root root   28 Apr 15 16:51 .
drwxr-xr-x. 8 root root 4096 Apr 15 16:50 ..
[root@lab-ol7-timezone RPMS]# cd noarch/
[root@lab-ol7-timezone noarch]# ls -lat
total 692
drwxr-xr-x. 2 root root     97 Apr 15 16:51 .
-rw-r--r--. 1 root root 189376 Apr 15 16:51 tzdata-java-2025b-1.el7.noarch.rpm
-rw-r--r--. 1 root root 513552 Apr 15 16:51 tzdata-2025b-1.el7.noarch.rpm
drwxr-xr-x. 3 root root     28 Apr 15 16:51 ..

Ahora vamos a instalar el binario creado.

[root@lab-ol7-timezone noarch]# yum localinstall tzdata-2025b-1.el7.noarch.rpm
Loaded plugins: langpacks, ulninfo
Examining tzdata-2025b-1.el7.noarch.rpm: tzdata-2025b-1.el7.noarch
Marking tzdata-2025b-1.el7.noarch.rpm as an update to tzdata-2024b-2.el7.noarch
Resolving Dependencies
--> Running transaction check
---> Package tzdata.noarch 0:2024b-2.el7 will be updated
---> Package tzdata.noarch 0:2025b-1.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================
 Package               Arch        Version        Repository                      Size
=======================================================================================
Updating:
 tzdata                noarch      2025b-1.el7    /tzdata-2025b-1.el7.noarch     1.8 M

Transaction Summary
=======================================================================================
Upgrade  1 Package

Total size: 1.8 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : tzdata-2025b-1.el7.noarch                                                                              1/2
  Cleanup    : tzdata-2024b-2.el7.noarch                                                                              2/2
  Verifying  : tzdata-2025b-1.el7.noarch                                                                              1/2
  Verifying  : tzdata-2024b-2.el7.noarch                                                                              2/2

Updated:
  tzdata.noarch 0:2025b-1.el7

Complete!

Cuando termine la instalación, validan la existencia de la clásula de cambio en la zona horaria respectiva.

[root@lab-ol7-timezone noarch]# rpm -q --changelog tzdata | head -20
* Mon Mar 24 2025 Patsy Griffin <patsy@redhat.com> - 2025b-1
- Update to tzdata-2025b (RHEL-84741)
- Chile's Aysén Region moves from -04/-03
to -03 year-round, diverging from America/Santiago and
creating a new zone America/Coyhaique.

* Tue Jan 21 2025 Patsy Griffin <patsy@redhat.com> - 2025a-1
Update to tzdata-2025a (RHEL-74308)
- Paraguay is now permanently at -03. This impacts timestamps
starting on 2025-03-22.
- Includes improvements to pre-1991 data for the Philippines.
- Etc/Unknown is now reserved.

* Fri Sep 27 2024 Patsy Griffin <patsy@redhat.com> - 2024b-2
- Harden against links to removed zones (RHEL-60063)

* Wed Sep 11 2024 Patsy Griffin <patsy@redhat.com> - 2024b-1
- Update to tzdata-2024b
- Improve historical data for Mexico, Mongolia, and Portugal.
- System V names are now obsolescent.
[root@lab-ol7-timezone noarch]# uname -a
Linux lab-ol7-timezone 5.4.17-2136.327.2.el7uek.x86_64 #2 SMP Fri Jan 5 14:53:41 PST 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@lab-ol7-timezone noarch]#

lunes, 14 de abril de 2025

Creando un dblink en Oracle 19c ORA-03150: end-of-file de 19.22 a 19.10 o inferior.

 

Un pequeño detalle que me he encontrado cuando he parchado al Release Update 22 y he querido hacer un DBLINK a una base de datos con un R.U. inferior a 18, que es donde he encontrado que algunas cosas cambian.


[oracle@bd-dev-server admin]$ sqlplus /nolog
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 14 17:05:29 2025
Version 19.22.0.0.0
Copyright (c) 1982, 2023, Oracle. All rights reserved.

idle> connect / as sysdba
Connected.

CDB$ROOT@CDB2> create database link PRODUCCION connect to C##CLONE_USER identified by "E2**************UiRO2" using 'CDBPRODUCCION';

Database link created.

Observen que he utilizado el nombre del usuario C##CLONE_USER sin colocar comillas dobles al inicio y final del usuario.

Cuando hago la prueba del DBLINK el mismo falla con error de comunicación.

CDB$ROOT@CDB2> select 1 from dual@produccion;

select 1 from dual@produccion

*

ERROR at line 1:
ORA-03150: end-of-file on communication channel for database link
ORA-02063: preceding line from PRODUCCION

Borramos el DBLINK y vamos a volverlo a crear.

CDB$ROOT@CDB2> drop database link produccion;
Database link dropped.

Esta vez vamos a crear el DBLINK utilizando el usuario entre comillas dobles.

CDB$ROOT@CDB2> create database link PRODUCCION connect to "C##CLONE_USER" identified by "E27**********iRO" using 'CDBPRODUCCION';

Database link created.

Probamos el DBLINK y ahora si funciona.

CDB$ROOT@CDB2> select 1 from dual@produccion;
1
---------
1

No se que exactamente ha pasado después del RU 19.18, lo cierto es que he tenido un comportamiento extraño en varios temas.

Desde una base de datos en versión E.E. que no permitió crear más de 3 PDBs cuando si lo lograba hacerlo antes del parcheo con indicación que la opción de Multitenant no estaba disponible, hasta estos pequeños detalles.

Sin embargo, no hay mucho por hacer, hay que seguir parchando para evitar quedarnos atrás con el soporte.


jueves, 3 de abril de 2025

Oracle Hot Topics: Apr 03,2025

Knowledge Articles
Knowledge Article    Product Area    Last Updated
ORA-00600 [17287] After Restore / Recovery
Oracle Database - Standard Edition Oracle Cloud Infrastructure - Database Service Oracle Database - Enterprise Edition     Thu, 3 Apr 2025 05:46 GMT-06:00

"This message contains information according to the preferences you set in My Oracle Support. To modify your settings or to turn off this automated message, login to My Oracle Support (http://support.oracle.com) and click on 'More' -> 'Settings' -> 'Hot Topics E-mail'" My Oracle Support


Todos los Sábados a las 8:00PM