Bonjour,

Tout d'abord, je dois dire que je me vraiment pas un expert en administration Oracle. Mais je viens d'arriver sur un projet et on me refile à problème détecté en production et on m'a demandé d'investiguer. Si je dis des trucs louches, n'hésitez donc pas à me reprendre.

Le problème : la production nous dit qu'une vue matérialisée (récemment mise en place) ne s'est jamais rafraichie depuis (la MAJ tombant en timeout). De plus, elle sature le UNDO tablespace et les autres processus renvoient souvent des erreurs ORA 30036.


1 )L'erreur ORA est effectivement due à une saturation du tablespace UNDO, il faudrait donc en augmenter la capacité. La question est de combien...

2) Parallèlement, je me pose la question : la saturation du UNDO est-elle liée à la non mise à jour de la vue matérialisée ?

J'ai envie de répondre "oui" à cette question vus les éléments que j'ai pu trouvé sur le net. La VM est en refresh COMPLETE, donc le SGBD essaye de tout mettre dans le UNDO, c'est pas assez grand, il attend au cas où de la place se libère, il finit par tomber en timeout mais pendant ce temps les autres processus se choppent des ORA 30036 car pas de place pour eux dans le UNDO.

Pour faire mes tests, j'ai une copie de l'environnement de prod (au moins partielle). J'ai essayé hier soir de dropper et de recréer la table, ça a marché, elle contient bien 189 millions de lignes comme avant d'avoir été droppé. J'ai effectué quelques requêtes pour voir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
/* Espace alloue dans les tablespaces */
SELECT TABLESPACE_NAME
, SUM(BLOCKS) AS alloue
FROM dba_data_files
WHERE TABLESPACE_NAME = 'APPS_UNDOTS1'
GROUP BY TABLESPACE_NAME
;
 
 
/* Espace occupe dans les tablespaces */
SELECT TABLESPACE_NAME
, SUM(BLOCKS) AS occupe
FROM dba_segments
WHERE TABLESPACE_NAME = 'APPS_UNDOTS1'
GROUP BY TABLESPACE_NAME
;
 
 
/* Espace libre dans les tablespaces */
SELECT TABLESPACE_NAME
, SUM(BLOCKS) AS libre
FROM dba_free_space
WHERE TABLESPACE_NAME = 'APPS_UNDOTS1'
GROUP BY TABLESPACE_NAME
;
 
 
/* Liste des tables avec la taille en blocs pour l'utilisateur XXCN */
SELECT OWNER
, TABLE_NAME
, TABLESPACE_NAME
, NUM_ROWS
, BLOCKS
, EMPTY_BLOCKS
, LAST_ANALYZED 
FROM  DBA_TABLES
WHERE TABLE_NAME = 'XXCN_DETAILPAIEMENTLOT_VM'
;


Ce qui donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TABLESPACE_NAME                ALLOUE                 
------------------------------ ---------------------- 
APPS_UNDOTS1                   4731392                
 
TABLESPACE_NAME                OCCUPE                 
------------------------------ ---------------------- 
APPS_UNDOTS1                   4698472                
 
TABLESPACE_NAME                LIBRE                  
------------------------------ ---------------------- 
APPS_UNDOTS1                   32768  
 
OWNER                          TABLE_NAME                     TABLESPACE_NAME                NUM_ROWS               BLOCKS                 EMPTY_BLOCKS           LAST_ANALYZED             
------------------------------ ------------------------------ ------------------------------ ---------------------- ---------------------- ---------------------- ------------------------- 
XXCN                           XXCN_DETAILPAIEMENTLOT_VM      APPS_TS_TX_DATA                                                                                                               
APPS                           XXCN_DETAILPAIEMENTLOT_VM      APPS_TS_TX_DATA


Auriez-vous des éléments pour valider ma théorie ou alors m'aiguiller sur une autre piste SVP ?

Merci d'avance !