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."
El Independent Automaton de Fleet Patching and Provisioning, también descrito por Oracle internamente en el contexto de FPP Local Mode, es una herramienta diseñada para realizar out-of-place patching entre dos ORACLE_HOME instalados en el mismo servidor, incluso cuando:
no existe Oracle Grid Infrastructure;
no existe Oracle Restart;
no existe un servidor FPP central;
los Oracle Homes no son working copies;
los Homes fueron instalados mediante runInstaller u otro método convencional.
Oracle permite a través de esta opción que 2 ORACLE_HOME instalados y no administrados por un servidor FPP, pueden ser migrados o actualizados.
La versión disponible del FPP en modo local solo dispone de un comando:
commands: move
objects: database
No contiene las funciones completas de un servidor o cliente FPP, como:
rhpctl add image
rhpctl add workingcopy
rhpctl query job
rhpctl deploy home
rhpctl move gihome
rhpctl upgrade database
rhpctl -version
y esto no esta mal, ya que es el comportamiento esperado en la versión autónoma.
La herramienta identifica las bases asociadas al Home origen y las cambia al Home destino.
Mi escenario para este laboratorio es el siguiente:
FPP integra la ejecución de datapatch como parte del movimiento, salvo que se le indique explícitamente no hacerlo.
Un punto importante mientras no se elimine ni modifique el Home de origen, puede realizarse el movimiento inverso.
No obstante, debe distinguir entre:
retornar los binarios al Home anterior;
revertir los cambios SQL aplicados por datapatch.
Después de que el RU nuevo haya modificado el diccionario, el retorno no debe tratarse simplemente como un cambio de variables. El procedimiento debe considerar el rollback SQL del RU, la compatibilidad y las opciones que soporte rhpctl. Por ello, el Home anterior debe conservarse hasta completar todas las validaciones funcionales.
A continuación podrás ver el procedimiento completo para realizar el cambio o actualización que describí previamente.
[oracle@oracle-server-26ai bin]$ ./rhpctl move database -h
Moves a database from source Oracle home to the patched Oracle home.
Usage: rhpctl move database -sid -sourcehome
-desthome
[-eval]
[-ignorewcpatches]
[-stopoption ]
[-drain_timeout
En mis charlas sobre "Ethical Hacking", me encanta hablar sobre “Neutralidad en Seguridad”. Me gusta ampliar el principio clásico de mínimo privilegio desde una perspectiva puramente técnica, hacia una dimensión de gobernanza, responsabilidad y protección del propio usuario.
El principio tradicional de mínimo privilegio (Principle of Least Privilege, PoLP) establece:
Una identidad (usuario, aplicación, proceso o servicio) debe recibir únicamente los privilegios estrictamente necesarios para ejecutar sus funciones autorizadas, durante el tiempo necesario y bajo las condiciones necesarias.
Sin embargo mi concepto agrega una capa adicional: un exceso de privilegios no solo incrementa el riesgo para la organización, sino que rompe la neutralidad del usuario frente a un incidente.
Para mi: Neutralidad en seguridad: es el principio mediante el cual los privilegios asignados a una identidad digital deben mantenerse alineados estrictamente con sus responsabilidades reales, evitando que permisos innecesarios conviertan a dicha identidad en un punto injustificado de exposición, sospecha o atribución dentro de un incidente de seguridad.
El punto central desde mi perspectiva, es que la neutralidad ocurre cuando, los Permisos concedidos = Responsabilidad funcional. Ni menos, ni más.
Desde el punto de vista de seguridad, un exceso de privilegios genera varios problemas:
1. Incrementa la superficie de ataque
Ejemplo en base de datos:
Un analista requiere:
SELECT sobre tablas de reportes,
pero recibe: SELECT ANY TABLE o peor aún "DBA".
El atacante hereda todo lo que la cuenta puede hacer, no solamente lo que el usuario normalmente hace.
2. Rompe la presunción operacional de inocencia.
Supongamos:
Usuario A: necesita consultar clientes, tiene acceso solo lectura
Usuario B: necesita consultar clientes, pero además tiene: borrar registros, exportar información, crear usuarios, modificar privilegios.
Si ocurre una fuga, desde un análisis forense el Usuario A:
¿Tenía capacidad técnica?
Respuesta: NO, menor probabilidad como origen.
En el caso del Usuario B:
¿Tenía capacidad técnica?
Respuesta: SÍ, debe investigarse. Aunque Usuario B sea inocente, los privilegios excesivos lo colocaron dentro del perímetro de sospecha.
3. La asignación excesiva de permisos crea responsabilidad compartida
Una frase que resume bien el concepto:
"Todo privilegio innecesario es una responsabilidad innecesaria transferida al usuario."
Dar privilegios no es solamente dar capacidad, también es asignar:
Tenemos un script para validar el crecimiento de objetos dentro de la base de datos en los últimos 6 días y cuando ejecutamos la consulta nos devuelve la siguiente salida.
El script en cuestión es el siguiente, asociado a una vista para poderlo ejecutar más fácil:
create view v_tablas_mas_crecimiento as
WITH snaps AS (
SELECT
MIN(snap_id) AS begin_snap,
MAX(snap_id) AS end_snap
FROM dba_hist_snapshot
WHERE begin_interval_time >= SYSDATE - 6
),
seg_begin AS (
SELECT
obj.owner,
obj.object_name AS segment_name,
obj.object_type AS segment_type,
ss.space_used_delta
FROM dba_hist_seg_stat ss
JOIN dba_hist_seg_stat_obj obj
ON obj.dbid = ss.dbid
AND obj.obj# = ss.obj#
AND obj.dataobj# = ss.dataobj#
JOIN snaps sn
ON ss.snap_id = sn.begin_snap
),
seg_growth AS (
SELECT
obj.owner,
obj.object_name AS segment_name,
obj.object_type AS segment_type,
SUM(ss.space_used_delta) AS growth_bytes
FROM dba_hist_seg_stat ss
JOIN dba_hist_seg_stat_obj obj
ON obj.dbid = ss.dbid
AND obj.obj# = ss.obj#
AND obj.dataobj# = ss.dataobj#
WHERE ss.snap_id BETWEEN (SELECT begin_snap FROM snaps)
AND (SELECT end_snap FROM snaps)
GROUP BY obj.owner, obj.object_name, obj.object_type
)
SELECT *
FROM (
SELECT
owner,
segment_name,
segment_type,
ROUND(growth_bytes/1024/1024,2) AS growth_mb
FROM seg_growth
WHERE growth_bytes > 0
ORDER BY growth_bytes DESC
)
WHERE ROWNUM <= 20;
select * from "V_TABLAS_MAS_CRECIMIENTO";
Qué son estos datos en el nombre del objeto ** MISSING: 6591054/6591054 ?
Vamos a explicarlo.
En Oracle, cuando estás consultando crecimiento histórico (normalmente desde AWR usando DBA_HIST_SEG_STAT y DBA_HIST_SEG_STAT_OBJ) y en lugar del nombre del objeto aparece algo como:
** MISSING: 6624752/6624752
significa que AWR tiene estadísticas históricas de un segmento, pero ya no puede resolver el objeto asociado en el diccionario histórico de objetos.
Hola gente comparto con ustedes esta información con la participación de uno de nuestros aliados en el#LAOUCTOUR2026Legadmi
📢 Webinar Exclusivo | Compliance y confianza: convierta los reportes SOC en una ventaja competitiva
¿Su empresa maneja información sensible o trabaja con proveedores que lo hacen?
Le invitamos a un webinar donde descubrirá cómo los reportes SOC 1 y SOC 2 pueden ayudarle a reducir riesgos, fortalecer la confianza de sus clientes y diferenciarse en el mercado.
📅 Fecha: 8 de julio 2026 ⏰ Hora: 9:00 a.m. – 10:00 a.m. 💻 Modalidad: Zoom Aprenda cómo:
✅ Evaluar y gestionar riesgos de proveedores críticos. ✅ Demostrar cumplimiento con estándares internacionales. ✅ Agilizar cierres
comerciales mediante mayor confianza y transparencia. 🎙️ Expositores: * José Manuel Ascanio – Director, Legadmi • Nelson Camargo – IT Risk Consultant Partner, Next Audit
👥 Dirigido a profesionales de Compliance, Auditoría, Riesgos, Seguridad de la Información, Compras, Finanzas, Tecnología y Operaciones.
Estas trabajando con campos tipo vector en Oracle AI Database 26ai y deseas crear un índice de tipo vectorial y recibes un ORA-51962. Qué debes hacer. ?
Primero que todo, un índice vectorial es una estructura de datos especializada que permite localizar rápidamente los vectores más similares a un vector de consulta dentro de un espacio multidimensional, evitando tener que comparar el vector buscado contra todos los vectores almacenados.
En Oracle AI Database 26ai, los índices vectoriales están diseñados para acelerar operaciones de Nearest Neighbor Search (NNS) utilizadas en sistemas de búsqueda semántica, RAG (Retrieval-Augmented Generation), recomendación de contenido, detección de similitud y aplicaciones de inteligencia artificial.
ORA-51962 significa que el Vector Pool del contenedor actual no tiene espacio libre suficiente o que el parámetro que controla esta estructura a nivel del SGA no ha sido configurado.
Oracle AI Database 26ai, no configura valores de facto para el parámetro VECTOR_MEMORY_SIZE. El valor de facto del parámetro es 0.
El error puede dar, ya sea porque el parámetro esta con valor 0 o bien, que el espacio en el "Pool", ha sido agotado.
Una consulta a la vista dinámica de la base de datos v$vector_index, te permite validar como se esta utilizando el espacio del VECTOR POOL.
Puedes también utilizar la siguiente consulta para obtener un mejor detalle de ocupación en MBytes.
SET LINESIZE 220
SET PAGESIZE 100
COLUMN owner FORMAT A20
COLUMN index_name FORMAT A35
COLUMN partition_name FORMAT A25
COLUMN index_organization FORMAT A30
COLUMN distance_type FORMAT A15
COLUMN allocated_mb FORMAT 999,999,990.00
COLUMN used_mb FORMAT 999,999,990.00
COLUMN pct_used FORMAT 990.00
COLUMN pct_free FORMAT 990.00
SELECT owner,
index_name,
index_organization,
distance_type,
index_dimensions,
num_vectors,
ROUND(allocated_bytes / 1024 / 1024, 2) AS allocated_mb,
ROUND(used_bytes / 1024 / 1024, 2) AS used_mb,
ROUND((used_bytes / NULLIF(allocated_bytes, 0)) * 100, 2) AS pct_used,
Puedes obtener una versión más resumida de la ocupación de los índices con la siguiente consulta.
SELECT owner,
index_name,
SUM(num_vectors) AS total_vectors,
ROUND(SUM(allocated_bytes) / 1024 / 1024, 2) AS allocated_mb,
ROUND(SUM(used_bytes) / 1024 / 1024, 2) AS used_mb,
ROUND((SUM(used_bytes) / NULLIF(SUM(allocated_bytes), 0)) * 100, 2) AS pct_used
FROM v$vector_index
GROUP BY owner, index_name
ORDER BY pct_used DESC;
Si la situación es que el parámetro no ha sido configurado, debes seguir los siguientes pasos.
Te mostraré como hacer la configuración del parámetro y como luego se puede crear el índice sin inconvenientes.
Detalle importante, el parámetro no es dinámico, por tanto, vas a necesitar reiniciar el contenedor de base de datos.
SQL*Plus: Release 23.26.1.0.0 - Production on Sat Jun 6 22:44:12 2026
Version 23.26.1.0.0
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Last Successful login time: Sat Jun 06 2026 21:41:10 +00:00
Connected to:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0
SQL> CREATE VECTOR INDEX IDX_CHUNKS_EMBEDDING_HNSW
ON documentos_pdf (EMBEDDING)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE
WITH TARGET ACCURACY 95
PARAMETERS (
TYPE HNSW,
NEIGHBORS 32,
EFCONSTRUCTION 500
);
ON documentos_pdf (EMBEDDING)
*
ERROR at line 2:
ORA-51962: The vector memory area is out of space for the current container.
Help: https://docs.oracle.com/error-help/db/ora-51962/
SQL> connect / as sysdba
Connected.
SQL> show user
USER is "SYS"
SQL> SHOW PARAMETER vector_memory_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
vector_memory_size big integer 0
SQL> alter system set vector_memory_size=1g scope=both;
alter system set vector_memory_size=1g scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-51950: The Oracle Database Vector Memory size cannot be increased.
Help: https://docs.oracle.com/error-help/db/ora-02097/
SQL> alter system set vector_memory_size=1g scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1.5717E+10 bytes
Fixed Size 5027392 bytes
Variable Size 1979711488 bytes
Database Buffers 1.2650E+10 bytes
Redo Buffers 8855552 bytes
Vector Memory Area 1073741824 bytes
Database mounted.
Database opened.
SQL> SHOW PARAMETER vector_memory_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
vector_memory_size big integer 1G
SQL> connect sh/sh@pdb1
Connected
SQL> CREATE VECTOR INDEX IDX_CHUNKS_EMBEDDING_HNSW
ON documentos_pdf (EMBEDDING)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE
WITH TARGET ACCURACY 95
PARAMETERS (
TYPE HNSW,
NEIGHBORS 32,
EFCONSTRUCTION 500
);
Index created.
Para que sirve este índice.?
índice vectorial HNSW sobre la columna EMBEDDING de la tabla DOCUMENTOS_PDF
para acelerar búsquedas de similitud semántica en Oracle AI Database 26ai.
Veámosla línea por línea:
CREATE VECTOR INDEX IDX_CHUNKS_EMBEDDING_HNSW ON documentos_pdf (EMBEDDING)
Crea un índice llamado IDX_CHUNKS_EMBEDDING_HNSW.
El índice se construye sobre la columna EMBEDDING.
Dicha columna contiene vectores generados por un modelo de embeddings
(texto, imágenes, audio, etc.).
Ejemplo:
[0.125, -0.234, 0.567, ...]
Cada vector representa el significado semántico de un chunk de documento.
ORGANIZATION INMEMORY NEIGHBOR GRAPH
Indica que Oracle utilizará una estructura de datos optimizada para búsquedas
ANN (Approximate Nearest Neighbor).
En lugar de comparar el vector de búsqueda contra todos los registros de la tabla:
Vector Consulta | v Comparar contra 10 millones de vectores
Oracle construye un grafo donde cada vector conoce a sus vecinos más cercanos:
A / | \ B C D |\/ \| E----F
La búsqueda "navega" por el grafo hasta encontrar los vectores más similares.
Beneficio:
Mucho más rápido.
Menor uso de CPU.
Escalable a millones de embeddings.
DISTANCE COSINE
Define la métrica de similitud.
Oracle calculará: Cosine Similarity entre el vector buscado y los vectores almacenados.
Matemáticamente:
A · B ------- |A||B|
Valores:
Resultado
Interpretación
1
Idénticos
0.9
Muy similares
0.5
Relación moderada
0
Sin relación
Para RAG y documentos generalmente es la opción más utilizada.
Ejemplo:
Consulta:"¿Qué es Oracle RAC?"
Aunque el documento diga:"Real Application Clusters permite..."
los embeddings tendrán direcciones parecidas y la distancia coseno será pequeña.
WITH TARGET ACCURACY 95
Oracle intentará devolver aproximadamente el 95% de los vecinos que encontraría
una búsqueda exacta.
Existe un compromiso entre:
Exactitud
Velocidad
100%
Más lenta
95%
Muy rápida
90%
Más rápida
80%
Extremadamente rápida
En RAG normalmente:
90 - 95 %
es un excelente equilibrio.
PARAMETERS
TYPE HNSW
Utiliza el algoritmo:Hierarchical Navigable Small World
Actualmente es uno de los algoritmos ANN más utilizados en sistemas vectoriales modernos.
También es usado en motores como:
FAISS
Milvus
Qdrant
OpenSearch
NEIGHBORS 32
También conocido como parámetro M en HNSW.
Indica cuántas conexiones tendrá cada nodo del grafo.
Visualmente:
Vector A | +----32 vecinos
Mayor valor: NEIGHBORS 64
Más memoria.
Índice más grande.
Mejor calidad de búsqueda.
Menor valor:NEIGHBORS 16
Menor tamaño.
Menor precisión.
Valor 32 suele ser una configuración equilibrada.
EFCONSTRUCTION 500
EFCONSTRUCTION 500
Controla la calidad durante la construcción del índice.
Cuando Oracle inserta cada vector:
Nuevo Vector | v Busca 500 candidatos | v Escoge los mejores vecinos
Valores típicos:
Valor
Calidad
100
Básica
200
Buena
500
Muy buena
1000
Excelente
Con:EFCONSTRUCTION 500
Oracle dedica más trabajo al construir el índice para obtener mejores