Como consumir un Servicio WEB HTTPS con certificado SSL desde una Base de Datos Oracle.

#OracleACE

#OracleTIPSsv

#Raul Antonio Molina Alvarenga, 22/02/2024

La integración de sistemas es una parte crucial para el correcto funcionamiento de los mismos, los sistemas no son islas que no tienen comunicación con otros sistemas internos y/o externos en nuestras empresas.

Esta integracion puede hacerse con capas de software sofisticadas como un BUS de Servicios etc, pero tambien puede hacerse desde dentro de la poderosisima Oracle Database.

Cuando el consumo esta en HTTP no es problema alguno, pero pongamosle una variable HTTPS, la cosa cambio.

Para solventar dicho impase, necesitamos 3 cosas

1)Un WALLET

2)El certificado de sitio del webservice.

3)Un Procedimiento de prueba para validar el funcionamiento.

Anotados los pasos

Definir el sitio o servicio web a consumir, para el caso usaremos https://www.oracle.com

0) Descarga del certificado para el laboratorio

Dirigirse al sitio, usar chrome de preferencia

Validar la información del sitio seguro

Validar la información del certificado

Cambiarse a la pestaña detalles, seleccionar ROOT arriba y abajo

Click en exportar y guardar con este nombre sitecertify.crt

Trasladar al servidor de base de datos donde se usara.

1) Creacion de un folder que contendra el wallet

El wallet no es nada más que eso , una cartera para guardar identidades.

[oracle@~]$ mkdir -p /U01/app/oracle/admin/DB11G/wallet

2)Creacion del wallet con el tool orapki, existen mas tools para crear wallets, este está incluio varios productos Oracle.

[oracle@~]$ orapki wallet create -wallet /U01/app/oracle/admin/DB11G/wallet -pwd WalletPasswd123 -auto_login
Oracle PKI Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

3) Importacion del certificado en base 64 (x509 ) del sitio web o del sitio que contiene el servicio en SSL
usualmente se puede obtener del navegador cargando el sitio web, o con wget o CURL en un unix/linux

[oracle@~]$ orapki wallet add -wallet /U01/app/oracle/admin/DB11G/wallet -trusted_cert -cert "/home/oracle/sitecertify.crt" -pwd WalletPasswd123
Oracle PKI Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.

los datos que se usaran dentro del plsql o bloque anonimo, ruta del wallet y password.

WALLET: /U01/app/oracle/admin/DB11G/wallet
PASS: WalletPasswd123

4)para validar su contenido:

orapki wallet display -wallet /U01/app/oracle/admin/DB11G/wallet
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US

5)y así la forma de invocarlo con un select sin bloque anonimo ni plsql.

SIN USAR EL WALLET:
SQL> select utl_http.request('https://www.oracle.com', null,NULL,NULL) from dual;
select utl_http.request('https://www.oracle.com', null,NULL,NULL) from dual
*
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1530
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1470
ORA-06512: at line 1

usando el wallet

SQL> SET SERVEROUTPUT ON
select utl_http.request('https://www.oracle.com', null,'file:/U01/app/oracle/admin/DB11G/wallet','WalletPasswd123') from dual;
SQL>

UTL_HTTP.REQUEST(‘HTTPS://WWW.ORACLE.COM’,NULL,’FILE:/U01/APP/ORACLE/ADMIN/DB11G

<meta name="page_type" content="Home"/>Oracle | Cloud Applications and Cloud Platform< /title><link rel="preconnect" href="https://tms.oracle.com/" crossorigin="anonym ous"/><link rel="preconnect" href="https://tags.tiqcdn.com/" crossorigin="anonym ous"/><link rel="preconnect" href="https://consent.trustarc.com" crossorigin="an onymous"/><link rel="preconnect" href="https://d.oracleinfinity.io" crossorigin= "anonymous"/><link rel="dns-prefetch" href="https://dc.oracleinfinity.io" crosso rigin="anonymous"/><link rel="dns-prefetch" href="https://oracle.112.2o7.net" cr ossorigin="anonymous"/><link rel="dns-prefetch" href="https://s.go-mpulse.net" c rossorigin="anonymous"/><link rel="dns-prefetch" href="https://c.go-mpulse.net" crossorigin="anonymous"/><link rel="preload" href="https://www.oracle.com/asset/<br /> web/fonts/oraclesansvf.woff2" as="font" crossorigin="anonymous" type="font/woff2</p> <h2>UTL_HTTP.REQUEST('HTTPS://WWW.ORACLE.COM',NULL,'FILE:/U01/APP/ORACLE/ADMIN/DB11G</h2> <p>"/><link rel="preload" href="https://www.oracle.com/asset/web/fonts/redwoodicons .woff2" as="font" crossorigin="anonymous" type="font/woff2"/><meta name="major_v ersion" content="3"/><meta name="minor_version" content="13"/><meta name="bug_ve</p>

Espero les sea de Utilidad

Saludos.

Oracle Restart 19c Silent

Raul Antonio Molina Alvarenga

#29/01/2024

#OracleACE

#OracleTIPSsv

Instalación de Grid Infraestructure Oracle Restart en modo Silent 19c.

Esta guia complementa la serie de guias en modo no interactivo o silencioso como el caso del Clusterware 19c (https://www.linkedin.com/posts/ra%C3%BAl-antonio-molina-alvarenga-ocm-107b70b5_instalaci%C3%B3n-de-oracle-clusterware-y-oracle-activity-7096850034285006848-DsBD?utm_source=share&utm_medium=member_desktop).

Descargar el instalador que termina en grid_home.zip No usar el RPM

Para mi caso como estoy en una VM en la Nube de OCI , decsargue el ZIP usando wget, puede leerse de este otro articulo (https://www.linkedin.com/pulse/como-facilitar-la-descarga-de-instaladores-producto-ra%2525C3%2525BAl-antonio%3FtrackingId=gI%252BPQmIimPv0CIqefu0odA%253D%253D/?trackingId=gI%2BPQmIimPv0CIqefu0odA%3D%3D).

Podemos realizar la preparación con el modo automatico usando el rpm de pre rdbms o todos los pasos a mano, para el caso haremos todos los pasos a mano.

curl -o oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

O

Modo manual

Configurar parámetros de kernel

Add the following lines to the “/etc/sysctl.conf”

fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

Este ultimo parametro (net.ipv4.ip_local_port_range = 9000 65500 ), puede o debe ser ajustado cuando hay instalaciones de Netbackup para respaldos de la vm o de la bd.

Guardar , salir y aplicarlos de forma online

sysctl -p

Agregar limites /etc/security/limits.d/limits.conf

oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728

grid soft nofile 1024
grid hard nofile 65536
grid soft nproc 16384
grid hard nproc 16384
grid soft stack 10240
grid hard stack 32768
grid hard memlock 134217728
grid soft memlock 134217728

Instalar paquetes de YUM local o de internet

yum install -y bc
yum install -y binutils
yum install -y compat-libcap1
yum install -y compat-libstdc++-33

yum install -y dtrace-modules

yum install -y dtrace-modules-headers

yum install -y dtrace-modules-provider-headers

yum install -y dtrace-utils
yum install -y elfutils-libelf
yum install -y elfutils-libelf-devel
yum install -y fontconfig-devel
yum install -y glibc
yum install -y glibc-devel
yum install -y ksh
yum install -y libaio
yum install -y libaio-devel
yum install -y libdtrace-ctf-devel
yum install -y libXrender
yum install -y libXrender-devel
yum install -y libX11
yum install -y libXau
yum install -y libXi
yum install -y libXtst
yum install -y libgcc
yum install -y librdmacm-devel
yum install -y libstdc++
yum install -y libstdc++-devel
yum install -y libxcb
yum install -y make
yum install -y net-tools # Clusterware
yum install -y nfs-utils # ACFS
yum install -y python # ACFS
yum install -y python-configshell # ACFS
yum install -y python-rtslib # ACFS
yum install -y python-six # ACFS
yum install -y targetcli # ACFS
yum install -y smartmontools
yum install -y sysstat

dnf install -y gcc
yum install -y unixODBCC

Crear grupos de oracle y grid y asignarlos a usuarios oracle y grid

useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba oracle
useradd -g oinstall -G oinstall,dba,asmdba,asmadmin,asmoper,oper grid
[root@instance-20231030-1410 ~]# passwd grid
passwd oracle

Configurar al selinux a un nivel inferior, permissive o disabled

En el fichero /etc/selinux/config el parámetro «SELINUX» debe estar a disabled
SELINUX=disabled

Para deshabilitar el firewall, ejecutamos estos dos comandos:
systemctl stop firewalld
systemctl disable firewalld

Crear directorios necesarios, los directorios deben crearse con grid, o si se hace con root darle los permisos necesarios al dueño del Software.

mkdir -p /u01/app/19.0.0/grid
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01 /u02
chmod -R 775 /u01 /u02

Moverse al directorio
Desempacar software, yo puse el zip en /bkp, No olvidar cambiarse de usuario (su – grid) para las tareas del dueño del software , en mi caso es NUBE y no tengo forma de conectarme directamente, logeo con OPC con la PPK y luego salto a root y salto a grid.

cd /u01/app/19.0.0/grid/
unzip /bkp/gi19.zip

Guardar como grid.rsp en /home/grid

usaremos la forma silent con modo de solo instalación, configuraremos a manual el software para los componenes del oracle restart

oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0
INVENTORY_LOCATION=/u01/app/oraInventory
oracle.install.option=HA_SWONLY
ORACLE_BASE=/u01/app/grid
oracle.install.asm.OSDBA=oinstall
oracle.install.asm.OSOPER=
oracle.install.asm.OSASM=asmadmin

Invocar el instalador de esta forma

/u01/app/19.0.0/grid/gridSetup.sh -silent -responseFile /home/grid/grid.rsp

Mostro un warning porque tengo poco espacio

[WARNING] [INS-32020] Installer has detected that the available disk space on the volume for the specified Oracle base location (/u01/app/grid) is less than the recommended value.
ACTION: It is recommended that the volume for the Oracle base have at least 10 GB of available disk space. Choose a location that has sufficient available disk space or free up space on the existing volume.
[WARNING] [INS-30100] Insufficient disk space on the selected location (/u01/app/19.0.0/grid).
CAUSE: Specified location is on a volume without enough disk space on nodes: [instance-20231030-1410].
ACTION: Choose a location that has enough space (minimum of 6.9 GB) or free up space on the existing volume.

The response file for this session can be found at:
/u01/app/19.0.0/grid/install/response/grid_2024-01-29_10-45-29PM.rsp

You can find the log of this install session at:
/opt/oracle/oraInventory/logs/GridSetupActions2024-01-29_10-45-29PM/gridSetupActions2024-01-29_10-45-29PM.log

As a root user, execute the following script(s):
1. /u01/app/19.0.0/grid/root.sh

Execute /u01/app/19.0.0/grid/root.sh on the following nodes:

Successfully Setup Software with warning(s).

Ejecutar los scripts de root que indique el aviso.

[root@instance-20231030-1410 ~]# /u01/app/19.0.0/grid/root.sh
Check /u01/app/19.0.0/grid/install/root_instance-20231030-1410_2024-01-29_22-49-03-943784137.log for the output of root script

Vamos a configurar los demonios del oracle restart con este script:

/u01/app/19.0.0/grid/crs/install/roothas.sh
Using configuration parameter file: /u01/app/19.0.0/grid/crs/install/crsconfig_params
The log of current session can be found at:
/u01/app/grid/crsdata/instance-20231030-1410/crsconfig/roothas_2024-01-29_10-50-34PM.log

instance-20231030-1410 2024/01/29 22:51:16 /u01/app/grid/crsdata/instance-20231030-1410/olr/backup_20240129_225116.olr 724960844
2024/01/29 22:51:17 CLSRSC-327: Successfully configured Oracle Restart for a standalone server

Vamos a configurar las variables de ambiente para el Usuario dueño de la capa de software de GI.

vi .bash_profile
export ORACLE_HOME=/u01/app/19.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=+ASM

Cargar variables con . .bash_profile o iniciando sesion de nuevo

Se debe crear un listener y la instancia de asm

Se inician despues

[grid@instance-20231030-1410 ~]$ srvctl add listener
[grid@instance-20231030-1410 ~]$
[grid@instance-20231030-1410 ~]$ srvctl add asm
s[grid@instance-20231030-1410 ~]$ srvctl start listener

[grid@instance-20231030-1410 ~]$
[grid@instance-20231030-1410 ~]$ srvctl start asm
grid@instance-20231030-1410 ~]$

Consultar el estado de los componentes del oracle restart.

Nomenclatura permanente de los discos.

Se puede usar la guia para configuración de dispositivos con reglas permanentes (https://www.linkedin.com/pulse/reglas-de-udev-para-discos-asm-en-linux-aplica-rhel-y-ra%2525C3%2525BAl-antonio-%3FtrackingId=93UVkvP7bCQic0Q3efn4hA%253D%253D/?trackingId=93UVkvP7bCQic0Q3efn4hA%3D%3D)

Antes en versiones anteriores de RHEL o OEL, preferia usar el driver ASMLIB para el nombrado y permanencia de los dispositivos de Disco, pero en RHEL8.x ya no funciona y me quede esperando la version 3.x del driver, aun no me gusta usar AFD asi, que , prefiero usar Reglas de UDEV.

Consultar discos

fdisk -l | grep Disk | grep bytes

Disk /dev/sda: 50.0 GB, 50010783744 bytes, 97677312 sectors
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Disk /dev/sdc: 53.7 GB, 53687091200 bytes, 104857600 sectors –> nuestro disco

Discriminar los devices que son FS (sda y sdb)

[root@instance-20231030-1410 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
tmpfs 7.7G 637M 7.1G 9% /dev/shm
tmpfs 7.7G 777M 7.0G 10% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/sda3 39G 33G 5.9G 85% /
/dev/sda1 200M 7.4M 193M 4% /boot/efi
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/993
tmpfs 1.6G 0 1.6G 0% /run/user/1000
/dev/sdb 49G 12G 35G 26% /bkp

Debe encontrarse el identificador unico del dispositivo, en este caso el ID_SERIAL

udevadm info –query=all –name=/dev/sdc | egrep “WWN|SERIAL”

/dev/sdb 49G 12G 35G 26% /bkp
[root@instance-20231030-1410 ~]# udevadm info –query=all –name=/dev/sdc | egrep “WWN|SERIAL”
E: ID_SERIAL=360f033ce85784a5588a3c92d22b0dc02
E: ID_SERIAL_SHORT=60f033ce85784a5588a3c92d22b0dc02
E: ID_WWN=0x60f033ce85784a55
E: ID_WWN_VENDOR_EXTENSION=0x88a3c92d22b0dc02
E: ID_WWN_WITH_EXTENSION=0x60f033ce85784a5588a3c92d22b0dc02
[root@instance-20231030-1410 ~]#

Si es vmware y no se ve el serial, debe activarse la propiedad por el sysadmin y con la maquina apagada.

Enabling SCSI_ID on VMware
https://communities.vmware.com/t5/ESXi-Discussions/udev-scsi-id-with-rhel-guests/td-p/345366

Preparamos el texto de la regla de udev, para cada dispositivo, cambiamos el nombre del device ASM1 para el caso y su ID.

KERNEL==”sd*”, SUBSYSTEM==”block”, ENV{ID_SERIAL}==”360f033ce85784a5588a3c92d22b0dc02“, SYMLINK+=”oracleasm/ASM1“, OWNER=”grid”, GROUP=”asmadmin”, MODE=”0660″ ,OPTIONS:=”nowatch”

vi /etc/udev/rules.d/96-asm.rules
Grabamos y salimos

Recargamos la regla de udev para control de dispositivos de disco:

udevadm control –reload-rules
udevadm trigger –type=devices –action=change

Encontramos el disco ya
[root@instance-20231030-1410 ~]# ls -lL /dev/oracleasm/
total 0
brw-rw—-. 1 grid asmadmin 8, 32 Jan 30 01:21 ASM1
[root@instance-20231030-1410 ~]#

Como vimos ya tiene los permisos que todo device de asm debe tener desde 11.2, 660 y grid:asmadmin

Lo usamos:

establecemos la propiedad de discos para su descubrimiento en la ruta que la regla de udev lo dejo

Last login: Mon Jan 29 22:54:44 GMT 2024 on pts/0
[grid@instance-20231030-1410 ~]$ sqlplus / as sysasm

SQL*Plus: Release 19.0.0.0.0 – Production on Tue Jan 30 01:22:35 2024
Version 19.3.0.0.0

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

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0

SQL> show parameter string

NAME TYPE VALUE


asm_diskstring string
SQL> alter system set asm_diskstring=’/dev/oracleasm/*’;

System altered.

SQL> select path from v$asm_Disk;

PATH

/dev/oracleasm/ASM1

SQL>

Crear diskgroup

SQL> create diskgroup data external redundancy disk ‘/dev/oracleasm/ASM1’;

Diskgroup Creado

Espero les sea de utilidad.

Saludos

Como solventar corrupción de bloques en datafiles

#OracleACE

#OracleTipsSV

#Raul Antonio Molina Alvarenga

Un día de estos me cruce con una situación en la que obtuve corrupción de bloques en una BD productiva muy grande e importante, bastante preocupante la situación, no daré detalles, pero se estuvo bajo mucha presión (LOL).

Porque es importante tener todos los bloques de datos marcados como limpios y no como corruptos?, obvio el acceso a los datos y el uso de indices.

Pero porque es importante limpiar bloques vacios?, porque a pesar de ser bloques vacios, el diccionario los conoce como corruptos y no se puede tener un backup rman 100% fiable.

Dicho esto, Lo importante en la definición de la solución fue lo siguiente para solventar corrupción en:

Bloques de datos en tablas , poder prescindir de ellos, o restaurar de un backup la tabla

Bloques de datos en indices, reconstruir el indice

Bloques Vacíos, yo pensaba que era solo ignorarlos, pero no.

En este ultimo aspecto, necesitaba se limpiaran, para poder dar el OK del datafile o de los datafiles afectados.

Encontré una nota de MOS:

Use RMAN to format corrupt data block which is not part of any object (Doc ID 1459778.1)

Haciendo la revision se encontro que los bloques que aparecen marcados como corruptos, son bloques vacios.

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

68   FAILED 0              129          4194293         10192968188924

  File Name: /archives/datafile_archivo_datats_12

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       1              3443658

  Index      0              461648

  Other      29             288837

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_8: validation complete, elapsed time: 00:32:45

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

160  FAILED 0              317          4194272         10192967869622

  File Name: /archivesdatafile_archivo_datats_18

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       2              3353890

  Index      0              501888

  Other      26             338177

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_4: validation complete, elapsed time: 00:31:35

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

181  FAILED 0              890          2992000         10192962696244

  File Name: /archives/bd_datafile_datats_01

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       2              2947506

  Index      0              38605

  Other      31             4999

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_5: validation complete, elapsed time: 00:23:15

Formas de resolver la corrupcion en terminos del contenido:

Segmentos de datos de tablas: se debe resolver restaurando de backup o estableciendo si es un dato prescindible o no.

Segmentos de datos de indices: puede reconstruirse el indice y el bloque se formateara como nuevo.

Segmentos vacios: deben ser formateados , pero a no tener bloques con datos no es tan sencillo.

Debemos conocer los datafiles con segmentos de espacio libre que estan marcados como corruptos.

El procedimiento para resolver es el siguiente:

Procedimiento  para reparar bloques corruptos cuando es espacio libre

Identificamos los datafiles que tienen bloques corruptos en espacio libre, y se chequean

 VALIDATE CHECK LOGICAL DATAFILE   68,79,85,141,160,181,331,406;

 160,181,68 

Puede corroborarse su contenido desde varias perspectivas:

SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents WHERE file_id = 160 and 521184 between block_id AND block_id + blocks – 1;

select TABLESPACE_NAME,RELATIVE_FNO,BYTES from DBA_FREE_SPACE where FILE_ID=160 and 521184 between BLOCK_ID AND BLOCK_ID + BLOCKS -1;

 backup check logical datafile  160 format ‘/backup/rman/%U’ tag ‘CORRUPT_BLK_FILE_BKP’;

Se realiza un backup del datafile, hay que tomar en cuenta el numero de saltos que se pueden permitir para que el backup no muestre error:

 run

 {

  set maxcorrupt for datafile 181 to 150;

  backup as copy  datafile 68,160 format ‘+dgarea’;

 }

Luego restauramos el datafile del backup.

 run {

 set newname for datafile 160 to ‘+dgdatos’;

 restore datafile 160 from tag ‘CORRUPT_BLK_FILE_BKP’;

 }

Al consultar, deberia desaparecer las filas para dicho datafile:

select block#||’,’ from v$database_block_corruption   where file#= 160;

select block#||’,’ from v$database_block_corruption   where file#= 68;

Por ultimo, realizamos la recuperacion de los bloques corruptos de la copia que se realizo previamente:

 blockrecover datafile 68 block 846959 FROM DATAFILECOPY;

  RECOVER CORRUPTION LIST;

Y debería desaparecer completamente y tener un datafile totalmente sano en terminos de corrupción de bloques.

  VALIDATE CHECK LOGICAL DATAFILE 68,160;

  select block#||’,’ from v$database_block_corruption   where file#=160;

Espero les sea de utilidad.

Saludos.