martes, 31 de enero de 2012

Nuevos parámetros de memoria y volcado de Oracle 11g

Si quieres migrar una base de datos de Oracle 10g a Oracle 11g, en general puedes hacer un volcado de todos los parámetros de la base de datos con una sentencia CREATE PFILE e iniciar tu nueva instancia Oracle 11g con ese pfile, pero sería mejor sustituír algunos parámetros obsoletos por los nuevos parámetros de Oracle 11g; sólo tomaría un par de minutos y así no saldrían mensajes molestos sobre parámetros obsoletos al iniciar la instancia:

SQL> startup nomount pfile=initmydb.ora
ORA-32006: BACKGROUND_DUMP_DEST initialization parameter has been deprecated
ORA-32006: REMOTE_OS_AUTHENT initialization parameter has been deprecated
ORA-32006: USER_DUMP_DEST initialization parameter has been deprecated
ORACLE instance started.

Total System Global Area 267227136 bytes
Fixed Size 2158832 bytes
Variable Size 134221584 bytes
Database Buffers 125829120 bytes
Redo Buffers 5017600 bytes

Primero que nada, el parámetro remote_os_authent es obsoleto en 11g por lo que puedes sólo quitarlo. Y en Oracle 11g, puedes sustituír los parámetros background_dump_dest, core_dump_dest and user_dump_dest con el nuevo parámetro diagnostic_dest, que por default es derivado del valor de la variable de entorno $ORACLE_BASE. Finalmente, puedes configurar un objetivo de uso de memoria para la instancia completa (PGA and SGA) con el nuevo parámetro memory_target, y también un límite de uso de memoria con el parámetro memory_max_target.

En este ejemplo, los seis parámetros están configurados para esta instancia de Oracle 10g:

SQL> select NAME, VALUE from v$parameter where name in ('pga_aggregate_target','sga_target',
'sga_max_size','user_dump_dest','background_dump_dest','core_dump_dest') order by NAME;

NAME VALUE
------------------------------ --------------------------------------------------
background_dump_dest /oracle_10g/app/oracle/admin/mydb/bdump
core_dump_dest /oracle_10g/app/oracle/admin/mydb/cdump
pga_aggregate_target 100663296
sga_max_size 268435456
sga_target 268435456
user_dump_dest /oracle_10g/app/oracle/admin/mydb/udump

6 rows selected.

En esta instancia 11g, sólo fueron definidos los parámetros diagnostic_dest y memory_target, y los otros parámetros fueron configurados por Oracle y derivados de los dos parámetros anteriores:

SQL> select NAME, VALUE from v$parameter where name in ('pga_aggregate_target','sga_target',
'sga_max_size','memory_target','memory_max_target','user_dump_dest','background_dump_dest',
'diagnostic_dest','core_dump_dest') order by NAME;

NAME VALUE
------------------------------ ------------------------------------------------------------
background_dump_dest /oracle_11g/product/diag/rdbms/mydb/mydb/trace
core_dump_dest /oracle_11g/product/diag/rdbms/mydb/mydb/cdump
diagnostic_dest /oracle_11g/product
memory_max_target 369098752
memory_target 369098752
pga_aggregate_target 0
sga_max_size 369098752
sga_target 0
user_dump_dest /oracle_11g/product/diag/rdbms/mydb/mydb/trace

9 rows selected.

Más información:

11g Automatic Diagnostic Repository (ADR)
REMOTE_OS_AUTHENT
SGA_MAX_SIZE
DIAGNOSTIC_DEST

lunes, 30 de enero de 2012

Revisando el set de caracteres de la base de datos

Si quieres exportar una base de datos Oracle para importar los datos en otra base de datos (imp/exp), o quieres crear una base de datos Oracle similar a otra base de datos, entonces tienes que poner atención al set de caracteres de la base de datos y a la variable de ambiente NLS_LANG. Si no lo haces, en caso de importar/exportar podrías terminar con datos diferentes de la base de datos origen, y en el caso de creación de una base de datos tu aplicación podría no almacenar los datos como se espera, y ambos problemas son difíciles de detectar y resolver. Por lo tanto, gasta un minuto revisando el NLS_CHARACTERSET en la base de datos origen y configurando la variable de ambiente NLS_LANG al momento de importar o crear la base de datos, y no tendrás que reexportar o recrear una base de datos por problemas de set de caracteres.

Para revisar el NLS_CHARACTERSET y todos los parámetros de localización de tu base de datos origen, puedes revisar la tabla NLS_DATABASE_PARAMETERS:

SQL> select * from NLS_DATABASE_PARAMETERS;

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET WE8ISO8859P1
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT dd-mon-yyyy
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.1.0

20 rows selected.

Teniendo los valores de los parámetros NLS_LANGUAGE, NLS_TERRITORY y NLS_CHARACTERSET puedes configurar la variable de ambiente NLS_LANG, o puedes sólo configurarla en la base de datos destino de la misma manera que la base de datos origen siempre y cuando el valor de la variable NLS_LANG corresponda con los parámetros NLS de la base de datos:

oracle@myserver:~$ export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

Y si estás creando una base de datos, no olvides declarar el set de caracteres apropiadamente:

CREATE DATABASE mydb
...
CHARACTER SET WE8ISO8859P1
...

Más información:

Oracle Database Globalization Support Guide

viernes, 27 de enero de 2012

Exports comprimidos

Usar RMAN para hacer respaldos de una base de datos Oracle es muy conveniente, pero algunas veces tienes que hacer exports de tu base de datos porque RMAN no es adecuado; por ejemplo, si necesitas copiar o respaldar sólo una tabla, o si no tienes activado el archivado de logs debido a restricciones de espacio y necesitas respaldar tu base de datos, y además no puedes dar de baja tu instancia mientras la respaldas, entonces exp es una buena opción.

Pero por alguna misteriosa razón exp (al menos hasta Oracle 10g) no tiene compresión y no puedes redirigir tu respaldo a la salida estándar por lo que podría ser difícil respaldar bases de datos grandes. Afortunadamente puedes usar tuberías nombradas para resolver esta situación; primero tienes que crear una tubería nombrada para conectar la salida de exp y la entrada de tu compresor:

[oracle]$ mknod mypipe p
[oracle]$ ls -la
total 8
drwxrwx--- 2 oracle dba 4096 May 30 16:47 .
drwxrwx--- 7 oracle dba 4096 May 30 16:45 ..
prw-r----- 1 oracle dba 0 May 30 16:47 mypipe

Entonces puedes lanzar tu compresor favorito para trabajar en segundo plano y finalmente ejecutar el comando exp, y tendrás un export comprimido al vuelo:

[oracle]$ compress < mypipe > mydb.dmp.Z &
[oracle]$ exp / parfile=myparfile.txt log=mylog.txt file=mypipe

Y recuerda, si quieres poner esto en un script agrega una sentencia wait después del comando exp.

jueves, 26 de enero de 2012

PeopleSoft, Oracle y un DBA sin suerte

Si eres un administrador de bases de datos Oracle, es posible que tengas que manejar bases de datos PeopleSoft. Son bases de datos grandes, complejas, que de pronto se les acaba el espacio temporal o se incrementa varias veces el tiempo de procesamiento usual, volviendo loco al administrador de bases de datos Oracle en el proceso.

En resumen, para soportar otros motores de bases de datos PeopleSoft usa tablas normales como tablas temporales y las etiqueta en la tabla PSRECDEFN como rectype=7, por lo tanto no puedes simplemente recolectar estadísticas de objetos como usualmente se hace debido a que las tablas temporales crecen mucho y se quedan vacías bastante rápido. Primero que nada, tienes que usar el script del apéndice A del PeopleSoft Enterprise Performance on Oracle 10g Database Red Paper, y si lees el documento completo valdrá la pena el tiempo invertido.

Esto es lo que sé de primera mano. El problema es que algunas veces este procedimiento especial de recolectar estadísticas no es suficiente y de todas formas tienes los problemas arriba mencionados, pero un compañero administrador de bases de datos Oracle después de analizar un montón de reportes de AWR, concluyó que ayuda recolectar estadísticas de los siguientes objetos:

DBMS_STATS.GATHER_TABLE_STATS (
OWNNAME => 'SYSADM',
TABNAME => 'PS_GP_ITER_TRGR',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
DEGREE => DBMS_STATS.AUTO_DEGREE,
CASCADE => TRUE);

DBMS_STATS.GATHER_TABLE_STATS (
OWNNAME => 'SYSADM',
TABNAME => 'PS_GP_RUNCTL',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
DEGREE => DBMS_STATS.AUTO_DEGREE,
CASCADE => TRUE);

DBMS_STATS.GATHER_TABLE_STATS (
OWNNAME => 'SYSADM',
TABNAME => 'PS_GP_CAL_RUN',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
DEGREE => DBMS_STATS.AUTO_DEGREE,
CASCADE => TRUE);

DBMS_STATS.GATHER_TABLE_STATS (
OWNNAME => 'SYSADM',
TABNAME => 'PS_GP_PYE_PRC_STAT',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
DEGREE => DBMS_STATS.AUTO_DEGREE,
CASCADE => TRUE);

DBMS_STATS.GATHER_TABLE_STATS (
OWNNAME => 'SYSADM',
TABNAME => 'PS_GP_HST_WRK',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
DEGREE => DBMS_STATS.AUTO_DEGREE,
CASCADE => TRUE);

analyze index SYSADM.PS_GP_PYE_SEG_STAT compute statistics;
analyze index SYSADM.PSAGP_PYE_PRC_STAT compute statistics;
analyze index SYSADM.PS_GP_PYE_PRC_STAT compute statistics;

No estoy seguro por qué este procedimiento resuelve problemas de desempeño y espacio temporal, pero funciona para mi y el administrador de bases de datos Oracle que escribió este procedimiento es muy bueno, por lo que podría funcionar para ti también.

Pusimos este procedimiento como un job diario en una base de datos PeopleSoft y en general trabaja bien, pero aún así hay problemas de vez en cuando con esta base de datos; esto me lleva a pensar que este procedimiento debe ejecutarse antes de programar una tarea de PeopleSoft grande o compleja ya que ejecutando este procedimiento no aparece ningún problema. Lo que quiero decir es que si tienen que correrse dos o más trabajos complejos de PeopleSoft en un día, sería mejor ejecutar este procedimiento antes de correr cada trabajo de PeopleSoft.

miércoles, 25 de enero de 2012

Revisando corrupción de bloques de datos

Si crees que una tabla podría tener bloques corruptos entonces puedes revisarla con el paquete DBMS_REPAIR. El procedimiento de revisión es muy simple: primero crea una tabla de reparación (en tu esquema) si no tienes una, después revisa la tabla con el procedimiento DBMS_REPAIR.CHECK_OBJECT, y finalmente revisa la tabla de reparación buscando registros de corrupción de bloques. Opcionalmente, puedes eliminar la tabla de reparación si no la vas a necesitar más.

myserver> sqlplus '/ as sysdba'

SQL*Plus: Release 10.2.0.4.0 - Production on Fri May 20 08:29:27 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> BEGIN
DBMS_REPAIR.ADMIN_TABLES (
TABLE_NAME => 'REPAIR_TABLE',
TABLE_TYPE => dbms_repair.repair_table,
ACTION => dbms_repair.create_action,
TABLESPACE => 'USERS');
END;
/

PL/SQL procedure successfully completed.

SQL> exit;

myserver> nohup sqlplus '/ as sysdba' @check.sql &
[1] 12263522
myserver> Sending nohup output to nohup.out.

myserver> tail -f nohup.out

SQL*Plus: Release 10.2.0.4.0 - Production on Fri May 20 08:29:27 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

number corrupt: 0

PL/SQL procedure successfully completed.

SQL> exit;

myserver> cat check.sql
SET SERVEROUTPUT ON
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
SCHEMA_NAME => 'MYSCHEMA',
OBJECT_NAME => 'MYTABLE',
REPAIR_TABLE_NAME => 'REPAIR_TABLE',
CORRUPT_COUNT => num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;
/
exit;

Como puedes ver, de acuerdo con el mensaje del procedimiento no hay bloques corruptos (number corrupt: 0), y si creaste la tabla de reparación justo antes de correr el procedimiento DBMS_REPAIR.CHECK_OBJECT entonces estará vacía también. Quizás notaste que decidí crear un script SQL (check.sql) y correrlo con nohup; si tienes una tabla muy grande y una conexión no muy buena al servidor de bases de datos, podría ser buena idea ejecutar el procedimiento con el comando nohup.

myserver> sqlplus '/ as sysdba'

SQL*Plus: Release 10.2.0.4.0 - Production on Fri May 20 08:29:27 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from REPAIR_TABLE;

no rows selected

SQL> BEGIN
DBMS_REPAIR.ADMIN_TABLES (
TABLE_NAME => 'REPAIR_TABLE',
TABLE_TYPE => dbms_repair.repair_table,
ACTION => dbms_repair.drop_action);
END;
/

PL/SQL procedure successfully completed.

SQL> exit;

Y si no tienes suerte y tienes una tabla con bloques corruptos, asegúrate de revisar la documentación de Oracle y entender qué significa reparar una tabla con corrupción de bloques.

martes, 24 de enero de 2012

Uso de índices en Oracle

Si quieres obtener estadísticas básicas de uso de índices usados recientemente en tu instancia de Oracle, puedes usar esta sentencia SQL:

SQL> select p.object_owner, p.object_name, sum(t.disk_reads_total) as disk_reads_sum,
sum(t.rows_processed_total) as rows_processed_sum from dba_hist_sql_plan p, dba_hist_sqlstat t
where p.sql_id = t.sql_id and p.object_type like '%INDEX%' and p.object_owner not in
('SYS','SYSTEM','SYSMAN','DBSNMP','OUTLN','TSMSYS')
group by p.object_owner, p.object_name order by p.object_owner, 4 desc;

OBJECT_OWNER OBJECT_NAME DISK_READS_SUM ROWS_PROCESSED_SUM
-------------------- ------------------------------- -------------- ------------------
MYSCHEMA01 IDX_MYTABLE01 620641 6209
MYSCHEMA01 IDX_MYTABLE02 569879 4965
MYSCHEMA01 IDX_MYTABLE03_PK 20 4793
MYSCHEMA01 IDX_MYTABLE04_PK 20 4793
MYSCHEMA02 IDX_MYTABLE05 414609 19940082
MYSCHEMA02 IDX_MYTABLE06 559721 3776187
MYSCHEMA02 IDX_MYTABLE07 1165298 621298
MYSCHEMA02 IDX_MYTABLE08_PK 795 107678
MYSCHEMA02 IDX_MYTABLE09_PK 174079 78627

viernes, 20 de enero de 2012

Alertas sin atender de Oracle

Desde Oracle 10g puedes configurar alertas para eventos de bases de datos como tamaño del tablespace (y muchas mas), y por default la instancia emite alertas sobre tamaño del tablespace, por lo cual puedes revisar todas las alertas y también corrupción de bloques de la base de datos con estas sentencias:

SQL> column REASON format A35
SQL> column SUGGESTED_ACTION format A35
SQL> column TIME_SUGGESTED format A35

SQL> select REASON, SUGGESTED_ACTION, TIME_SUGGESTED from dba_alert_history union
select REASON, SUGGESTED_ACTION, TIME_SUGGESTED from dba_outstanding_alerts
order by TIME_SUGGESTED;

REASON SUGGESTED_ACTION TIME_SUGGESTED
----------------------------------- ----------------------------------- -----------------------------------
Tablespace [UNDO] is [76 percent] f Add space to the tablespace 07-MAY-11 01.47.40.716220 AM -05:00
ull

Tablespace [UNDO] is [73 percent] f Add space to the tablespace 07-MAY-11 03.07.46.785262 AM -05:00
ull

SQL> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;

no rows selected

No es necesario decirlo, pero si hay datos en la vista V$DATABASE_BLOCK_CORRUPTION podrías tener serios problemas con tu base de datos.

jueves, 19 de enero de 2012

Instancias de Oracle que terminan abruptamente y sistemas de archivos en sólo lectura

Tienes un servidor Linux corriendo una o más instancias de Oracle, y un día todas las instancias están abajo excepto sus listeners. Revisas el log de alertas y no encuentras absolutamente nada, y si eres afortunado intentas levantar las instancias y obtienes un mensaje de error acerca de un sistema de archivos en modo de sólo lectura.

myserver> dbstart
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
Usage: /oracle/product/10.2.0/bin/dbstart ORACLE_HOME
touch: cannot touch `/oracle/product/10.2.0/startup.log': Read-only file system
chmod: changing permissions of `/oracle/product/10.2.0/startup.log': Read-only file system
Processing Database instance "mydb01": log file /oracle/product/10.2.0/startup.log
/oracle/product/10.2.0/bin/dbstart: line 361: /oracle/product/10.2.0/startup.log: Read-only file system
touch: cannot touch `/oracle/product/10.2.0/startup.log': Read-only file system
chmod: changing permissions of `/oracle/product/10.2.0/startup.log': Read-only file system
Processing Database instance "mydb02": log file /oracle/product/10.2.0/startup.log
/oracle/product/10.2.0/bin/dbstart: line 361: /oracle/product/10.2.0/startup.log: Read-only file system

myserver> touch /oracle/product/10.2.0/test.txt
touch: cannot touch `/oracle/product/10.2.0/test.txt': Read-only file system

Intentas crear un archivo con touch en el sistema de archivos de Oracle y no puedes, por lo que revisas el tiempo arriba del servidor, la carga y los sistemas de archivos montados:

myserver> uptime
11:34:30 up 138 days, 18:02, 1 user, load average: 0.00, 0.00, 0.00

myserver> mount
/dev/mapper/VolGroup01-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/cciss/c0d0p1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/appsvg-lv001 on /oracle type ext3 (rw,_netdev)

Todo se ve bien pero notas la opción _netdev en el sistema de archivos de Oracle. Cuando configuras sistemas de archivos en /etc/fstab y algunos de ellos son dependientes de la red, pones esta opción para que el sistema operativo no intente montarlos antes de tener conexión a la red.

Por lo tanto, tienes un sistema de archivos que es accesado a través de la red por lo que podría ser iSCSI:

myserver> /sbin/lsmod|grep iscsi
iscsi_tcp 19785 3
libiscsi_tcp 21957 2 iscsi_tcp,cxgb3i
libiscsi2 42181 5 ib_iser,iscsi_tcp,bnx2i,cxgb3i,libiscsi_tcp
scsi_transport_iscsi2 37709 7 ib_iser,iscsi_tcp,bnx2i,cxgb3i,libiscsi2
scsi_transport_iscsi 6085 1 scsi_transport_iscsi2
scsi_mod 141717 23 mptctl,ib_iser,iscsi_tcp,bnx2i,cxgb3i,libiscsi2,scsi_transport_iscsi2,scsi_dh,sg,qla2xxx,scsi_transport_fc,mptspi,scsi_transport_spi,mptsas,mptscsih,scsi_transport_sas,usb_storage,cciss,hpahcisr,sd_mod

myserver> /sbin/iscsiadm -m session -P 2
iscsiadm: Maybe you are not root?
iscsiadm: Could not lock discovery DB: /var/lock/iscsi/lock.write: Permission denied
Target: iqn.2000-03.com.someprovider:mycompany:87:mycmp1
Current Portal: 10.0.57.23:3260,1
Persistent Portal: 10.0.57.34:3260,1
**********
Interface:
**********
Iface Name: default
Iface Transport: tcp
Iface Initiatorname: iqn.1994-05.com.redhat:1234abc56d78
Iface IPaddress: 10.0.57.85
Iface HWaddress:
Iface Netdev:
SID: 1
iSCSI Connection State: Unknown
iSCSI Session State: LOGGED_IN
Internal iscsid Session State: Unknown
************************
Negotiated iSCSI params:
************************
HeaderDigest: None
DataDigest: None
MaxRecvDataSegmentLength: 262144
MaxXmitDataSegmentLength: 262144
FirstBurstLength: 262144
MaxBurstLength: 1048576
ImmediateData: Yes
InitialR2T: No
MaxOutstandingR2T: 1

Ese es el problema! Las instancias de Oracle terminan abruptamente porque no pueden escribir en los archivos de la base de datos, y si los logs están en los mismos sistemas de archivos Oracle no puede tampoco escribir mensajes de error. Este problema de conectividad podría ser debido a una carga pesada, a problemas intermitentes en la red, problemas con los dispositivos de almacenamiento o cualquier otra cosa, pero si el problema no es muy grave tu administrador de sistemas podría cambiar algunos parámetros iSCSI para aliviar un poco la situación:

node.conn[0].timeo.noop_out_interval = 0
node.conn[0].timeo.noop_out_timeout = 0
node.session.timeo.replacement_timeout = 86400

Más información:

Filesystems becoming read-only on iSCSI
Linux* Open-iSCSI

miércoles, 18 de enero de 2012

Revisando instancias de Data Guard

Si tienes bases de datos Oracle configuradas con Data Guard, podrías querer estar seguro de que todo está bien y los archivos son transmitidos a y cargados en tu base de datos en espera. Puedes hacer esto fácilmente ejecutando este script en tu instancia primaria:

COLUMN ARCHIVE_NAME FORMAT A35
COLUMN TRANSMITTED FORMAT A18
COLUMN STDBY_APPLIED FORMAT A10
COLUMN PRI_ARCH, FORMAT A10
COLUMN STDBY_DEST FORMAT A10

select case when remote.sequence# is null
then 'NOT TRANSMITTED!'
else 'transmitted'
end as TRANSMITTED,
remote.applied as STDBY_APPLIED,
local.sequence# PRI_SEQ#,
local.archived PRI_ARCH,
remote.standby_dest STDBY_DEST,
remote.sequence# STDBY_SEQ#,
current_seq#, status_db
from (
(select *
from (
select v$instance.status as status_db,instance_role,
sequence# current_seq#, (sequence#-11) secuencia
from v$log, v$instance
where v$log.status = 'CURRENT'
), v$archived_log l
where dest_id = 1
and l.sequence# > secuencia) local
left join
(select * from v$archived_log where dest_id = 2) remote
on local.sequence# = remote.sequence# and
local.thread# = remote.thread#
)
order by local.sequence# desc;

El significado de los campos es:

TRANSMITTED si el log archivado fue transferido a la instancia en espera
STDBY_APPLIED si el log archivado fue aplicado a la base de datos en espera
PRI_SEQ# numero de secuencia del log de la base de datos primaria
PRI_ARCH si el log fue archivado
STDBY_SEQ# numero de secuencia del log de la base de datos en espera
CURRENT_SEQ# numero de secuencia actual
STATUS_DB estado de la instancia primaria

Como puedes ver en este ejemplo, la base de datos en espera está actualizada y todo está bien:

TRANSMITTED STDBY_APPL PRI_SEQ# PRI STDBY_DEST STDBY_SEQ# CURRENT_SEQ# STATUS_DB
------------------ ---------- ---------- --- ---------- ---------- ------------ ------------
transmitted YES 788 YES YES 788 789 OPEN
transmitted YES 787 YES YES 787 789 OPEN
transmitted YES 786 YES YES 786 789 OPEN
transmitted YES 785 YES YES 785 789 OPEN
transmitted YES 784 YES YES 784 789 OPEN
transmitted YES 783 YES YES 783 789 OPEN
transmitted YES 782 YES YES 782 789 OPEN
transmitted YES 781 YES YES 781 789 OPEN
transmitted YES 780 YES YES 780 789 OPEN
transmitted YES 779 YES YES 779 789 OPEN

10 rows selected.

En este ejemplo, todos los logs archivados han sido transferidos a la base de datos en espera pero no han sido aplicados, en este caso debido a que la base de datos en espera está abierta en modo de sólo lectura:

TRANSMITTED STDBY_APPL PRI_SEQ# PRI STDBY_DEST STDBY_SEQ# CURRENT_SEQ# STATUS_DB
------------------ ---------- ---------- --- ---------- ---------- ------------ ------------
transmitted NO 387 YES YES 387 388 OPEN
transmitted NO 386 YES YES 386 388 OPEN
transmitted NO 385 YES YES 385 388 OPEN
transmitted NO 384 YES YES 384 388 OPEN
transmitted NO 383 YES YES 383 388 OPEN
transmitted NO 382 YES YES 382 388 OPEN
transmitted NO 381 YES YES 381 388 OPEN
transmitted NO 380 YES YES 380 388 OPEN
transmitted NO 379 YES YES 379 388 OPEN
transmitted NO 378 YES YES 378 388 OPEN

10 rows selected.

Este script funciona siempre y cuando el parámetro LOG_ARCHIVE_DEST_2 apunte a la base de datos en espera.

Y sólo para el registro no todo en este blog es mi idea, por ejemplo este script fue idea de un compañero administrador de bases de datos. Algunas veces obtengo ideas de internet, algunas veces de mis compañeros de trabajo, y aunque no lo creas, algunas veces tengo mis propias ideas!

martes, 17 de enero de 2012

Fallando respaldo con expdp y la tabla maestra

Estás intentando hacer un respaldo de tu base de datos Oracle con Data Pump, y expdp termina casi al instante con este mensaje de error:

ORA-31626: job does not exist
ORA-31633: unable to create master table "MYUSER.EXPDP_MYDB_BCK"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPV$FT", line 871
ORA-00955: name is already used by an existing object

Si tu no escribiste el script que ejecuta Data Pump y tienes poca experiencia con expdp podrías no saber lo que significa este error, pero es bastante simple: la tabla maestra (en este caso MYUSER.EXPDP_MYDB_BCK) u otro objeto con este nombre existe por lo que Data Pump no puede crearla, y es necesaria para hacer el respaldo. Podría existir debido a que expdp no terminó su ejecución apropiadamente la última vez que corrió, por lo que la tabla maestra no fue borrada.

La solución es también bastante simple: si no necesitas esta tabla solo bórrala, o cambia el nombre de la tabla maestra en los parámetros de Data Pump si necesitas este objeto y no está relacionado al respaldo con Data Pump.

Más información:

Oracle Data Pump in Oracle Database 10g

lunes, 16 de enero de 2012

Data Guard y procesos de archivado terminando su ejecución

Hace algún tiempo configuraste un par de instancias con Data Guard y desde entonces todo funcionó bien, hasta que abriste en modo de sólo lectura tu instancia en espera y entonces los procesos de archivado de la instancia primaria comenzaron a terminar su ejecución y estos mensajes empezaron a aparecer en el alert log de la instancia primaria:

Thu Mar 17 15:32:49 2011
******************************************************************
LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_lns1_17449.trc (incident=356411):
ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], [], [], [], [], []
Thu Mar 17 15:32:53 2011
Sweep Incident[356411]: completed
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_lns1_17449.trc (incident=356412):
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_lns1_17449.trc:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_lns1_17449.trc:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_lns1_17449.trc:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_lns1_17449.trc:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Thu Mar 17 15:32:57 2011
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_arc0_17142.trc (incident=361859):
ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_arc0_17142.trc (incident=361860):
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_arc0_17142.trc:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []
Errors in file /oracle_11g/product/diag/rdbms/mydb/mydb/trace/mydb_arc0_17142.trc:
ORA-00600: internal error code, arguments: [], [], [], [], [], [], [], [], [], [], [], []

Como quizás sepas, un error ORA-00600 significa algo así como "no tengo idea de qué pasó por lo que voy a mandar un error ORA-00600". Este tipo de situaciones son muy difíciles de diagnosticar, pero después de trabajar duro (mi compañero administrador de bases de datos) nos dimos cuenta que había un problema de falta de permisos en el directorio /var/tmp, donde Oracle pone los sockets para el listener.

Los directorios y permisos de /var/tmp deben ser algo como esto:

myserver> ls -la /var/tmp
total 12
drwxrwxrwt 3 root root 4096 2011-03-18 10:10 .
drwxr-xr-x 16 root root 4096 2010-02-05 13:14 ..
drwxrwxrwt 2 root dba 4096 2011-03-18 08:13 .oracle
myserver> ls -la /var/tmp/.oracle/
total 8
drwxrwxrwt. 2 root dba 4096 2011-05-04 08:17 .
drwxrwxrwt. 3 root root 4096 2011-05-04 09:18 ..
srwxrwxrwx. 1 oracle dba 0 2010-12-17 11:47 s#6115.1
srwxrwxrwx. 1 oracle dba 0 2010-12-17 11:47 s#6115.2
srwxrwxrwx. 1 oracle dba 0 2011-01-12 16:48 s#7018.1
srwxrwxrwx. 1 oracle dba 0 2011-01-12 16:48 s#7018.2
srwxrwxrwx. 1 oracle dba 0 2010-05-12 12:31 s#7662.1
srwxrwxrwx. 1 oracle dba 0 2010-05-12 12:31 s#7662.2
srwxrwxrwx. 1 oracle dba 0 2010-05-11 15:58 sEXTPROC_FOR_XE
srwxrwxrwx 1 oracle dba 0 2011-05-04 08:17 smyserverDBG_CSSD
srwxrwxrwx 1 oracle dba 0 2011-05-04 08:17 sOCSSD_LL_myserver_localhost
srwxrwxrwx 1 oracle dba 0 2011-05-04 08:17 sOracle_CSS_LclLstnr_localhost_0

Por lo tanto, después de arreglar los permisos en /var/tmp y reiniciar el listener de la instancia primaria y el envío de archive logs, el problema desapareció.

viernes, 13 de enero de 2012

Obteniendo información básica de un sistema AIX

Algunas veces podrías necesitar conocer información básica acerca de tu servidor AIX como el tiempo arriba (uptime), versión del sistema operativo (oslevel), versión de firmware (lsmcode), parámetros del sistema operativo (lsattr), hardware (lscfg) o incluso errores de dispositivos de almacenamiento (errpt), por lo cual puse esta transcripción como referencia. Algunos parámetros son fáciles de entender y otros son sólo para administradores de sistemas experimentados, pero esta información podría ser de ayuda para un administrador de bases de datos Oracle trabajando en un servidor AIX.

myserver> uptime
04:34PM up 79 days, 5:52, 1 user, load average: 1.20, 1.13, 1.11

myserver> oslevel -r
5300-11

myserver> lsmcode -c
The current permanent system firmware image is SF240_320
The current temporary system firmware image is SF240_332
The system is currently booted from the temporary firmware image.

myserver> lsattr -E -l sys0
SW_dist_intr false Enable SW distribution of interrupts True
autorestart true Automatically REBOOT system after a crash True
boottype disk N/A False
capacity_inc 1.00 Processor capacity increment False
capped true Partition is capped False
conslogin enable System Console Login False
cpuguard enable CPU Guard True
dedicated true Partition is dedicated False
ent_capacity 2.00 Entitled processor capacity False
frequency 1056000000 System Bus Frequency False
fullcore false Enable full CORE dump True
fwversion IBM,SF240_320 Firmware version and revision levels False
id_to_partition 0X80000819C3F00009 Partition ID False
id_to_system 0X80000819C3F00000 System ID False
iostat false Continuously maintain DISK I/O history True
keylock normal State of system keylock at boot time False
log_pg_dealloc true Log predictive memory page deallocation events True
max_capacity 3.00 Maximum potential processor capacity False
max_logname 9 Maximum login name length at boot time True
maxbuf 20 Maximum number of pages in block I/O BUFFER CACHE True
maxmbuf 0 Maximum Kbytes of real memory allowed for MBUFS True
maxpout 0 HIGH water mark for pending write I/Os per file True
maxuproc 1024 Maximum number of PROCESSES allowed per user True
min_capacity 2.00 Minimum potential processor capacity False
minpout 0 LOW water mark for pending write I/Os per file True
modelname IBM,9119-590 Machine name False
ncargs 512 ARG/ENV list size in 4K byte blocks True
nfs4_acl_compat secure NFS4 ACL Compatibility Mode True
pre430core false Use pre-430 style CORE dump True
pre520tune disable Pre-520 tuning compatibility mode True
realmem 18874368 Amount of usable physical memory in Kbytes False
rtasversion 1 Open Firmware RTAS version False
sed_config select Stack Execution Disable (SED) Mode True
systemid IBM,02025224F Hardware system identifier False
variable_weight 0 Variable processor capacity weight False

myserver> lscfg
INSTALLED RESOURCE LIST

The following resources are installed on the machine.
+/- = Added or deleted from Resource List.
* = Diagnostic support not available.

Model Architecture: chrp
Model Implementation: Multiple Processor, PCI bus

+ sys0 System Object
+ sysplanar0 System Planar
* pci45 U5791.001.9920F70-P1 PCI Bus
* pci46 U5791.001.9920F70-P1 PCI Bus
+ fcs2 U5791.001.9920F70-P1-C08-T1 FC Adapter
* fcnet2 U5791.001.9920F70-P1-C08-T1 Fibre Channel Network Protocol Device
+ fscsi2 U5791.001.9920F70-P1-C08-T1 FC SCSI I/O Controller Protocol Device
* hdisk5 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LF0000000000000 EMC Symmetrix FCP Raid1
* hdiskpower0 U5791.001.9920F70-P1-C08-T1-L40 PowerPath Device
* hdiskpower1 U5791.001.9920F70-P1-C08-T1-L41 PowerPath Device
* hdiskpower2 U5791.001.9920F70-P1-C08-T1-L42 PowerPath Device
* hdiskpower3 U5791.001.9920F70-P1-C08-T1-L43 PowerPath Device
* hdiskpower4 U5791.001.9920F70-P1-C08-T1-L44 PowerPath Device
* hdiskpower5 U5791.001.9920F70-P1-C08-T1-L45 PowerPath Device
* hdiskpower6 U5791.001.9920F70-P1-C08-T1-L46 PowerPath Device
* hdiskpower7 U5791.001.9920F70-P1-C08-T1-L47 PowerPath Device
* hdiskpower8 U5791.001.9920F70-P1-C08-T1-L48 PowerPath Device
* hdiskpower9 U5791.001.9920F70-P1-C08-T1-L49 PowerPath Device
* hdiskpower10 U5791.001.9920F70-P1-C08-T1-L50 PowerPath Device
* hdiskpower11 U5791.001.9920F70-P1-C08-T1-L51 PowerPath Device
* hdiskpower12 U5791.001.9920F70-P1-C08-T1-L52 PowerPath Device
* hdiskpower13 U5791.001.9920F70-P1-C08-T1-L53 PowerPath Device
* hdiskpower14 U5791.001.9920F70-P1-C08-T1-L54 PowerPath Device
* hdiskpower15 U5791.001.9920F70-P1-C08-T1-L55 PowerPath Device
* hdiskpower16 U5791.001.9920F70-P1-C08-T1-L56 PowerPath Device
* hdiskpower17 U5791.001.9920F70-P1-C08-T1-L57 PowerPath Device
* hdiskpower18 U5791.001.9920F70-P1-C08-T1-L58 PowerPath Device
* hdiskpower19 U5791.001.9920F70-P1-C08-T1-L60 PowerPath Device
* hdiskpower20 U5791.001.9920F70-P1-C08-T1-L61 PowerPath Device
* hdiskpower21 U5791.001.9920F70-P1-C08-T1-L62 PowerPath Device
* hdiskpower22 U5791.001.9920F70-P1-C08-T1-L63 PowerPath Device
* hdiskpower23 U5791.001.9920F70-P1-C08-T1-L64 PowerPath Device
* hdiskpower24 U5791.001.9920F70-P1-C08-T1-L65 PowerPath Device
* hdiskpower25 U5791.001.9920F70-P1-C08-T1-L66 PowerPath Device
* hdiskpower26 U5791.001.9920F70-P1-C08-T1-L59 PowerPath Device
* hdisk67 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L11000000000000 EMC Symmetrix FCP Raid5
* hdisk68 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L12000000000000 EMC Symmetrix FCP Raid5
* hdisk69 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L13000000000000 EMC Symmetrix FCP Raid5
* hdisk70 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L14000000000000 EMC Symmetrix FCP Raid5
* hdisk71 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L15000000000000 EMC Symmetrix FCP Raid5
* hdisk72 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L16000000000000 EMC Symmetrix FCP Raid5
* hdisk73 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L17000000000000 EMC Symmetrix FCP Raid5
* hdisk74 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L18000000000000 EMC Symmetrix FCP Raid5
* hdisk75 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L10A000000000000 EMC Symmetrix FCP Raid5
* hdisk78 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LF5000000000000 EMC Symmetrix FCP Raid5
* hdisk79 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LF6000000000000 EMC Symmetrix FCP Raid5
* hdisk107 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L2000000000000 EMC Symmetrix FCP Raid5
* hdisk108 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L3000000000000 EMC Symmetrix FCP Raid5
* hdisk109 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L4000000000000 EMC Symmetrix FCP Raid5
* hdisk110 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L5000000000000 EMC Symmetrix FCP Raid5
* hdisk111 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L6000000000000 EMC Symmetrix FCP Raid5
* hdisk112 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L7000000000000 EMC Symmetrix FCP Raid5
* hdisk113 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L8000000000000 EMC Symmetrix FCP Raid5
* hdisk114 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L9000000000000 EMC Symmetrix FCP Raid5
* hdisk115 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LA000000000000 EMC Symmetrix FCP Raid5
* hdisk116 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LB000000000000 EMC Symmetrix FCP Raid5
* hdisk117 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LC000000000000 EMC Symmetrix FCP Raid5
* hdisk118 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LD000000000000 EMC Symmetrix FCP Raid5
* hdisk119 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LE000000000000 EMC Symmetrix FCP Raid5
* hdisk120 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-LF000000000000 EMC Symmetrix FCP Raid5
* hdisk121 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L10000000000000 EMC Symmetrix FCP Raid5
* hdisk122 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L100000000000000 EMC Symmetrix FCP Raid5
* hdisk123 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L101000000000000 EMC Symmetrix FCP Raid5
* hdisk124 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L102000000000000 EMC Symmetrix FCP Raid5
* hdisk125 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L103000000000000 EMC Symmetrix FCP Raid5
* hdisk126 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L104000000000000 EMC Symmetrix FCP Raid5
* hdisk127 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L105000000000000 EMC Symmetrix FCP Raid5
* hdisk128 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L106000000000000 EMC Symmetrix FCP Raid5
* hdisk129 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L107000000000000 EMC Symmetrix FCP Raid5
* hdisk130 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L109000000000000 EMC Symmetrix FCP Raid5
* hdisk131 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L110000000000000 EMC Symmetrix FCP Raid5
* hdisk132 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L111000000000000 EMC Symmetrix FCP Raid5
* hdisk133 U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L112000000000000 EMC Symmetrix FCP Raid5
* hdiskpower27 U5791.001.9920F70-P1-C08-T1-L29 PowerPath Device
* hdiskpower28 U5791.001.9920F70-P1-C08-T1-L30 PowerPath Device
* hdiskpower29 U5791.001.9920F70-P1-C08-T1-L31 PowerPath Device
* hdiskpower30 U5791.001.9920F70-P1-C08-T1-L32 PowerPath Device
* hdiskpower31 U5791.001.9920F70-P1-C08-T1-L33 PowerPath Device
* hdiskpower32 U5791.001.9920F70-P1-C08-T1-L34 PowerPath Device
* hdiskpower33 U5791.001.9920F70-P1-C08-T1-L35 PowerPath Device
* hdiskpower34 U5791.001.9920F70-P1-C08-T1-L36 PowerPath Device
* hdiskpower35 U5791.001.9920F70-P1-C08-T1-L37 PowerPath Device
* hdiskpower36 U5791.001.9920F70-P1-C08-T1-L38 PowerPath Device
* hdiskpower37 U5791.001.9920F70-P1-C08-T1-L39 PowerPath Device
* pci15 U5791.001.9920F6T-P2 PCI Bus
* pci25 U5791.001.9920F6T-P2 PCI Bus
+ scsi12 U5791.001.9920F6T-P2-T6 Wide/Ultra-3 SCSI I/O Controller
+ hdisk18 U5791.001.9920F6T-P2-T6-L8-L0 16 Bit LVD SCSI Disk Drive (73400 MB)
+ hdisk19 U5791.001.9920F6T-P2-T6-L9-L0 16 Bit LVD SCSI Disk Drive (73400 MB)
+ ses10 U5791.001.9920F6T-P2-T6-L15-L0 SCSI Enclosure Services Device
* pci4 U5791.001.9920F6H-P1 PCI Bus
* pci5 U5791.001.9920F6H-P1 PCI Bus
+ ent0 U5791.001.9920F6H-P1-C09-T1 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
+ ent1 U5791.001.9920F6H-P1-C09-T2 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
* vio0 Virtual I/O Bus
* ent3 U9119.590.025224F-V9-C2-T1 Virtual I/O Ethernet Adapter (l-lan)
* vsa0 U9119.590.025224F-V9-C0 LPAR Virtual Serial Adapter
* vty0 U9119.590.025224F-V9-C0-L0 Asynchronous Terminal
* pci0 U5791.001.9920F6W-P1 PCI Bus
* pci44 U5791.001.9920F6W-P1 PCI Bus
+ fcs0 U5791.001.9920F6W-P1-C09-T1 FC Adapter
* fcnet0 U5791.001.9920F6W-P1-C09-T1 Fibre Channel Network Protocol Device
+ fscsi0 U5791.001.9920F6W-P1-C09-T1 FC SCSI I/O Controller Protocol Device
* hdisk2 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LF0000000000000 EMC Symmetrix FCP Raid1
* hdisk58 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L11000000000000 EMC Symmetrix FCP Raid5
* hdisk59 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L12000000000000 EMC Symmetrix FCP Raid5
* hdisk60 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L13000000000000 EMC Symmetrix FCP Raid5
* hdisk61 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L14000000000000 EMC Symmetrix FCP Raid5
* hdisk62 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L15000000000000 EMC Symmetrix FCP Raid5
* hdisk63 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L16000000000000 EMC Symmetrix FCP Raid5
* hdisk64 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L17000000000000 EMC Symmetrix FCP Raid5
* hdisk65 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L18000000000000 EMC Symmetrix FCP Raid5
* hdisk66 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L10A000000000000 EMC Symmetrix FCP Raid5
* hdisk76 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LF5000000000000 EMC Symmetrix FCP Raid5
* hdisk77 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LF6000000000000 EMC Symmetrix FCP Raid5
* hdisk80 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L2000000000000 EMC Symmetrix FCP Raid5
* hdisk81 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L3000000000000 EMC Symmetrix FCP Raid5
* hdisk82 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L4000000000000 EMC Symmetrix FCP Raid5
* hdisk83 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L5000000000000 EMC Symmetrix FCP Raid5
* hdisk84 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L6000000000000 EMC Symmetrix FCP Raid5
* hdisk85 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L7000000000000 EMC Symmetrix FCP Raid5
* hdisk86 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L8000000000000 EMC Symmetrix FCP Raid5
* hdisk87 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L9000000000000 EMC Symmetrix FCP Raid5
* hdisk88 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LA000000000000 EMC Symmetrix FCP Raid5
* hdisk89 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LB000000000000 EMC Symmetrix FCP Raid5
* hdisk90 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LC000000000000 EMC Symmetrix FCP Raid5
* hdisk91 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LD000000000000 EMC Symmetrix FCP Raid5
* hdisk92 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LE000000000000 EMC Symmetrix FCP Raid5
* hdisk93 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-LF000000000000 EMC Symmetrix FCP Raid5
* hdisk94 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L10000000000000 EMC Symmetrix FCP Raid5
* hdisk95 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L100000000000000 EMC Symmetrix FCP Raid5
* hdisk96 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L101000000000000 EMC Symmetrix FCP Raid5
* hdisk97 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L102000000000000 EMC Symmetrix FCP Raid5
* hdisk98 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L103000000000000 EMC Symmetrix FCP Raid5
* hdisk99 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L105000000000000 EMC Symmetrix FCP Raid5
* hdisk100 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L106000000000000 EMC Symmetrix FCP Raid5
* hdisk101 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L107000000000000 EMC Symmetrix FCP Raid5
* hdisk102 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L109000000000000 EMC Symmetrix FCP Raid5
* hdisk103 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L110000000000000 EMC Symmetrix FCP Raid5
* hdisk104 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L111000000000000 EMC Symmetrix FCP Raid5
* hdisk105 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L112000000000000 EMC Symmetrix FCP Raid5
* hdisk106 U5791.001.9920F6W-P1-C09-T1-W5006048ACC36E4EC-L113000000000000 EMC Symmetrix FCP Raid5
+ fcs1 U5791.001.9920F6W-P1-C09-T2 FC Adapter
* fcnet1 U5791.001.9920F6W-P1-C09-T2 Fibre Channel Network Protocol Device
+ fscsi1 U5791.001.9920F6W-P1-C09-T2 FC SCSI I/O Controller Protocol Device
* rmt1 U5791.001.9920F6W-P1-C09-T2-W100000E00223B4FE-L1000000000000 Other FC SCSI Tape Drive
* rmt2 U5791.001.9920F6W-P1-C09-T2-W100000E00223B4FE-L2000000000000 Other FC SCSI Tape Drive
* rmt3 U5791.001.9920F6W-P1-C09-T2-W100000E00223D755-L0 Other FC SCSI Tape Drive
* rmt4 U5791.001.9920F6W-P1-C09-T2-W100000E00223D755-L1000000000000 Other FC SCSI Tape Drive
* rmt5 U5791.001.9920F6W-P1-C09-T2-W100000E00223FF7A-L0 Other FC SCSI Tape Drive
* rmt6 U5791.001.9920F6W-P1-C09-T2-W100000E002240263-L0 Other FC SCSI Tape Drive
* rmt0 U5791.001.9920F6W-P1-C09-T2-W100000E00223FF7A-L1000000000000 Other FC SCSI Tape Drive
* rmt7 U5791.001.9920F6W-P1-C09-T2-W100000E002240263-L1000000000000 Other FC SCSI Tape Drive
+ L2cache0 L2 Cache
+ mem0 Memory
+ proc0 Processor
+ proc2 Processor

myserver> errpt -a|more
---------------------------------------------------------------------------
LABEL: SC_DISK_ERR2
IDENTIFIER: B6267342

Date/Time: Mon Dec 13 06:53:34 CST 2010
Sequence Number: 000007
Machine Id: 001122334400
Node Id: myserver
Class: H
Type: PERM
Resource Name: hdisk111
Resource Class: disk
Resource Type: SYMM_RAID5
Location: U5791.001.9920F70-P1-C08-T1-W5006048ACC36E4E3-L6000000000000
VPD:
Manufacturer................EMC
Machine Type and Model......SYMMETRIX
ROS Level and ID............5671
Serial Number...............12345678
Part Number.................000000000000510023010187
EC Level....................751315
LIC Node VPD................0AA3
Device Specific.(Z0)........04
Device Specific.(Z1)........51
Device Specific.(Z2)........567100750000000000092508
Device Specific.(Z3)........12000000
Device Specific.(Z4)........54130008
Device Specific.(Z5)........BF80
Device Specific.(Z6)........4D

Description
DISK OPERATION ERROR

Probable Causes
DASD DEVICE

Failure Causes
DISK DRIVE
DISK DRIVE ELECTRONICS

Recommended Actions
PERFORM PROBLEM DETERMINATION PROCEDURES

Detail Data
PATH ID
0
SENSE DATA
0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0118 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0083 0000
0000 003D 0019
---------------------------------------------------------------------------
LABEL: SC_DISK_ERR2
IDENTIFIER: B6267342

Date/Time: Mon Dec 13 06:53:34 CST 2010
Sequence Number: 000006
Machine Id: 001122334400

jueves, 12 de enero de 2012

Configurando Transparent Application Failover

De acuerdo con Oracle (traducción mía):

"Transparent Application Failover (TAF) es una característica del manejador Java Database Connectivity (JDBC) Oracle Call Interface (OCI). Permite a la aplicación reconectarse automáticamente a una base de datos, si falla la conexión a la instancia de la base de datos".

Por lo tanto, si tienes algunas instancias corriendo con Data Guard puedes configurar TAF en esas instancias y tener recuperación de fallas automática, lo cual implica crear un servicio controlado por un trigger de la base de datos que estará arriba sólo en la instancia primaria, como puedes ver en esta transcripción:

myserver >sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on Tue Feb 1 15:19:59 2011

Copyright (c) 1982, 2008, Oracle. All rights reserved.

SQL> connect / as sysdba

Connected.

SQL> EXEC DBMS_SERVICE.CREATE_SERVICE (service_name => 'taf_mydb',
network_name => 'taf_mydb', aq_ha_notifications => TRUE,
failover_method => 'BASIC', failover_type => 'SESSION',
failover_retries => 180, failover_delay => 5);

PL/SQL procedure successfully completed.

SQL> CREATE OR REPLACE TRIGGER SYS.MANAGE_TAF_SERVICE
AFTER STARTUP ON DATABASE
DECLARE
ROLE VARCHAR(30) := NULL;
BEGIN
SELECT TRIM(DATABASE_ROLE) INTO ROLE FROM V$DATABASE;
IF ROLE = 'PRIMARY' THEN
DBMS_SERVICE.START_SERVICE('taf_mydb');
ELSE
DBMS_SERVICE.STOP_SERVICE('taf_mydb');
END IF;
END;
/

Trigger created.

SQL> alter system archive log current;

System altered.

SQL> exit;

myserver >lsnrctl status LISTENER_mydb

LSNRCTL for Linux: Version 11.1.0.7.0 - Production on 01-FEB-2011 15:29:03

Copyright (c) 1991, 2008, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.50)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER_mydb
Version TNSLSNR for Linux: Version 11.1.0.7.0 - Production
Start Date 31-JAN-2011 15:47:49
Uptime 0 days 23 hr. 41 min. 14 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle_11g/product/11.1.0/network/admin/listener.ora
Listener Log File /oracle_11g/product/diag/tnslsnr/myserver/listener_mydb/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.50)(PORT=1521)))
Services Summary...
Service "taf_mydb" has 1 instance(s).
Instance "mydb", status READY, has 1 handler(s) for this service...
Service "mydb" has 2 instance(s).
Instance "mydb", status UNKNOWN, has 1 handler(s) for this service...
Instance "mydb", status READY, has 2 handler(s) for this service...
Service "mydb_XPT" has 1 instance(s).
Instance "mydb", status READY, has 1 handler(s) for this service...
The command completed successfully

Tienes que hacer la configuración arriba mencionada sólo en tu base de datos primaria, y esta configuración será propagada a la base de datos en espera con la sentencia alter system archive log current.

Si leíste cuidadosamente y entendiste el primer párrafo de este mensaje, te habrás dado cuenta que TAF es de hecho implementado del lado del cliente; tu configuraste las instancias para lanzar un servicio especial que estará activo sólo en la instancia primaria en todo momento, pero el cliente es quien decide a qué servicio conectarse. Por lo tanto, tienes que configurar el tnsnames de esta forma:

MYDATABASE =
(DESCRIPTION =
(LOAD_BALANCE = OFF)
(FAILOVER = ON)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.50) (PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.60) (PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = taf_mydb)
(FAILOVER_MODE =
(TYPE = SESSION)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)

En este ejemplo, te conectarás a MYDATABASE que está compuesto por la instancia primaria (192.168.1.50) y la instancia en espera (192.168.1.60). Y si vas a usar Java, no olvides que TAF no funciona con los manejadores Thin, tienes que usar los manejadores OCI. Recordar esto puede salvarte de muchos problemas con tus compañeros administradores de WAS.

Más información:

Failover Connections for Data Guard Error with ORA-1033 [ID 461874.1]
Transparent Application Failover

miércoles, 11 de enero de 2012

Revisando el estado de operaciones de RMAN

Si respaldas tu base de datos Oracle con RMAN y quieres revisar la ejecución de las operaciones de RMAN, puedes usar la vista V$RMAN_STATUS como en el siguiente ejemplo:

SQL> select COMMAND_ID, OPERATION, STATUS, END_TIME from V$RMAN_STATUS WHERE END_TIME > sysdate - 5;

COMMAND_ID OPERATION STATUS END_TIME
----------------------- --------------------------------- ------------- ---------
2010-11-26T23:05:29 RMAN COMPLETED 26-NOV-10
backup_level_1 BACKUP COMPLETED 26-NOV-10
backup_level_1 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 26-NOV-10
backup_level_1 BACKUP COMPLETED 26-NOV-10
backup_level_1 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 26-NOV-10
2010-11-27T22:56:51 RMAN COMPLETED 27-NOV-10
backup_level_1 BACKUP COMPLETED 27-NOV-10
backup_level_1 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 27-NOV-10
backup_level_1 BACKUP COMPLETED 27-NOV-10
backup_level_1 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 27-NOV-10
2010-11-28T22:55:34 RMAN COMPLETED 29-NOV-10
backup_level_0 DELETE COMPLETED 28-NOV-10
backup_level_0 BACKUP COMPLETED 29-NOV-10
backup_level_0 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 29-NOV-10
backup_level_0 BACKUP COMPLETED 29-NOV-10
backup_level_0 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 29-NOV-10
backup_level_0 DELETE COMPLETED 29-NOV-10
backup_level_0 DELETE COMPLETED 29-NOV-10
2010-11-30T22:49:31 RMAN COMPLETED 30-NOV-10
backup_level_1 BACKUP COMPLETED 30-NOV-10
backup_level_1 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 30-NOV-10
backup_level_1 BACKUP COMPLETED 30-NOV-10
backup_level_1 CONTROL FILE AND SPFILE AUTOBACK COMPLETED 30-NOV-10

23 rows selected.

martes, 10 de enero de 2012

Revisando el estado de servidores de aplicaciones

Si trabajas como administrador de bases de datos Progress (no, de verdad?) y necesitas revisar el estado de un servidor de aplicaciones, puedes hacerlo de esta manera:

MYSERVER:/home/progress:> asbman -i myasb -q
PROGRESS Version 9.1E as of Tue Oct 12 14:40:19 EDT 2004


Connecting to Progress AdminServer using rmi://localhost:20931/Chimera (8280)
Searching for myasb (8288)
Connecting to myasb (8276)

Broker Name : myasb
Operating Mode : State-reset
Broker Status : ACTIVE
Broker Port : 3058
Broker PID : 25482
Active Servers : 15
Busy Servers : 15
Locked Servers : 0
Available Servers : 0
Active Clients (now, peak) : (0, 3)
Client Queue Depth (cur, max) : (0, 3)
Total Requests : 186
Rq Wait (max, avg) : (18006 ms, 9276 ms)
Rq Duration (max, avg) : (18007 ms, 9277 ms)

PID State Port nRq nRcvd nSent Started Last Change
25577 CONNECTED 03502 000003 000003 000003 Jan 26, 2011 13:14 Jan 26, 2011 13:14
25714 CONNECTED 03503 000003 000003 000003 Jan 26, 2011 13:14 Jan 26, 2011 13:14
25718 CONNECTED 03504 000015 000015 000015 Jan 26, 2011 13:14 Jan 26, 2011 14:24
25722 CONNECTED 03505 000013 000013 000013 Jan 26, 2011 13:14 Jan 26, 2011 14:24
27113 CONNECTED 03506 000014 000014 000014 Jan 26, 2011 13:16 Jan 26, 2011 13:21
29966 CONNECTED 03507 000002 000002 000002 Jan 26, 2011 13:21 Jan 26, 2011 13:21
30012 CONNECTED 03508 000006 000006 000006 Jan 26, 2011 13:21 Jan 26, 2011 13:22
31236 CONNECTED 03509 000003 000003 000003 Jan 26, 2011 13:22 Jan 26, 2011 13:22
31291 CONNECTED 03510 000010 000010 000010 Jan 26, 2011 13:22 Jan 26, 2011 13:24
31295 CONNECTED 03511 000005 000005 000005 Jan 26, 2011 13:22 Jan 26, 2011 13:24
31299 CONNECTED 03512 000004 000004 000004 Jan 26, 2011 13:22 Jan 26, 2011 13:24
31646 CONNECTED 03513 000002 000002 000002 Jan 26, 2011 13:24 Jan 26, 2011 13:24
31650 CONNECTED 03514 000008 000008 000008 Jan 26, 2011 13:24 Jan 26, 2011 13:26
00439 CONNECTED 03515 000002 000002 000002 Jan 26, 2011 13:26 Jan 26, 2011 13:26
00443 CONNECTED 03516 000007 000007 000007 Jan 26, 2011 13:26 Jan 26, 2011 13:31

Como puedes ver, este servidor de aplicaciones tiene 15 servidores activos y una larga espera en peticiones, y debido a que el límite de conexiones en la licencia de este servidor de aplicaciones es de hecho 15 y las conexiones no están siendo cerradas, no hay manera de que una nueva conexión pueda ser creada. En este caso, puedes matar algunas conexiones o detener e iniciar el servidor de aplicaciones para deshacerte de todas las conexiones al mismo tiempo. Con asbman -i myasb -k puedes detener el servidor de aplicaciones myasb y con asbman -i myasb -x lo levantas.

Después de reiniciar este apps, puedes ver que el número de servidores activos es sólo uno y el tiempo de espera de peticiones es cero:

MYSERVER:/home/progress:> asbman -i myasb -q
PROGRESS Version 9.1E as of Tue Oct 12 14:40:19 EDT 2004


Connecting to Progress AdminServer using rmi://localhost:20931/Chimera (8280)
Searching for myasb (8288)
Connecting to myasb (8276)

Broker Name : myasb
Operating Mode : State-reset
Broker Status : ACTIVE
Broker Port : 3058
Broker PID : 7034
Active Servers : 1
Busy Servers : 0
Locked Servers : 0
Available Servers : 1
Active Clients (now, peak) : (0, 0)
Client Queue Depth (cur, max) : (0, 0)
Total Requests : 0
Rq Wait (max, avg) : (0 ms, 0 ms)
Rq Duration (max, avg) : (0 ms, 0 ms)

PID State Port nRq nRcvd nSent Started Last Change
07082 AVAILABLE 03502 000000 000000 000000 Jan 26, 2011 15:19 Jan 26, 2011 15:19

Puedes revisar la licencia para tu instalación de Progress con el comando showcfg.

lunes, 9 de enero de 2012

Revisando uso de memoria de procesos

Algunas veces tu servidor puede tener una carga pesada porque hay uno o más procesos consumiendo mucha memoria, y cuando ya no hay más memoria física (RAM) disponible el sistema empieza a usar memoria virtual (swap), y dado que la RAM es miles de veces más rápida que un disco duro normal seguro notarás cuando tu sistema comience a paginar memoria. Por lo tanto, si eres un administrador de sistemas o un DBA de Oracle ejecutando instancias en tu propio servidor AIX que no corre nada más, podría ser bueno identificar los procesos que consumen más memoria del sistema de una manera fácil y rápida como esta:

myserver> ps auwx|sort -k 5b,5nr|more
USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND
oracle 5669038 0.1 2.0 1536176 743136 - A Jan 21 18:43 oraclemyoradb (LOCAL=NO)
oracle 4755538 0.0 2.0 1472752 719680 - A Jan 15 16:44 oraclemyoradb (LOCAL=NO)
oracle 5922916 0.0 1.0 1463404 518768 - A Jan 21 9:05 oraclemyoradb (LOCAL=NO)
oracle 4575476 0.0 2.0 1419100 692160 - A 16:05:55 2:25 oraclemyoradb (LOCAL=NO)
oracle 2752638 0.0 2.0 1405344 692960 - A Jan 20 11:35 oraclemyoradb (LOCAL=NO)
oracle 6070354 0.1 2.0 1338124 736024 - A 16:03:06 5:23 oraclemyoradb (LOCAL=NO)
oracle 3518588 0.0 2.0 1273420 704220 - A Jan 20 10:56 oraclemyoradb (LOCAL=NO)
oracle 5390404 0.1 2.0 1272972 814148 - A Jan 22 13:47 oraclemyoradb (LOCAL=NO)
oracle 2371620 0.0 2.0 1259332 685920 - A Jan 20 7:40 oraclemyoradb (LOCAL=NO)
oracle 4784328 0.0 2.0 1259024 774984 - A Jan 20 11:02 oraclemyoradb (LOCAL=NO)
oracle 5877918 0.1 2.0 1200360 730492 - A Jan 24 5:12 oraclemyoradb (LOCAL=NO)
oracle 4374602 0.0 2.0 1193800 771632 - A Jan 21 9:35 oraclemyoradb (LOCAL=NO)
oracle 5804038 0.0 2.0 1178616 681944 - A Jan 20 19:32 oraclemyoradb (LOCAL=NO)
oracle 4931756 0.3 2.0 1156880 786928 - A 10:58:49 1:45 oraclemyoradb (LOCAL=NO)
oracle 3100862 0.0 2.0 1146228 664368 - A Jan 18 6:54 oraclemyoradb (LOCAL=NO)
oracle 1880168 0.0 2.0 1043492 709820 - A Jan 20 16:53 oraclemyoradb (LOCAL=NO)
oracle 3858452 0.0 2.0 1035528 723960 - A Jan 20 12:24 oraclemyoradb (LOCAL=NO)
oracle 4050954 0.0 2.0 1027828 678236 - A Jan 22 10:00 oraclemyoradb (LOCAL=NO)
oracle 3510290 0.0 2.0 1010724 610948 - A Jan 14 11:22 oraclemyoradb (LOCAL=NO)

Como puedes ver, hay muchos procesos oracle relacionados con la base de datos myoradb que están consumiendo demasiada memoria y ahogando el sistema.

Cómo obtener referencias a una tabla

En Oracle, si necesitas saber qué tablas tienen una relación DIRECTA con una tabla dada, no como en el caso de una tabla que tiene una llave foránea de una segunda tabla que a su vez tiene una llave foránea apuntando a una tercera tabla, entonces puedes usar esta sentencia SQL:

SQL> select owner, constraint_name, constraint_type, table_name
from all_constraints where constraint_type='R' and r_constraint_name in
(select constraint_name from all_constraints where constraint_type in ('P','U')
and owner='MYUSER' and table_name='MYTABLE');

OWNER CONSTRAINT_NAME C TABLE_NAME
-------------------- -------------------- - ---------------------
ANOWNER SYS_C0018146 R ATABLE
ANOWNER SYS_C0018144 R OTHER_TABLE
ANOWNER SYS_C0018145 R A_THIRD_TABLE
ANOWNER SYS_C0018148 R RELATED_TABLE

viernes, 6 de enero de 2012

Revisando el caché de AIX

El área de caché es un área de memoria donde el sistema operativo pone bloques de archivos frecuentemente usados, por lo tanto reduciendo operaciones de entrada/salida costosas hacia dispositivos más lentos como discos duros. Es un buen concepto y bastante útil para aumentar el desempeño de sistemas de archivos (NFS, samba), pero no es tan bueno para software de bases de datos como Oracle porque una instancia maneja su propia área de caché.

Por lo tanto, si tu eres un administrador de bases de datos Oracle en servidores AIX es una buena práctica estar al tanto de la configuración y el uso de memoria, y quizás ayudar un poco a tu compañero administrador de sistemas si se da el caso. Los parámetros importantes a revisar son el porcentaje mínimo y máximo de RAM para caché de archivos (minperm% and maxperm%):

root:myserver> vmstat -v
2621440 memory pages
2525761 lruable pages
180000 free pages
4 memory pools
647419 pinned pages
80.0 maxpin percentage
20.0 minperm percentage
80.0 maxperm percentage
24.8 numperm percentage
627654 file pages
0.0 compressed percentage
0 compressed pages
24.8 numclient percentage
25.0 maxclient percentage
627654 client pages
0 remote pageouts scheduled
58246 pending disk I/Os blocked with no pbuf
10544297 paging space I/Os blocked with no psbuf
2228 filesystem I/Os blocked with no fsbuf
805 client filesystem I/Os blocked with no fsbuf
2215609 external pager filesystem I/Os blocked with no fsbuf
0 Virtualized Partition Memory Page Faults
0.00 Time resolving virtualized partition memory page faults

Como puedes ver en este ejemplo, hay mucha memoria mínima asignada para el caché de archivos (20%) y desperdiciada ya que el caché de Oracle es mejor para bases de datos Oracle que el caché de sistema operativo, pero no puedes asignar ese 20% de espacio en RAM a Oracle a menos que cambies los parámetros de memoria virtual de AIX.

Más aún, la memoria máxima reservada para el caché de archivos está limitada por el porcentaje maxclient (25%) por lo que en este sistema tu puedes usar hasta el 25% de la RAM para el caché de archivos de sistemas de archivos que no sean JFS y el otro 55% para el caché de archivos de sistemas de archivos JFS. Puedes revisar el uso de páginas de memoria para JFS con este comando:

root:myserver> svmon -G
size inuse free pin virtual
memory 2621440 2442500 178940 647452 2186997
pg space 5373952 925157

work pers clnt other
pin 562525 0 0 84927
in use 1734676 0 707824

PageSize PoolSize inuse pgsp pin virtual
s 4 KB - 2326020 925157 571068 2070517
m 64 KB - 7280 0 4774 7280

Quizás notes que hay 0 páginas usadas para el caché de archivos de sistemas de archivos JFS (pers), y eso podría ser debido a que no hay sistemas de archivos JFS en este servidor:

root:myserver> mount
node mounted mounted over vfs date options
-------- --------------- --------------- ------ ------------ ---------------
/dev/hd1 / jfs2 Jun 05 19:09 rw,log=/dev/hd8
/dev/hd2 /usr jfs2 Jun 05 19:09 rw,log=/dev/hd8
/dev/hd5 /var jfs2 Jun 05 19:10 rw,log=/dev/hd8
/dev/hd3 /tmp jfs2 Jun 05 19:10 rw,log=/dev/hd8
/dev/hd4 /home jfs2 Jun 05 19:11 rw,log=/dev/hd8
/proc /proc procfs Jun 05 19:11 rw
/dev/hd6 /opt jfs2 Jun 05 19:11 rw,log=/dev/hd8
/dev/fslv00 /myfs jfs2 Jun 05 19:11 rw,log=/dev/loglv00

IBM recomienda configurar los parámetros así:

maxperm = 90%
maxclient = 90%
minperm = 3%

Más información:

Tuning the AIX file caches
Overview of AIX page replacement

jueves, 5 de enero de 2012

Revisando los advisors de Oracle

Los advisors (consejeros?) de Oracle (desde la versión 10g) son una excelente manera de revisar el desempeño de una instancia y afinar tu base de datos Oracle, y puedes ver esta información de una manera fácil e intuitiva con el Enterprise Manager, pero algunas veces no tienes el Enterprise Manager corriendo o quizás quieres obtener esta información rápidamente con un script. Si este es el caso, puedes usar estas sentencias SQL para revisar la información de los advisors:

SQL> set linesize 150
SQL> column pga_target_mb format 999,999,990
SQL> column estd_extra_MB format 999,999,990
SQL> column name format A30
SQL> column value format A30

SQL> select pga_target_for_estimate/1048576 pga_target_mb, pga_target_factor factor,
estd_extra_bytes_rw/1048576 estd_extra_MB, estd_pga_cache_hit_percentage pga_hit,
estd_overalloc_count over_alloc from v$pga_target_advice
where pga_target_factor between .75 and 3 order by pga_target_factor;

PGA_TARGET_MB FACTOR ESTD_EXTRA_MB PGA_HIT OVER_ALLOC
------------- ---------- ------------- ---------- ----------
120 .75 490,015 44 901
160 1 275,813 58 593
192 1.2 254,315 60 565
224 1.4 180,064 68 130
256 1.6 154,973 71 130
288 1.8 154,460 71 68
320 2 153,986 71 46
480 3 151,257 72 0

8 rows selected.

SQL> SELECT SGA_SIZE, SGA_SIZE_FACTOR, ESTD_DB_TIME, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS
from v$sga_target_advice where sga_size_factor between .75 and 3 order by SGA_SIZE_FACTOR;

SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS
---------- --------------- ------------ ------------------- -------------------
192 .75 698484 1.0397 297575225
256 1 671813 1 287818188
320 1.25 660325 .9829 283644824
384 1.5 637752 .9493 275384442
448 1.75 637752 .9493 275384442
512 2 637752 .9493 275384442

6 rows selected.

SQL> select NAME, VALUE from v$parameter
where NAME in ('shared_pool_size','large_pool_size','java_pool_size');

NAME VALUE
------------------------------ ------------------------------
shared_pool_size 0
large_pool_size 0
java_pool_size 0

SQL> select pool, name, bytes FROM V$SGASTAT where name = 'free memory';

POOL NAME BYTES
------------ ------------------------------ ----------
shared pool free memory 15515352
large pool free memory 3118304
java pool free memory 4194304

Pero ten cuidado! Los advisors de Oracle no están incluídos gratis y tienes que tener una licencia de Database Diagnostic Pack para usar esta información, y aún si lanzas sólo un select en estas vistas queda registrado por siempre y podrías ser responsable por usar un producto sin licencia. Y como una nota relacionada, si crees que puedes auditar el uso de productos en tu base de datos Oracle para mantener el cumplimiento de licencias de manera fácil y segura, piénsalo dos veces.

Más información:
Oracle licensing compliance is important
Oracle license audit

martes, 3 de enero de 2012

Obtener información de DBlinks

En Oracle puedes conectarte y consultar otras bases de datos con DBlinks, y eso es casi como tener los datos en tu base de datos local ... Hasta que tienes problemas de latencia o de baja de instancias necesarias para trabajar con tu instancia local; si tu no instalaste o diseñaste tu base de datos local puede ser que tengas DBlinks y no lo sepas.

Por lo cual, si quieres saber información sobre DBlinks en tu base de datos, puedes lanzar estas sentencias SQL:

SQL> column DB_LINK format a30
SQL> column name format a30
SQL> column value format a50

SQL> select name, value from v$parameter where name like '%dblink%';

NAME VALUE
------------------------------ --------------------------------
dblink_encrypt_login FALSE

SQL> select OWNER, DB_LINK, HOST, CREATED from dba_db_links;

OWNER DB_LINK HOST CREATED
--------------- -------------------- -------------------- ---------
PUBLIC DBLINK1 MYHOST01 25-MAY-08
PUBLIC DBLINK2 MYHOST02 25-MAY-08
PUBLIC DBLINK3 MYHOST03 25-MAY-08
PUBLIC DBLINK4 MYHOST04 25-MAY-08

lunes, 2 de enero de 2012

Revisando errores en procedimientos

Si tienes un procedimiento o paquete que no compiló bien, puedes revisar los errores y líneas de código relacionadas con esta sentencia SQL:

SQL> column TEXT format a30
SQL> select e.NAME, e.TYPE, e.TEXT as ERROR, s.TEXT as CODE
from dba_errors e join dba_source s on
(e.OWNER=s.OWNER and e.NAME=s.NAME and e.TYPE=s.TYPE and e.LINE=s.LINE)
where e.OWNER in ('MYUSER') order by e.OWNER, e.NAME, e.LINE;

NAME TYPE ERROR
--------------- ------------ ------------------------------------------------
CODE
----------------------------------------------------
MYPACKAGE PACKAGE BODY PL/SQL: ORA-00942: table or view does not exist
INSERT INTO mytable@my.dblink

MYPACKAGE PACKAGE BODY PL/SQL: SQL Statement ignored
INSERT INTO mmytable@my.dblink

MYPACKAGE PACKAGE BODY PL/SQL: ORA-00942: table or view does not exist
SELECT count("myfield") INTO afield

MYPACKAGE PACKAGE BODY PL/SQL: SQL Statement ignored
SELECT count("myfield") INTO afield