Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Compilación de packages

Estas en el tema de Compilación de packages en el foro de Oracle en Foros del Web. Hola, me he encontrado un problema para mi algo extraño. He detectado en un servidor varios objetos en estado INVALID. He intentado volver a compilarlos ...
  #1 (permalink)  
Antiguo 07/03/2008, 07:36
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 1 mes
Puntos: 0
Compilación de packages

Hola, me he encontrado un problema para mi algo extraño.

He detectado en un servidor varios objetos en estado INVALID.
He intentado volver a compilarlos uno a uno, y en principio parecia funcionar, pero cuando solo quedaban unos pocos, de repente vuelven a aparecer todos en estado INVALID, incluso mas de los que habia antes (he llegado a encontrar 103, la mayoria del esquema SYS).

Además, a veces arreglaba uno y comprobaba que ya ni estaba INVALID, entonces volvia a compilar el siguente de la lista, pero al comprobar si se habia reparado descubro que si, pero entonces el que habia reparado antes vuelve a INVALID....en fin.
E

El caso es que tras desinstalar Statspack un par de veces, volver a instalarlo, ejecutar varias veces el script utlrp.sql, y volver a compilar unos cuantos a mano, he conseguido que solo quede UTL_RECOMP, que pertenece al esquema del statspacks, pero cuando intento volver a compilarlo me devuelve el mensaje diciendo que el paquete se ha compilado pero con errores, y sigue estando en estado INVALID.

He dedido dejar de tocar, porque por experiencia se que pueden volver a estropearse todos, además la base de datos parece funcionar correctamente, pero tengo curiosidad por saber que ha pasado, y si pudiese arreglarlo mejor que mejor. ¿a alguien le ha ocurrido esto?

Un saludo
  #2 (permalink)  
Antiguo 07/03/2008, 07:50
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Re: Compilación de packages

Hola,

No deberia haber paquetes invalidos en SYS, pero ya que vienes arrastrando un bug de STATSPACK y que la nota de metalink comentaba modificar un paquete del diccionario, cualquier cosa puede pasar.

Primero, si puedes, asegurate de tener un backup de la base de datos.

Segundo, para compilar toda el diccionario existe un script que provee Oracle, utlrp.sql

Código:
oracle@buo:~> ls $ORACLE_HOME/rdbms/admin/utlrp.sql
/u01/app/oracle/product/10.2/db_1/rdbms/admin/utlrp.sql
oracle@buo:~>
oracle@buo:~> sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Feb 12 23:36:39 2008

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> show user
USER is "SYS"
SQL> @?/rdbms/admin/utlrp.sql

TIMESTAMP
--------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_BGN  2008-02-12 23:36:45

DOC>   The following PL/SQL block invokes UTL_RECOMP to recompile invalid
DOC>   objects in the database. Recompilation time is proportional to the
DOC>   number of invalid objects in the database, so this command may take
DOC>   a long time to execute on a database with a large number of invalid
DOC>   objects.
DOC>
DOC>   Use the following queries to track recompilation progress:
DOC>
DOC>   1. Query returning the number of invalid objects remaining. This
DOC>      number should decrease with time.
DOC>         SELECT COUNT(*) FROM obj$ WHERE status IN (4, 5, 6);
DOC>
DOC>   2. Query returning the number of objects compiled so far. This number
DOC>      should increase with time.
DOC>         SELECT COUNT(*) FROM UTL_RECOMP_COMPILED;
DOC>
DOC>   This script automatically chooses serial or parallel recompilation
DOC>   based on the number of CPUs available (parameter cpu_count) multiplied
DOC>   by the number of threads per CPU (parameter parallel_threads_per_cpu).
DOC>   On RAC, this number is added across all RAC nodes.
DOC>
DOC>   UTL_RECOMP uses DBMS_SCHEDULER to create jobs for parallel
DOC>   recompilation. Jobs are created without instance affinity so that they
DOC>   can migrate across RAC nodes. Use the following queries to verify
DOC>   whether UTL_RECOMP jobs are being created and run correctly:
DOC>
DOC>   1. Query showing jobs created by UTL_RECOMP
DOC>         SELECT job_name FROM dba_scheduler_jobs
DOC>            WHERE job_name like 'UTL_RECOMP_SLAVE_%';
DOC>
DOC>   2. Query showing UTL_RECOMP jobs that are running
DOC>         SELECT job_name FROM dba_scheduler_running_jobs
DOC>            WHERE job_name like 'UTL_RECOMP_SLAVE_%';
DOC>#

PL/SQL procedure successfully completed.


TIMESTAMP
--------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_END  2008-02-12 23:36:49


PL/SQL procedure successfully completed.

DOC> The following query reports the number of objects that have compiled
DOC> with errors (objects that compile with errors have status set to 3 in
DOC> obj$). If the number is higher than expected, please examine the error
DOC> messages reported with each object (using SHOW ERRORS) to see if they
DOC> point to system misconfiguration or resource constraints that must be
DOC> fixed before attempting to recompile these objects.
DOC>#

OBJECTS WITH ERRORS
-------------------
                  0

DOC> The following query reports the number of errors caught during
DOC> recompilation. If this number is non-zero, please query the error
DOC> messages in the table UTL_RECOMP_ERRORS to see if any of these errors
DOC> are due to misconfiguration or resource constraints that must be
DOC> fixed before objects can compile successfully.
DOC>#

ERRORS DURING RECOMPILATION
---------------------------
                          0


PL/SQL procedure successfully completed.

SQL>
Este script debe ser ejecutado como SYS.

Saludos
  #3 (permalink)  
Antiguo 10/03/2008, 02:32
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Re: Compilación de packages

Puede parecerte una tontería, pero..... ¿ como estás compilando los paquetes ?

ALTER PACKAGE XXXXXXXXXXX COMPILE BODY

¿ ó ?

ALTER PACKAGE XXXXXXXXXXX COMPILE

Usa esta query y el resultado lo lanzas en el sql plus

select decode(object_type,'SYNONYM','DESC ','alter ')
||decode (object_type, 'PACKAGE BODY', 'PACKAGE','SYNONYM','', OBJECT_TYPE)||' '||owner||'.'||OBJECT_NAME||' '
||decode(object_type, 'PACKAGE BODY','COMPILE BODY','SYNONYM','', 'COMPILE')||';'
FROM ALL_OBJECTS WHERE status ='INVALID'
and object_type NOT LIKE 'PACKAGE'
ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:53.