lunes, 22 de noviembre de 2010
Gestión automática de la memoria 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
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
Performance Management
Heterogeneous Services
Performance Management
Security
Oracle Replication
Ejecutar por: SYS
Descripción: Corre todos los scripts necesarios para habilitar la replicación en la base de datos
Storage Management
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
Security
Oracle Replication
Metadata Management
Security
Distributed Management
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:
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
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
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)
)



