Entradas

Mostrando entradas de octubre, 2017

Cambiar DBNAME y DBID en Oracle database

Este documento tiene como finalidad crear una guía útil para cambiar el DBNAME y el DBID mediante la utilidad NID disponible desde Oracle 9.2 Si cambias el DBID tendrás que abrir la base de datos con un "OPEN RESETLOGS", lo que conlleva la recreación de los redologs y poner la secuencia de los archives a 1 . Los anteriores backup serán invalidados No obstante, puedes cambiar sólo el DBNAME si los efectos secundarios descritos añadiendo el parámetro SETNAME=Y , esto te permite cambiar el DBNAME sin cambiar el DBID. SQL> select dbid,name,open_mode,activation#,created from v$database; DBID NAME OPEN_MODE ACTIVATION# CREATED ---------- --------- -------------------- ----------- --------- 1423238009 ORCL READ WRITE 1423232377 11-NOV-15 Creamos un pfile nuevo a fin de poder modificarlo: SQL> create pfile from spfile; File created. SQL> exit Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 -...

Información histórica sesiones Oracle

Imagen
A partir de Oracle 10.2 con ASH podemos consultar cierta información sobre las sessiones. Encuentro muy interesante poder consultar el número de sesiones conectadas a la base de datos en el pasado para ver esta información podemos consultar estas vistas: v$sysmetric_history --> Información a corto plazo, contiene datos de la última hora en períodos de minutos dba_hist_sysmetric_summary -->Contiene datos del último mes a intervalos resumidos de 1 hora (Media, máxima y mínima de esa hora) v$sysmetric_history y dba_hist_sysmetric_summary contiene información de un montón de métricas diferentes, así que tenemos que seleccionar la métrica que queramos, en este caso las sesiones: set linesize 190 col METRIC_NAME for a100 select METRIC_ID, METRIC_NAME from v$sysmetric_history group by METRIC_ID, METRIC_NAME ; Si queremos buscar las métricas disponible relacionadas con sesiones hacemos: SQL> set linesize 190 col METRIC_NAME for a100 select METRIC_ID, METRIC_NAME ...

matar sesiones oracle

El otro día recibí una alerta acerca de algunos bloqueos en esta base de datos, esta consulta me parece mas funcional que las basadas en v$lock, puesto que es mas rápida: SQL> SELECT * FROM dba_waiters where MODE_HELD 'None' or MODE_REQUESTED 'Share'; WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2 --------------- --------------- -------------------------- ---------------------------------------- ---------------------------------------- ---------- ---------- 398 336 Transaction Exclusive Share 327692 9591040 397 336 Transaction Exclusive Share 327692 9591040 394 336 Transaction Exclusive ...

Oracle máximo de sesiones

Oracle tiene la vista gv$resource_limit en la que se puede ver ciertas metricas actuales y su valor límite: set linesize 190 set pages 200 select * from gv$resource_limit; INST_ID RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCAT LIMIT_VALUE ---------- ------------------------------ ------------------- --------------- --------------- ------------ 1 processes 44 300 300 300 1 sessions 52 215 512 512 1 enqueue_locks 30 295 6480 6480 1 enqueue_resources 24 165 2472 UNLIMITED 1 ges_procs 0 0 0 0 1 ges_ress 0 0 ...

Comprobación estado general base de datos Oracle

Muchas veces cuando entramos a un sistema por primera vez no sabemos muy bien como reconocerlo, y empezar a mirarlo... Lo primero que yo hago es un ps -ef | grep ora_pmon a fin de ver las bases de datos que hay corriendo sobre ese host, en mi caso tenemos: host110> ps -ef | grep pmon orauser1 25453 1 0 Apr 14 ? 225:49 ora_pmon_orcl1 orauser2 1915 1 0 Aug 9 ? 213:09 ora_pmon_orcl2 orapbf 6091 1 0 Apr 27 ? 90:00 ora_pmon_pbf orauser3 8221 1 0 Jun 15 ? 76:55 ora_pmon_orcl3 orafi2 11802 1 0 Jun 13 ? 17:04 ora_pmon_fi2 orauser4 12982 1 0 Jun 15 ? 207:43 ora_pmon_orcl4 oragt4 11493 1 0 Mar 9 ? 119:28 ora_pmon_gt4 oraoq0 28195 1 0 Sep 23 ? 3:53 ora_pmon_OQ0 oraod0 653 1 0 Sep 23 ? 4:02 ora_pmon_OD0 oracle 21760 1 0 Sep 23 ? 0:54 ora_pmon_gh oracle 25147 22868 1 17:11:29 pts/1 0:00 grep ora_pmon al cual habría que quitar la úl...

Comando SAR

En AIX el comando sar: El comando por defecto en Aix tiene estas columnas: %usr: El porcentaje de la CPU que está ocupaco en procesos de usuario como scripts o aplicaciones. %sys: : El porcentaje de la CPU que está ocupaco en procesos de sistema %wio: El porcentaje de tiempo que la CPU está esperando en operaciones de entrada y salida en un dispositivo de bloque, que la mayoría de las veces será disco. %idle: El porcentaje de la CPU que no está ocupada. Estos 4 campos deberían de sumar 100%. sar -P ALL nos muestra esta actividad pero procesador por procesador, si ponermos sar -P 0 por ejemplo, nos puestra la actividad el primer procesador de la máquina. sar -d device: Es el disco para el que sacamos estadísticas. En Solaris, se puede ver el physical disk mirando /etc/path_to_inst, y cruzandolo con /dev/dsk. %busy: Es el porcentaje de tiempo que el disco está o leyendo o escribiendo. avque: This is the average depth of the queue that is used to serialize disk activ...

Leer las cabeceras de los discos en asm kfed read

Muchas veces resulta útil leer las cabeceras de los discos en asm debido a que cuando no están montados, por ejemplo, no podemos saber a qué diskgroup corresponde el disco mediante la vista v$asm_disk. O bien monitorizar los discos cuando no está arrancado el +ASM. El primer punto es saber dónde estan montadas las unidades de disco en unix, para ello podríamos haber consultado la instancia asm con un show parameter asm_diskstring, pero si está parada podemos irnos a /dev y hacer un ls -ltr para mirar cuales son los discos... Si hacemos un kfed read /dev/disk_ASM se nos muestra lo siguinte: $> kfed read /dev/disk_ASM kfbh.endian: 0 ; 0x000: 0x00 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0 kfbh.block.obj: 2147483662 ; 0x008: TYPE=0x8 NUMB=0xe kfbh.c...

Contar el número de errores en el alert.log desde un día y hora determinados

Para contar el número de errores total de un fichero tipo alert log no hay demasiados problemas, lo podemos hacer mediante sun simple: cat alert_$ORACLE_SID.log | grep ORA- | wc -l El problema surge cuando queremos verificar sólo a partir de un punto, para por ejemplo, verificar cada hora si ha habido un error en la BBDD o no. Para esto, la estrategia a seguir es hacer un tail -numero_lineas alert_$ORACLE_SID.log, el problema lo tenemos en que hemos de calcular el número de líneas que ha generado el alert en la última hora. Establecemos una variable con el nombre de "fechaInicio" que definirá la hora a partir de la cual queremos sacar el número de errores en el alert de la siguinte forma. $ fechaInicio=`date +"%a %b %d %H"` Wed Nov 06 18 Ojo, es muy importante que fechaInicio se genere exactamente con el formato de fecha de nuetro alert.log, porque sino no nos filtrará correctemente. Con lo cual, nuestro script localizará la linea de inicio de la...

lsnrctl password

El otro día al intentar hacer un lsnrctl status a un LISTENER me pasó: oracle> lsnrctl status LSNR_BBDD004 LSNRCTL for HPUX: Version 9.2.0.8.0 - Production on 03-OCT-2017 07:34:02 Copyright (c) 1991, 2006, Oracle Corporation. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=BBDD004))) TNS-01169: The listener has not recognized the password Esto es debido a que el listener está protegido con password. Para hacer el status hacemos cd $ORACLE_HOME/network/admin cat listener.ora Mi listener.ora tiene este aspecto: host001 oracle ( BBDD004 ) > cat listener.ora LSNR_BBDD004 = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = BBDD004)) (ADDRESS = (PROTOCOL = TCP)(HOST = host001)(PORT = 1675)) ) ) #----ADDED BY TNSLSNR 20-MAR-2017 16:40:28--- PASSWORDS_LSNR_BBDD004 = C1EC4CFD39852D66 así hemos localizado la password del listener, luego hacemos: host001 oracle ( BBDD004 ) > lsnrctl LSNRCTL> set password 'C1EC4CFD39...

Trigger de auditoría

Hoy añadiremos un trigger de auditoría en nuestra BBDD a nivel de logon. El objetivo es que los usuarios de desarrollo no puedan logearse en la BBDD de producción, con programas como el TOAD, que pueden hacer mucha mella en el rendimiento, además añadiremos una tabla en la que iremos registrando los usuarios que se conectan a la BBDD. Esta auditoría nos sirve para ver las DDL y las DDL que están ejecutando los usuarios sobre la BBDD (para ello deberemos activar el parámetro audit_file_dest), sino únicamente para ver quién se conecta. Primero deberemos crear una tabla en la que se recojan los datos de los usuarios, esta tabla la tendremos que crear en función de los datos que queramos recoger de los usuarios que se conectan. Utilizaremos el paquete SYS_CONTEXT (en versiones antiguas se utiliza en USERENV('SESSIONID')), que recoge datos del usuario actual create table login_info (fecha date, usuario_db varchar(50), usuario_so varchar(50), ip varchar(15), maquina v...

Llenado de filesystem archives

Operativa en caso de llenado de filesystem archives. El primer problema que se nos plantea es que si en el filesystem de archives se ha llenado completamente no vamos a poder entrar en la BBDD para cambiar el destino de los archives, por lo que no tendremos mas remedio que mover alguno de los archives a algún filesystem alternativo que tenga espacio o bien comprimir alguno (mas lento). Con esta orden en nuestro shell, sacaremos la ocupación de todos los filesystems del sistema y podremos ver cual está al 100% df -k para ver el destino actual de los archives (siempre y cuando tengamos un fichero init y no spfile): en el shell, hacer: cd $ORACLE_HOME/dbs cat init${ORACLE_SID}.ora cat init${ORACLE_SID}.ora | grep log_archive con la última orden nos debería salir algo como esto: log_archive_start = true log_archive_dest = /aplicaciones/oracle/archives log_archive_format = "%TS%S.ARC" Una vez que sabemos el destino de los archives tenemos que ir al directorio ...

Oracle select sobre alert.log

La tabla x$dbgalertext nos permite leer el alert log a través de consultas SQL. (Versiones 11g) A través de la tabla x$dbgalertext podemos consultar el alert log de cada base de datos oracle mediante una cómoda consulta SQL. Esto nos permite unas capacidades de filtrado superiores a las que se pueden alcanzar mediante los métodos tradicionales con unix (tail, head, wc -l...) Por ejemplo, podemos filtrar todos los errores tipo ORA- mediante la select: select record_id, to_char(originating_timestamp,'DD.MM.YYYY HH24:MI:SS'), message_text from x$dbgalertext where lower(MESSAGE_TEXT) like lower('%ora-%');

Corrupción en Oracle

Las causas que pueden generar corrupción en una BBDD Oracle son: Problemas en el sistema de I/O de la máquina. Problemas del sistema Operativo. Problemas Internos de Oracle. Recuperaciones incorrectas de una BBDD. Para solucionar un problema de éste tipo, normalmente los usuario y/o el cliente quieren recuperar los datos lo mas rápido posible, y la causa de la corrupción queda en segundo plano... Lo cual es un error, porque la corrupción podría volver a repetirse después de haber restaurado... 1. Determinar el alcanze del problema. Lo primero que debemos hacer, aparte de echar un vistazo al alert.log es verificar todos los ficheros de la BBDD con un dbverify, para ello primero sacaremos cual es el tamaño del bloque de la BBDD y luego pasar una orden en el sistema oparativo como esta: dbv file='datafile' blocksize=(tamaño del bloque) el tamaño del bloque lo sacaremos de SQL> show parameter db_block_size NAME TYPE VALU...

Bloqueos en Oracle

Ver y matar Bloqueos en una BBDD Un bloqueo sobre un objeto de una base de datos lo genera una transacción que hace operaciones que no son compatibles con otras transacciones. Por ejemplo: en un primer momento una transaccion actualiza un registro de una tabla, esto generará un bloqueo exclusivo sobre este registro, si otro proceso intentase actualizar la misma fila, este proceso se quedaría en espara del primero. La siguiente consulta nos muestra transacciones que están esperando a que terminen otros transacciones. Estas transacciones están bloqueando tablas de la base de datos. Esta consulta puede ser un poco lenta dependiento del sistema, si te encuentras en ésta caso puedes ver el supapartado lentitud de v$lock select /*+ rule */ lock1.sid, ' BLOQUEA ', lock2.sid, lock1.ctime/60 minutos_espera from gv$lock lock1, gv$lock lock2 where lock1.block =1 and lock2.request > 0 and lock1.id1=lock2.id1 and lock1.id2=lock2.id2; Para terminar con éstos bloqueos podemos mat...

Ampliar tablespace Oracle

Ampliar tablespace Para ver los tablespaces con mayor ocupación en una BBDD yo siempre utilizo esta consulta: set linesize 170 set pages 60 column pct_used format 999.9 heading "%|Used" column ts_name format a33 heading "Tablespace Name" column Mbytes format 999,999,999,999 heading "MBytes" column used format 999,999,999,999 heading "Used" column free format 999,999,999,999 heading "Free" column largest format 999,999,999,999 heading "Largest" break on report compute sum of Mbytes on report compute sum of free on report compute sum of used on report select nvl(b.tablespace_name,nvl(a.tablespace_name,'UNKNOWN')) ts_name , kbytes_alloc/1024 Mbytes , (kbytes_alloc-nvl(kbytes_free,0))/1024 used , nvl(kbytes_free,0)/1024 free , ((kbytes_alloc-nvl(kbytes_free,0))/kbytes_alloc)*100 pct_used , nvl(largest,0)/1024 largest from (select sum(bytes)/102...