ORA-04031: Incapaz de alocar bytes de memória compartilhada (“”, “”, “”, “”)

8

Estou recebendo esse erro em um banco de dados de desenvolvimento. Isso acontece em algumas consultas específicas (inserções e exclusões simples por meio do aplicativo .NET). O banco de dados é usado por um usuário e o erro ocorre independentemente de quanto tempo o banco de dados estava em execução.

O único parâmetro relacionado à memória que é definido é: MEMORY_TARGET = 1.2G

Oracle 11.2 x64 Standard Edition Um Windows Server 2008 R2

spm
fonte

Respostas:

8

Seu aplicativo provavelmente não está usando variáveis ​​de ligação, o que causou a fragmentação do SGA (ele é preenchido com várias cópias do SQL que usam literais em vez de ligações).

Você pode corrigir temporariamente o problema liberando o pool compartilhado com:

alter system flush shared_pool;

Existe uma solução alternativa que você pode tentar impedir que isso aconteça no futuro.

Ative o compartilhamento do cursor e devolva o banco de dados:

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

A única maneira real de corrigir isso é reescrever seu aplicativo para que ele use variáveis ​​de ligação.

Philᵀᴹ
fonte
"então devolver o banco de dados" ==? "desligamento - inicialização"?
Atilla Ozgur
Sim, fechou a descer do banco de dados e começar tudo de novo
Philᵀᴹ
problema "resolvido" de uma forma estranha
spm
11
Como eu disse, se o aplicativo que não utiliza variáveis ​​de ligação é a causa do problema, a única maneira de "resolver" é reescrever o aplicativo para usá-las.
Philᵀᴹ
Vou tentar as duas soluções se o problema ocorrer novamente. Mas acho que não se aplica a esse caso, porque acontece mesmo que seja a primeira consulta após a reinicialização.
Spm
2

A resposta acima é um pouco antiga.

alter system flush shared_pool; 

Pode aliviar o problema imediatamente, mas não lidar com a causa raiz. o parâmetro cursor_sharing agora assume 2 valores:

FORÇA ou EXATA. Com EXACT, sua consulta precisará corresponder exatamente para que um cursor (sql com plano de execução) seja reutilizado; com "FORCE", todos os valores em suas consultas são alterados para vincular variáveis. Isso é realmente útil quando seu aplicativo não usa variáveis ​​de ligação. O banco de dados fará isso por você.

Se você já estiver usando cursor_sharing = FORCE. Em seguida, você deve começar a considerar o ajuste da alocação de memória e, dependendo dos parâmetros de memória que o sistema usa, você pode obter uma idéia de onde deve definir esse valor com as seguintes consultas:

Quando SGA_TARGET e SGA_MAX__SIZE / PGA_TARGET e PGA_MAX_SIZE são usados ​​(eles devem corresponder): selecione * de v $ sga_target_advice; selecione * de v $ pga_target_advice;

Seria assim: no meu caso, este é um sistema de pré-produção, não ficará tão bom por muito tempo:

Este é o SGA_TARGET_ADVICE:

A linha onde SGA_SIZE_FACTOR é 1 é a configuração atual. Em um sistema em que a memória está subdimensionada, o aumento em SGA_SIZE e SGA_SIZE_FACTOR deve mostrar uma diminuição drástica em ESTD_DB_TIME e ESTD_DB_TIME_FACTOR. Aumente a memória para um ponto em que aumentar novamente não faça mais uma alteração tão grande no estd_db_time.

No meu caso aqui, com minha carga atual, eu poderia facilmente reduzir o tamanho de SGA_TARGET para 80G sem sofrer um grande impacto. No entanto, reduzi-lo para 57G e menos produziria problemas de desempenho cada vez mais 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.

Quando MEMORY_TARGET é usado:

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

Como complemento à resposta anterior, verifica-se que, ALTER SESSION SET NLS_COMP=LINGUISTIC;ALTER SESSION SET NLS_SORT=GENERIC_M_CI;por algum motivo, rapidamente esgota a memória. O problema desaparece ao usar outro NLS_SORT.

spm
fonte