Mostrando entradas con la etiqueta ORACLE. Mostrar todas las entradas
Mostrando entradas con la etiqueta ORACLE. Mostrar todas las entradas

sábado, 12 de enero de 2013

Forzar cambio de online redo log manualmente

Para que se cambie el grupo de online redo log manualmente se puede ejecutar el comando siguiente como DBA:


sql> ALTER SYSTEM SWITCH LOGFILE; (modo asíncrono)
sql> ALTER SYSTEM ARCHIVE LOG CURRENT; (modo síncrono, requiere ARCHIVELOG activado)

Que cambia al siguiente grupo de online redo log marcándolo como CURRENT.

Este tipo de cambio se denomina CHECKPOINT COMPLETO, ya que se ha forzado un cambio de grupo de redo, a diferencia del CHECKPOINT INCREMENTAL que se produce cuando hay presión de memoria o bien, cuando el grupo actual se ha llenado.

También se podría forzar de una forma indirecta el cambio de grupo, si lanzamos una copia de seguridad en una base de datos configurada con Hot Backup (ARCHIVELOG activado).

Para ver el estado de los redos se pueden usar las siguientes vistas:
v$logfile
v$log

Información complementaria:
http://asktom.oracle.com
http://dba-oracle.com

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



miércoles, 5 de diciembre de 2012

java.lang.Exception: UnknownHostException sending request

Cuando se cambia el nombre del Host de un equipo que soporta un SGBDR Oracle, al acceder como SYS al Enterprise Manager Database Control se muestra un error de Java:

java.lang.Exception: UnknownHostException sending request::nombrehost

Esto es debido a que el nombre de Host se almacena en archivos de configuración y repositorio del EM Control. Para ello debemos realizar unos pasos como son:
  1. Eliminar los archivos de configuración existentes.
  2. Eliminar los objetos del repositorio existentes.
  3. Crear de nuevo los archivos de configuración y objetos del repositorio

Todos estos pasos se pueden realizar en uno sólo y para ello utilizaremos el Enterprise Manager Configuration Assistant (EMCA) una herramienta de consola. (http://docs.oracle.com/cd/B28359_01/server.111/b28319/emca.htm)

Por ejemplo para la versión 10gR2 desde la línea de comandos ejecutaremos:

C:\> emca -config dbcontrol db -repos recreate

Este comando nos preguntará si realmente deseamos realizar el proceso, si seguimos a delante le deberemos indicar el nombre del SID de la BBDD y el puerto del Listener. Con ello, y después de una confirmación final se realizará el proceso de eliminación y configuración de los elementos necesarios para el Enterprise Manager.

A continuación se muestra el proceso de cambio:

EMCA iniciado en 05-dic-2012 11:12:50
Asistente de Configuraci¾n de EM, Versi¾n 10.2.0.1.0 Producci¾n
Copyright (c) 2003, 2005, Oracle. Todos los Derechos Reservados.
Introduzca la siguiente informaci¾n:
SID de Base de Datos: orcl
Database Control ya estß configurado para la base de datos orcl
Ha seleccionado configurar Database Control para gestionar la base de datos orcl
Se eliminarß la configuraci¾n existente y los valores por defecto y se realizarß
 una configuraci¾n nueva
┐Desea continuar? [sÝ(Y)/no(N)]: y
N·mero de Puerto del Listener: 1521
Contrase±a de Usuario SYS:
Contrase±a de Usuario DBSNMP:
Contrase±a de Usuario SYSMAN:
Contrase±a de Usuario SYSMAN: Direcci¾n de Correo Electr¾nico para Notificacione
s (opcional):
Servidor de Correo Saliente (SMTP) para Notificaciones (opcional):
-----------------------------------------------------------------
Ha especificado los siguientes valores
ORACLE_HOME de Base de Datos ................ C:\oracle\product\10.2.0\db_1
Nombre del host de la base de datos ................ edi00041.octaedin.local
N·mero de Puerto del Listener ................ 1521
SID de Base de Datos ................ orcl
Direcci¾n de Correo Electr¾nico para Notificaciones ...............
Servidor de Correo Saliente (SMTP) para Notificaciones ...............
-----------------------------------------------------------------
┐Desea continuar? [sÝ(Y)/no(N)]: y
05-dic-2012 11:13:56 oracle.sysman.emcp.EMConfig perform
INFO: Esta operaci¾n se estß registrando en C:\oracle\product\10.2.0\db_1\cfgtoo
llogs\emca\orcl\emca_2012-12-05_11-12-50-AM.log.
05-dic-2012 11:13:58 oracle.sysman.emcp.util.DBControlUtil stopOMS
INFO: Parando Database Control. Puede tardar unos minutos...
05-dic-2012 11:14:48 oracle.sysman.emcp.EMReposConfig dropRepository
INFO: Borrando el repositorio de EM. Puede tardar unos minutos...
05-dic-2012 11:16:10 oracle.sysman.emcp.EMReposConfig invoke
INFO: El repositorio se ha borrado correctamente
05-dic-2012 11:16:10 oracle.sysman.emcp.EMReposConfig createRepository
INFO: Creando el repositorio de EM. Puede tardar unos minutos...
05-dic-2012 11:19:35 oracle.sysman.emcp.EMReposConfig invoke
INFO: El repositorio se ha creado correctamente
05-dic-2012 11:19:46 oracle.sysman.emcp.util.DBControlUtil startOMS
INFO: Iniciando Database Control. Puede tardar unos minutos...
05-dic-2012 11:20:26 oracle.sysman.emcp.EMDBPostConfig performConfiguration
INFO: Database Control se ha iniciado correctamente
05-dic-2012 11:20:26 oracle.sysman.emcp.EMDBPostConfig performConfiguration
INFO: >>>>>>>>>>> La URL de Database Control es http://edi00041.octaedin.local:1
158/em <<<<<<<<<<<
La configuraci¾n de Enterprise Manager se ha realizado correctamente
EMCA terminado en 05-dic-2012 11:20:26

miércoles, 3 de octubre de 2012

Pentaho SPOON: JDBC error al conectar con Oracle

Con la versión 4.3.0 del Spoon-Kettle de Pentaho, al crear una nueva conexión de base de datos y después de introducir los parámetros oportunos, se puede producir un error en la conexión de la base de datos. Uno de los posibles errores puede ser causado por intenta usar un driver JDBC que no está instalado.


Exception while loading class
oracle.jdbc.driver.OracleDriver

La solución es fácil, sólo se requiere instalar los drivers correspondientes, para ello podemos seguir los siguientes pasos:

  • Determinaremos con el siguiente código la versión de Oracle. Para ello podemos utilizar cualquier herramienta que tenga acceso a Oracle (SQL*PLus, SQL Developer, Toad, etc.).
SELECT banner
  FROM v$version
 WHERE lower(banner) like '%oracle%';
La salida anterior podría mostrar un resultado parecido a este:
"Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production"
  • Ahora debemos saber qué JDK estamos usando. Podemos ejecutar el comando siguiente en una ventana de sistema.
 java -version
La salida anterior podría mostrar un resultado parecido a este:
"java verison 1.6.0_24..."
  • Siguiente paso es descargar el driver JDBC correspondiente a la versión de Oracle y al JDK que estamos usando. Para ello:
    • Accederemos a la web de Oracle para descargarlo.
    • Localizaremos la sección de "Drivers" y seleccionaremos JDBC drivers.
    • En la siguiente ventana nos mostrará los diferentes drivers según la versión de Oracle. Localizaremos por ejemplo la 11.0.2.2.
    • En la nueva ventana, demos descargar los archivos del driver y el soporte de idioma. En nuestro caso descargaremos:
      • ojdbc6.jar      Clase para usar con JDK 1.6.
      • orai18n.jar     Clase NLS para usar con JDK 1.5 y 1.6.
  • Por último debemos copiar los dos archivos descargados anteriormente en el directorio de los drivers que usa Spoon.
 ....\libext\JDBC
Con estos pasos ya se puede configurar una conexión a una base de datos Oracle sin ningún problema.



lunes, 4 de abril de 2011

Calcular fecha teniendo como valor los segundos desde una fecha dada.

Cuando partimos de una fecha inicial y queremos obtener una fecha final sumándole sólo segundos, en Oracle no disponemos de una función tipo fechafinal(fechainicial, segundos). Para ello podemos utilizar la propiedad de incrementar una fecha a partir de las unidades en días.

Por ejemplo a partir de la fecha "01/01/2011" le queremos sumar dos días, para ello podemos hacer:


SELECT TO_DATE('01/01/2011', 'DD/MM/YYYY') + 2 FROM DUAL


El resultado es "03/01/2011", a la fecha de partida se le han sumado 2 días.

Debido a que la función de sumar sólo tiene en cuenta las unidades en días, para sumar segundos deberemos sumar la fracción de días que representan los segundos. Partiendo de que en un día hay 86400 segundos (60 segundos en un minuto * 60 minutos en una hora * 24 horas en un día es igual a 86400 segundos en un día).
La fracción a sumar será SEGUNDOS / 86400.

Por ejemplo a partir de la fecha "01/01/2011" le queremos sumar 5 minutos (300 segundos), para ello:

SELECT TO_DATE('01/01/2011', 'DD/MM/YYYY HH24:MI:SS') + (300/86400) FROM DUAL

El resultado es "01/01/2011 00:05:00".

A partir de la versión 9i existen dos nuevos tipos de datos INTERVAL DAY TO SECOND y INTERVAL YEAR TO MONTH. Con estos tipos de datos se consigue clarificar la lectura del dato.

El ejemplo anterior quedaría como :

SELECT TO_DATE('01/01/2011', 'DD/MM/YYYY HH24:MI:SS') + (INTERVAL '5' MINUTE) FROM DUAL

El resultado es  "01/01/2011 00:05:00".
 

INTERVAL DAY TO SECOND

Este tipo de dato permite definir intervalos de fecha de días a segundos (con decimales sólo para los segundos), mostrando un formato del tipo D H:M:S  (D día, H horas, M minutos, S segundos con fracción)

Ejemplos:

SELECT INTERVAL '1' SECOND FROM DUAL              Muestra ->      0  0:0:1.0
SELECT INTERVAL '70.01' SECOND FROM DUAL       Muestra ->      0  0:1:10.01
SELECT INTERVAL '130' MINUTE FROM DUAL          Muestra ->      0  2:10:0.0
SELECT INTERVAL '25' HOUR FROM DUAL               Muestra ->      1  1:0:0.0
SELECT INTERVAL '3' DAY FROM DUAL                   Muestra ->      3  0:0:0.0

También se puede operar con ellos:

SELECT SYSTIMESTAMP, SYSTIMESTAMP - INTERVAL '10' MINUTE FROM DUAL

SELECT TO CHAR(SYSDATE,'dd-mm-yyyy hh24:mi:ss'), TO_CHAR( SYSDATE - INTERVAL '15' MINUTE,'dd-mm-yyyy hh24:mi:ss') FROM DUAL

INTERVAL YEAR TO MONTH

Este tipo de dato permite definir intervalos de fecha de años a meses, mostrando un formato del tipo YY-MM  (YY años, MM meses).

Ejemplos:

SELECT INTERVAL '30' MONTH FROM DUAL            Muestra ->    2-6
SELECT INTERVAL '30' YEAR FROM DUAL               Muestra ->    30-0


viernes, 9 de abril de 2010

UTILIZAR LEVEL PARA DUPLICAR REGISTROS EN UNA CONSULTA

A veces nos interesa duplicar, triplicar o tener n copias de un mismo registro de la base de datos por cualquier motivo. Un ejemplo sería hacer n copias de la misma factura para un cliente.
Para abordar esto lo podemos hacer de muchas maneras, utilizando bucles en el código, con SQL sin intervención de ningún tipo de bucle u otras maneras que seguro sabréis ;).

En el siguiente ejemplo de enfoque de la solución he optado por SQL, ya que la motivación inicial era aplicarlo directamente en la consulta de obtención de datos para REPORTS 6.

Para simplificar el ejemplo supondremos que tenemos los siguientes datos en una tabla llamada Cliente con estos datos


Nombre Copias
----------- ---------

Jordi .......... 3
Pedro
........ 2
Elisa
.......... 4
Utilizaremos la tabla DUAL para obtener una cantidad ilimitada de registros, pero para el ejemplo lo limitaremos a 5 registros.


SELECT LEVEL Registro FROM DUAL CONNECT BY LEVEL <= 5

Nota: cuidado con ejecutar SELECT LEVEL Registro FROM DUAL CONNECT BY LEVEL > 0, ya que la generación de la tabla temporal se comerá toda la memoria. (con 40.322.423 registros mi portatil se quedó sin memoria virtual)

Esto nos generará un conjunto de registros que quedaría así:


Registro
------------
1
2
3
4
5
Efectuamos la unión entre las dos tablas para obtener el conjunto de registros indicados en el campo copias de la tabla cliente.


SELECT c.nombre, c.copias, d.registro
FROM cliente c,
( SELECT LEVEL registro
FROM DUAL
CONNECT BY LEVEL <= 5 ) d WHERE c.copias >= d.registro
El resultado que obtenemos:


NOMBRE COPIAS REGISTRO
-------------- ------------ ----------------JORDI ............3................. 1
JORDI ............3................. 2
JORDI ........... 3................. 3
PEDRO ..........2................. 1
PEDRO ..........2................. 2
ELISA ...........4.................. 1
ELISA ...........4
.................. 2
ELISA
...........4.................. 3
ELISA
.......... 4.................. 4

jueves, 25 de marzo de 2010

ERROR INSTALACION FORMS 6 EN WINDOWS 7


Al efectuar el proceso de instalación de Oracle Forms 6 en Windows 7 se produce un error si se dan una serie de circunstancias.

Si el instalador intenta instalar el driver ODBC 32 bits, se produce un error:
odbo3220.ins(182): OS_ERROR while...
y la instalación no continúa.

El problema se genera al registrar los productos de Oracle Forms 6 si no se es el usuario Administrador de Windows 7, incluso teniendo derechos de administrador.

Para poder instalarlo correctamente y sin errores debemos efectuar el proceso de instalación como el usuario Administrador.