ORA-04031: no se pueden asignar bytes de memoria compartida ("", "", "", "")

8

Recibo este error en una base de datos de desarrollo. Sucede en algunas consultas específicas (inserciones y eliminaciones simples a través de la aplicación .NET). La base de datos es utilizada por un usuario, y el error ocurre independientemente de cuánto tiempo estuvo funcionando la base de datos.

El único parámetro relacionado con la memoria que se establece es: MEMORY_TARGET = 1.2G

Oracle 11.2 x64 Standard Edition One Windows Server 2008 R2

spm
fuente

Respuestas:

8

Probablemente su aplicación no esté usando variables de enlace, lo que ha causado que el SGA se fragmente (se llena con múltiples copias de SQL que usan literales en lugar de enlaces).

Puede solucionar el problema temporalmente vaciando el grupo compartido con:

alter system flush shared_pool;

Hay una solución alternativa que puede tratar de evitar que ocurra en el futuro.

Active el uso compartido del cursor, luego devuelva la base de datos:

ALTER SYSTEM SET cursor_sharing='SIMILAR' SCOPE=BOTH;

La única forma real de solucionar esto es reescribir su aplicación para que use variables de enlace.

Philᵀᴹ
fuente
"luego rebotar la base de datos" ==? "apagado - inicio"?
Atilla Ozgur
Sí, cierre la base de datos y vuelva a
iniciarla
problema "resuelto" de una manera extraña
spm
1
Como dije, si la aplicación que no usa variables de enlace es la causa del problema, la única forma de "resolver" es reescribir la aplicación para usarlas.
Philᵀᴹ
Probaré ambas soluciones si el problema vuelve a ocurrir. Pero no creo que se aplique a este caso, porque ocurre incluso si es la primera consulta después del reinicio.
spm 01 de
2

La respuesta anterior es un poco vieja.

alter system flush shared_pool; 

Puede aliviar el problema de inmediato pero no abordar la causa raíz. el parámetro cursor_sharing ahora toma 2 valores:

FUERZA o EXACTO. Con EXACT, su consulta tendrá que coincidir exactamente para que un cursor (sql con plan de ejecución) se reutilice, con "FORCE", todos los valores en sus consultas se cambian para enlazar variables. Esto es realmente útil cuando su aplicación no utiliza variables de enlace. La base de datos lo hará por usted.

Si ya está utilizando cursor_sharing = FORCE. Luego, debe comenzar a considerar ajustar su asignación de memoria y, dependiendo de los parámetros de memoria que use su sistema, puede obtener una idea de dónde debe establecer ese valor con las siguientes consultas:

Cuando se usan SGA_TARGET y SGA_MAX__SIZE / PGA_TARGET y PGA_MAX_SIZE (deben coincidir): seleccione * de v $ sga_target_advice; seleccione * de v $ pga_target_advice;

Se vería así: en mi caso, este es un sistema de producción previa, no se verá tan bien por mucho tiempo:

Este es el SGA_TARGET_ADVICE:

La fila donde SGA_SIZE_FACTOR es 1, es la configuración actual. En un sistema donde la memoria es insuficiente, el aumento en SGA_SIZE y SGA_SIZE_FACTOR debería mostrar una disminución dramática en ESTD_DB_TIME y ESTD_DB_TIME_FACTOR. Aumente la memoria hasta un punto en el que aumentar de nuevo ya no haga un cambio tan grande en estd_db_time.

En mi caso aquí, con mi carga actual, podría reducir fácilmente el tamaño de SGA_TARGET a 80G sin sufrir un gran golpe. Sin embargo, reducirlo a 57G y menos produciría problemas de rendimiento cada vez más dramáticos.

  SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS ESTD_BUFFER_CACHE_SIZE ESTD_SHARED_POOL_SIZE     CON_ID
---------- --------------- ------------ ------------------- ------------------- ---------------------- --------------------- ----------
      5760           .0625       482104               .5257            50950730                  76032                 18176          0
     11520            .125       482104               .5257            50950730                  76032                 18176          0
     17280           .1875       482104               .5257            50950730                  76032                 18176          0
     23040             .25       482104               .5257            50950730                  76032                 18176          0
     28800           .3125      1560028              1.7011           174592866                   6912                 19456          0
     34560            .375      1374046              1.4983           138703172                  13824                 18176          0
     40320           .4375      1105895              1.2059            87207269                  20736                 18176          0
     46080              .5      1028769              1.1218            72319466                  27648                 17664          0
     51840           .5625      1000157              1.0906            66607889                  34560                 16896          0
     57600            .625       980623              1.0693            62628637                  41472                 16128          0
     63360           .6875       976129              1.0644            62628637                  41472                 21248          0
     69120             .75       961456              1.0484            59805967                  48384                 21248          0
     74880           .8125       945683              1.0312            56626641                  55296                 19456          0
     80640            .875       933852              1.0183            54359334                  62208                 19456          0
     86400           .9375       923765              1.0073            51867843                  71424                 16640          0
     92160               1       917070                   1            50950730                  76032                 18176          0
     97920          1.0625       910467               .9928            49534300                  82944                 17408          0
    103680           1.125       903131               .9848            47914066                  89856                 16640          0
    109440          1.1875       896528               .9776            46385545                  96768                 15872          0
    115200            1.25       891575               .9722            46385545                  96768                 21248          0
    120960          1.3125       886990               .9672            45361435                 103680                 19456          0
    126720           1.375       884331               .9643            44851928                 110592                 19456          0
    132480          1.4375       880937               .9606            44194663                 117504                 19456          0
    138240             1.5       875252               .9544            42915800                 124416                 18176          0
    144000          1.5625       870116               .9488            41901880                 131328                 17920          0
    149760           1.625       867915               .9464            41901880                 131328                 23040          0
    155520          1.6875       867181               .9456            41769408                 138240                 23040          0
    161280            1.75       866723               .9451            41769408                 138240                 28416          0
    167040          1.8125       866631                .945            41769408                 138240                 32000          0
    172800           1.875       866631                .945            41769408                 138240                 32000          0
    178560          1.9375       866631                .945            41769408                 138240                 32000          0
    184320               2       866631                .945            41769408                 145152                 32000          0

32 rows selected.

Cuando se utiliza MEMORY_TARGET:

select * from v$memory_target_advice;
Nicolas de Fontenay
fuente
1

Como una adición a la respuesta anterior, resulta que ALTER SESSION SET NLS_COMP=LINGUISTIC;ALTER SESSION SET NLS_SORT=GENERIC_M_CI;por alguna razón agota rápidamente la memoria. El problema desaparece cuando se usa otro NLS_SORT.

spm
fuente