Problemas con SYSAUX, ocupación de AWRs

Hoy vamos a lidiar con un problema muy común en las bases de datos de Oracle que es el tamaño del tablespace SYSAUX.
El tablespace SYSAUX es uno de los tablespaces especiales de la base de datos con el que no podemos jugar alegremente, la principal característica que tiene de cara a la administración de base de datos es que ,el espacio que le demos se ha perdido, es decir, no va ha haber forma de hacerlo mas pequeño (al menos en mi caso siempre ha habido un «pero» que lo imposibilita).

Como decía al principio es junto con el SYSTEM un tablespace muy especial, y los motivos de su tamaño pueden ser varios,hoy vamos a centrarnos en como vaciar un poco el tamaño debido el AWR.

Lo que, lo primero que tendremos que hacer es ver cual es el componente que esta llenándonos el tablespace.
Para ello tenemos la consulta

set linesize 100;
column OCCUPANT_NAME format a20;
column OCCUPANT_DESC format a60;
column Mb format 999.99
SELECT occupant_name,space_usage_kbytes/1024 Mb,occupant_desc
  FROM V$SYSAUX_OCCUPANTS
  order by space_usage_kbytes  desc;

OCCUPANT_NAME             MB OCCUPANT_DESC
-------------------- ------- ------------------------------------------------------------
SM/AWR                780.06 Server Manageability - Automatic Workload Repository
SM/OPTSTAT            333.00 Server Manageability - Optimizer Statistics History
LOGMNR                 91.63 LogMiner
XDB                    85.50 XDB
SM/ADVISOR             65.56 Server Manageability - Advisor Framework
WM                      6.38 Workspace Manager
SM/OTHER                6.25 Server Manageability - Other Components
SMON_SCN_TIME           5.31 Transaction Layer - SCN to TIME mapping
EXPRESSION_FILTER       3.88 Expression Filter System
JOB_SCHEDULER           2.81 Unified Job Scheduler
EM_MONITORING_USER      2.75 Enterprise Manager Monitoring User
SQL_MANAGEMENT_BASE     1.69 SQL Management Base Schema
PL/SCOPE                1.56 PL/SQL Identifier Collection
XSOQHIST                1.38 OLAP API History Tables
AO                      1.38 Analytical Workspace Object Table
LOGSTDBY                1.38 Logical Standby
STREAMS                 1.00 Oracle Streams
AUTO_TASK                .31 Automated Maintenance Tasks
ORDIM/ORDDATA            .00 Oracle Multimedia ORDDATA Components
ORDIM/ORDPLUGINS         .00 Oracle Multimedia ORDPLUGINS Components
ORDIM/SI_INFORMTN_SC     .00 Oracle Multimedia SI_INFORMTN_SCHEMA Components
HEMA
EM                       .00 Enterprise Manager Repository
TEXT                     .00 Oracle Text
ULTRASEARCH              .00 Oracle Ultra Search
ORDIM                    .00 Oracle Multimedia ORDSYS Components
SDO                      .00 Oracle Spatial
STATSPACK                .00 Statspack Repository
TSM                      .00 Oracle Transparent Session Migration User
XSAMD                    .00 OLAP Catalog
AUDIT_TABLES             .00 DB audit tables
ULTRASEARCH_DEMO_USE     .00 Oracle Ultra Search Demo User

Como podemos ver, son muchas las cosas que se guardan en SYSAUX, pero, en nuestro caso, está bastante claro que, la mayoría de la ocupación es debida a los AWR.

Nuestro siguientes pasos van a ser:

  • Determinar que es lo que nos ocupa el espacio
  • Mirar si la causa esta en la retención
  • Mirar si la causa está en los AWR guardados
  • Mirar si la causa está en las lineas «huerfanas» de las Active Session History

Nuestro objetivo va a ser liberar espacio dentro de SYSAUX , no disminuir el tamaño de este tablespace ya que, como decía al principio esto es prácticamente una misión imposible.

Determinar que es lo que ocupa espacio

El siguiente paso será el buscar la información del AWR, para ello el propio Oracle tiene una utilidad que podemos llamar desde sqlplus

 SQL> @$ORACLE_HOME/rdbms/admin/awrinfo.sql

Este sql nos genera un informe con unos apartados muy interesantes que nos servirán para encontrar de donde liberar espacio.

Mirar si la causa esta en la retención

************************************                                                                         
(2) Size estimates for AWR snapshots                                                                          
*************************************                                                                                                                                                                                    
| Estimates based on 60 mins snapshot INTERVAL:                                                               
|    AWR size/day                           31.0 MB (1,324 K/snap * 24 snaps/day)                             
|    AWR size/wk                           217.2 MB (size_per_day * 7) per instance                                                                                                                                     
| Estimates based on 24 snaps in past 24 hours:                                                               
|    AWR size/day                           31.0 MB (1,324 K/snap and 24 snaps in past 24 hours)              
|    AWR size/wk                           217.2 MB (size_per_day * 7) per instance                           
|

Aqui podemos ver el tamaño estimado que ocupa nuestra información de los AWR, en función del periodo de retencion que tengamos de los AWR tendremos la ocupación en la base de datos.
Cuando sabemos cuanto ocupa cada AWR y cuanto hacemos al día, tenemos que saber cuantos dias guardamos para ver si la ocupación es correcta, para ello haremos :

SQL> SELECT retention FROM dba_hist_wr_control;

RETENTION
---------------------------------------------------------------------------
+00007 00:00:00.0

En mi caso por ejemplo, la retencion es de 7 días.

Mirar si la causa está en los AWR guardados

Otro de los problemas que podemos tener es que el número de AWR que mantenemos guardados por razones históricas en la instancia, en el informe que acabamos de obtener también aparece un apartado con las últimas 50 snapshots de la base de datos, el eliminar imágenes antiguas también nos ayudará a liberar espacio.

  • Mirar si la causa está en las lineas «huerfanas» de las Active Session History
  • Algunas veces el Active Session History (ASH) guarda filas que no pertenecen a ningún AWR,esto hace que el ASH ocupe gran parte del espacio dedicado al AWR, la forma de saber si esto nos está sucediendo es mirar nuestro informe en el apartado

    
    **********************************
    (3a) Space usage by AWR components (per database)
    **********************************
    
    COMPONENT        MB  % AWR  KB_PER_SNAP MB_PER_DAY MB_PER_WEEK TABLE% : INDEX%                                
    --------- --------- ------ ------------ ---------- ----------- ----------------                               
    FIXED         131.5   50.6          670       15.7       109.9    52% : 48%                                   
    EVENTS         37.9   14.6          193        4.5        31.7    43% : 57%                                   
    SQLPLAN        25.0    9.6          127        3.0        20.9    72% : 28%                                   
    ASH            18.3    7.0           93        2.2        15.3    89% : 11%                                   
    SQL            11.0    4.2           56        1.3         9.2    60% : 40%                                   
    SPACE          10.3    4.0           53        1.2         8.6    61% : 39%                                   
    SQLTEXT         5.2    2.0           26        0.6         4.3    96% : 4%                                    
    SQLBIND         0.8    0.3            4        0.1         0.6    50% : 50%                                   
    RAC             0.6    0.2            3        0.1         0.5    50% : 50%                                   
    

    Si la línea de ASH ocupa mas de un 1% probablemente sea la causa de nuestra ocupación.
    Mediante la siguiente consulta podemos saber si es nuestro caso.

    SELECT COUNT(*) huerfanas
    FROM wrh$_active_session_history a
    WHERE NOT EXISTS
      (SELECT *
      FROM wrm$_snapshot
      WHERE snap_id       = a.snap_id
      AND dbid            = a.dbid
      AND instance_number = a.instance_number
      );
    
    
     HUERFANAS
    ----------
           116
    
    

    Si aparece alguna línea podemos borrarlas con

    delete  
    FROM wrh$_active_session_history a
    WHERE NOT EXISTS
      (SELECT *
      FROM wrm$_snapshot
      WHERE snap_id       = a.snap_id
      AND dbid            = a.dbid
      AND instance_number = a.instance_number
      );
    

    Con estas tres acciones, si elproblema de laocupación del SYSAUX es debido a el AWR tendremos que haberpodido liberar el espacio suficiente para que la base de datos pueda seguir trabajando sin problemas de espacio.

    Aún así, el tema de la ocupación del SYSAUX es un tema bastante complejo, con lo que, como siempre, el mejor sitio para buscar soluciones es soporte de Oracle, aquí tenéis un pequeño listado de algunas de las notas que puede que os aplique y cuyo contenido tenéis en la página de soporte

    • AWR Data Uses Significant Space in the SYSAUX Tablespace [ID 287679.1]
    • Suggestions if your SYSAUX Tablespace grows rapidly or too large [Document 1292724.1]
    • General Guidelines for SYSAUX Space Issues [Document 552880.1]
    • SYSAUX Grows Because Optimizer Stats History is Not Purged [Document 1055547.1]
    • Space issue in Sysaux tablespace due to Unexpected AWR size [Document 1218413.1]
    • Space Management In Sysaux Tablespace with AWR in Use [Document 287679.1]
    • SYSAUX Tablespace Grows Heavily Due To AWR [Document 852028.1]

    O alguna entrada muy interesante en algunos blogs como es

    Why is my SYSAUX Tablespace so Big? Statistics_level=ALL

    Introduccion a los servicios de Oracle

    Uno de los elementos mas potentes que introdujo Oracle en la versión 10g fué el uso de servicios.
    Los servicios de Oracle no son otra cosa que una abstracción lógica de una instancia de base de datos. Aunque los servicios tienen mas sentido en entorno RAC, hoy vamos a ver como se configuran y para que pueden servir en un entorno de «single instance».

    Supongamos tenemos una base de datos produccion en la que tenemos consolidados 4 entornos distintos ( Webfotos,Cargas,Contabilidad y Desarrollo ) que acceden a nuestra instancia con el mismo esquema,y desde servidores de aplicaciones que comparten máquina entre ellos, en el momento en que la base de datos tiene problemas nos es muy difícil el saber quien es quien.
    Si pudiésemos discriminar las conexiones por una agrupación lógica, sería mas fácil el verlo, y , mas aún, si el EMC fuese capaz de separar las gráficas y estadísticas por esa agrupación.

    Pues esto es exactamente lo que nos proporcionan los servicios Oracle.
    En nuestro caso ficticio, vamos a crear los distintos servicios:

    • Webfotos
    • Cargas
    • Contabilidad
    • Desarrollo

    De esta forma, cada conexión de estos 4 entornos usara un service_name distinto en su TNS_NAMES de cliente, y , la base de datos podrá identificar ( y limitar) a cada uno de ellos de manera separada.

    Lo primero que tendremos que hacer es crear los servicios. Para esto tenemos dos maneras, o bien desde el srvctl ( en caso de RAC,Grid control u Oracle restart), o mediante el paquete DBMS_SERVICES , como nuestro caso es el de una «single instance», no nos va a quedar mas remedio que usar este paquete.
    Mediante la función CREATE_SERVICE crearemos los servicios de la manera:

    exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'webfotos', NETWORK_NAME=>'webfotos')
    exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'cargas', NETWORK_NAME=>'cargas')
    exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'contabilidad', NETWORK_NAME=>'contabilidad')
    exec dbms_service.CREATE_SERVICE(SERVICE_NAME=>'desarrollo', NETWORK_NAME=>'desarrollo')
    

    Una vez creados los servicios, los arrancaremos con la función

    exec dbms_service.START_SERVICE('webfotos')
    exec dbms_service.START_SERVICE('cargas')
    exec dbms_service.START_SERVICE('contabilidad')
    exec dbms_service.START_SERVICE('desarrollo')
    

    Para comprobar si la creación de nuestros servicios ha funcionado, podemos chequear el parámetro service_names

    SQL> select value from v$parameter where NAME='service_names';
    VALUE
    ---------------------------
    produccion,webfotos,cargas,contabilidad,desarrollo
    

    O bien el listener con lsnrctl services

    [oracle@blog] [$lsnrctl services
    
    LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 17-MAY-2013 13:31:06
    
    Copyright (c) 1991, 2011, Oracle.  All rights reserved.
    
    Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
    Services Summary...
    Service "PLSExtProc" has 1 instance(s).
      Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:0 refused:0
             LOCAL SERVER
    Service "produccion" has 1 instance(s).
      Instance "XE", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:34 refused:0 state:ready
             LOCAL SERVER
    Service "webfotos" has 1 instance(s).
      Instance "XE", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:34 refused:0 state:ready
             LOCAL SERVER
    Service "contabilidad" has 1 instance(s).
      Instance "XE", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:34 refused:0 state:ready
             LOCAL SERVER
    Service "desarrollo" has 1 instance(s).
      Instance "XE", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:34 refused:0 state:ready
             LOCAL SERVER
    Service "cargas" has 1 instance(s).
      Instance "XE", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:34 refused:0 state:ready
             LOCAL SERVER
    The command completed successfully
    

    Ahora, solamente tendremos que modificar los respectivos TNSNAMES de los distntos entornos para que se conecten mediante SERVICE_NAME y no mediante SID y tendremos identificados cada una de la sesiones de oracle con el servicio.

    ¿que beneficios nos aporta todo esto?

    • Trazabilidad: Nos va a ser sencillísimo encontrar quien es el que esta haciendo algo ya que en un primer vistazo encontraremos al culpable «logico» del problema, una vez tenemos el origen del problema es mas sencillo abordarlo.
    • Accounting: Vamos a poder ser capaces de ver los consumos de cada aplicacion/grupo lógico en la base de datos, lo que nos puede ser muy bueno a la hora de derivar costes o limitar recursos
    • control de accesos: Si en un momento específico queremos asegurarnos de que un elemento lógico no acceda a la aplicacion, podemos detener el servicio y el resto funcionaría correctamente.Esto puede ser muy útil por ejemplo, para evitar cargas en horario diurno, o para controlar los equipos de desarrollo

    Hasta ahora lo hemos visto todo muy fácil, pero .. ¿que ocurre cuando reinicias la base de datos?.
    Para que la instancia levante los servicios al arrancar deberán de estar en el init.ora con la sintaxsis:

    
    service_names='produccion','webfotos','cargas','desarrollo'
    

    Si no es así , cuando se levante nuestra base de datos no se levantan los servicios, y esto hace que no funcione nada de lo que apunta a ellos.
    La solución como os decía la principio es hacerlo desde el srvctl, pero …
    ¿como lo hacemos si no tenemos RAC,Grid u Oracle restart?
    La respuesta es brutalmente sencilla.

    [oracle@blog] [$sqlplus "/as sysdba"
    SQL*Plus: Release 11.2.0.2.0 Production on Vie May 17 13:09:11 2013
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
    SQL> alter system set service_names='produccion,webfotos,cargas,contabilidad,desarrollo';
    System altered.
    

    Tan sencillo como acabáis de ver, simplemente hemos de conectarnos desde el sqlplus y hacer un ALTER SYSTEM para el parámetro service_names poniendo nuestros servicios separados por comas.

    Como siempre, para mas información, tenemos la documentación de Oracle del paqueteDBMS_SERVICES

    Instalación de Oracle Enterprise Manager 12c

    Hola

    Hoy vamos a ver como se hace la instalación de el OEM 12c en un servidor Linux.

    Lo primero que haremos será el instalar un Oracle Linux 6.3 y una base de datos Enterprise (es un requerimiento del OEM 12c) que servirá de nuestro repositorio para el cloud. Después de esto, iremos a la web de descargas de Oracle para bajarnos el 12c.
    Antes de empezar con la instalación, he de advertiros que, el OEM 12c tiene muchísimas restricciones de licenciamiento, con lo que, os conviene echarles un vistazo antes de instalarlo a la ligera.

    Nosotros vamos a llevar a cabo la instalación según este documento http://docs.oracle.com/cd/E24628_01/install.121/e24089/toc.htm.

    La instalación la vamos a llevar a cabo con el usuario emc y hemos reservado una particion de 15Gb bajo /oem , aunque pueda parecer una barbaridad de espacio, no nos va a sobrar tanto, por que, como vemos en el cuadro adjunto las necesidades de HW no son precisamente «pequeñas»

    requisitos HW

    requisitos HW

    Además de esto, hemos de tener en cuenta que, nosotros ya tenemos binarios de Oracle instalados en este servidor, por que tenemos la base de datos instalada, por eso el directorio del inventario de oracle será común

    [oem@emc fuentes]$ cat /etc/oraInst.loc 
    inventory_loc=/oraInventory
    inst_group=oinstall

    Antes de la instalación deberemos de cerciorarnos que tenemos los siguientes paquetes:

    • make-3.81
    • binutils-2.17.50.0.6
    • gcc-4.1.1
    • libaio-0.3.106
    • glibc-common-2.3.4
    • libstdc++-4.1.1
    • libXtst-1.0.99.2-3.el6.x86_64.rpm
    • sysstat-5.0.5
    • glibc-devel-2.5-49-i686 (This is a 32-bit package)
    • glibc-devel-2.5-49-x86_64 (This is a 64-bit package)

    Crearemos el usuario oem que asignaremos al grupo oinstall

    Tras descomprimir los 3 ficheros de fuentes (ocupan unos 5 Gb) lanzaremos el comando

    ./runInstaller

    Lo primero que nos solicitará es el usuario del metalink (soporte), nosotros le diremos que no queremos
    Captura de pantalla 2013-03-03 a la(s) 18.48.38

    Lo segundo es si queremos buscar nuevas actualizaciones, nuevamente le diremos que no

    usuario metalnk

    usuario metalnk

    Tras esto, el instalador llevará a cabo las comprobaciones necesarias para la instalación, en caso de tener problemas con alguna de ellas, deberemos de solucionarlas.En nuestro caso, nos muestra un «warning» que podemos omitir.
    prerequisitos

    Este problema es debido a que necesitamos la instalación de una librería de 32 bits y nuestro sistema es de 64 bits, para solucionarlo solamente tenemos que hacer

    yum install glibc-devel.i686
    

    Con la instalacion de esta librería, la comprobación será correcta, y podremos seguir con la instalación.

    Una vez pasado ese punto, nos indica que tipo de instalacion queremos hacer.
    Tenemos una explicacion de cual es cual en http://docs.oracle.com/cd/E24628_01/install.121/e22624/install_em_exist_db.htm en Table 7-1 Differences Between Simple and Advanced Installation,y, como podeis ver, la instalacion básica se ajusta mas que de sobra a nuestras necesidades.

    Captura de pantalla 2013-03-03 a la(s) 18.53.34

    Antes de seguir en los siguientes pasos hay que tener unas pequeñas cosillas en cuenta:

    • El wizzard no puede lanzarse desde un host remoto, hay que instalar desde la máquina
    • No tenemos que tener variables ORACLE_HOME o ORACLE_SID
    • No hay que instalar el OEM en un link
    • OEM te va a instalar un Weblogic y el JDK 1.6
    • No trastees el weblogic, hay que dejarlo caer como lo va a dejar la instalacion de OEM
    • La instalación no debe de hacerse como root
    • La base de datos del repositorio debe de ser una versión Enterprise con particionamiento
    • La tarea de recolección de estadísticas debe de estar detenida

    En nuestro caso, vamos a dejar la instalacion bajo la particion /oem

    paths e instalacion

    paths e instalacion

    Le introducimos el password y la ubicacion de nuestra base de datos.

    password e instancia

    password e instancia

    Importante: Hemos de tener en cuenta que este paso se «apropiará» de la cuenta de system de la instancia, con lo que se teníamos en Enterpise Control de la instancia nos tocará eliminarlo.

    Tras este punto volveremos a tener las comprobaciones de rigor, y tras poner una contraseña acorde (en este punto no nos deja poner una trivial) , llegaremos a la pantalla de instalación.

    instalaacion

    El proceso de instalación es bastante largo,pero , siguiendo estos pasos finalizar la instalación es simplemente cuestion de tiempo y paciencia.

    Monitorizar el alert.log desde una sql remota

    El fichero de alertas de oracle alert.log es uno de los ficheros que tradicionalmente revisamos en busca de errores de la base de datos.
    Hasta la versión 11g esta monitorización se hacía por medio del scripts que interactuaban con ficheros del sistema operativo, lo que nos llevaba a tener que mantener estos scripts para las distintas versiones de shells de sistema, o tener que instalar algún tipo de interprete en el sistema que nos lo gestionara de manera multiplataforma.

    Una de las grandes ventajas de la 11g es que Oracle nos ha obsequiado con una tabla de base de datos que mapea esta información del alert.log dentro de la base de datos . Estamos hablando de la tabla x$dbgalertext;

    Mediante la tabla x$dbgalertext podemos obtener toda la informacion que está en el alert.log, su contenido es:

    SQL> desc X$DBGALERTEXT
    
               Name                            Null?    Type
               ------------------------------- -------- -------------------------
        1      ADDR                                     RAW(4)
        2      INDX                                     NUMBER
        3      INST_ID                                  NUMBER
        4      ORIGINATING_TIMESTAMP                    TIMESTAMP(3) WITH TIME ZONE
        5      NORMALIZED_TIMESTAMP                     TIMESTAMP(3) WITH TIME ZONE
        6      ORGANIZATION_ID                          VARCHAR2(64)
        7      COMPONENT_ID                             VARCHAR2(64)
        8      HOST_ID                                  VARCHAR2(64)
        9      HOST_ADDRESS                             VARCHAR2(16)
       10      MESSAGE_TYPE                             NUMBER
       11      MESSAGE_LEVEL                            NUMBER
       12      MESSAGE_ID                               VARCHAR2(64)
       13      MESSAGE_GROUP                            VARCHAR2(64)
       14      CLIENT_ID                                VARCHAR2(64)
       15      MODULE_ID                                VARCHAR2(64)
       16      PROCESS_ID                               VARCHAR2(32)
       17      THREAD_ID                                VARCHAR2(64)
       18      USER_ID                                  VARCHAR2(64)
       19      INSTANCE_ID                              VARCHAR2(64)
       20      DETAILED_LOCATION                        VARCHAR2(160)
       21      PROBLEM_KEY                              VARCHAR2(64)
       22      UPSTREAM_COMP_ID                         VARCHAR2(100)
       23      DOWNSTREAM_COMP_ID                       VARCHAR2(100)
       24      EXECUTION_CONTEXT_ID                     VARCHAR2(100)
       25      EXECUTION_CONTEXT_SEQUENCE               NUMBER
       26      ERROR_INSTANCE_ID                        NUMBER
       27      ERROR_INSTANCE_SEQUENCE                  NUMBER
       28      VERSION                                  NUMBER
       29      MESSAGE_TEXT                             VARCHAR2(2048)
       30      MESSAGE_ARGUMENTS                        VARCHAR2(128)
       31      SUPPLEMENTAL_ATTRIBUTES                  VARCHAR2(128)
       32      SUPPLEMENTAL_DETAILS                     VARCHAR2(128)
       33      PARTITION                                NUMBER
       34      RECORD_ID                                NUMBER
    

    Ahora bien, ¿como accedemos a ella?

    La tabla no puede ser accedida directamente desde un usuario que no sea sys, así que, lo que haremos será el crear una vista sobre esta tabla (a la que llamaremos por ejemplo ficheroalert ) y permitirle que lo vea a nuestro usuario de monitorizacion.

    
    create view ficheroalert as select  * from sys.x$dbgalertext;
    grant select on sys.ficheroalert to MONITORIZACION;
    
    

    A partir de aquí, solamente tenemos que jugar con los campos descritos arriba y podremos obtener la informacion que deseemos.
    En mi caso , por ejemplo, me gustaría saber si ha habido algún mensaje ORA- o ERROR en los ultimos 5 munitos.

    La consulta que ejecutaré para obtenerlo es:

    
    select to_char(ORIGINATING_TIMESTAMP, 'dd-mon-yyyy hh24:mi:ss'),
          substr(MESSAGE_TEXT, 1, 300) message_text
        from sys.ficheroalert
        where (MESSAGE_TEXT like '%ORA-%'
                or upper(MESSAGE_TEXT) like '%ERROR%')
         and 
               cast(ORIGINATING_TIMESTAMP as DATE) > sysdate - 5/1440;
                - X/1440 es la X en minutos 
    
    

    Entrada en ingles en Monitoring the alert.log from a remote sql

    Instalación de RAC I Preparativos

    Vamos a retomar la instalación de un RAC en una plataforma virtualizada de pruebas con Virtualbox. En este punto tenemos las máquinas creadas y con el sistema operativo instalado, con lo que vamos a utilizar esta entrada para detallar los pasos necesarios para ajustar esos sistemas operativos para la instalacion del grid

    Creacion de usuarios y grupos
    Lo primero que hemos de hacer es crear los grupos necesarios para nuestra instalación

    /usr/sbin/groupadd -g 501 oinstall
    /usr/sbin/groupadd -g 502 dba
    /usr/sbin/groupadd -g 505 asmadmin
    /usr/sbin/groupadd -g 506 asmdba
    /usr/sbin/groupadd -g 507 asmoper
    

    Tras los grupos, creamos los usuarios y los asignamos a los grupos correspondientes

    /usr/sbin/useradd -u 501 -g oinstall -G asmadmin,asmdba,asmoper grid
    /usr/sbin/useradd -u 502 -g oinstall -G dba,asmdba oracle
    

    Confuguración del fichero hosts

    Dado que los equipos van a referenciarse entre ellos constantemente, deberemos de configurar la resolución de nombres entre ellos, la forma mas rápida y sencilla es la de incluir sus nombres en el /etc/hosts de todos los nodos del rac

    # Direcciones para nuestros equipos
    # HOST y publica  eth0
    10.0.2.2  exodar.pamplona.name   exodar
    10.0.2.3  rac1.pamplona.name     rac1
    10.0.2.4  rac2.pamplona.name     rac2
    10.0.2.5  rac3.pamplona.name     rac3
    10.0.2.6  rac4.pamplona.name     rac4
    10.0.2.24 plantilla.pamplona.name        plantilla
    
    
    #Virtual  Eth1  direcciones de la red sobre la que se da el servicio 
    192.168.1.1  exodar-vip.pamplona.name   exodar-vip
    192.168.1.2  rac1-vip.pamplona.name     rac1-vip
    192.168.1.3  rac2-vip.pamplona.name     rac2-vip
    192.168.1.4  rac3-vip.pamplona.name     rac3-vip
    192.168.1.5  rac4-vip.pamplona.name     rac4-vip
    192.168.1.24 plantilla-vip.pamplona.name        plantilla-vip
    
    #ScaN  comentadas ya que estan dada de alta en round robin dns
    # estas son las verdaderas direcciones de servicio 
    #192.168.1.20  ractest.pamplona.name  ractest
    #192.168.1.21  ractest.pamplona.name  ractest
    #192.168.1.22  ractest.pamplona.name  ractest
    
    #Private ETH2 red privada de los nodos
    192.168.2.1  exodar-conn.pamplona.name  exodar-priv
    192.168.2.2  rac1-conn.pamplona.name    rac1-conn
    192.168.2.3  rac2-conn.pamplona.name    rac2-conn
    192.168.2.4  rac3-conn.pamplona.name    rac3-conn
    192.168.2.5  rac4-conn.pamplona.name    rac4-conn
    192.168.2.24 plantilla-conn.pamplona.name   plantilla-conn
    
    

    Consideraciones sobre la configuracion de la red

    • El orden de las interfaces de red en todos los nodos ha de ser el mismo
    • La direccion de SCAN (Single Cliente Access Name) es la direccion a la que vamos a aceeder desde los clientes ( IPs de servicio),Grid Infraestructure iniciará el local listener LISTENER sobre todos los nodos para escuchar sobre la local VIP, y SCAN listener LISTENER_SCAN1 para escuchar sobre las SCAN VIPs. Aunque podríamos seguir entrando a las local VIPS del nodo, Oracle recomienda que se acceda siempre a las direcciones de SCAN.
    • La direccion de SCAN debe de ser un nombre del dominio con almenos una direccion y un máximo de tres direcciones,el nombre de la direccion de scan (ractest en nuestro caso) debe de ser global y único y será utilizado por defecto como nombre del cluster
    • Oracle recomienda no configurar SCAN VIP address en el archivo host ya que si se usa en archivo host para resolver el nombre del SCAN, se puede tener una sola SCAN VIP address. Oracle recomienda configurar el SCAN para utilizar DNS Round Robin resolution a con direcciones.

    Servidor de NTP
    Debemos de estar seguros que la hora de todos nuestros equipos del RAC es idéntica.
    Oracle cuenta con el CTSSD(Cluster Time Syncronization Server Daemon) que se encarga de esto, con lo que podemos parar el servicio del sistema operativo NTPD.
    Si por el contrario queremos tener el servicio activo, habremos de configurarlo con la opción -x

    Creamos accesos por ssh entre los nodos.
    Deberemos permitir conexiones y ejecuciones remotas entre los nodos para el usuario grid.
    Para ello haremos en uno de los dos nodos:

    mkdir .ssh
    chmod 700 .ssh
    [grid@rac1 ~]$ ssh-keygen -t dsa
    Generating public/private dsa key pair.
    Enter file in which to save the key (/home/grid/.ssh/id_dsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/grid/.ssh/id_dsa.
    Your public key has been saved in /home/grid/.ssh/id_dsa.pub.
    
    

    Ahora copiaremos

    scp id_dsa.pub rac1-vip:/home/grid/.ssh/authorized_keys
    
    

    y haremos lo mismo con rac1

    scp id_dsa.pub rac2-vip:/home/grid/.ssh/authorized_keys
    
    

    para ver si ha funcionado deberemos de poder hacer libremente ssh desde el usuario grid de rac1 a rac2 y viceversa.

    preparamos los parámetros del kernel

    Editaremos el fichero /etc/sysctl.cnf y pondremos los siguientes valores para el kernel

    # Para Oracle
    fs.aio-max-nr = 1048576
    fs.file-max = 6815744
    kernel.shmall = 2097152
    kernel.shmmax = 1054504960
    kernel.shmmni = 4096
    # semaphores: semmsl, semmns, semopm, semmni
    kernel.sem = 250 32000 100 128
    net.ipv4.ip_local_port_range = 9000 65500
    net.core.rmem_default=262144
    net.core.rmem_max=4194304
    net.core.wmem_default=262144
    net.core.wmem_max=1048586
    
    

    para que el kernel adopte estos valores sintener que reiniciar ejecutaremos el comando

    sysctl -p
    
    

    ademas de esto, tendremos que añadir las siguientes líneas en el fichero /etc/security/limits.conf

    # Para Oracle
    grid soft nproc 2047
    grid hard nproc 16384
    grid soft nofile 1024
    grid hard nofile 65536
    
    oracle soft nproc 2047
    oracle hard nproc 16384
    oracle soft nofile 1024
    oracle hard nofile 65536
    
    

    comprobamos que en el fichero /etc/pam.d/login este la línea

    session required pam_limits.so
    
    

    Directorios para la instalación
    Ahora crearemos los directorios de instalacion.
    Habitualmente los elementos de oracle son creados bajo /u01/app /u02 ….
    En nuestro caso tratándose de una plataforma de test sobre maquinas virtuales no tenemos un alto número de unidades de disco que montar y donde separar los elementos, con lo que toda nuestra instlacion será llevada a cabo bajo el directorio /oracle aún así y por motivos de compatibilidad, vamos ha hacer un enlace simólico desde /u01 hasta /oracle
    así pues, nuestros datos para la instalacion del grid serán
    GI_HOME=/oracle/11.2.0/grid
    ORACLE_BASE=/oracle/app/grid

    Hemos de tener en cuenta que el GI_HOME no debe de estar bajo ningún directorio de oracle_base .
    Durante la instalación el GI_HOME será cambiado a root lo que podría causar errores de alguna otra instalación que esté sobre esos discos.

    mkdir /oracle
    ln -s /oracle /u01
    chown -R grid:oinstall /oracle
    mkdir -p /oracle/11.2.0/grid
    chown -R grid:oinstall /oracle/11.2.0/grid
    chmod 775 /oracle/11.2.0/grid
    
    mkdir -p /oracle/app/grid
    chown -R grid:oinstall /oracle/app/grid
    chmod -R 775 /oracle/app/grid
    
    

    Configuramos el asmlib

    [root@rac2 etc]# /etc/init.d/oracleasm configure -i
    Configuring the Oracle ASM library driver.
    
    This will configure the on-boot properties of the Oracle ASM library
    driver. The following questions will determine whether the driver is
    loaded on boot and what permissions it will have. The current values
    will be shown in brackets ('[]'). Hitting without typing an
    answer will keep that current value. Ctrl-C will abort.
    
    Default user to own the driver interface []: grid
    Default group to own the driver interface []: asmadmin
    Start Oracle ASM library driver on boot (y/n) [y]:
    Scan for Oracle ASM disks on boot (y/n) [y]:
    Writing Oracle ASM library driver configuration: done
    Initializing the Oracle ASMLib driver: [ OK ]
    Scanning the system for Oracle ASMLib disks: [ OK ]
    

    Aseguramos permisos con UDEV
    En linux una de las formas que podemos asegurar que los dispositivos de los discos tendrán los permisos deseados es mediante la creacion de una regla de udev.
    Así pues, con el comando blkid comprobaremos que discos tenemos en nuestro sistema.

    [root@rac1 /]# blkid
    /dev/sda1: UUID="b8327abf-baf7-48c5-baac-b39dc98d6b6e" TYPE="swap"
    /dev/sda2: UUID="67748b98-ffde-4dbc-9b14-5da7dae13d65" TYPE="ext4"
    /dev/sdb1: LABEL="DISK1" TYPE="oracleasm"
    /dev/sdc1: LABEL="DISK2" TYPE="oracleasm"
    /dev/sdd1: LABEL="DISK3" TYPE="oracleasm"
    /dev/sde1: LABEL="DISK4" TYPE="oracleasm"
    /dev/sdf1: LABEL="DISK5" TYPE="oracleasm"
    /dev/sdg1: LABEL="OCRVOTING" TYPE="oracleasm"
    
    

    con lo que sabemos que tenemos los discos sdb,sdc,sdd,sde,sdf, y sdg para asegurar los permisos crearemos el fichero /etc/udev/rules.d/99.oracle.rules con el contenido

    # Damos permisos grid:asmadmin a los discos de asm
    
    KERNEL=="sd[b-g]1", OWNER="grid",GROUP="asmadmin", MODE="660" NAME="asmdisk_%k"
    
    

    comprobamos los permisos

    root@rac1 /]# ls -l /dev/sd*
    brw-rw---- 1 root disk 8, 0 dic 30 16:56 /dev/sda
    brw-rw---- 1 root disk 8, 1 dic 30 16:56 /dev/sda1
    brw-rw---- 1 root disk 8, 2 dic 30 16:56 /dev/sda2
    brw-rw---- 1 root disk 8, 16 dic 30 16:56 /dev/sdb
    brw-rw---- 1 root disk 8, 17 dic 30 16:56 /dev/sdb1
    brw-rw---- 1 root disk 8, 32 dic 30 16:56 /dev/sdc
    brw-rw---- 1 root disk 8, 33 dic 30 16:56 /dev/sdc1
    brw-rw---- 1 root disk 8, 48 dic 30 16:56 /dev/sdd
    brw-rw---- 1 root disk 8, 49 dic 30 16:56 /dev/sdd1
    brw-rw---- 1 root disk 8, 64 dic 30 16:56 /dev/sde
    brw-rw---- 1 root disk 8, 65 dic 30 16:56 /dev/sde1
    brw-rw---- 1 root disk 8, 80 dic 30 16:56 /dev/sdf
    brw-rw---- 1 root disk 8, 81 dic 30 16:56 /dev/sdf1
    brw-rw---- 1 root disk 8, 96 dic 30 16:56 /dev/sdg
    brw-rw---- 1 root disk 8, 97 dic 30 16:56 /dev/sdg1
    

    ejecutamos

    udevadm control --reload-rules
    /sbin/start_udev
    

    Y comprobamos los permisos, tenemos que:

    [root@rac1 rules.d]# ls -l /dev/sd*
    brw-rw---- 1 root disk 8, 0 dic 30 15:01 /dev/sda
    brw-rw---- 1 root disk 8, 1 dic 30 15:01 /dev/sda1
    brw-rw---- 1 root disk 8, 2 dic 30 15:01 /dev/sda2
    brw-rw---- 1 root disk 8, 16 dic 30 15:01 /dev/sdb
    brw-rw---- 1 grid asmadmin 8, 17 dic 30 15:01 /dev/sdb1
    brw-rw---- 1 root disk 8, 32 dic 30 15:01 /dev/sdc
    brw-rw---- 1 grid asmadmin 8, 33 dic 30 15:01 /dev/sdc1
    brw-rw---- 1 root disk 8, 48 dic 30 15:01 /dev/sdd
    brw-rw---- 1 grid asmadmin 8, 49 dic 30 15:01 /dev/sdd1
    brw-rw---- 1 root disk 8, 64 dic 30 15:01 /dev/sde
    brw-rw---- 1 grid asmadmin 8, 65 dic 30 15:01 /dev/sde1
    brw-rw---- 1 root disk 8, 80 dic 30 15:01 /dev/sdf
    brw-rw---- 1 grid asmadmin 8, 81 dic 30 15:01 /dev/sdf1
    brw-rw---- 1 root disk 8, 96 dic 30 15:01 /dev/sdg
    brw-rw---- 1 grid asmadmin 8, 97 dic 30 15:01 /dev/sdg1
    

    Comprobacion de prerequisitos

    Ahora podremos comprobar que esta todo correcto con el comando

    
    ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -r 11gR2 
    

    El siguiente paso será la instalación del Grid Infraestructure