Using username "opc". Authenticating with public key "rsa-key-20200507" Passphrase for key "rsa-key-20200507": [opc@srv-encriptacion-respaldos ~]$ sudo -s /bin/bash [root@srv-encriptacion-respaldos opc]# dnf -y update Last metadata expiration check: 2:22:53 ago on Fri 07 Aug 2026 02:32:42 PM GMT. Dependencies resolved. ============================================================================================== Package Architecture Version Repository Size ============================================================================================== Installing: kernel x86_64 5.14.0-687.36.1.el9_8 ol9_baseos_latest 993 k .. webkit2gtk3-jsc x86_64 2.52.5-1.el9_8 ol9_appstream 8.9 M xfsprogs x86_64 6.18.0-1.0.4.el9 ol9_UEKR8 1.3 M Transaction Summary =============================================================================================== Install 13 Packages Upgrade 92 Packages Total download size: 1.3 G Downloading Packages: (1/105): kernel-5.14.0-687.36.1.el9_8.x86_64.rpm 20 MB/s | 993 kB 00:00 (2/105): kernel-core-5.14.0-687.36.1.el9_8.x86_64.rpm 68 MB/s | 17 MB 00:00 .. 60 MB/s | 1.3 MB 00:00 (104/105): webkit2gtk3-jsc-2.52.5-1.el9_8.x86_64.rpm 48 MB/s | 8.9 MB 00:00 (105/105): linux-firmware-20260615-999.48.gite7eb98af.el9.noarch.rpm 75 MB/s | 717 MB 00:09 ---------------------------------------------------------------------------------------------------- Total 101 MB/s | 1.3 GB 00:12 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Running scriptlet: linux-firmware-999:20260615-999.48.gite7eb98af.el9.noarch 1/1 Running scriptlet: firewalld-1.3.4-19.0.1.el9_8.noarch 1/1 Preparing : 1/1 .. Running scriptlet: kernel-uek-core-6.12.0-204.92.4.4.3.el9uek.x86_64 55/197 ... Running scriptlet: sssd-kcm-2.9.8-4.0.1.el9_8.1.x86_64 79/197 Running scriptlet: oracle-cloud-agent-1.61.0-6.el9.x86_64 80/197 Upgrading : oracle-cloud-agent-1.61.0-6.el9.x86_64 80/197 Running scriptlet: oracle-cloud-agent-1.61.0-6.el9.x86_64 80/197 Changing ownership of agent.yml* files to oracle-cloud-agent:oracle-cloud-agent Changing ownership of updater.yml* files to oracle-cloud-agent-updater:adm Changing ownership of /var/log/oracle-cloud-agent/updater.log to oracle-cloud-agent-updater:adm Setting capabilities on bastions plugin 2026/08/07 16:57:11 Capability set on filePath: /usr/libexec/oracle-cloud-agent/plugins/bastions = [1 0 0 10 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 2026/08/07 16:57:11 Capability set on filePath: 20 = [1 0 0 10 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 2026/08/07 16:57:11 Capability set properly : [1 0 0 10 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] Changing ownership of /var/lib/ocarun/db/runcommand.db to ocarun:oracle-cloud-agent post install upgrade: stop service post install upgrade : clean up old files if any post install: starting services Upgrading : PackageKit-1.2.6-2.0.1.el9_8.x86_64 81/197 Running scriptlet: PackageKit-1.2.6-2.0.1.el9_8.x86_64 81/197 ... Upgrading : pcp-oracle-conf-1-6.0.10.el9.x86_64 104/197 Running scriptlet: pcp-oracle-conf-1-6.0.10.el9.x86_64 104/197 Cleanup : glibc-devel-2.34-272.0.1.el9_8.x86_64 106/197 ... Running scriptlet: kernel-modules-core-5.14.0-687.36.1.el9_8.x86_64 197/197 Running scriptlet: kernel-core-5.14.0-687.36.1.el9_8.x86_64 197/197 2026-08-07 16:58:05,307 - INFO - Processing directory: /var/cache/uptrack/Linux/x86_64 2026-08-07 16:58:05,307 - INFO - Kept (running kernel): /var/cache/uptrack/Linux/x86_64/6.12.0-204.92.4.3.1.el9uek.x86_64 2026-08-07 16:58:05,307 - INFO - Directory cleaned up successfully: /var/cache/uptrack Running scriptlet: kernel-uek-modules-core-6.12.0-204.92.4.4.3.el9uek.x86_64 197/197 Running scriptlet: kernel-uek-core-6.12.0-204.92.4.4.3.el9uek.x86_64 197/197 2026-08-07 16:59:13,574 - INFO - Processing directory: /var/cache/uptrack/Linux/x86_64 2026-08-07 16:59:13,574 - INFO - Kept (running kernel): /var/cache/uptrack/Linux/x86_64/6.12.0-204.92.4.3.1.el9uek.x86_64 2026-08-07 16:59:13,574 - INFO - Directory cleaned up successfully: /var/cache/uptrack Running scriptlet: kernel-uek-modules-6.12.0-204.92.4.4.3.el9uek.x86_64 197/197 Running scriptlet: kernel-modules-5.14.0-687.36.1.el9_8.x86_64 197/197 Running scriptlet: tuned-2.27.0-2.0.1.el9_8.noarch 197/197 Running scriptlet: tzdata-2026b-1.el9.noarch 197/197 Verifying : kernel-5.14.0-687.36.1.el9_8.x86_64 1/197 ... Verifying : webkit2gtk3-jsc-2.52.4-1.el9_8.x86_64 193/197 Verifying : pcp-oracle-conf-1-6.0.10.el9.x86_64 194/197 Verifying : pcp-oracle-conf-1-6.0.9.el9.x86_64 195/197 Verifying : xfsprogs-6.18.0-1.0.4.el9.x86_64 196/197 Verifying : xfsprogs-6.18.0-1.0.1.el9.x86_64 197/197 Upgraded: NetworkManager-1:1.54.3-4.0.1.el9_8.x86_64 NetworkManager-config-server-1:1.54.3-4.0.1.el9_8.noarch NetworkManager-libnm-1:1.54.3-4.0.1.el9_8.x86_64 NetworkManager-team-1:1.54.3-4.0.1.el9_8.x86_64 NetworkManager-tui-1:1.54.3-4.0.1.el9_8.x86_64 PackageKit-1.2.6-2.0.1.el9_8.x86_64 PackageKit-glib-1.2.6-2.0.1.el9_8.x86_64 acl-2.4.0-1.el9_8.x86_64 ... vim-common-2:8.2.2637-26.0.1.el9_8.13.x86_64 vim-enhanced-2:8.2.2637-26.0.1.el9_8.13.x86_64 vim-filesystem-2:8.2.2637-26.0.1.el9_8.13.noarch vim-minimal-2:8.2.2637-26.0.1.el9_8.13.x86_64 webkit2gtk3-jsc-2.52.5-1.el9_8.x86_64 xfsprogs-6.18.0-1.0.4.el9.x86_64 Installed: kernel-5.14.0-687.36.1.el9_8.x86_64 kernel-core-5.14.0-687.36.1.el9_8.x86_64 kernel-devel-5.14.0-687.36.1.el9_8.x86_64 kernel-modules-5.14.0-687.36.1.el9_8.x86_64 kernel-modules-core-5.14.0-687.36.1.el9_8.x86_64 kernel-uek-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-core-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-modules-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-modules-core-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-modules-desktop-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-modules-extra-netfilter-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-modules-usb-6.12.0-204.92.4.4.3.el9uek.x86_64 kernel-uek-modules-wireless-6.12.0-204.92.4.4.3.el9uek.x86_64 Complete! [root@srv-encriptacion-respaldos opc]# dnf install dnf-utils Last metadata expiration check: 2:42:12 ago on Fri 07 Aug 2026 02:32:42 PM GMT. Package yum-utils-4.3.0-26.0.1.el9.noarch is already installed. Dependencies resolved. Nothing to do. Complete! [root@srv-encriptacion-respaldos opc]# needs-restarting -r Core libraries or services have been updated since boot-up: * glibc * kernel * kernel-uek * kernel-uek-core * linux-firmware * systemd Reboot is required to fully utilize these updates. More information: man needs-restarting [root@srv-encriptacion-respaldos opc]#
Reboot is required to fully utilize these updates. More information: man needs-restarting [root@srv-encriptacion-respaldos opc]# init 6 Broadcast message from root@srv-encriptacion-respaldos
on pts/1 (Fri 2026-08-07 17:29:23 GMT): The system will reboot now! [root@srv-encriptacion-respaldos opc]# Using username "opc". Authenticating with public key "rsa-key-20200507" Passphrase for key "rsa-key-20200507": Last login: Fri Aug 7 16:55:02 2026 from 10.100.128.156 [opc@srv-encriptacion-respaldos ~]$ sudo -s /bin/bash [root@srv-encriptacion-respaldos opc]# needs-restarting -r No core libraries or services have been updated since boot-up. Reboot should not be necessary.
ronald.vargas.quesada@gmail.com / Blog de Tecnologías Oracle desde 2009, San José, Costa Rica, 23 de Febrero 17 Aniversario -"No vivas para que tu presencia se note, sino para que tu ausencia se sienta" Bob Marley. Peter Drucker "No hay nada más inútil que hacer con gran eficiencia aquello que nunca debió hacerse."
viernes, 7 de agosto de 2026
Debes reiniciar tu servidor de Oracle Linux, después de hacer una actualización de paquetes del sistema operativo.?
jueves, 6 de agosto de 2026
Oraworld Magazine-Junio 2026
ORAWORLD Magazine - Edition #39
Disfrute la última edición de ORAWORLD directamente desde esta página.
Si el documento no se visualiza correctamente, haga clic aquí para abrir el PDF en una nueva ventana.
domingo, 2 de agosto de 2026
La respuesta: Que impacto tiene el que generemos un Datapump utilizando un método de encriptación por ejemplo nativo o externo, a la hora de comprimir el archivo con el respaldo respectivo.?
Las principales normas y regulaciones que tenemos de referencia para temas de proteción de respaldos son:
1. ISO/IEC 27001:2022 (la más utilizada)Los controles relacionados son:
Control 8.24 - Use of Cryptography
Establece que la organización debe definir e implementar el uso apropiado de mecanismos criptográficos para proteger la confidencialidad e integridad de la información.
Un respaldo es precisamente información almacenada.
Control 8.13 - Information Backup
2. ISO/IEC 27002
Es la guía de implementación de ISO 27001.Es todavía más explícita.
Indica que los respaldos deben protegerse contra:
- acceso no autorizado
- pérdida
- modificación
- divulgación
La recomendación práctica es utilizar cifrado cuando el medio pueda salir del control de la organización.
3. PCI DSS 4.0Requisito 3
Protección de datos del titular de la tarjeta.Incluye:
- bases de datos
- exportaciones
- respaldos
- cintas
- archivos
Todos deben protegerse mediante criptografía fuerte.
Requisito 3.5
Las claves criptográficas deben administrarse correctamente.
Requisito 3.6
Debe existir gestión formal del ciclo de vida de las llaves.Si un Data Pump contiene información de tarjetas, debe estar cifrado.
Muy utilizado por agencias gubernamentales y empresas grandes.
Controles relevantes:
CP-9
System Backup
Los respaldos deben protegerse contra divulgación.
SC-28
Protection of Information at Rest
Toda información almacenada debe protegerse.
La guía recomienda explícitamente el uso de cifrado.
MP-4
Media Storage
Los medios de almacenamiento deben protegerse físicamente y mediante mecanismos criptográficos.
5. CIS Controls v8
Los CIS Controls indican:
Control 3Data ProtectionIncluye proteger la información tanto en tránsito como almacenada.Los respaldos son considerados datos almacenados.
6. COBIT 2019
COBIT no exige AES256 específicamente.
Pero sí establece:
- protección de activos de información
- controles de seguridad
- gestión del riesgo
- continuidad del negocio
¿Cómo funciona gzip?
Por ejemplo, si un archivo contiene:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gzip no almacena las 30 letras "A". Almacena algo equivalente a:
"A" repetida 30 veces
Lo mismo ocurre con:
- nombres de columnas repetidos
- bloques de ceros
- espacios en blanco
- cadenas repetidas
- registros similares
- páginas parcialmente vacías
Por ejemplo, si el archivo original contiene:
CLIENTE CLIENTE CLIENTE CLIENTE CLIENTE
Después del cifrado podría verse conceptualmente así:
Ya no existe ninguna repetición visible.8FA34C1E... B92D7114... 5C88AF0D... A13E74F2... 9E0BC813...
¿Por qué gzip deja de funcionar?
Porque ya no hay patrones que comprimir.
Desde la perspectiva de gzip, el archivo parece una secuencia completamente aleatoria:
010110101011101010010001011...
Y una secuencia verdaderamente aleatoria no es compresible.
Supongamos un dump de:
100 GB
Puede contener muchas repeticiones.
Reducción del 75%.100 GB │ ▼ gzip │ ▼ 25 GB
Data Pump cifrado
En ocasiones incluso obtendrás: 100.1 GB porque gzip añade sus propias cabeceras y metadatos.100 GB │ ▼ AES256 │ ▼ 100 GB de datos pseudoaleatorios │ ▼ gzip │ ▼ 99.9 GB
¿Qué hace Oracle cuando se usa COMPRESSION?
Aquí está la diferencia importante.
Cuando ejecutas:
COMPRESSION=ALL ENCRYPTION=ALL
Oracle no cifra primero.
Internamente realiza algo conceptualmente equivalente a:
Datos Oracle │ ▼ Compresión Data Pump │ ▼ Archivo comprimido │ ▼ AES256 │ ▼ Dump cifrado
Es decir:
Por eso la compresión sigue siendo efectiva.Primero comprime. Luego cifra.
¿Por qué Oracle no cifra primero?
Porque ocurriría exactamente lo que observamos previamente.
Si Oracle hiciera:
Datos │ ▼ AES │ ▼ Compresión
- Si la encriptación la hacemos después de haber creado nuestro respaldo sin encriptar de manera nativa, vamos a obtener un buen porcentaje de compresión, pero la información estaría expuesta algunos minutos mientras hacemos el proceso de compresión, para luego encriptar manualmente.
- Si usamos la manera nativa de encriptación en el momento de crear el respaldo, pero sin compresión de datos o metadata, la capacidad de comprensión va a ser cercana a "0" o menos de "0" con una herramienta externa o bien, simplemente no se va a comprimir, lo positivo será que el tiempo de ejecución no se ve alterado significativamente y no va a existir exposición de información confidencial nunca.
- Si además de encriptar en el momento de ejecutar el respaldo, utilizamos el parámetro de compression COMPRESSION=ALL, el archivo de respaldo tendrá el aproximadamente un poco más del doble del tamaño de un archivo no encriptado comprimido con GZIP -exactamente un 125% más-, y la duración del respaldo, pasa de 25 minutos a 41 minutos, un 64% más.
- Para organizaciones que no tienen el tema regulatorio como prioridad, utilizar el método 1.
- Para organizaciones que el tema regulatorio no es opcional, pero no cuentan con suficiente recursos de almacenamiento para retención de históricos, utilizar el método 3.
- Para organizaciones que están en el medio de las 2 anteriores, usar el método 2.
[oracle@bd-dev-laboratorio datapump]$ cd validar/
[oracle@bd-dev-laboratorio validar]$ ls -alt
total 157741313
drwxr-xr-x. 4 oracle oinstall 45 Jul 31 23:18 ..
drwxr-xr-x. 2 oracle oinstall 4 Jul 31 22:03 .
-rw-r-----. 1 oracle oinstall 80817483776 Jul 31 17:16 PDB1DEV_3107261650.dmp
-rw-r--r--. 1 oracle oinstall 127544 Jul 31 17:16 PDB1DEV_3107261650.log
-rw-r-----. 1 oracle oinstall 80707993600 Jul 26 22:25 PDB1DEV_2607262200.dmp
-rw-r--r--. 1 oracle oinstall 127393 Jul 26 22:25 PDB1DEV_2607262200.log
[oracle@bd-dev-laboratorio validar]$ gzip2
=== Inicio de compresión: Fri Jul 31 23:38:29 CST 2026 ===
=== Fin de compresión: Sat Aug 1 00:22:45 CST 2026 ===
[oracle@bd-dev-laboratorio validar]$
[oracle@bd-dev-laboratorio validar]$ ls -lat
total 85266481
drwxr-xr-x. 2 oracle oinstall 4 Aug 1 00:22 .
drwxr-xr-x. 4 oracle oinstall 45 Jul 31 23:18 ..
-rw-r-----. 1 oracle oinstall 80826147081 Jul 31 17:16 PDB1DEV_3107261650.dmp.gz
-rw-r--r--. 1 oracle oinstall 17205 Jul 31 17:16 PDB1DEV_3107261650.log.gz
-rw-r-----. 1 oracle oinstall 6486334242 Jul 26 22:25 PDB1DEV_2607262200.dmp.gz
-rw-r--r--. 1 oracle oinstall 17138 Jul 26 22:25 PDB1DEV_2607262200.log.gz
[oracle@bd-dev-laboratorio validar]$
[oracle@bd-dev-laboratorio validar]$ cat /home/oracle/scripts/resp_datapump_PDB1dev.sh
#!/bin/bash
TERM=xterm
USER=oracle
ORACLE_SID=cdb
ORACLE_BASE=/opt/app/oracle
MAIL=/var/spool/mail/oracle
LANG=en_US.UTF-8
HOME=/home/oracle
LOGNAME=oracle
LESSOPEN=||/usr/bin/lesspipe.sh %s
ORACLE_HOME=/opt/app/oracle/product/19.10
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_HOME ORACLE_BASE ORACLE_SID PATH
EXPDMP=`date '+PDB1DEV_%d%m%y%H%M'`
export EXPDMP
# Script de ejecución sin compresión de respaldos
# expdp c##exportdp/oracle@PDB1dev LOGFILE=$EXPDMP'.log' \
DIRECTORY=EXPDIR DUMPFILE=$EXPDMP EXCLUDE=statistics FULL=YES
# Script de ejecución con compresión de respaldos
expdp c##exportdp/oracle@PDB1dev LOGFILE=$EXPDMP'.log' DIRECTORY=EXPDIR DUMPFILE=$EXPDMP \
EXCLUDE=statistics FULL=YES encryption=ALL encryption_algorithm=AES256 \
encryption_password=NA********************$2026
gzip /respaldos/172.X.X.X/datapump/$EXPDMP*
mv /respaldos/172.X.X.X/datapump/$EXPDMP* /NFS/172.X.X.X/datapump/
[oracle@bd-dev-laboratorio validar]$ /home/oracle/scripts/resp_datapump_PDB1dev.sh
[oracle@bd-dev-laboratoriovalidar]$ tail -n 5 *.log
==> PDB1DEV_0108261124.log <==
Master table "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully loaded/unloaded
******************************************************************************
Dump file set for C##EXPORTDP.SYS_EXPORT_FULL_02 is:
/respaldos/172.24.140.99/datapump/PDB1DEV_0108261124.dmp
Job "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully completed at
Sat Aug 1 11:46:01 2026 elapsed 0 00:21:57
==> PDB1DEV_2607262200.log <==
Master table "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully loaded/unloaded
******************************************************************************
Dump file set for C##EXPORTDP.SYS_EXPORT_FULL_02 is:
/respaldos/172.XX.X.X/datapump/PDB1DEV_2607262200.dmp
Job "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully completed at
Sun Jul 26 22:25:29 2026 elapsed 0 00:25:26
==> PDB1DEV_3107261650.log <==
Master table "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully loaded/unloaded
******************************************************************************
Dump file set for C##EXPORTDP.SYS_EXPORT_FULL_02 is:
/respaldos/172.X.X.X/datapump/PDB1DEV_3107261650.dmp
Job "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully completed at
Fri Jul 31 17:16:28 2026 elapsed 0 00:25:31
[oracle@bd-dev-laboratorio validar]$
[oracle@bd-dev-laboratorio validar]$ ls -lat
total 243147137
-rw-r--r--. 1 oracle oinstall 80832880672 Aug 1 12:49 PDB1DEV_0108261124.dmp.enc
drwxr-xr-x. 2 oracle oinstall 7 Aug 1 12:32 .
drwxr-xr-x. 4 oracle oinstall 45 Aug 1 12:12 ..
-rw-r-----. 1 oracle oinstall 80832880640 Aug 1 11:46 PDB1DEV_0108261124.dmp
-rw-r--r--. 1 oracle oinstall 127549 Aug 1 11:46 PDB1DEV_0108261124.log
-rw-r-----. 1 oracle oinstall 80826147081 Jul 31 17:16 PDB1DEV_3107261650.dmp.gz
-rw-r--r--. 1 oracle oinstall 127544 Jul 31 17:16 PDB1DEV_3107261650.log
-rw-r-----. 1 oracle oinstall 6486334242 Jul 26 22:25 PDB1DEV_2607262200.dmp.gz
-rw-r--r--. 1 oracle oinstall 127393 Jul 26 22:25 PDB1DEV_2607262200.log
[oracle@bd-dev-laboratoriovalidar]$ time openssl enc -aes-256-cbc -pbkdf2 -salt \
-in PDB1DEV_0108261124.dmp -out PDB1DEV_0108261124.dmp.enc
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
real 17m10.146s
user 1m49.553s
sys 2m16.912s
Durante aproximadamente 13 minutos, el proceso estuvo esperando principalmente operaciones
de entrada/salida. Además, openssl enc procesa este cifrado como un único flujo;
asignarle más CPU o más núcleos no hace que una sola ejecución escale linealmente.
OpenSSL incluye openssl speed precisamente para medir la capacidad criptográfica del
equipo y distinguirla del rendimiento del almacenamiento
[oracle@bd-dev-laboratoriovalidar]$ openssl speed -evp aes-256-cbc
Doing aes-256-cbc for 3s on 16 size blocks: 135996407 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 64 size blocks: 38799610 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 256 size blocks: 9970455 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 1024 size blocks: 2519818 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 8192 size blocks: 315709 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 16384 size blocks: 157698 aes-256-cbc's in 3.00s
OpenSSL 1.1.1k FIPS 25 Mar 2021
built on: Mon Feb 23 10:24:46 2026 UTC
options:bn(64,64) md2(char) rc4(8x,int) des(int) aes(partial) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -O2 -g -pipe -Wall
-Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions
-fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1
-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables
-fstack-clash-protection -fcf-protection -Wa,--noexecstack -Wa,--generate-missing-build-notes=yes
-specs=/usr/lib/rpm/redhat/redhat-hardened-ld -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC
-DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5
-DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM
-DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DZLIB -DNDEBUG
-DPURIFY -DDEVRANDOM="\"/dev/urandom\""
-DSYSTEM_CIPHERS_FILE="/etc/crypto-policies/back-ends/openssl.config"
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-256-cbc 725314.17k 827725.01k 850812.16k 860097.88k 862096.04k 861241.34k
[oracle@bd-dev-laboratoriovalidar]$ grep -m1 -o '\baes\b' /proc/cpuinfo
aes
[oracle@bd-dev-laboratoriovalidar]$
Para calcular la velocidad real:
[oracle@bd-dev-laboratoriovalidar]$ bytes=$(stat -c %s PDB1DEV_0108261124.dmp)
[oracle@bd-dev-laboratoriovalidar]$
Esto permitirá comparar el cifrado contra la velocidad máxima de lectura
y escritura del almacenamiento.
[oracle@bd-dev-laboratoriovalidar]$ awk -v b="$bytes" -v s=1030.146 \
> 'BEGIN {
> printf "Velocidad promedio: %.2f MiB/s\n", b/s/1024/1024
> }'
Velocidad promedio: 74.83 MiB/s
[oracle@bd-dev-laboratoriovalidar]$ ls -lat
total 91605377
drwxr-xr-x. 2 oracle oinstall 6 Aug 1 14:23 .
drwxr-xr-x. 4 oracle oinstall 45 Aug 1 12:12 ..
-rw-r-----. 1 oracle oinstall 6489619161 Aug 1 11:46 PDB1DEV_0108261124.dmp.gz
-rw-r--r--. 1 oracle oinstall 127549 Aug 1 11:46 PDB1DEV_0108261124.log
-rw-r-----. 1 oracle oinstall 80826147081 Jul 31 17:16 PDB1DEV_3107261650.dmp.gz
-rw-r--r--. 1 oracle oinstall 127544 Jul 31 17:16 PDB1DEV_3107261650.log
-rw-r-----. 1 oracle oinstall 6486334242 Jul 26 22:25 PDB1DEV_2607262200.dmp.gz
-rw-r--r--. 1 oracle oinstall 127393 Jul 26 22:25 PDB1DEV_2607262200.log
[oracle@bd-dev-laboratorio validar]$ time openssl enc -aes-256-cbc -pbkdf2 -salt \
-in PDB1DEV_0108261124.dmp.gz -out PDB1DEV_0108261124.dmp.enc
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
real 1m35.347s
user 0m8.641s
sys 0m10.881s
[oracle@bd-dev-laboratorio validar]$ ^C
[oracle@bd-dev-laboratorio validar]$ ls -lat
total 97943937
-rw-r--r--. 1 oracle oinstall 6489619184 Aug 1 14:48PDB1DEV_0108261124.dmp.enc
drwxr-xr-x. 2 oracle oinstall 7 Aug 1 14:46 .
drwxr-xr-x. 4 oracle oinstall 45 Aug 1 12:12 ..
-rw-r-----. 1 oracle oinstall 6489619161 Aug 1 11:46PDB1DEV_0108261124.dmp.gz
-rw-r--r--. 1 oracle oinstall 127549 Aug 1 11:46PDB1DEV_0108261124.log
-rw-r-----. 1 oracle oinstall 80826147081 Jul 31 17:16PDB1DEV_3107261650.dmp.gz
-rw-r--r--. 1 oracle oinstall 127544 Jul 31 17:16PDB1DEV_3107261650.log
-rw-r-----. 1 oracle oinstall 6486334242 Jul 26 22:25PDB1DEV_2607262200.dmp.gz
-rw-r--r--. 1 oracle oinstall 127393 Jul 26 22:25PDB1DEV_2607262200.log
expdp c##exportdp/oracle@PDB1dev LOGFILE=$EXPDMP'.log' DIRECTORY=EXPDIR \
DUMPFILE=$EXPDMP EXCLUDE=statistics FULL=YES COMPRESSION=ALL encryption=ALL \
encryption_algorithm=AES256 encryption_password=NA****************2026
Master table "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully loaded/unloaded
******************************************************************************
Dump file set for C##EXPORTDP.SYS_EXPORT_FULL_02 is:
/respaldos/172.x.x.x/datapump/PDB1DEV_0108262144.dmp
Job "C##EXPORTDP"."SYS_EXPORT_FULL_02" successfully completed at
Sat Aug 1 22:26:36 2026 elapsed 0 00:41:49
drwxr-xr-x. 4 oracle oinstall 47 Aug 1 22:34 .
-rw-r--r--. 1 oracle oinstall 17114 Aug 1 22:26 PDB1DEV_0108262144.log.gz
-rw-r-----. 1 oracle oinstall 14740083605 Aug 1 22:26 PDB1DEV_0108262144.dmp.gz
drwxr-xr-x. 2 oracle oinstall 7 Aug 1 14:46 validar
sábado, 1 de agosto de 2026
Que impacto tiene el que generemos un Datapump utilizando un método de encriptación por ejemplo nativa o externa, a la hora de comprimir el archivo con el respaldo respectivo.?
Hola gente,
martes, 28 de julio de 2026
El arte de estar distraído en un DBA
Hace muchos años, cuando aún las redes sociales, no eran un distractor para todo y apenas se ponía de moda el teléfono celular solo para llamadas y algunos cuantos mensajes SMS, tuve uno de los "lapsus mentalis" más costosos.
Estaba en medio de una depuración de un procedimiento y necesitaba cambiar las características de una tabla, cuando en ese momento sonó el teléfono.
Pude haber ignorado la llamada, pero era de mi casa, así que procedí a contestar. En ese momento sucedido, sucedido una cadena de acontencimientos que terminaron con el borrado accidental de la tabla de producción y no de la tabla temporal de pruebas.
Ya lo sabía con anticipación, el cerebro humano de los hombres, no tiene la capacidad de multiprocesamiento en línea, pero aún así, lo intenté y me equivoqué.
"La experiencia es una maestra muy cara, pero los necios no aprenden de otra."
Nunca más cuando debí contestar un teléfono, continuaba con las manos en el teclado, la lección fue muy dura y como decimos por acá, "al mejor mono se le cae el zapote" y a veces algo más.
martes, 21 de julio de 2026
Un verdadero clásico: conocías el paquete DBMS_DB_VERSION? Compilación condicional en la base de datos Oracle
Es un paquete pequeño, pero contiene más elementos de los que normalmente se utilizan. Su propósito principal es permitir que el código PL/SQL sea compatible entre distintas versiones de Oracle mediante compilación condicional y comprobaciones de versión.
Este paquete expone constantes que permiten identificar la versión mayor, la release y comprobar características específicas de la base de datos.
Una de las razones por las que existe este paquete es permitir escribir código compatible con varias versiones de Oracle.
El paquete principalmente es llamado a través de sus constantes VERSION y RELEASE, no expone procedimientos, funciones ni parámetros, sino únicamente constantes públicas como:
Además de VERSION y RELEASE, el paquete define constantes booleanas que permiten saber si el código se está compilando para una determinada versión.
En la versión de base de datos Oracle AI Database 26ai, podemos observar en el código, como las constantes para las versiones de base de datos 11.1 hacia atrás han sido marcadas como obsoletas.
Las constantes VER_LEx, son especialmente útiles cuando el objetivo es mantener compatibilidad hacia atrás.
LINE TEXT
---------- ------------------------------------------------------------------------------
1 package dbms_db_version is
2 version constant pls_integer :=
3 23; -- RDBMS version number
4 release constant pls_integer := 0; -- RDBMS release number
5
6 /* The following boolean constants follow a naming convention. Each
7 constant gives a name for a boolean expression. For example,
8 ver_le_9_1 represents version <= 9 and release <= 1
9 ver_le_10_2 represents version <= 10 and release <= 2
10 ver_le_10 represents version <= 10
11
12 Code that references these boolean constants (rather than directly
13 referencing version and release) will benefit from fine grain
14 invalidation as the version and release values change.
15
16 A typical usage of these boolean constants is
17
18 $if dbms_db_version.ver_le_10 $then
19 version 10 and ealier code
20 $elsif dbms_db_version.ver_le_11 $then
21 version 11 code
22 $else
23 version 12 and later code
24 $end
25
26 This code structure will protect any reference to the code
27 for version 12. It also prevents the controlling package
28 constant dbms_db_version.ver_le_11 from being referenced
29 when the program is compiled under version 10. A similar
30 observation applies to version 11. This scheme works even
31 though the static constant ver_le_11 is not defined in
32 version 10 database because conditional compilation protects
33 the $elsif from evaluation if the dbms_db_version.ver_le_10 is
34 TRUE.
35 */
36
37 /* Deprecate boolean constants for unsupported releases */
38
39 ver_le_9_1 constant boolean := FALSE;
40 PRAGMA DEPRECATE(ver_le_9_1);
41 ver_le_9_2 constant boolean := FALSE;
42 PRAGMA DEPRECATE(ver_le_9_2);
43 ver_le_9 constant boolean := FALSE;
44 PRAGMA DEPRECATE(ver_le_9);
45 ver_le_10_1 constant boolean := FALSE;
46 PRAGMA DEPRECATE(ver_le_10_1);
47 ver_le_10_2 constant boolean := FALSE;
48 PRAGMA DEPRECATE(ver_le_10_2);
49 ver_le_10 constant boolean := FALSE;
50 PRAGMA DEPRECATE(ver_le_10);
51 ver_le_11_1 constant boolean := FALSE;
52 PRAGMA DEPRECATE(ver_le_11_1);
53 ver_le_11_2 constant boolean := FALSE;
54 ver_le_11 constant boolean := FALSE;
55 ver_le_12_1 constant boolean := FALSE;
56 ver_le_12_2 constant boolean := FALSE;
57 ver_le_12 constant boolean := FALSE;
58 ver_le_18 constant boolean := FALSE;
59 ver_le_19 constant boolean := FALSE;
60 ver_le_20 constant boolean := FALSE;
61 ver_le_21 constant boolean := FALSE;
62 ver_le_23 constant boolean := TRUE;
63
64 end dbms_db_version;
64 rows selected.
SQL>
Esta es una funcionalidad poco conocida pero que tiene más de 20 años de existencia.
[oracle@oracle-server-26ai ~]$ sqlplus /nolog
SQL*Plus: Release 23.26.2.0.0 - Production on Wed Jul 22 00:12:04 2026
Version 23.26.2.0.0
Copyright (c) 1982, 2026, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
SQL> alter session set container=pdb1;
Session altered.
PL/SQL procedure successfully completed.
El paquete no devuelve la versión completa de la base de datos, sólo la versión base
SQL> set serveroutput on
SQL> begin
dbms_output.put_line(
dbms_db_version.version
);
end;
/
23
PL/SQL procedure successfully completed.
Podemos generar una versión de la consulta ampliada para poder mostrar un poco más de
información utilizando la constante RELEASE
SQL> set serveroutput on
declare
begin
dbms_output.put_line('Oracle Version');
dbms_output.put_line('--------------');
dbms_output.put_line( dbms_db_version.version || '.' ||
dbms_db_version.release );
dbms_output.put_line('Compatible: ' ||
dbms_db_version.version || '.' ||
dbms_db_version.release
);
end;
/
Oracle Version
--------------
23.0
Compatible: 23.0
PL/SQL procedure successfully completed.
Compilación condicional
Oracle permite usar directivas especiales:
$IF$THEN$ELSE$END
Estas son evaluadas por el compilador.
Por ejemplo:
SQL> DECLARE
x number;
BEGIN
$IF DBMS_DB_VERSION.VERSION >= 23 $THEN
x := 10;
$ELSE
x := 20;
$END
DBMS_OUTPUT.PUT_LINE('Valor de x: '||x);
END;
/
Valor de x: 10
PL/SQL procedure successfully completed.
En este caso el compilador dependiendo la versión en la cuál compiles el programa,
así será la generación del código que utilice. por eso en la ejecución del procedimiento
en la versión 26.23.2 devuelve el valor 10
Pero si ejecutamos el mismo código en una versión 19c, el resultado será 20.
SQL> select BANNER_FULL from v$version;
BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.22.0.0.0
SQL> DECLARE
x number;
BEGIN
$IF DBMS_DB_VERSION.VERSION >= 23 $THEN
x := 10;
$ELSE
x := 20;
$END
DBMS_OUTPUT.PUT_LINE('Valor de x: '||x);
END;
/
Valor de x: 20
PL/SQL procedure successfully completed.
Todo esto esta muy bien, pero el procedimiento va más allá.
Podemos utilizar las constantes boleanas, para determinar cuál es la versión de la
base de datos de tal forma que basado en el valor obtenido, ejecute la parte del código
que corresponda.
Ejecutando en Oracle AI Database 26ai.
SQL> DECLARE
x NUMBER;
BEGIN
IF DBMS_DB_VERSION.VER_LE_19 THEN
x := 10;
ELSIF DBMS_DB_VERSION.VER_LE_23 THEN
x := 13;
ELSE
x := 20;
END IF;
DBMS_OUTPUT.PUT_LINE('Valor de x: ' || x);
END;
/
Valor de x: 13
PL/SQL procedure successfully completed.
Ahora veamos un ejemplo de ejecución sobre una acción real a nivel de la base de datos.
Necesitamos crear un procedimiento que sea capaz de borrar una tabla, pero que dependiendo
de la versión que sea, utilice el método con el condicionamiento IF EXISTS o simplemente un
DROP TABLE, al no existe la validación, como en versiones 19c o previas.
#### Oracle 19c
SQL> create table t1( x number, y char);
Table created.
SQL> desc t1
Name Null? Type
---------------------- -------- ----------
X NUMBER
Y CHAR(1)
Al ejecutar el procedimiento con el IF EXISTS en 19c, provoca que el procedimiento genere
un error de ejecución ORA-00933
SQL> set serveroutput on
SQL> DECLARE
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE IF EXISTS t1';
DBMS_OUTPUT.PUT_LINE('Tabla T1 eliminada (si existía).');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
ORA-00933: SQL command not properly ended
PL/SQL procedure successfully completed.
Ahora hagamos el mismo proceso, pero con la sintáxis aceptada en 19c.
SQL> DECLARE
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
DBMS_OUTPUT.PUT_LINE('Tabla T1 eliminada.');
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -942 THEN
DBMS_OUTPUT.PUT_LINE('La tabla T1 no existe.');
ELSE
RAISE;
END IF;
END;
/
Tabla T1 eliminada.
PL/SQL procedure successfully completed.
SQL> create table t1( x number, y char);
Table created.
Ahora agreguemos la opción de compilación condicional al script, para que no nos genere error
en la versión 19c.
DECLARE
BEGIN
$IF DBMS_DB_VERSION.VERSION >= 23 $THEN
EXECUTE IMMEDIATE 'DROP TABLE IF EXISTS t1';
$ELSE
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
$END
DBMS_OUTPUT.PUT_LINE('Proceso finalizado.');
END;
/
Proceso finalizado.
PL/SQL procedure successfully completed.
SQL> desc t1
ERROR:
ORA-04043: object t1 does not exist
SQL>
En la version de Oracle AI Database 26ai, ambas instrucciones serán ejecutadas sin presentar
ningún error, ya que ambas son válidas.
##Oracle 26ai
SQL> create table t1( x number, y char);
Table created.
SQL> DECLARE
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
DBMS_OUTPUT.PUT_LINE('Tabla T1 eliminada.');
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -942 THEN
DBMS_OUTPUT.PUT_LINE('La tabla T1 no existe.');
ELSE
RAISE;
END IF;
END;
/
Tabla T1 eliminada.
PL/SQL procedure successfully completed.
¿Por qué Oracle diseñó este mecanismo? El dato histórico interesante:
$IF DBMS_DB_VERSION.VER_LE_10 $THEN -- Código para Oracle 10g o anterior $ELSIF DBMS_DB_VERSION.VER_LE_11 $THEN -- Código para Oracle 11g $ELSE -- Código para versiones posteriores $END
Antes de 10.2 el paquete ya existía, pero no podía aprovecharse con este mecanismo de compilación condicional, que es precisamente el uso para el que fue diseñado
Esta característica recién ha cumplido 24 años de existencia. La conocías.?
lunes, 13 de julio de 2026
Cuando te contratan para perder.
Sucede en las relaciones personales.
Hay personas que llegan intentando reconstruir vínculos que llevan años deteriorándose.
Intentan comunicarse.
Intentan comprender.
Intentan cambiar.
Mientras la otra parte ya tomó la decisión de irse hace mucho tiempo.
No buscan reconstruir.
Buscan confirmar que ya no había nada por hacer.
Y entonces aparece alguien dispuesto a luchar una batalla que ya había terminado antes de comenzar.
La experiencia, sin embargo, también enseña algo esperanzador.
No todos los desafíos imposibles son una trampa.
Algunas de las mejores historias profesionales nacen precisamente de proyectos que parecían condenados.
La diferencia suele estar en algo que pocas veces aparece en una descripción de puesto.
La voluntad real de cambiar.
Cuando existe esa voluntad, incluso con pocos recursos, los equipos encuentran caminos.
Cuando no existe, ni el mejor profesional del mundo puede fabricar compromiso donde nadie quiere asumirlo.
Si pudiera dar un consejo a quienes apenas comienzan su carrera, no sería "acepten todos los retos".
Sería algo distinto.
Aprendan primero a identificar la naturaleza del desafío.
Antes de aceptar un puesto, hagan preguntas difíciles:
- ¿Por qué se fue la persona anterior?
- ¿Cuántas personas han ocupado ese cargo en los últimos años?
- ¿Qué decisiones puede tomar realmente quien ocupe el puesto?
- ¿Existe presupuesto para cambiar las cosas?
- ¿La dirección está dispuesta a modificar aquello que provocó el problema?
El talento es importante.
Pero también lo es elegir las batallas correctas.
Y para quienes ya acumulamos algunas décadas de experiencia, el aprendizaje quizá sea diferente.
No debemos confundir resiliencia con sacrificio infinito.
No tenemos que demostrar constantemente que podemos salvar cualquier proyecto.
Hay momentos en que la mayor muestra de madurez profesional consiste en reconocer que una organización no busca soluciones.
Busca un responsable.
Y son dos cosas completamente distintas.
Decir "no" también forma parte de la experiencia.
Renunciar antes de convertirnos en el chivo expiatorio de decisiones ajenas también es una forma de proteger nuestra integridad profesional.
No porque tengamos miedo de fracasar.
Sino porque entendimos que no todo fracaso nos pertenece.
Después de tantos años sigo creyendo que las personas pueden cambiar organizaciones.
He visto equipos extraordinarios lograr cosas que parecían imposibles.
Pero también aprendí que ninguna persona, por brillante que sea, puede reemplazar la voluntad colectiva de hacer que las cosas no funcionen.
Y hay barcos que solo buscan un nuevo capitán para explicar por qué terminaron hundiéndose.
La experiencia consiste, precisamente, en aprender a distinguir unos de otros.
Porque, al final, el verdadero éxito profesional no siempre consiste en salvar todos los barcos.
A veces consiste en reconocer cuáles todavía quieren navegar.
No me hagan mucho caso, yo ya estoy un poco viejo y creo que la entrada en años me empieza a pasar factura.
Solo tengan presente una cosa, la vida es corta, mucho más de lo que crees cuando tienes 20, 30 o 40 años. Despues de los 50's, sólo piensas en una cosa: Como tener paz y como vivir bien.
Algunos dirán que con 58 años, aún me queda mucho por hacer. Y si, tienen mucha razón, pero mis prioridades actuales, son muy distintas a las de hace 20 años atrás.
En ocasiones, desearía correr detrás de un balón, saltar y golpearlo como lo hacía cuando tenía 20. Pero la realidad es otra. Mi cuerpo me lo recuerda cada mañana al levantarme y cada día al final. Ya no soy lo mismo y nunca más lo volveré a hacer. Esa es la realidad.
Lo único que nunca deberíamos permitirnos es cargar con la culpa de un fracaso cuya causa nunca estuvo en nuestras manos.






