# Buenas prácticas de memoria

Level 200

### Introducción:

Cuando creamos nuestra base de datos Oracle una de las primeras consideraciones a tener es como vamos a distribuir y asignar la memoria del servidor de base de datos.

**Configuración Inicial:**

La memoria debe afinarse según la carga de la base de dato y la naturaleza de la misma; sin embargo hay configuraciones iniciales que Oracle nos recomienda como buenas prácticas.

**Buena práctica:** Como referencia podriamos asignar hasta un 80% de la memoria para Oracle (SGA + PGA) y dejar un 20% para el sistema operativo; sin embargo esto va a depender mucho de lo que tenga instalado el servidor y las necesidades de memoria del sistema operativo.

**Procedimiento:**

Entonces lo primero que debemos hacer es determinar la memoria total del servidor.

`free -h`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/2cf38e21-c009-4ace-90f5-ff3b3e00dbfa.png align="center")

Memoria total 6.9G, 80%=5.52GB

Según lo obtenido tenemos 5.52GB para asignar a Oracle, es decir la SGA + PGA no debería pasar ese valor.

Y como configuro esos valores?

Esos valores se configura en los parámetros de base de datos, los cuales son los siguientes:

sga\_target=5GB

pga\_agregate\_target= 0.5GB

\*\*\*Estos valores asignados pueden y van a varíar según la necesidad de la base de datos, para efectos de este ejemplo usaremos esos valores.

Estos valores se configuran en el parameter file o el spfile, tener en cuenta que si ambos existen tiene precedencia el spfile.

La ruta donde se encuentra ese archivo por defecto es el:

`$ORACLE_HOME/dbs`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/42ae89c7-5e31-40bd-a5f3-6a7f954962ed.png align="center")

En la imagen vemos el archivo spfileDBACEJS.ora. Si quisiéramos generar un parameter file desde el spfile ejecutamos el siguiente comando:

`create pfile from spfile;`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/aa1bbcd5-ad0c-4adc-a71d-3c00c1091365.png align="center")

Vemos que ya se genero el parameter file: init

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/726ac9f3-66f4-44aa-b31d-a11aedc83478.png align="center")

También podemos cambiar esos parametros con comandos:

`alter system`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/30ef9419-a390-4f0e-ba47-a9884505abbb.png align="center")

Nos dice que no podemos cambiar el parámetro porque el parámetro sga\_max\_size es menor, por tanto primero cambiaremos ese parámetro.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/32e236c4-c5fd-4ed3-a8c1-141490303297.png align="center")

Obtenemos error porque ese parámetro no es dinámico, un parámetro es dinámico cuando se puede cambiar sin reiniciar la base de datos, entonces para poder cambiar agregamos la cláusula scope=spfile.

`alter system set sga_max_size=5G scope=spfile;`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/07975dd3-a2c7-44a7-ad94-66105c2c9cc1.png align="center")

Y para que el parámetro se aplique necesitamos reiniciar la base de datos.

`shutdown immediate`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/b8bcd008-75fb-4317-bc66-602ff7b5047d.png align="center")

`startup`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/0b85357c-c076-4ea2-96bf-f4ab6b38db4f.png align="center")

**\*\*\*Problemas!!!,** a veces podemos obtener errores y esto pueden no tener tanto detalle como para resolverlos, en ese escenario tenemos que revisar el alert.log, el cual es el archivo que registra los eventos de interés que ocurren en la base de datos.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/f4cdbef6-102e-40a8-8661-594bd767defc.png align="center")

Ahora que tenemos el detalle del error vemos que se origina por el large\_pages, para efectos prácticos y poder mostrar la configuración de memoria configuraremos:

`large_pages=auto;`

Y ahora si levanta la base de datos:

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/129bd77a-e8a1-47c6-8576-b24c911d2e63.png align="center")

y validamos que el parámetro se haya modificado:

`show parameter sga_max`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/bda5e35c-801b-4a9a-bd52-f639d7b13050.png align="center")

y ahora procedemos a cambiar la sga

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/652589aa-8e33-4019-8756-286801c6f984.png align="center")

Y ahora cambiamos el pga, dado que es un parámetro dinámico nos permite hacerlo sin reiniciar la base de datos.

`alter system set pga_aggregate_target=512M;`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/988af4bc-6e23-49b8-ad36-efd2c92afaee.png align="center")

Ya con eso tenemos configurado la memoria de la base de datos según la referencia del 80% del total de la memoria; sin embargo los valores de sga y pga se deberán ir ajustando según la característica de carga de la base de datos.

Y que pasa si intento agregar memoria que no tengo?

`alter system set pga_aggregate_target=10G;`

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/899bf76d-5372-4e7b-81ba-77e448bdabee.png align="center")

Oracle nos arroja un error dado que detecta que no existe memoria física suficiente para la asignación.

**Conclusión:**

La asignación de memoria es una de las actividades criticas a realizar al implementar una base de datos y esta muy relacionada con la configuración del sistema operativo , memoria física disponible y la característica de carga de la base de datos, es una actividad que se ejecuta inclusive después de la implementación como parte del afinamiento de la base de datos.
