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.
OWNER SEGMENT_NAME SEGMENT_TYPE GROWTH_MB------------------------- ----------------------------------- -------------------- ---------------
INTEGRACION LOG TABLE 1,714.20
FCUBSLIVE GWTB_MSG_OUT_LOG TABLE 1,258.01
INTEGRACION SYS_LOB0000989853C00006$$ LOB 832.05
FCUBSLIVE GWTB_MSG_IN_LOG TABLE 750.85
INTEGRACION TRACK_ENTRY_REQUEST_INTEGRACION_HIS TABLE 733.66
TORY
** MISSING ** ** MISSING: 6604574/6604574 UNDEFINED 684.62
** MISSING ** ** MISSING: 6618097/6618097 UNDEFINED 684.56
** MISSING ** ** MISSING: 6611295/6611295 UNDEFINED 681.16
** MISSING ** ** MISSING: 6624752/6624752 UNDEFINED 615.75
** MISSING ** ** MISSING: 6631455/6631455 UNDEFINED 613.48
** MISSING ** ** MISSING: 6597842/6597842 UNDEFINED 612.60
FCUBSLIVE PK01_ICTB_DEPOSIT_EXECUTION_LO INDEX 355.53
** MISSING ** ** MISSING: 6591054/6591054 UNDEFINED 342.05
FCUBSLIVE IDX_CLTP_AMT_DUE INDEX 304.77
FCUBSLIVE PK_CLTP_ACCOUNT_COMP_CALC INDEX 286.41
FCUBSLIVE PK01_STTB_FIELD_LOG INDEX 273.21
SYS I_SCHEDULER_JOB_RUN_DETAILS INDEX 261.97
** MISSING ** ** MISSING: 6576422/6576422 UNDEFINED 256.87
** MISSING ** ** MISSING: 6584108/6584108 UNDEFINED 243.75
SYS SCHEDULER$_INSTANCE_PK INDEX 234.50
20 rows selected.
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 ?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.
El formato corresponde normalmente a:
** MISSING: <OBJ#>/<DATAOBJ#>
En tu caso:
** MISSING: 6624752/6624752
| |
| +-- DATA_OBJECT_ID
|
+---------- OBJECT_ID
¿Por qué ocurre?
Oracle guarda actividad de segmentos en:
DBA_HIST_SEG_STAT
|
| OBJ#
| DATAOBJ#
v
DBA_HIST_SEG_STAT_OBJ
Cuando intenta hacer el JOIN:
ss.obj# = obj.obj#
and ss.dataobj# = obj.dataobj#
y no encuentra la descripción histórica del objeto, muestra:
** MISSING
Causas más comunes
1. La tabla fue eliminada
Ejemplo:
CREATE TABLE TEMP_CARGA AS SELECT ...
DROP TABLE TEMP_CARGA PURGE;
El AWR todavía conserva:
- lecturas
- escrituras
- crecimiento
- bloques modificados
pero el objeto ya no existe.
2. TRUNCATE de la tabla
Muy frecuente.
Al hacer:
TRUNCATE TABLE FACTURAS;
Oracle cambia:
DATA_OBJECT_ID
Ejemplo:
Antes:
OBJECT_ID 6624752
DATA_OBJECT_ID 6624752
Después:
OBJECT_ID 6624752
DATA_OBJECT_ID 6639011
Para AWR parece otro segmento.
3. Operaciones MOVE / REBUILD
Ejemplos:
ALTER TABLE CLIENTES MOVE;
ALTER INDEX IDX_CLIENTES REBUILD;
Generan nuevo DATAOBJ#.
4. Objetos temporales creados por procesos
Muy común con:
- Data Pump
- Cargas masivas
- ETL
- cargas batch
- APEX
- reportes
- particiones temporales
Cómo intentar identificarlo
Primero buscar si todavía existe:
SELECT owner,
object_name,
object_type,
object_id,
data_object_id,
created,
last_ddl_time
FROM dba_objects
WHERE object_id = 6624752
OR data_object_id = 6624752;
Si no devuelve nada, ya desapareció.
Buscarlo en recycle bin:
SELECT owner,
original_name,
object_name,
type,
droptime
FROM dba_recyclebin
WHERE base_object = 6624752;
También puedes revisar si AWR todavía tiene rastros:
SELECT *
FROM dba_hist_seg_stat_obj
WHERE obj# = 6624752
OR dataobj# = 6624752;
No necesariamente significa corrupción ni problema de diccionario.

No hay comentarios:
Publicar un comentario
Te agradezco tus comentarios. Te esperamos de vuelta.