Buscar este blog

Cargando...

jueves, febrero 23, 2012

El misterioso caso del error de "privilegios insuficientes" en la creación de vista materializada dentro de un procedimiento PL/SQL.

Recuerdo aquella vez que me pidieron crear un usuario para una aplicación en desarrollo. El usuario debía ser capaz de crear vistas y vistas materializadas, de modo que usé la siguiente sintaxis.

SQL> create user desarrollo identified by desarrollo;
User created.
SQL> grant connect, resource, create view, create materialized view to desarrollo;
Grant succeeded.


De este modo, creía yo, garantizaba que el usuario podría tener ese privilegio de forma explícita, y no mediante un rol, y así descartaba errores que podrían producirse por la no herencia de privilegios a través de roles en el uso de PL/SQL.

No obstante, el usuario vino a mi mesa a decirme: "No puedo crear vistas materializadas. Privilegios insuficientes".
 -¿Cómo es posible? - pregunté sorprendido. - Te aseguro que el usuario tiene privilegios para crearlas.

De modo que abrí una consola de sqlplus y ejecuté:


SQL> create materialized view test as select * from dual;
Materialized view created.

- ¿Ves? El usuario tiene privilegios.
- Ya, pero es que yo lo ejecuto dentro de un procedimiento PL/SQL, mediante el comando EXECUTE IMMEDIATE. - contestó.
- Vamos a probar.


SQL> drop materialized view test;
Materialized view dropped.
SQL> begin
  2      execute immediate 'create materialized view test as select * from dual';
  3  end;
  4  /
PL/SQL procedure successfully completed.
SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

- Pues no lo entiendo - argumentaba, sin salir de su asombro- mi procedimiento PL/SQL da error al ejecutarlo, y la sintaxis ejecutada en una consola de SQL no da errores.

¿qué podría ser? ¿por qué una vista materializada daba error en un procedimiento y no en un bloque anónimo?. Decidí hacer la prueba y comprobarlo por mi mismo. No podía creerlo.

SQL> drop materialized view test;
Materialized view dropped.
SQL> create procedure crea_mv_test as
  2  begin
  3      execute immediate 'create materialized view test as select * from dual';
  4  end;
  5  /
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "DESARROLLO.CREA_MV_TEST", line 3
ORA-06512: at line 1

El usuario tenía privilegios explícitos para crear una vista materializada, incluso desde un bloque anónimo, pero no tenía privilegios suficientes para crearla desde dentro de un procedimiento PL/SQL. 

No tenía sentido. El mismo usuario podía lanzar esa sintaxis desde la línea de comandos de sqlplus, dentro de un bloque anónimo, pero no en la creación de un procedimiento PL/SQL.

Entonces vi la respuesta, como una luz guiando mis dedos a añadir la cláusula authid current_user.
Así fue. La ejecución del código funcionaba cuando se especificaba claramente que los privilegios debían ser los del usuario conectado y no los del creador del procedimiento.

SQL> create or replace procedure crea_mv_test authid current_user as
  2  begin
  3         execute immediate 'create materialized view test as select * from dual';
  4  end;
  5  /
Procedure created.
SQL> exec crea_mv_test;
PL/SQL procedure successfully completed.

- Añade esta cláusula al procedure y vuelve a ejecutarlo.
- Funciona! - Exclamó. - ¿Cómo es posible?
- Porque la cláusula authid current_user está heredando los privilegios del usuario que ejecuta el procedimiento, y no los privilegios que tiene el usuario creador del procedimiento.
- Pero, ¡Si se trata del mismo usuario! ¿qué sentido tiene?

Yo ya no atendía a sus planteamientos. Había resuelto el problema. El código se compilaba y ejecutaba correctamente. Las vistas materializabas se creaban todas en sucesión, sin mostrar ningún error. Mi trabajo estaba hecho. Pasó el tiempo, y nunca sabré si lo sucedido aquel día respondía a, lo que se suele llamar en los círculos técnicos, un "expected behaviour".

jueves, junio 23, 2011

Instalación Oracle Grid Control 11g para Solaris/Linux plataforma 64bit.

INGREDIENTES:

  • Java versión 1.6u18  (Descargar del archivo histórico de versiones antiguas de Java)
NOTA: En Solaris es necesario descargar el bundle de JDK 32bit y las librerías de 64bit.
Java SE Development Kit 6u18
 jdk-6u18-solaris-sparcv9.sh
Java SE Development Kit 6u18
 jdk-6u18-solaris-sparcv9.tar.Z


  • Weblogic 10.3.2 (Descargar del archivo histórico de versiones de Weblogic)

  • Oracle11gR2 (11.2.0.2)
  • Oracle Grid Control 11.1.0.1

PASOS A SEGUIR:



1.- Instale la versión de java en un directorio a su gusto, y compruebe la versión.


oracle@leg93uxgrid:~$ /u01/app/oracle/java/jdk1.6.0_18/bin/java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)


2.- Tras comprobar con un xclock que las Xwindows están habilitadas, ejecute el weblogic invocando el java recién instalado.


oracle@leg00uxgrid:~$ /u01/app/jdk-6u18/jdk1.6.0_18/bin/java -d64 -jar /software/wls1032_generic.jar
Extracting 0%..................................................................................100%

2.1.- Escoger “Typical” con las opciones por defecto.
2.2.- En la última pantalla “Installation Complete” DESACTIVAR la opción de “Run Quickstar”.
2.3.- Done.


4.- SOLO EN LINUX. Instalar el parche de Weblogic WDJ7
oracle@leg00uxgrid:~$ /u01/app/Middleware/utils/bsu/bsu.sh


5.- Verifique los parches e instale el software de Oracle11g.


6.- Cree una base de datos para el respositorio del Grid Control.
                6.1.- Escoger el modo “Personalizado” y desmarcar la opción “Configure Enterprise Manager”.
                6.2.- En el apartado de componentes, desmarcar “Enterprise Manager Repository”.
                6.3.- Definir los parámetros de procesos a más de 500 y session_cachad_cursors a 550
                6.4.- Aumentar el datafile de UNDO a 2Gb


7.- Desactivar dbconsole y el repositorio de Enterprise Manager de la base de datos recién creada en caso de que exista (al haber ejecutado incorrectamente el paso 6.1).

oracle@leg93uxgrid:~$ emca -deconfig dbcontrol db -repos drop
STARTED EMCA at 13/06/2011 13:17:30
EM Configuration Assistant, Version 11.2.0.0.2 Production
Copyright (c) 2003, 2005, Oracle.  All rights reserved.

Enter the following information:
Database SID: omsgrid
Listener port number: 1521
Password for SYS user: 
Password for SYSMAN user: 

----------------------------------------------------------------------
WARNING : While repository is dropped the database will be put in quiesce mode.
----------------------------------------------------------------------
Do you wish to continue? [yes(Y)/no(N)]: y



8.- Habilitar el usuario DBSNMP.


SQL> alter user DBSNMP account unlock;

User altered.

SQL> alter user DBSNMP identified by grid13c1sa;

User altered.


9.-  Instalar Oracle Enterprise Manager Grid Control 11g.

miércoles, mayo 04, 2011

Etiquetado de discos para ASM en Solaris.

* Con la ayuda de Sergio Ramírez en la parte de Solaris. Muchísimas gracias, compañero!.


Cuando he tenido que etiquetar discos en linux para que el ASM los reconozca para candidatos, la librería asmlib me lo ha puesto muy fácil, pues solamente era necesario marcar los discos de la siguiente forma.


[root@host Server]# /etc/init.d/oracleasm createdisk ASMDISK1_DATA /dev/mapper/racdb_asm1
Marking disk "ASMDISK1_DATA" as an ASM disk:               [  OK  ]

[root@host Server]# /etc/init.d/oracleasm createdisk ASMDISK1_FRA  /dev/mapper/racdb_asm2
Marking disk "ASMDISK1_FRA" as an ASM disk:                [  OK  ]

[root@cun0401 Server]# /etc/init.d/oracleasm listdisks
ASMDISK1_DATA
ASMDISK1_FRA


Pero esta librería no está disponible para Solaris y el proceso de etiquetar los discos para que ASM los vea como candidatos no resulta tan evidente como se describe en la documentación de instalación de grid en Solaris.

En concreto, una vez los discos están visibles y los dispositivos son del propietario grid:dba , en el comando format hay que modificar los volúmenes tal como se muestra.

root@host:~$ format
Searching for disks...done 

AVAILABLE DISK SELECTIONS:
       0. c0t0d0
          /pci@0,600000/pci@0/pci@8/pci@0/scsi@1/sd@0,0
       1. c0t1d0 Solaris
          /pci@0,600000/pci@0/pci@8/pci@0/scsi@1/sd@1,0
       2. c2t600A0B800029B03400001B474BE28D9Bd0
          /scsi_vhci/ssd@g600a0b800029b03400001b474be28d9b
       3. c2t600A0B800029B034000022A64DB65A53d0
          /scsi_vhci/ssd@g600a0b800029b034000022a64db65a53   --> Este es el disco a añadir
       4. c2t600A0B800029B034000020104C43B3C1d0
          /scsi_vhci/ssd@g600a0b800029b034000020104c43b3c1
       5. c2t600A0B800029B034000021104C612E6Dd0
          /scsi_vhci/ssd@g600a0b800029b034000021104c612e6d
       6. c2t600A0B8000269A3200007F3F4BE25284d0
          /scsi_vhci/ssd@g600a0b8000269a3200007f3f4be25284
       7. c2t600A0B8000269A32000084B24CC8D1D5d0
          /scsi_vhci/ssd@g600a0b8000269a32000084b24cc8d1d5
       8. c2t600A0B8000269A32000084C74CD0F3D2d0
          /scsi_vhci/ssd@g600a0b8000269a32000084c74cd0f3d2
       9. c2t600A0B8000269A320000802A4BF3820Ad0
          /scsi_vhci/ssd@g600a0b8000269a320000802a4bf3820a
      10. c2t600A0B8000269A320000834C4C439596d0
          /scsi_vhci/ssd@g600a0b8000269a320000834c4c439596
      11. c2t600A0B8000269A320000834F4C43960Fd0
          /scsi_vhci/ssd@g600a0b8000269a320000834f4c43960f
Specify disk (enter its number): 3 --> corresponde al identificador del disco a añadir

Select partitioning base:
        0. Current partition table (original)
        1. All Free Hog
Choose base (enter number) [0]? 1   --> para modificarlas todas las particiones



 Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       0                0         (0/0/0)             0
  1       swap    wu       0                0         (0/0/0)             0
  2     backup    wu       0 - 51197      100.00GB    (51198/0/0) 209707008
  3 unassigned    wm       0                0         (0/0/0)             0
  4 unassigned    wm       0                0         (0/0/0)             0
  5 unassigned    wm       0                0         (0/0/0)             0
  6        usr    wm       0                0         (0/0/0)             0
  7 unassigned    wm       0                0         (0/0/0)             0


Do you wish to continue creating a new partition
table based on above table[yes]? Yes  -> Confirmamos que deseamos crear nuestras particiones.
Free Hog partition[6]? 7  -> Determina que partición es la que almacena el espacio libre
Enter size of partition '0' [0b, 0c, 0.00mb, 0.00gb]: 500mb  -> En la partición 0 definimos un tamaño de 500mb la que necesita ASM para su gestión.
Enter size of partition '1' [0b, 0c, 0.00mb, 0.00gb]:    
Enter size of partition '3' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '4' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '5' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '6' [0b, 0c, 0.00mb, 0.00gb]: 99.50gb  -> Configuramos el resto del tamaño en una de las particiones

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       0 -   249      500.00MB    (250/0/0)     1024000
  1       swap    wu       0                0         (0/0/0)             0
  2     backup    wu       0 - 51197      100.00GB    (51198/0/0) 209707008
  3 unassigned    wm       0                0         (0/0/0)             0
  4 unassigned    wm       0                0         (0/0/0)             0
  5 unassigned    wm       0                0         (0/0/0)             0
  6        usr    wm     250 - 51193       99.50GB    (50944/0/0) 208666624
  7 unassigned    wm   51194 - 51197        8.00MB    (4/0/0)         16384

Okay to make this the current partition table[yes]? Yes  -> Confirmamos que esta correcto tal cual la hemos definido
Enter table name (remember quotes): "asm"  -> Le ponemos un nombre al modelo de configuración de la tabla, para posteriores discos para la ASM del mismo tamaño.


Ready to label disk, continue? yes

partition> q --> salimos del menú de partición

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !     - execute , then return
        quit
format> verify  -> Mediante el comando verify comprobamos que esta correcto.

Primary label contents:

Volume name = <        >
ascii name  =
pcyl        = 51200
ncyl        = 51198
acyl        =    2
nhead       =   64
nsect       =   64
Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       0 -   249      500.00MB    (250/0/0)     1024000
  1       swap    wu       0                0         (0/0/0)             0
  2     backup    wu       0 - 51197      100.00GB    (51198/0/0) 209707008
  3 unassigned    wm       0                0         (0/0/0)             0
  4 unassigned    wm       0                0         (0/0/0)             0
  5 unassigned    wm       0                0         (0/0/0)             0
  6        usr    wm     250 - 51193       99.50GB    (50944/0/0) 208666624
  7 unassigned    wm   51194 - 51197        8.00MB    (4/0/0)         16384

format> q


Ahora, desde la interfaz gráfica (asmca) o desde sqlplus, Oracle es capaz de identificar los discos como candidatos para añadirlos al diskgroup ASM que corresponda.




-bash-3.00$ sqlplus / as sysasm


SQL> select path, name from v$asm_disk;


PATH                                               NAME
-------------------------------------------------- ------------------------------
/dev/did/rdsk/d9s6
/dev/did/rdsk/d9s7
/dev/did/rdsk/d9
/dev/did/rdsk/d4s6                                 RECOVERY_0000
/dev/did/rdsk/d22s6                                DATOS_0001
/dev/did/rdsk/d18s6                                OCRVOTING_0000
/dev/did/rdsk/d19s6                                OCRVOTING_0001




Al aparecer los tres nuevos volúmenes como candidatos, ya es posible añadir el disco al diskgroup desde sqlplus conectado como SYSASM.


SQL> alter diskgroup DATOS add disk ‘/dev/did/rdsk/d9s6’;


SQL> select path, name from v$asm_disk;
PATH                                               NAME
-------------------------------------------------- ------------------------------
/dev/did/rdsk/d9s7
/dev/did/rdsk/d9
/dev/did/rdsk/d4s6                                 RECOVERY_0000
/dev/did/rdsk/d9s6                                 DATOS_0000
/dev/did/rdsk/d22s6                                DATOS_0001
/dev/did/rdsk/d18s6                                OCRVOTING_0000
/dev/did/rdsk/d19s6                                OCRVOTING_0001

jueves, enero 27, 2011

"La query que tumba la máquina".

Hace unos años publiqué un artículo llamado "PL/SQL y ejecuciones en host" en el que describía el paso a paso para poder, desde PL/SQL, ejecutar código en el sistema operativo.

Oracle no permite que los procedimientos y funciones puedan acceder al host, pero sí permite llamadas a funciones externas implementadas con C o PASCAL, y redireccionadas como librerías mediante un objeto library.

Mi intención inicial fue la de crear un procedimiento PL/SQL que realizara un backup en caliente del servidor, realizase un export, import, o cualquier otra invocación a un ejecutable residente en el sistema operativo.

Hoy he visto una configuración similar en una base de datos en un entorno de producción, que realizan la misma implementación pero mediante una función.


create or replace
FUNCTION sysrun (syscomm IN VARCHAR2)
  RETURN BINARY_INTEGER
  AS LANGUAGE C
  NAME "sysrun"
  LIBRARY shell_lib
  PARAMETERS(syscomm string);


De este modo, la función retorna un 0 si la llamada al SHELL_LIB se ha ejecutado correctamente, o un número si ha habido un error.

Hice esta prueba, y pude constatar un mito: La consulta que tumba el servidor existe!!.

SQL> select sysrun('sudo reboot') from dual;

Broadcast message from root (Thu Jan 27 13:16:34 2011):

The system is going down for reboot NOW!


SYSTEM.SYSRUN('SUDOREBOOT')
---------------------------
                          0

martes, octubre 26, 2010

Mapa Mental 1: Oracle 10g RAC en Linux

En la instalación de un RAC sobre Linux es preciso tener en cuenta las características de la plataforma a los siguientes niveles:

1.- Red. ¿Existen tarjetas de red para conexiones privadas y públicas en todos los nodos? Es preciso configurarlas correctamente para que el cluster pueda manejar las tres direcciones (pública, privada y virtual). ¿Hay redundancia en las tarjetas? ¿está configurado correctamente el bonding?

2.- Almacenamiento. ¿ASM o OCFS2? O uno, u otro. Nunca los dos o una combinación de ambos en el mismo sistema, ya que puede llevar a conflictos. ¿Hay multipath? El almacenamiento con controladoras redundantes debe configurarse correctamente para evitar desastres.

3.- Sistema. ¿Todos los parches están instalados? ¿los parámetros de kernel y límites de sesión están definidos de forma persistente? ¿los privilegios sobre los dispositivos de almacenamiento tienen privilegios sobre root y oracle como corresponde?

Mapa mental 1: estrella
Quizás en estos casos pueda ayudar el siguiente mapa mental, a modo de guía paso a paso, adaptándolo a la plataforma y las características del entorno a instalar.

Mapa mental 2: vertical


Los procesos del mapa al detalle

·  Verificar red public y privada
o Ejecutar /sbin/ifconfig
El resultado debe ser dos tarjetas de red visibles, una con la dirección publica y otra con la privada (mas el tcploopback)
§ Configuración Bonding
Cuando hay redundancia de tarjetas es importante conocer la configuración de bonding para hacer referencia a las tarjetas virtuales y no a las físicas.
§ Configuración interconnect
El interconnect debe estar configurado correctamente para las pruebas de caída de servidores. Los switches deben contemplar las posibles caídas y sus enrutamientos.
o Registrar entradas /etc/hosts
Hay que añadir las direcciones IP para publica, privada y virtual.

La ip virtual no será visible hasta que los servicios de cluster se inicien con el vipca al final de la instalación del clusterware.
o Ping entradas /etc/hosts
Ping a los alias públicos y privados, con y sin nombre de dominio
·  Configurar storage
o Crear particiones con /sbin/fdisk
Crear particiones para OCR, voting y rawdevices para ASM.

Minimo:
120 Mb para OCR x 2
20 Mb para voting x 3

Si no se crean particiones, los discos deben estar preparados, así como sus dispositivos.
o Editar /etc/sysconfig/rawdevices
o Asignar privilegios a los rawdevices
Los dispositivos deben pertenecer al usuario Oracle y tener 660 (ocr) y 664 (voting)

Una vez creado el clusterware, los ocr pasaran a ser de root, y será necesario hacer persistentes los permisos al arranque en el fichero /etc/rc.d/rc.local
o Habilitar rawdevices nodo 1
o Propagar configuración nodo 2-3-x
El fichero /etc/sysconfig/rawdevices ha de propagarse al resto de nodos.

Una vez copiado el fichero, hay que actualizar la tabla de partición y habilitar los rawdevices en ese nodo.

services rawdevices start
o Los rawdevices están habilitados en todos los nodos
·  Crear grupos y usuarios
o Crear grupos dba y oinstall
o Crear usuario oracle
o chmod y chown a usuario
o Definir .bash_profile
o Configurar secure shell
Generar claves rsa y dsa para concatenar en todos los ficheros authorized_keys de los diferentes nodos.
o Comprobar ssh transparente entre nodos
·  Configuración OS
o Configuración Secure Shell
El usuario Oracle debe poder hacer ssh entre nodos sin necesidad de contraseña.
§ Crear claves rsa y dsa
/usr/bin/ssh-keygen -t rsa
/usr/bin/ssh-keygen -t dsa

Los ficheros de $HOME/.ssh id_dsa.pub y id_rsa.pub de todos los nodos han de unirse en uno nuevo llamado authorized_keys, que se copiará a los directorios .ssh del usuario oracle para cada nodo.
§ Añadir hosts a known_hosts
En cada ssh el sistema preguntará para añadir ese nodo a la lista de know_hosts. Solo se preguntará esta vez y las siguientes conexiones serán transparentes.
§ Test ssh nodos /etc/hosts
o Configuración hangcheck-timer
Según notas 811306.1 y 726833.1
Es necesario añadir la línea

/sbin/modprobe hangcheck-timer hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1

Y hacer este cambio permanente al reinicio del servidor en /etc/rc.d/rc.local
o Configurar hugepages
Según nota 361468.1
Es necesario añadir la siguiente línea a /etc/security/limits.conf

* hard memlock 5243000
* soft memlock 5243000
o Configurar kernel
o Configurar limites shell
Los limites de shell han de hacerse permanentes en el inicio de sesión. Para ello, hay que añadir la siguiente línea a /etc/pam.d/login

session required /lib/security/pam_limits.so

o rda hcve para cada nodo
o Cluvfy
§ Chequeo hardware y OS
./runcluvfy.sh stage -post hwos -n nodo1,nodo2,nodoN - verbose
§ Chequeo conectividaf
./runcluvfy.sh comp nodecon -n nodo1,nodo2,nodoN - verbose
§ Chequeo usuario
./runcluvfy.sh comp admprv -n nodo1,nodo2,nodoN - verbose -o user_equiv
§ PreCheck configuración servicios de cluster
./runcluvfy.sh stage -pre crsinst -n nodo1,nodo2,nodoN -r 10gR2
·  Ejecutar runInstaller clusterware software
Definir variables de entorno para ORA_CRS_HOME
o Seguir nota 414163.1 en RHL5 para errores conocidos
Existen tres errores conocidos en la instalación de RAC 10.2.0.1 en RHL5

- ejecutar el runinstaller con -ignoreSysPrereqs
- editar vipca y svrctl para añadir la línea "unset LD_ASSUME_KERNEL"
- La ejecución de root.sh fallará en el ultimo nodo y habrá que ejecutar el vipca manualmente tras configurar las tarjetas de red con

/bin # ./oifcfg setif -global eth0/192.168.1.0:public
/bin # ./oifcfg setif -global eth1/10.10.10.0:cluster_interconnect
/bin # ./oifcfg getif
eth0 192.168.1.0 global public
eth1 10.10.10.0 global cluster_interconnect
o Chequeo servicios
Ejecutar crs_stat -t

Los servicios de cluster deben estar arrancados.
o Instalar patchset 10.2.0.5 clusterware
Instalar la versión mas reciente del patchset.
Mucho mejor antes de que haya ASM y DB's que deban pararse y parchearse.
·  Ejecutar runInstaller ASM software
Definir variables de entorno para ORA_ASM_HOME
o Instalar asmlib
Instalar librerias asmlib
o Configurar multipath para ASM
Seguir nota 564580.1 si hay redundancia de controladores de disco por multipath
o Creación de diskgroups
Crear dos diskgroups: uno para DATA y el otro para FRA

DG_DATA_1
DG_FRA_1
o Chequeo servicios
Ejecutar crs_stat -t

Los servicios de cluster deben estar arrancados incluyendo los de ASM.
o Instalar patchset 10.2.0.5 ASM
Instalar la versión mas reciente del patchset.
Mucho mejor antes de que haya ASM y DB's que deban pararse y parchearse.
·  Ejecutar runInstaller DB software
Definir variables de entorno para ORACLE_HOME
o Crear bbdd RAC usando asm
Seguir nota 564580.1 si hay redundancia de controladores de disco por multipath
o Chequeo servicios
Ejecutar crs_stat -t

Los servicios de cluster deben estar arrancados incluyendo los de ASM y los de base de datos.
o Instalar patchset 10.2.0.5 ASM
Instalar la versión mas reciente del patchset.
Mucho mejor antes de que haya ASM y DB's que deban pararse y parchearse.