No Oracle 12c, foi implementado um novo parâmetro de controle de memória, o _kgl_large_heap_assert_threshold.
O ORA-600 [KGL-heap-size-exceeded] aparece quando um heap baseado no SGA cresce demais, ultrapassando o limite definido para o _kgl_large_heap_assert_threshold.
Esse parâmetro possui o valor padrão, definifo pela Oracle, de 500MB.
Se qualquer heap tentar alocar memória além desse tamanho, um erro interno (ORA-600 [KGL-heap-size-exceeded]) será reportado.
A solução para esse problema é alteração da configuração de dois parâmetros:
_kgl_large_heap_warning_threshold
_kgl_large_heap_assert_threshold
O parâmetro _kgl_large_heap_warning_threshold é a configuração de um alerta para quando o oracle ultrapassar o valor definido.
Como padrão, ele também tem o valor de 500Mb e sempre que um heap atingir esse valor (Padrão) ou o valor configurado, caso já tenha sido alterado alguma vez, ele emitirá um alerta no arquivo alert.log do banco de dados.
O parâmetro _kgl_large_heap_assert_threshold, como descrito anteriormente, é o valor de heap de memória permitido pelo Oracle.
O valor a ser configurado para esses dois parâmetros deverá ser maior do que o oracle está tentando alocar.
Para alterar o parâmetro devemos:
a) Conectar no banco de dados como sysdba
$ sqlplus / as sysdba
b) Alterar o parâmetro _kgl_large_heap_warning_threshold
Em ambiente single:
SQL> alter system set "_kgl_large_heap_warning_threshold"=2147483647 scope=both;
Em ambiente RAC
SQL> alter system set "_kgl_large_heap_warning_threshold"=2147483647 scope=both sid='*';
c) Alterar o parâmetro _kgl_large_heap_assert_threshold
Em ambiente single:
SQL> alter system set "_kgl_large_heap_assert_threshold"=2147483647 scope=both;
Em ambiente RAC
SQL> alter system set "_kgl_large_heap_assert_threshold"=2147483647 scope=both sid='*';
Observação:
- O valor do parâmetro _kgl_large_heap_assert_threshold deve ser configurado em bytes.
- O valor a ser definido não pode ser maior que 2147483647.
- No exemplo, utilizamos a alocação para o valor máximo permitido, mas qualquer valor poderá ser utilizado desde que seja menor ou igual a 2147483647.
- Também podemos definir os parâmetros como zero e deixar o Oracle decidir sobre a alocação dos valores de heap de memória.
Para verificarmos os valores atuais dos parâmetros, podemos utilizar o SQL abaixo:
Set lines 200
col name format a40
col DESCRIPTION format a70
col KSPPSTVL format a20
select nam.ksppinm NAME, nam.ksppdesc DESCRIPTION, val.KSPPSTVL
from x$ksppi nam,x$ksppsv val
where nam.indx = val.indx and nam.ksppinm like '%kgl_large_heap_%_threshold%';
NAME DESCRIPTION KSPPSTVL
---------------------------------------- ---------------------------------------------------------------------- --------------------
_kgl_large_heap_warning_threshold maximum heap size before KGL writes warnings to the alert log 2147483647
_kgl_large_heap_assert_threshold maximum heap size before KGL raises an internal error 2147483647
Referências:
Memory Notification: Library Cache Object loaded into SGA / ORA-600 [KGL-heap-size-exceeded] (Doc ID 330239.1)
Bug 22330282 "Heap size 0K exceeds notification threshold" alert messages when "_kgl_large_heap_warning_threshold" is set to 0
Bug 19708342 - Package compilation fails with ORA-600 [KGL-heap-size-exceeded] (Doc ID 19708342.8)
Nenhum comentário:
Postar um comentário