jueves, 28 de agosto de 2014

MATAR PROCESOS Y SESIONES QUE ESTÁN COLGADAS EN LA BASE DE DATOS


El por que saber como encontrar procesos y sesiones resulta util cunado estos quedan colgados en los procesos de la base y otros usuarios desean hacer uso de objetos bloqueados por otras sesiones, Para poder liberar estos objetos de los procesos colgados es necesario matar las sesiones.

La problemática se produjo cuando al intentar borrar un usuario utilizando la sentencia :

DROP USER usuario1 CASCADE;

Y a continuación creamos el mismo usuario eliminado con la sentencia

CREATE USER usuario1 
IDENTIFIED BY password
DEFAULT TABLESPACE tbs_1
ACCOUNT UNLOCK;

Nos retorna errores ORA-00604 y  ORA-00054. 





Aparentemente el mensaje indica que otra sesión esta ocupando ese objeto por lo cual la transacción no puede realizarse.

SOLUCIÓN

Existen varios pasos para solventar esta acción, realizar en el orden que se encuentran a continuación es lo recomendable para no afectar a la base ni realizar acciones innecesarias.

Nos conectamos como sys / as sysdba a la intancia de base de datos por toad. Ir al utilitario buscador de sesiones e  identificar el usuario que esta ocupando el objeto. Damos clic derecho sobre el id sesión y poner matar sesión.

Esperamos unos minutos y Re-intentar ejecutando el script.

Si el problema persiste tenemos que realizar esta acción de forma manual ya que, aunque el toad indica que la sesión ya no esta activa existen procesos colgados en la base de datos que no permiten el desbloqueo efectivo del objeto. Para ello ejecutamos el siguiente query en un editor de SQL del Toad o directamente en SQLPlus* como sysdba.

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S,
V$PROCESS P, V$SQL SQ
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;


Esta sentencia nos permite identificar el id de sesión y el número de serial de los procesos ejecutados, con esos dos valores, enviando como parámetro podemos ejecutar la sentencia ALTER para matar la sesión.desde Oracle.

ALTER SYSTEM KILL SESSION  '<id>, <serial#>';

Esperamos unos minutos y Re-intentar ejecutando el script.

Si el problema persiste y pude darse el caso que así sea, se debe matar el proceso de sistema operativo que esta ejecutando el bloqueo al objeto como root, para ello nos sirve el valor arrojado en la query anterior que es el SPID, con este valor podemos matar el proceso de sistema operativo utilizando el comando kill.

Nota: Dejar como ultima opción esta ya que, el matar el proceso de sistema operativo que no sea, puede afectar la integridad y consistencia de la base de datos.

[oracle@localhost ~]$ ps -ef|grep <spid>
root 11942 11928 0 11:57:57 pts/3 0:00 grep <spid>
[oracle@localhost ~]$ kill -9 <spid>

viernes, 8 de agosto de 2014

OPTIMIZA: BASH PARA BAJAR Y SUBIR UNA INSTANCIA DE BASE DE DATOS

Hola Amig@s,

Este post enseñare a crear un script para bajar y subir una instancia de base de datos Oracle de forma segura.

Datos Generales:

-Sistema Operativo : Linux (Funciona en cualquier ambiente Linux incluso AIX )
-Nombre de la Instancia de Base de Datos: PRUEBA

Paso 1:  Creemos un archivo profile para configurar las variables de ambiente de la instancia. Para ello nos conectamos con usuario Oracle a nuestro servidor y ejecutamos:

oracle@test ~]$ cd
[oracle@test ~]$ pwd
/home/oracle

Es para ubicamos en el Home del usuario Oracle a nivel de sistema operativo. Creamos el archivo .profilePrueba, el cual almacenara las configuraciones de variables para nuestra instancia.

[oracle@mcpebi ~]$ vim .profilePRUEBA

En este archivo vamos a agregar las siguientes lineas:

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=PRUEBA
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib



Paso 2: Crear archivo bash para subir la instancia de base de datos.

[oracle@test ~]$ vim prueba_start.sh

En este archivo vamos a agregar las siguientes lineas:

#!/bin/bash
cd /home/oracle/
. ./.profileMCPE
sqlplus "/as sysdba" << EOF
startup;
exit;

Salimos del editor vim, y ya tenemos nuestro bash para subir la instancia de base de datos.

Paso 3: Crear archivo bash para bajar la instancia de base de datos.

oracle@test ~]$ vim prueba_stop.sh

En este archivo vamos a agregar las siguientes lineas:

#!/bin/bash
cd /home/oracle/
. ./.profileMCPE
sqlplus "/as sysdba" << EOF
shutdown immediate;
exit;

Salimos del editor vim, y ya tenemos nuestro bash para bajar de forma segura  la instancia de  base de datos.

Paso 4: Dar permisos a archivos como ejecutables.

Para este paso es necesario ser usuario root, ejecutamos el siguiente comando

[root@mcpebi test]# chmod 777 prueba_start.sh prueba_stop.sh

Para poder ejecutar el comando desde cualquier directorio que nos encontremos podemos copiar estos archivos en la carpeta /bin

[root@mcpebi oracle]# scp prueba_start.sh prueba_stop.sh  /bin/

Ya tenemos nuestros archivos para bajar y subir nuestra Instancia de base de datos de forma segura.

Archivos en Acción (Demo)
Archivo prueba_stop.sh

[oracle@test ~]$ prueba_stop.sh 
/bin/prueba_stop.sh: línea 6: aviso: el documento-aquí en la línea 4 está delimitado por fin-de-fichero (se esperaba `EOF')

SQL*Plus: Release 11.2.0.3.0 Production on Fri Aug 8 12:22:28 2014

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


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

SQL> 
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@mcpebi ~]$

Archivo prueba_start.sh

[oracle@test ~]$ preuba_start.sh 
/bin/prueba_start.sh: línea 6: aviso: el documento-aquí en la línea 4 está delimitado por fin-de-fichero (se esperaba `EOF')

SQL*Plus: Release 11.2.0.3.0 Production on Fri Aug 8 12:24:22 2014

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

Connected to an idle instance.

SQL> ORACLE instance started.

Total System Global Area 6263357440 bytes
Fixed Size    2239976 bytes
Variable Size 2030043672 bytes
Database Buffers 4211081216 bytes
Redo Buffers   19992576 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@test ~]$

miércoles, 6 de agosto de 2014

CONSULTA LA VERSIÓN DE PARCHES APLICADOS (PSU)

Hola Amig@s,

Se han preguntado si su base de datos tiene algún parche aplicado y desean saber en que versión esta, pues bien aqui les dejo el Query que les permitira saber cuando y que parche fue aplicado en su Base de Datos Oracle.

Para ello primero explicaremos que es un PSU (Patch Set Updates)

Patch Set Updates (PSU) son los mismos parches acumulativos que incluyen tanto los parches de seguridad y correcciones prioritarias. La clave con la PSU es que son actualizaciones menores de versión (por ejemplo, 11.2.0.1.1 a 11.2.0.1.2). Una vez que se aplica una fuente de alimentación, sólo las UPM se puede aplicar en los próximos trimestres hasta que la base de datos se actualiza a una nueva versión de la base.

La consulta para obtener la información de los parches aplicados seria:

SQL> set lines 255
SQL> col action_time for a40
SQL> col action for a8
SQL> col namespace for a7
SQL> col version for a11
SQL> col comments for a40
SQL>  select substr(ACTION_TIME,1,40) action_time,substr(ACTION,1,8) action,substr(NAMESPACE,1,7) namespace,
substr(VERSION,1,11) version,ID,substr(COMMENTS,1,40) comments,BUNDLE_SERIES
from registry$history; 



ACTION_TIME ACTION   NAMESPA VERSION      ID COMMENTS  BUNDLE_SERIES
---------------------------------------- -------- ------- ----------- ---------- ---------------------------------------- ------------------------------
17-SEP-11 10.21.11.595816 AM APPLY  SERVER  11.2.0.3       0 Patchset 11.2.0.2.0  PSU

10-APR-13 06.15.42.063248 AM APPLY  SERVER  11.2.0.3       0 Patchset 11.2.0.2.0  PSU


References: New Patch Nomenclature for Oracle Products [ID 1430923.1]