Controlador Oracle
Esta documentación explica la implementación del controlador Oracle y cómo los parámetros de conexión se corresponden con los campos de la interfaz de usuario en la aplicación Gigantic.
Parámetros de Conexión
| Campo UI | Implementación Técnica | Descripción | Requerido | Valor por Defecto |
|---|---|---|---|---|
| Host | connectString en la configuración de oracledb | El nombre de host o dirección IP del servidor Oracle | Sí | localhost |
| Puerto | Parte de connectString en la configuración de oracledb | El número de puerto en el que escucha el servidor Oracle | Sí | 1521 (de driverPorts) |
| Base de Datos | Parte de connectString en la configuración de oracledb | El nombre de la base de datos/PDB a la que conectarse | Sí | Ninguno (debe ser especificado) |
| Propietario | owner en la configuración de gigadb | El propietario del esquema a usar para consultas y extracción de metadatos | No | Esquema del usuario actual |
| Contenedor | container en la configuración de gigadb | El nombre de la Base de Datos Conectable (PDB) cuando se usa Oracle Multitenant | No | Ninguno |
| Nombre de Usuario | user en la configuración de conexión de oracledb | Usuario de base de datos para autenticación | Sí | Ninguno (debe ser especificado) |
| Contraseña | password en la configuración de conexión de oracledb | Contraseña para el usuario de base de datos | Sí | Ninguno (debe ser especificado) |
Detalles Técnicos
La implementación del controlador Oracle utiliza la biblioteca Node.js oracledb con capacidades de agrupamiento de conexiones.
Aspectos técnicos clave:
- El agrupamiento de conexiones se utiliza a través de la clase Pool de oracledb
- Los conceptos de Propietario y Contenedor (PDB) son específicos de Oracle
- El controlador utiliza el paquete DBMS_METADATA para la generación de DDL
- Manejo de columnas virtuales en el método normalizeRecordOracle
- Múltiples modos de carga soportados: insert, update, merge
Cuando el túnel SSH está habilitado, las conexiones se establecen primero a través del túnel antes de conectarse al servidor Oracle.
Formato de Cadena de Conexión
Las conexiones Oracle combinan campos individuales de la UI en una cadena de conexión. Se soportan dos formatos:
- Sintaxis de Conexión Fácil (por defecto):
//host:port/database- Cadena de Conexión Directa:
user/password@//host:port/databaseLa aplicación toma los campos individuales de la UI (Host, Puerto, Base de Datos) y los combina en el formato #1 para la biblioteca oracledb.
Opciones de Autenticación
Oracle soporta varios tipos de autenticación:
| Tipo de Autenticación | Mapeo UI | Descripción |
|---|---|---|
| Ninguna | No aplicable para Oracle | Deshabilita autenticación |
| Contraseña | Campos de usuario/contraseña | Autenticación estándar usuario/contraseña |
| Gestor de Contraseñas | Varios campos de gestores de contraseñas | Obtiene credenciales de gestores de contraseñas externos |
Soporte de Túnel SSH
El controlador Oracle soporta túneles SSH para acceso seguro a bases de datos detrás de firewalls o en redes privadas. Para información detallada sobre la configuración de túneles SSH, por favor consulte la documentación de Túneles SSH.
Endpoints de API Utilizados
Las conexiones Oracle se utilizan principalmente en:
- Creación de Tap (descubrimiento de fuente de datos)
- Creación de Sink (destino de datos para datos anonimizados)
- Ejecución de Pipeline (extracción y carga de datos)
Tablas Grandes y Reanudación
Esta sección recoge solo lo propio de Oracle. Cómo funcionan la reanudación, los rangos paralelos y las estimaciones de filas en todos los controladores se explica en Bases de datos grandes.
Lectura
- Las tablas se leen por bloques ordenados por la clave primaria, de modo que un job que se detiene se reanuda tras la última clave que guardó. Una tabla sin clave primaria se lee con un único cursor y empieza de nuevo si el job se detiene: no se usa
ROWID, porque ordenar por él obliga a ordenar el resto de la tabla en cada bloque. - Todas las columnas de la clave primaria deben ser
NUMBER(con cualquier precisión y escala, o sin ellas, comoNUMBER,NUMBER(10)oINTEGER) o de texto (CHAR,VARCHAR2,NVARCHAR2). Los valores de la clave se leen y comparan como texto, así que los números grandes y decimales se reanudan con exactitud. No se usa una clave con alguna columnaFLOAT,BINARY_FLOAToBINARY_DOUBLE, así que esa tabla se lee con un único cursor. Las claves de texto se comparan conNLS_SORTyNLS_COMPaBINARY.
Rangos Paralelos y Estimación de Filas
- Los rangos de clave primaria se cortan a partir de una muestra
SAMPLE BLOCK ... SEEDde la clave, dimensionada según la estadísticaBLOCKSde la tabla. Si la muestra es demasiado pequeña, una clave entera de una sola columna se reparte a partes iguales entre su mínimo y su máximo. - La estimación de filas es
NUM_ROWSdeALL_TABLES(USER_TABLESsi no se indica Owner). Una tabla sin estadísticas no la tiene y se usa el número de filas guardado en el modelo: recoge estadísticas de las tablas grandes (DBMS_STATS.GATHER_TABLE_STATS).
Carga
- Antes de cargar, el job desactiva las foreign keys de las tablas que carga y las foreign keys de otras tablas que las referencian. Cada una se anota antes en la tabla
GIGANTICS_DISABLED_CONSTRAINTS, que se crea en el esquema del Owner (o en el del usuario si no se indica Owner). Al terminar solo se vuelven a activar las anotadas, conENABLE VALIDATE, y se borran sus anotaciones. Una foreign key que ya estaba desactivada antes del job sigue desactivada. - Si un job muere, las anotaciones se quedan y el siguiente job que carga esas tablas las activa. Una foreign key que falla en
ENABLE VALIDATE(porque las filas cargadas no la cumplen) sigue desactivada y anotada, y se avisa en el log. - Si no se puede crear la tabla de anotaciones, el job avisa en el log y, al terminar, activa todas las foreign keys desactivadas de esas tablas.
- Los triggers de las tablas cargadas se desactivan con
DISABLE ALL TRIGGERSy se activan conENABLE ALL TRIGGERSal terminar. No se anotan: si un job muere, siguen desactivados hasta que termine otra carga de esas tablas. - La opción truncate ejecuta
TRUNCATE TABLE. - Las cargas update y merge pasan por una tabla temporal global y un
MERGEque compara todas las columnas de una clave primaria compuesta. - Cuando fallan algunas filas de un lote, el job avisa en el log con el número de filas fallidas y el primer error, y confirma el resto del lote.
Permisos
Para un sink Oracle, el usuario de base de datos necesita:
CREATE TABLEy cuota en su tablespace, paraGIGANTICS_DISABLED_CONSTRAINTSy las tablas de staging del merge. Si el Owner es otro esquema, ambas se crean y se escriben en ese esquema, lo que requiere privilegios comoCREATE ANY TABLE.SELECTsobreDBA_CONSTRAINTSsi se indica Owner (por ejemplo medianteSELECT_CATALOG_ROLE).ALTERsobre las tablas que carga y sobre las tablas cuyas foreign keys las referencian (ALTER ANY TABLEsi son de otro esquema).
Parámetros Personalizados
El controlador Oracle soporta parámetros personalizados adicionales que pueden especificarse en formato YAML para ajustar finamente el comportamiento de conexión, agrupamiento, configuraciones SSL y otras opciones avanzadas.
Atributos de Conexión
# Configuración de Conexión
stmtCacheSize: 30
edition: "ORA$BASE"
events: false
externalAuth: false
privilege: "SYSDBA" # o "SYSOPER", "SYSASM", "SYSBACKUP", "SYSDG", "SYSKM", "SYSRAC"
# Soporte de Sharding
shardingKey: ["clave1", "clave2"]
superShardingKey: ["super_clave1", "super_clave2"]
# Etiquetado de Sesión
tag: "app_producción"Atributos de Agrupamiento
# Configuración de agrupamiento
poolAlias: "miagrupamiento"
poolMin: 4
poolMax: 10
poolIncrement: 1
poolTimeout: 60
poolPingInterval: 60
poolMaxPerShard: 5
# Gestión de cola
queueMax: 50
queueRequests: true
queueTimeout: 60000
# Estadísticas de agrupamiento
enableStatistics: trueConfiguración SSL/TLS
# Configuración SSL
sslServerCertDN: "CN=server.ejemplo.com,O=Ejemplo Corp,C=ES"
sslServerDNMatch: true
sslAllowWeakDNMatch: false
useSNI: true
# Cartera Oracle
walletLocation: "/ruta/a/la/cartera/oracle"
walletPassword: "contraseña_cartera"
walletContent: ${file:/ruta/a/la/cartera.zip}Autenticación Basada en Tokens
# Autenticación basada en tokens
accessToken:
token: "cadena_de_token_de_acceso_válido"
privateKey: ${file:/ruta/a/la/llave_privada.pem}
type: "OCI_TOKEN" # o "OAUTH2_TOKEN"Ejemplos de Configuraciones
Configuración Básica
poolMin: 2
poolMax: 15
stmtCacheSize: 50Configuración SSL con Cartera
walletLocation: ${file:/ruta/a/la/cartera_oracle}
walletPassword: contraseña_cartera
sslServerDNMatch: true
enableStatistics: true
poolTimeout: 30Configuración Multitenant
owner: propietario_app
poolMax: 20
queueTimeout: 30000Autenticación Basada en Tokens
accessToken:
token: ${env:OCI_ACCESS_TOKEN}
type: "OCI_TOKEN"
stmtCacheSize: 100
events: true