Lo mínimo que hay que saber para solucionar errores con la SGA de Oracle

Hay que tener en cuenta que la SGA es mucho más de lo que hay explicado aquí, pero esto es una guía para solucionar problemas que pueden aparecer y entenderla de manera mas rápida

Definición:

SGA (Área Global del Sistema) es una estructura básica de memoria de Oracle que sirve para facilitar la transferencia de información entre usuarios y también almacena la información estructural de la BD más frecuentemente requerida.

El área global del sistema y un conjunto de procesos de la base de datos constituyen una instancia de una base de datos Oracle. La base de datos Oracle automáticamente reserva memoria para el área global del sistema cuando se inicia una instancia, y el sistema operativo reclama la memoria cuando se apaga dicha instancia. Cada instancia tiene su propia SGA.

¿Que contiene la SGA?

Memoria Oracle (SGA) Su tamaño está determinado por los parámetros:
• Shared_Pool_Size= Tamaño en bytes del área para SQL compartidos y sentencias PL/SQL.
• Db_Block_Size = Tamaño en bytes de un solo bloque de datos.
• Db_Block_Buffers = Numero de Buffers a localizar en memoria.
• Log_Buffer = Numero de bytes localizados para los Redo Log Buffer.

Está Compuesto por:
• Los Redo Log Buffers
• Los Database Buffers
• Shared SQL Pool

Oracle descarga / libera la información contenida en la shared pool por cualquiera de las siguientes razones:

• Si un objeto del esquema referenciado en una sentencia sql, es modificado posteriormente en cualquier manera, el área del sql compartido es invalidado y la sentencia tendrá que ser recompilada la próxima vez que se ejecute.
• Si se cambia el nombre global de la base de datos, toda la información en en la shared pool es descargada.
• El administrador puede manualmente desalojar toda la información en esta área compartida para evaluar el rendimiento con respecto a ésta área de memoria, que sería esperada luego de que la instancia inicie sin apagar la instancia actual. La sentencia ALTER SYSTEM FLUSH SHARED_POOL es usada para esto (versiones 10 o posterior).
El total disponible de memoria en un sistema tiene que estar configurado de forma que todos los componentes de ese sistema funcionen óptimamente. Una pauta a seguir para que el sistema quede bien configurado podría ser el siguiente:

¿ Que tamaño dar a la SGA en un sistema nuevo o del que conocemos el número de usuarios, procesos, etc…?

Oracle SGA Componentes –>       50% del total de la memória del sistema
Sistema operativo + Otros  –>       + o – 15% del total de la memória del sistema
Memoria de usuario  –>                + o – 35% del total de la memória del sistema

Esta es la primera pauta que podemos seguir a la hora de reservar o ver la memoria que se necesita o que se puede poner cómo máximo en un sistema para que Oracle funcione correctamente y los demás componentes del sistema puedan hacerlo también. ( habría que tener en cuenta también el número de usuarios que accederán concurrentemente al sistema).

Una vez que hemos decidido que la SGA de nuestra base de datos ORACLE va a ser el 50% de la memoria total del sistema. Esta memoria la tenemos que dividir entre los componentes que la forman. (Database buffer cache, shared_pool_area, fixed size, redo log buffer).

Componentes de la SGA (Memoria SGA)
Database Buffer Cache ~80% de la SGA
Shared Pool Area    ~12% de la SGA
Fixed Size    ~1% de la SGA
Redo Log Buffer   ~0.1% de la SGA

Seguidamente se muestran una serie de consultas básicas que nos darán la información que necesitamos para saber como está la SGA.

• La siguiente consulta nos da información de la Shared Pool indicando el espacio ocupado/libre tanto en bytes como en megabytes.

select * from ( select POOL, NAME, BYTES, BYTES/1048576 as MBytes from v$sgastat where pool=’shared pool’ order by BYTES desc ) where rownum <= 25;

El campo “free memory” es el que indica el espacio libre en esos momentos. Para sacar exactamente TOTALES de espacio de la SGA ocupado y libre, ejecutaremos la siguiente sentencia:

select name,to_number(value/1024/1024) Mbytes
from v$parameter where name =’shared_pool_size’
union all
select name,bytes/1024/1024
from v$sgastat where pool = ‘shared pool’ and name = ‘free memory’;

Esto nos devolverá en MB el espacio total ocupado y libre de la SGA. Podemos comprobar que nos devuelve el resultado correcto mirando directamente en los parámetros generales de Oracle de la siguiente manera:
 

select * from v$system_parameter
where name like ‘%shared%’;

Nos dará el valor en bytes una descripción de los parámetros de Oracle.

Un error típico que suele dar relacionado con la SGA es el ORA-04031

Este error es fácil de solucionar siempre y cuando se tenga claro que es debido a que falta espacio en la SGA, bien porque se ha quedado pequeña, se definió mal desde un principio o porque está muy fragmentada.

Existe un comando que libera la SGA sin tener que parar la BBDD a partir de la versión 10 de Oracle. Este comando es el siguiente:

SVRMGRL> alter system flush shared_pool;

Ejemplo:

Connected to:
Oracle8i Enterprise Edition Release 8.1.7.4.0 – Production
JServer Release 8.1.7.4.0 – Production

SQL> select count(*) from v$sqlarea;

COUNT(*)
———-
828

SQL> alter system flush shared_pool;

System altered.

SQL> select count(*) from v$sqlarea;

COUNT(*)
———-
18
 

También desde la version 10 de Oracle podemos modificar el tamaño en caliente. Se haría de la siguiente manera:

SVRMGRL>  alter system set shared_pool_size = 400M;
SVRMGRL>  alter system set shared_pool_reserved_size = <15% de la shared_pool_size>;

Se ha de tener en cuenta que a partir de las versión 10 de Oracle si se tiene el parámetro SGA_TARGET activado, será Oracle quien automáticamente gestione la memória de la SGA. Por tanto, la modificación de los parámetros shared_pool_XXXX no tendrán efecto.

Manipulación de los parámetros del SGA

Existen tres tipos de parámetros en oracle:

- Parámetros “fijos”=> Son parámetros que una vez instalada la base de datos no se pueden volver a modificar / configurar. El juego de caracteres es un claro ejemplo.

- Parámetros Estáticos => Son parámetros que se pueden modificar, pero su modificación implica cerrar la base de datos y volverla a abrir para que los lea del fichero y pueda realizar el cambio.

- Parámetros Dinámicos=> Son parámetros cuyo valor se puede cambiar sin necesidad de cerrar la base de datos a diferencia de los estáticos.

Podemos asignar valores a los parámetros de la siguiente manera:

SQL> ALTER SYSTEM SET <parámetro> = <valor> [SCOPE = <ámbito>]

El valor del ámbito puede ser uno de los siguientes.

• spfile  –> Fichero de parámetros
• memory  –> En memória (en caliente)
• both  –> En memória y en el fichero de parámetros spfile.

Ejemplo:

El ejemplo anterior sólo funciona a partir de la versión 9.

Para ver el valor actual de un parámetro.
SQL> show parameter <parámetro>

Existe una manera sencilla de verificar que parámetros son dinámicos y cuales son estáticos.

La vista V$PARAMETER nos proporciona este tipo de información.

La columna ISSYS_MODIFIABLE contiene tres (3) tipos de valores:
• Immediate
• Deferred
• False
Por ejemplo:
SQL> select distinct ISSYS_MODIFIABLE from V$PARAMETER;

ISSYS_MODIFIABLE
—————————
IMMEDIATE
DEFERRED
FALSE

IMMEDIATE: identifica aquellos parámetros dinámicos, es decir, los ajustes se realizan de manera inmediata.
DEFERRED: los ajustes pueden ser realizados en “caliente” pero tomarán efecto solo después de que la base de datos sea re-inicializada.
FALSE: obligatoriamente la base de datos debe bajarse para poder efectuar el cambio.

La siguiente sentencia nos permite conocer lo anterior mencionado:

Col NAME format a50
Col ISSYS_MODIFIABLE format a20

Select NAME, ISSYS_MODIFIABLE
From V$PARAMETER
Order by 1

Para mostrar el estado actual del SGA.
SQL> show sga

NOTA: Sólo parte de la información de este artículo ha sido extraido de la WIKIpedia y es posible que de alguna otra WEB relacionada con Oracle. Se ha ordenado la documentación y se han añadido conocimientos y experiencias propias para validar dicho artículo.
This entry was posted in Administración Oracle and tagged , , . Bookmark the permalink.

Deja un comentario