quinta-feira, 29 de dezembro de 2016

ORA-00600: internal error code, arguments: [KGL-heap-size-exceeded]


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