sábado, 15 de diciembre de 2012

ORA-00845: MEMORY_TARGET not supported on this system

En la WEB de Oracle se puede descargar una imagen completa del sistema operativo Linux con software de Oracle pre-instalado para ser usada con Virtual Box. El problema de esta máquina virtual es que funciona con lentitud, debido a su baja asignación de memoria en la configuración de dicha máquina.

He decido cambiarle la cantidad de memoria disponible a 3GB. Después he iniciado la MV y he cambiado el parámetro estático MEMORY_MAX_TARGET. A continuación el tamaño actual:

SQL> show parameter mem;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address             integer     0
memory_max_target                    big integer 436M
memory_target                        big integer 436M
shared_memory_address                integer     0
Realizo el cambio y paro la base de datos (BD):
SQL>alter system set memory_max_target=2G scope=spfile;

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Reinicio y se produce un error, no se puede arrancar la BD:
SQL> startup;
ORA-00845: MEMORY_TARGET not supported on this system
En esta situación no puedo iniciar la BD, ni siquiera ponerla en NOMOUNT ya que existe algún error en el archivo de parámetros spfile.

Se puede optar por dejar el spfile como estaba o bien solucionar el error.
Para recuperar el spfile podemos tirar de copia de seguridad o bien editarlo con el objetivo de dejar el valor modificado como se encontraba originalmente.
Para este último caso podemos genera un archivo de texto a partir del spfile (que es binario) usando el siguiente comando:

SQL> create pfile='/home/oracle/app/oracle/product/11.2.0/dbhome_2/dbs/sptxt.ora' from spfile;
Ahora podemos usar vi para editar el archivo y dejar el valor correcto en MEMORY_MAX_TARGET. Seguidamente podemos volver a crear el archivo spfileorcl.ora a partir del nuestro.

SQL> create spfile='/home/oracle/app/oracle/product/11.2.0/dbhome_2/dbs/spfileorcl.ora' from pfile='/home/oracle/app/oracle/product/11.2.0/dbhome_2/dbs/sptxt.ora';

Iniciamos de nuevo la BD sin ningún problema:

SQL> startup;
ORACLE instance started.

Total System Global Area  456146944 bytes
Fixed Size                  1344840 bytes
Variable Size             369101496 bytes
Database Buffers           79691776 bytes
Redo Buffers                6008832 bytes
Database mounted.
Database opened.
Lo correcto sería solucionar el error ya que nos interesa disponer de más memoria para el uso de Oracle.
El error ORA_00845 MEMORY_TARGET NOT SUPPORTED ON THIS SYSTEM, se genera cuando el tamaño de MEMORY_MAX_TARGET es mayor que el configurado en /dev/shm (memoria de intercambio requerida por Oracle).

Para conocer el tamaño de shm:

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1              11G  2.3G  7.3G  24% /
/dev/hdb1              12G  7.0G  4.2G  63% /home
tmpfs                 1.8G     0  1.8G   0% /dev/shm
/dev/hdc               53M   53M     0 100% /media/VBOXADDITIONS_4.2.4_81684

Para modificar el valor de forma permanente hay que editar como root el archivo fstab e indicar un valor igual o superior a MEMORY_MAX_TARGET:
# vi /etc/fstab
....
tmpfs         /dev/shm       tmpfs   defaults,size=2G        0 0
....
Una vez editado hay que montar de nuevo shm:
# mount -o remount /dev/shm
Ahora, ya podemos iniciar la BD con un tope de memoria de 2G, también indicamos el uso de MEMORY_TARGET a 1G:

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 2042241024 bytes
Fixed Size                  1345204 bytes
Variable Size            1929382220 bytes
Database Buffers          100663296 bytes
Redo Buffers               10850304 bytes
SQL> show parameters mem;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address             integer     0
memory_max_target                    big integer 2G
memory_target                        big integer 448M
shared_memory_address                integer     0

SQL> alter system set memory_target=1G scope=both;

SQL> show parameter mem;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address             integer     0
memory_max_target                    big integer 2G
memory_target                        big integer 1G
shared_memory_address                integer     0

Espero que os sirva y podéis consultar las siguientes fuentes:
http://asktom.oracle.com
http://www.orasite.com
http://www.cyberciti.biz



No hay comentarios:

Publicar un comentario