lunes, 22 de noviembre de 2010

Gestión automática de la memoria PGA

¿Qué es la PGA?
Las siglas provienen de Program/Private Global Area, y es la memoria privada de cada proceso servidor. En esta memoria cada proceso almacena información que sólo es necesaria para su propio funcionamiento como por ejemplo sus variables globales, el estado actual de cada cursor (SQL) que se ejecuta... etc.

La PGA se compone de:
Área SQL privada: cada SQL que se ejecuta necesita de este espacio para poder llevar el control de las operaciones propias de la sentencia. Se asigna cuando se abre el cursor y se libera completamente cuando se cierra. Esta parte de memoria se subdivide en dos: a) area persistente: perdura durante toda la vida del cursor. Guarda las bind variables además de otras cosas; b) area en tiempo de ejecución: se libera cuando finaliza la ejecución de la sentencia SQL (aunque no se haya cerrado el cursor ). Constituyen las áreas de trabajo (working areas) que se explican más adelante. El número máximo de cursores, y por tanto, el número máximo de áreas SQL privadas, que un usuario puede tener abiertos al mismo tiempo se controla con el parámetro OPEN_CURSORS. También hay que tener en cuenta que esta área SQL privada se almacena en la PGA si la Instancia está configurada como servidores dedicados (dedicated servers). En caso de servidors compartidos (shared servers) se almacena en la SGA.
Memoria de las sesiones: guarda información relativa a la sesión como el login, variables de sesión... etc. En servidores compartidos (shared servers) este área pasa a ser pública ya que diferentes usuarios comparten los mismos procesos servidores.
¿Qué son las áreas de trabajo (working areas)?
Las área de trabajo (working areas) son el espacio usado por el proceso servidor para realizar ordenaciones y clasificaciones como los ORDER BY, GROUP BY o HASH JOIN. Esta área es la de mayor tamaño y forma parte del área en tiempo de ejecución.

Su tamaño es determinante para obtener buenos tiempos de respuesta en operaciones de este tipo, ya que si el espacio se queda pequeño para realizar estas tareas es necesario liberar espacio usando el tablespace temporal del usuario. Ésta actividad de swapping afecta drásticamente al rendimiento y recibe el nombre de "extra pass".

¿Dónde se almacena la PGA?
La PGA se almacena en la memoria del servidor pero fuera de la SGA. Por tanto, para dimensionar ambas áreas hay que tener en cuenta que la suma de las dos no supere los límites específicos del servidor y la plataforma (tamaño máximo memoria RAM, 2 GB en Windows sin /3GB, 3 GB en Windows con /3GB... etc.).

¿El tamaño de la PGA es configurable?
Sí, pero únicamente es configurable el tamaño de las áreas de trabajo. Desde Oracle9i el DBA puede fijar el tamaño máximo del cónjunto de todas las PGAs de la Instancia a través del parámetro PGA_AGGREGATE_TARGET. De esta forma, Oracle dinámicamente gestiona el tamaño de cada área de trabajo para que la suma de todas las PGAs (no de todas las áreas, que es un parte de la PGA como ya se ha indicado) no exceda del límite impuesto. En versiones anteriores la forma de controlar el tamaño de cada área de trabajo era a través de los parámetros SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_AREA_SIZE y CREATE_BITMAP_AREA_SIZE.

Para que la Instancia tenga el cuenta el parámetro PGA_AGGREGATE_TARGET, el parámetro WORKAREA_SIZE_POLICY se debe asignar a AUTO (por omisión). Con MANUAL, se indica que se trabaja de la forma anterior y se fija cada parámetro *_AREA_SIZE por separado.

¿Cuándo se crea la PGA?
La crea el Listener durante la creación del proceso servidor. Si esta memoria no puede ser asignada o reservada la creación del proceso servidor falla y el Listener devuelve un ORA-12500: TNS:listener failed to start a dedicated server process. Igualmente, si durante la ejecución de alguna sentencia es necesario incrementar el tamaño de la PGA y el sistema operativo no tiene más memoria para darle se devuelve un error indicándolo.

¿Cuándo se destruye la PGA?
Al cerrar el proceso servidor su PGA asociada se libera y se devuelve al sistema operativo el espacio reservado. El proceso servidor se cierra cuando el usuario ejecuta EXIT o DISCONNECT, lanza un Ctrl+C, se pierde la comunicación con el servidor, se produce un ORA-600 que desconecta la sesión, el DBA lanza un KILL SESSION, etc.

¿Cuánto ocupa cada PGA?
En cada versión de Oracle, e incluso en cada release, el tamaño mínimo cambia. No obstante, como el tamaño es cambiante en función del área de trabajo, lo mejor que se puede hacer para comprobar cuánto ocupa o cómo ocupa es monitorizarlas.

¿Cómo se monitoriza la PGA?
Hay diferentes vistas para saber cuánto ocupa cada PGA individual o para saber cuánto ocupan todas las PGAs o incluso para saber si está bien configurado el parámetro PGA_AGGREGGATE_TARGET.

Con V$PROCESS se puede saber el tamaño de la PGA de cada proceso de la Instancia (el proceso puede ser background o foreground -también llamado shadow-). Si es un proceso background se sabé rápidamente qué proceso es porque lleva el nombre del proceso en la columna PROGRAM. Si es un proceso shadow se sabe el usuario que hay detrás cruzando las columnas ADDR.V$PROCESS con PADDR.V$SESSION. Veamos un ejemplo:

SQL> select sid, serial#, username, command, status, machine from v$session where paddr='BE103FA4';

SID SERIAL# USERNAME COMMAND STATUS MACHINE
---- ---------- -------- ------- -------- -------
1386 9 TEST_USR 0 INACTIVE SATURNO

Para obtener unas estadísticas de la PGA se puede usar la vista V$PGASTAT:

SQL> select * from v$pgastat;

NAME VALUE UNIT
---------------------------------------- ---------- -------
aggregate PGA target parameter 256901120 bytes
aggregate PGA auto target 58300416 bytes
global memory bound 51380224 bytes
total PGA inuse 192188416 bytes
total PGA allocated 283714560 bytes
maximum PGA allocated 548391936 bytes
total freeable PGA memory 0 bytes
process count 343
max processes count 404
PGA memory freed back to OS 0 bytes
total PGA used for auto workareas 0 bytes
maximum PGA used for auto workareas 78736384 bytes
total PGA used for manual workareas 0 bytes
maximum PGA used for manual workareas 530432 bytes
over allocation count 15599
bytes processed 8,1983E+11 bytes
extra bytes read/written 1,4539E+10 bytes
cache hit percentage 98,25 percent
recompute count (total) 208640


Aggregate PGA target parameter indica el valor del parámetro PGA_AGGREGGATE_TARGET.
Aggregate PGA auto target indica la cantidad de PGA que Oracle puede usar como áreas de trabajo. Este valor varía en función de la carga de trabajo. Total PGA allocated indica el valor total de PGA asignado. Este es el valor que Oracle intenta mantener por debajo de PGA_AGGREGGATE_TARGET. Este valor puede ser más alto que el indicado por el parámetro de inicialización en momentos puntuales de mucha carga o de forma constante si PGA_AGGREGGATE_TARGET está pobremente dimensionado. Over allocation count indica el número de veces que ha habido que sobrepasar el límite impuesto por PGA_AGGREGGATE_TARGET, lo que es síntoma de que hay que aumentar el parámetro.
Cache hit percentage indica el número de veces que se ha podido realizar una operación intensiva de ordenación/clasificación sin incurrir en un "extra pass". Si este valor no es cercano al 100% indica que hay que aumentar el parámetro PGA_AGGREGGATE_TARGET.

La vista V$PGA_TARGET_ADVICE es muy útil para predecir cómo cambiaría el comportamiento de la Instancia si modificamos le valor de PGA_AGGREGATE_TARGET. Para que esta vista recopile información el parámetro STATISTICS_LEVEL debe estar configurado a TYPICAL o ALL:

SQL> select pga_target_for_estimate, pga_target_factor,
estd_pga_cache_hit_percentage, estd_overalloc_count
from v$pga_target_advice;

PGA_TGT_FE PGA_TGT_F ESTD_HIT_PCTGE ESTD_OVRALL_COUNT
---------- --------- -------------- -----------------
32112640 ,125 67 67303
64225280 ,25 67 67303
128450560 ,5 67 66960
192675840 ,75 74 40785
256901120 1 97 4652
308281344 1,2 98 73
359661568 1,4 98 0
411041792 1,6 98 0
462422016 1,8 98 0
513802240 2 98 0
770703360 3 98 0
1027604480 4 100 0
1541406720 6 100 0
2055208960 8 100 0


La columna pga_target_for_estimated indica la estimación para las que las demás columnas están dando información. La columna pga_target_factor indica la relación entre el valor de PGA_AGGREGGATE_TARGET actual y el valor de estimación de esa fila. Cuando este factor está a 1 indica la relación 1 a 1 -el tamaño actual-. Si es 2, es 1 a 2 -el doble-, y si es 0,125 es 1 a 0,125 -una octava parte-. La columna estd_pga_cache_hit_percentage indica el porcentage de éxito, operación resueltas sin "extra pass" para ese pga_target_for_estimated. Por último, la columna estd_overalloc_count indica el número de veces que habría que sobrepasar el valor indicado por PGA_AGGREGGATE_TARGET para ese pga_target_for_estimated.

Para este caso el valor óptimo sería subir el valor del parámetro 1,4 veces porque nos da una estimación de 0 "extra passes". Seguir aumentándolo no aportaría ninguna mejora. Si estamos justos de memoria y 73 "extra passes" son asumbles se puede empezar aumentándolo 1,2 veces en vez 1,4 y después de un tiempo de trabajo volver a chequear los valores.

Por último decir que las vistas V$PGASTAT y V$PGA_TARGET_ADVICE guardan información de la Instancia en tiempo real. Cuando se reinicia la Instancia estas vistas empiezan a recopilar datos nuevos. Para ver el histórica entre reinicios están las vistas DBA_HIST_PGASTAT y DBA_HIST_PGA_TARGET_ADVICE respectivamente.

miércoles, 13 de octubre de 2010

SQL y PL/SQL - La nueva sentencia MERGE

La sentencia MERGE, a la que muchos denominan UPSERT debido a su funcionalidad, está disponible desde la aparición de la versión 9i de la base de datos Oracle. Se trata de una de las funcionalidades del kernel de Oracle más utiles a la hora de permitir el uso de la tecnología ETL (Extract, Transform and Load - Extraer, Transformar y Cargar) con las bases de datos Oracle. Este tipo de tecnología puede utilizarse y está especialmente enfocada para ser usada en aplicaciones de data warehousing (almacen de datos). Básicamente, lo que permite la sentencia SQL MERGE es, dependiendo de una condición lógica, actualizar registros (UPDATE) cuando la condición se cumple, o insertar registros (INSERT) cuando dicha condición no se cumple, de ahí surge la denominación de UPSERT.

Anteriormente a la versión 9i de Oracle, la alternativa en SQL era ejecutar dos sentencias DML, un UPDATE y un INSERT, cada una utilizando condiciones lógicas opuestas. En cuanto a las alternativas en PL/SQL eran: bien intentar insertar un registro y si la sentencia INSERT fallaba debido a una excepción PLSQL del tipo DUP_VAL_ON_INDEX, entonces realizar un UPDATE del registro en cuestión; bien intentar actualizar un registro y si la sentencia UPDATE devolvía SQL%NOTFOUND, entonces ejecutar la correspondiente sentencia INSERT.

Las ventajas de la sentencia SQL MERGE son claras:

- Permite con una misma sentencia realizar un UPDATE si el registro existe, o un INSERT si se trata de un nuevo registro.

- La sentencia puede paralelizarse de forma transparente.

- Se evita la necesidad de realizar actualizaciones múltiples.

- Es especialmente útil para realizar operaciones en masa y, como ya he mencionado, en aplicaciones de data warehousing.

- El rendimiento de la base de datos mejora ya que, al necesitarse menos sentencias SQL para realizar las mismas operaciones, también se necesitan menos accesos a las tablas fuente.

Ejemplo de sentencia MERGE

En el presente ejemplo voy a partir del hecho de que tenemos dos tablas en un data warehouse, una de ellas con muchos registros denominada clientes y otra más pequeña denominada datos_cli cuyos registros deben insertarse en la tabla clientes. En pocas palabras, estoy suponiendo que la tabla datos_cli contiene los cambios a realizar sobre la tabla clientes. La sentencia SQL MERGE que debemos utilizar para actualizar la tabla cliente podría ser la siguiente:

MERGE INTO clientes cli USING datos_cli dac
ON (cli.cliente_id = dac.cliente_id)
WHEN MATCHED THEN
UPDATE SET
cli.nombre = dac.nombre,
cli.direccion = dac.direccion
WHEN NOT MATCHED THEN
INSERT (cliente_id, nombre, direccion)
VALUES (dac.cliente_id, dac.nombre, dac.direccion);

Así pues, la sentencia MERGE del ejemplo realizará las siguientes operaciones:

- Si existe un registro en datos_cli con el mismo ID de otro registro en la tabla clientes, entoces actualizará el valor de los campos nombre y dirección de la tabla clientes con los valores correspondientes de la tabla datos_cli.

- Si no existe un registro en clientes con el ID del registro de datos_cli que está siendo procesado, entonces se insertará dicho registro en la tabla clientes.

En resumen, la sintaxis de la sentencia MERGE debe incorporar:

Una cláusula INTO, que especifica la tabla destino donde los registros serán actualizados o insertados.

Una cláusula USING, especificando el origen de los datos que van a ser insertados o que van a servir para actualizar la tabla destino. El origen de los datos puede tratarse de una tabla, una vista, o del resultado de la ejecución de una consulta SELECT.

Una cláusula ON, que especifica la condición bajo la cual se realizará, bien la operación UPDATE (si la condición se cumple), bien la operación INSERT (si la condición no se cumple).

Las cláusulas WHEN MATCHED NOT MATCHED, que son las que indican a la base de datos Oracle que acción realizar si se cumple o no se cumple la condición del ON. Estas dos cláusulas se pueden poner en cualquier orden.

lunes, 27 de septiembre de 2010

Creando estructuras adicionales del Diccionario de la Base de Datos Oracle 11g

A menudo tenemos dudas como crear o recrear algunas de las estructuras adicionales, que residen en el diccionario de la base de datos.
Cuando nos encontramos en esta situación peculir, optamos por buscar en la web, como hacer la tarea y en muchas ocasiones, las explicaciones que encontramos, no son las más claras y precisas.
Aquí les va un listado, con el nombre de algunos de los más buscados scripts, la funcionalidad y requerido por quién, así como con que usuario deben de ejecutar el procedimiento, para crear los paquetes o procedimientos en la base de datos.

Performance Management
script: ctablock.sql
Ejecutar por: SYS
Descripción: Crea las vistas que pueden mostrar dinámicamente las dependencias de bloqueos en la base de datos

Heterogeneous Services
script: caths.sql
Ejecutar por: SYS
Descripción: Instala paquetes para la administración de servicios heterogéneos, que son aquellos componentes integrados en el Servidor de Oracle, para proveer la tecnología genérica para el acceso a sistemas no-ORACLE desde el Server RDBMS Oracle.

Performance Management
script: catio.sql
Ejecutar por: SYS
Descripción: Permite que el I/O sea rastreado tabla por tabla en la base de datos.

Security
script:catoctk.sql
Ejecutar por: SYS
Descripción: Crea el paquete de herramientas para criptografía de Oracle

Oracle Replication
script: catrep.sql
Ejecutar por: SYS
Descripción: Corre todos los scripts necesarios para habilitar la replicación en la base de datos

Storage Management
script: dbmsiotc.sql
Ejecutar por: Cualquier usuario
Descripción: Genera los objetos necesarios para poder analizar los registros encadenados en las tablas organizadas al indíce.

Performance Management
script: dbmspool.sql
Ejecutar por: SYS o SYSDBA
Descripción: Habilita la posibilidad de fijar, paquetes PL/SQL, declaraciones SQL y triggers dentro del área de Shared Pool

Security
script: utlpwdmg.sql
Ejecutar por: SYS o SYSDBA
Descripción: Crea el paquete de funcionalidad, para activar la utilización de complejidad en claves de acceso a la base de datos.

Oracle Replication
script: utlscln.sql
Ejecutar por: Cualquier usuario
Descripción: Copia una vista materializada ( snapshot ) de un esquema a otro.

Metadata Management
script: utldtree.sql
Ejecutar por: Cualquier usuario
Descripción: Crea las tablas y vistas que muestran las dependencias entre objectos.

Security
script: catnoaud.sql
Ejecutar por: SYS
Descripción: Remueve las vistas y sinónimos para la auditoría de la metadata.

Distributed Management
script: catnsnmp.sql
Ejecutar por: SYS
Descripción: Elimina el usuario DBSNMP y sus objetos, asi como el rol SNMPAGENT

viernes, 23 de abril de 2010

¿Cómo copiar datos desde una base a otra en Oracle?

Si alguna vez se han preguntado como hacer para copiar información (y rapidamente!) desde una base de datos a otra acá les dejo el comando de SQL*Plus para poder hacerlo:

COPY FROM  "db_origen" TO  "db_destino" "accion" "tabla_destino"
["(column_name, column_name...)"] USING "query";

Siendo:

  • "db_origen" y "db_destino" - las conexiones a las base de datos, por ejemplo: SCOTT/TIGER@BASE1

  • "accion" - puede ser una de las siguientes:

    • create - Crea la tabla. Si esta ya existía vamos a tener un error al ejecutar el comando.

    • replace - Reemplaza la tabla si existía y la vuelve a crear. Si no existía, la crea e inserta los datos.

    • insert - Inserta los datos provenientes de la query. En este caso solo las filas devueltas por la query son insertadas, no hay ninguna operación de DDL. Si la tabla no existía vamos a tener un error al ejecutar el comando.

    • append - Inserta los datos si la tabla ya existía. Si la tabla no existía entonces la crea y luego procede a insertar las filas.}

  • "tabla_destino": La tabla destino :P

  • ["(column_name, column_name...)"] - Opcional. Permite establecer en que columnas queremos insertar los datos. Esto debe usarse cuando el query solo va a devolver algunas de las columnas de la tabla destino y no todas.

  • "query" - Query a ejecutarse en la base origen.

Ejemplos de uso:

Podriamos crear una tabla desde la base DB1 en la base DB2 con el siguiente comando:

SQL> copy FROM scott/tiger@DB1 TO scott/tiger@DB2 CREATE emp
using SELECT * FROM emp;

Este comando también sirve para poder copiar información desde una tabla a otra en la misma base:

SQL> copy FROM scott/tiger@DB1 TO scott/tiger@DB1 CREATE new_emp
using SELECT * FROM emp;

Conclusión:

Vale destacar que este método es muy práctico para copiar tablas con columnas con tipo de datos: BLOB, CLOB o Long.

Si en nuestra base de datos tenemos columnas Long utilizadas para almacenar texto, deberiamos tener en cuenta el tamańo de los datos Long a copiar. Ejecutamos el siguiente comando "longsize" con el tamańo deseado (en bytes) y listo:

SQL> SET longsize 35000

Otro modificador util es el "copycommit", el cual permite establecer cada cuantas filas insertadas se va a ejecutar un commit:

SQL> SET copycommit 5000

Espero que les haya sido de utilidad!

miércoles, 5 de agosto de 2009

Instalación de un Oracle sobre Linux y Automatizar el arranque de Oracle al iniciar el sistema:


Los pasos que hay que seguir para la instalación de un servidor Oracle sobre una máquina Linux son:

1º.- Hacer espacio suficiente:

Para ello lo primero que debemos hacer es crear una nuava partición donde metamos la instalación y los datos de Oracle.
Si lo queremos hacer correctamente lo que deberiamos hacer es hacerlo por separado, pero dependerá del servidor que utilicemos y sus caracteristicas.

Para crear una nueva partición sobre Linux debemos utilizar el siguiente comando:

fdisk sdXXX

siendo sdXX el disco físico donde queremos realizar la partición, (para ver los discos disponibles podemos utilizar el comando df).
Una vez en fdisk podemos usar “m” para obtener la ayuda correspondiente, pero básicamente los pasos a seguir son:
a.- Crear la nueva partición (n).
b.- Asignarle un tipo (t).
c.- Escribir los datos en el sistema de ficheros (w).

Una vez creada la partición con fdisk debémos darle formato, para ello usamos la instrucción: mkfs con los siguientes parámetros:
mkfs –t ext3 /dev/ sdXXX1

Esto le dará formato al nuevo disco que hayamos creado, ahora solo nos quedará que se pueda montar de forma automática cada vez que arranquemos el sistema, para ello debemos añadir la siguiente línea al fichero fstab, que se encuentra en /etc.

/dev/ sdXXX1 / ext2 defaults 1 1


Una vez hecho esto ya tenemos el espacio necesario para la instalación de Oracle.


2º.- Bajamos Oracle Database.
Una vez que hemos hecho los prerrequisitos de espacio en disco duro, debemos asegurarnos que cumplimos con el resto de requisitos para ello podemos bajarnos de forma gratuita la última versión de Oracle desde la página de Oracle:

http://www.oracle.com/technology/software/products/database/oracle10g/index.html

3º.- Instalación del oracle:

Una vez descargado los archivos hay que seguir los pasos que se están en la documentación que viene con el cd.

Si seguimos todos los pasos y cumplimos los prerrequisitos no debería darnos problemas.

4º.- Automatizar el arranque de Oracle al iniciar el sistema:

Para debemos hacer lo siguiente:

a.- Modificar el fichero /etc/oratab para que tenga la siguiente forma:

# This file is used by ORACLE utilities. It is created by root.sh
# and updated by the Database Configuration Assistant when creating
# a database.

# A colon, ':', is used as the field terminator. A new line terminates
# the entry. Lines beginning with a pound sign, '#', are comments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME::
#
# The first and second fields are the system identifier and home
# directory of the database respectively. The third filed indicates
# to the dbstart utility that the database should , "Y", or should not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
#
*:/oracle/app/product/10.1.0/Db_1:N
#SIGC:/oracle/app/product/10.1.0/Db_1:N
SIGC:/oracle/app/product/10.1.0/Db_1:Y


Este fichero se genera durante la instalación de Oracle.

b.- Crearnos un fichero oracle en /etc/init.d con el siguiente contenido:

#!/bin/bash

#
# Run-level Startup script for the Oracle Instance and Listener
#
# chkconfig: 345 93 15
# description: Startup/Shutdown Oracle listener and instance



ORA_HOME="/oracle/app/oracle/product/10.1.0/db_1"
ORA_OWNR="oracle"

# if the executables do not exist -- display error

if [ ! -f $ORA_HOME/bin/dbstart -o ! -d $ORA_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi

# depending on parameter -- startup, shutdown, restart
# of the instance and listener or usage display

case "$1" in
start)
## Oracle listener and instance startup
echo -n "Starting Oracle: "
# start TNS listener
su - $ORA_OWNR -c "$ORA_HOME/bin/lsnrctl start"
# start database
su - $ORA_OWNR -c $ORA_HOME/bin/dbstart
touch /var/lock/subsys/oracle
# Arrancamos el Oias
#echo -n "Starting Oracle Application Server: "
#su - $ORA_OWNR -c "./arranca_ias.sh"
echo "OK"
;;
stop)
# Paramos el Oias
#echo -n "Shutdown Oracle Application Server"
#su - $ORA_OWNR -c "./para_ias.sh"
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
# stop TNS listener
su - $ORA_OWNR -c "$ORA_HOME/bin/lsnrctl stop"
# stop database
su - $ORA_OWNR -c $ORA_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 start|stop|restart|reload"
exit 1
esac
exit 0


Es muy importante la línea que se encuentra comentada al principio: # chkconfig: 345 93 15 porque va a ser la que determine los parámetros de arranque (345) y su prioridad (93 15) al arrancarlos o matarlos.

Para poder incluirlo dentro del arranque del sistema debemos ejecutar:
chkconfig --add oracle

Donde oracle es el fichero que nos hemos creado antes (/etc/init.d/oracle).

5º.- Configuración de las conexiones desde el exterior:
Para poder realizar las conexiones desde el exterior hay que modificar el fichero tnsnames.ora en el caso de que no lo hay hecho automáticamente para que tenga el siguiente formato:


# tnsnames.ora Network Configuration File: /oracle/app/product/10.1.0/Db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

SIGC= (DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=localhost.localdomain)
(PORT=1521)
)
)
(CONNECT_DATA=
(SID=sigc)
(SERVER=DEDICATED)
)
)

#EXTPROC_CONNECTION_DATA =
# (DESCRIPTION =
# (ADDRESS_LIST =
# (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
# )
# (CONNECT_DATA =
# (SID = PLSExtProc)
# (PRESENTATION = RO)
# )
# )





Corolario: Comandos de Oracle

emctl status dbconsole  nos muestra el estado de la consola de oracle, pero debemos tenerlo apagado por defecto porque consume muchos recursos.

lsnrctl  listener de oracle, que es donde se configura el acceso desde la red de nuestro servidor, para que funcione, por derfecto tiene un fichero de configuración llamado listener.ora donde se pueden configurar las restricciones de acceso a nuestro servidor, nosostros en principio simplemente lo debemos quitar.

sqlplus  programa de oracle que nos permite el acceso a la base de datos con sql, también desde aquí podemos arrancar y parar las difernetes instancias de la Base de Datos mediante shut inmediate y startup.
Si queremos entrar como dba debemos ejecutar: <>

dbca Data Base Control Administration, sirve para crear/modificar/borrar instancias de una Base de Datos.

viernes, 28 de noviembre de 2008

¿Archive log perdido? No reconstruya su Standby

Otro problema recurrente con las bases de datos standby es la pérdida de uno o más archive logs aún no aplicados. La solución era usualmente el reconstruir nuevamente la base de datos standby, lo cual si bien es relativamente fácil, puede consumir bastante tiempo. Esto fue lo que algunos sugirieron a un afligido DBA que pedía ayuda en el foro de Oracle Technet, afortunadamente si estás usando Oracle 10gR2 la solución es mucho más simple y rápida, ¿suena bien? entonces vamos con el procedimiento.

1. Detener la sincronización de la base de datos standby
2. STDB> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
3. Obtener el SCN al cual se ha llegado en la base de datos standby
4. STDB> SELECT CURRENT_SCN FROM V$DATABASE;
5. Obtener un backup incremental de la base de datos primaria con RMAN, a partir del SCN obtenido en el paso previo
6. RMAN> BACKUP INCREMENTAL FROM SCN
7. DATABASE FORMAT '/tmp/ForStandby_%U' tag 'FORSTANDBY';
8. Catalogar el backup del paso previo en la base de datos standby
9. RMAN> CATALOG START WITH '/tmp/ForStandby';
10. Recuperar la base de datos standby con el backup ya catalogado
11. RMAN> RECOVER DATABASE NOREDO;
12. En la base de datos primaria crear un nuevo standby controlfile
13. RMAN> BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '/tmp/ForStandbyCTRL.bck';
14. Detener la base de datos standby y levantarla con nomount
15. RMAN> SHUTDOWN;
16. RMAN> STARTUP NOMOUNT;

17. Restaurar el standby controlfile obtenido en el paso (6) en la base de datos standby
18. RMAN> RESTORE STANDBY CONTROLFILE FROM '/tmp/ForStandbyCTRL.bck';
19. Detener la base de datos standby levantarla con mount
20. RMAN> SHUTDOWN;
21. RMAN> STARTUP MOUNT;

22. Limpiar los standby redo logs en la base de datos standby
23. STDB> ALTER DATABASE CLEAR LOGFILE GROUP 1;
24. STDB> ALTER DATABASE CLEAR LOGFILE GROUP 2;
25. STDB> ALTER DATABASE CLEAR LOGFILE GROUP 3;
26. Si estaba activo Flashback Database, reiniciarlo
27. STDB> ALTER DATABASE FLASHBACK OFF;
28. STDB> ALTER DATABASE FLASHBACK ON;

29. Reiniciar el recovery de la base de datos standby
30. STDB> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

Este procedimiento aplica no sólo cuando un archive log se ha perdido, sino también cuando se han realizado operaciones con nologging en la base de datos principal o cuando hay un gran retraso en la sincronización. Puedes revisar el texto completo en el manual Oracle Data Guard Concepts and Administration.

jueves, 6 de noviembre de 2008

Oracle PL/SQL - Debug usando tabla de apoyo

Hoy les traigo una pequeña utilidad que les permitira incluir de una forma sencilla un pequeño sistema de Debug para Oracle PL/SQL que este basado además de en el archiconocido dbms, en una tabla de apoyo que sirva para poder registrar el desempeño de un determinado bloque de código a lo largo del tiempo, facilitandonos las tareas de depuración.

CREATE OR REPLACE PROCEDURE "P_DEBUG_LOG" (donde IN VARCHAR2,texto IN VARCHAR2) IS

-- Raul Carrillo Garrido aka metsuke - www.metsuke.com
-- Released Under LGPL License v3 (http://www.gnu.org/copyleft/lesser.html)

withDbms BOOLEAN := TRUE;
withTable BOOLEAN := FALSE;
cuando DATE := SYSDATE;

BEGIN

IF (withTable) THEN
INSERT INTO DEBUG_LOG (CUANDO,TEXTO,DONDE) VALUES (cuando,texto,donde);
END IF;

IF (withDbms) THEN
DBMS_OUTPUT.put_line('(' TO_CHAR(cuando,'DD/MM/YY HH24:MI:SS') ') - ' donde ' - ' texto );
END IF;

EXCEPTION

WHEN OTHERS THEN

-- Do nothing. Es para debug, si falla algo no quiero que el debug interrumpa el funcionamiento de la aplicación.
-- en todo caso si ejecutamos al menos un dbms para aprovechar y que el proceso informe.
DBMS_OUTPUT.put_line('Se ha producido un error en P_DEBUG_LOG ' SQLERRM);

END;



La tabla de DEBUG_LOG se puede crear mediante el uso del siguiente script:


CREATE TABLE DEBUG_LOG
(
CUANDO DATE,
TEXTO VARCHAR2(2000),
DONDE VARCHAR2(2000)
)