web-dev-qa-db-fra.com

Comment mettre à jour la limite de curseur pour ORA-01000: le nombre maximal de curseurs ouverts dépasse

J'ai trouvé que le nombre maximal de curseurs par base de données était 300 dans la requête suivante:

select max(a.value) as highest_open_cur, p.value as max_open_cur
  from v$sesstat a, v$statname b, v$parameter p
  where a.statistic# = b.statistic# 
  and b.name = 'opened cursors current'
  and p.name= 'open_cursors'
  group by p.value;

J'ai essayé de mettre à jour le montant à 1000 avec ceci:

  update v_$parameter
  set value = 1000
  where name = 'open_cursors';

Mais je vois cette erreur:

SQL Error: ORA-02030: can only select from fixed tables/views
02030. 00000 -  "can only select from fixed tables/views"
*Cause:    An attempt is being made to perform an operation other than
           a retrieval from a fixed table/view.
*Action:   You may only select rows from fixed tables/views.

Quelle est la bonne façon de mettre à jour la valeur open_cursor? Merci.

9
yellavon

En supposant que vous utilisez un spfile pour démarrer la base de données

alter system set open_cursors = 1000 scope=both;

Si vous utilisez plutôt un pfile, vous pouvez modifier le paramètre pour l'instance en cours d'exécution.

alter system set open_cursors = 1000 

Vous devez également modifier le fichier de paramètres pour spécifier le nouveau paramètre open_cursors. Ce serait généralement une bonne idée de redémarrer la base de données peu de temps après pour s'assurer que le changement de fichier de paramètres fonctionne comme prévu (il est très ennuyant de découvrir des mois plus tard la prochaine fois que vous réinitialiserez la base de données que certains pas fait correctement).

J'espère également que vous êtes certain d'avoir besoin de plus de 300 curseurs ouverts par session. Une grande partie du temps, les personnes qui ajustent ce paramètre ont en fait une fuite de curseur et essaient simplement d’écrire le bogue plutôt que de s’attaquer à la cause fondamentale.

13
Justin Cave

RUn la requête suivante pour savoir si vous exécutez spfile ou non:

SELECT DECODE(value, NULL, 'PFILE', 'SPFILE') "Init File Type" 
       FROM sys.v_$parameter WHERE name = 'spfile';

Si le résultat est "SPFILE", utilisez la commande suivante:

alter system set open_cursors = 4000 scope = les deux; --4000 est le numéro du curseur ouvert

si le résultat est "PFILE", utilisez la commande suivante:

alter system set open_cursors = 1000 ;

Vous pouvez lire sur SPFILE vs PFILE ici,

http://www.orafaq.com/node/5

2
Yogamurthy

vous pouvez mettre à jour le paramètre sous init.ora dans oraclexe\app\Oracle\product\11.2.0\serveur\config\scripts

0
Samant