sábado, 29 de noviembre de 2014

MELI - API - SDK - JAVA -Obtener datos con una petición GET


Estoy empezando a incursionar en las API de Mercado Libre y decidí crear una aplicación de ejemplo. 
La idea es utilizar la sdk de Java disponible para Mercado Libre para poder hacerlo. También existen para otros lenguajes como PHP, Python, entre otros. En esta github de mercado libre podes encontrar más información.

En este ejemplo vamos a utilizar la sdk de java.

Los pasos son los siguentes:

1) Para poder conectarse con las API de MELI es necesario utilizar el Aplication Manager. En ese link van a encontrar information de como crear el App id y el Secret Key.

2) Una vez que tenemos el App id (clientID) y el Secret Key(clientSecret) vamos a bajar la sdk-Java de Mercado Libre.
Para proyectos maven solamente con agregar un nuevo repositorio alcanza.

<repositories>
    ...
    <repository>
         <id>mercadolibre-snapshots</id>
         <url>https://github.com/mercadolibre/java-sdk-repo/raw/master/snapshots</url>
    </repository>
    ...
</repositories>

Y después la dependencia

<dependencies>
       ...
       <dependency>
             <groupId>com.mercadolibre</groupId>
             <artifactId>sdk</artifactId>
             <version>0.0.2-SNAPSHOT</version>
      </dependency>
      ...
</dependencies>


3) Una vez configurado su entorno vamos a proceder a realizar la comunicación con MELI.

Creamos una nueva clase llamada Site como sigue:

public class Site {

    private final String id;
    private final String name;

    public Site(final String id, final String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Site{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

Esta clase va a contener toda la información de los Sites.

Luego creamos un SiteHandler para realizar las consultas.

public class SiteHandler {
   //Nombre de los campos que vamos a obtener informacion
    private static final String ID_KEY = "id";
    private static final String NAME_KEY = "name";
    //Creamos una unica instancia de Meli.
    private final Meli meli;

    private static final SiteHandler instance = new SiteHandler();

    private SiteHandler() {
        //Aca creamos el objecto Meli con la información de su aplicación.
        meli = new Meli(clientId, clienteSecret);
    }

    public static SiteHandler getInstance() {
        return instance;
    }

    public List<Site> getAllMeliSite()  {
        //Todos los sites.
        final List<Site> newSites = new ArrayList<Site>();
        try {
            //Aqui realizamos la consulta de todos los sites.
            final Response response = meli.get("/sites/");
            //Objeto gson que sirve para "parsear" los resultados.
            final Gson gson = new Gson();
            //Convertimos desde JSON a Java creando una lista de StringMap
            final List<StringMap<String>> sites = gson.fromJson(response.getResponseBody(), List.class);
            //Convertimos los objectos StringMap a Site.
            for (final StringMap<String> entries : sites) {
                newSites.add(new Site(entries.get(ID_KEY), entries.get(NAME_KEY)));
            }
        } catch (MeliException ex) {
            //Logger error en la respuesta
            System.out.println("Error " + ex.getMessage());
        } catch (IOException e) {
            //Logger error en la transformacion usando de gson.
            System.out.println("Error " + e.getMessage());
        }
        return newSites;
    }
}

Por último creamos un objeto main para que ejecute lo anterior:

public class Main {

    public static void main(String[] args) throws Exception {
        final List<Site> sites = SiteHandler.getInstance().getAllMeliSite();

        for (final Site site: sites) {
            System.out.println(site);
        }
    }   
}

Espero que sirva este sensillo ejemplo.

El ejemplo completo lo pueden encontrar en este link


Referencias:
https://github.com/mercadolibre/java-sdk
http://developers.mercadolibre.com/application-manager/
http://www.java2blog.com/2013/11/gson-example-read-and-write-json.html
http://developers.mercadolibre.com/api-directory/#close




jueves, 23 de octubre de 2014

AngularJs - Crear un simple menú.

Estoy empezando a utilizar AngularJs (por lo cual no soy un experto) pero aquí les dejo un ejemplo sobre como crear un menú de opciones y dejar seleccionada la opción dependiendo donde se encuentra  el usuario. 
Para mayor detalle ver la referencia abajo.

1) Este es el html principal: portada.html


       <html ng-app="portada">
            <head> 
                <script src="angular.min.js">
                </script> <script src="app.js"></script> 
             </head>
             <body> 
                   <div class="clearfix">
                      <menu></menu> 
                   </div>
             </body>
        </html>

2) Creamos el html que va a ser nuestra directives  menu.html

        <ul> 
             <li ng-repeat="navLink in navLinks" ng class="navClass('{{navLink.Title}}')">
                     <a href='{{navLink.Href}}#{{navLink.Title}}'> {{navLink.LinkText}}</a>
             </li>
        </ul>

3) Creamos el archivo js para el cual vamos a crear el directives y el modulo correspondiente: app.js
(function () {
var app = angular.module('portada', []);
app.controller('menuController', ['$scope', '$location', function ($scope, $location) {
$scope.navLinks = [{
Title: 'portada',
LinkText: 'Inicio',
Href : 'portada.html'
},{
Title: 'contacto',
LinkText: 'Contacto',
Href : 'contacto.html'
}];

$scope.navClass = function (page) {
var currentRoute = $location.path().substring(1) || 'portada';
return page === currentRoute ? 'active' : '';
};   
}]);

app.directive('menu', function() {
return {
restrict: 'E',
templateUrl: 'menu.html',
controller:'menuController', 
controllerAs: 'menuController'
}
});
})();
4) Agregarle un estilo particular al clase "active"

Referencia sobre este ejemplo.


miércoles, 22 de octubre de 2014

Linux - Log-in al servidor con SSH sin password


Una vez que tenemos la consola abierta ejecutamos estos pasos: 

1) Ejecutamos este comando: 

ssh-keygen

Obtenemos la salida

Generating public/private rsa key pair.
Enter file in which to save the key (/home/federico-coraglio/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/federico-coraglio/.ssh/id_rsa.
Your public key has been saved in /home/federico-coraglio/.ssh/id_rsa.pub.
The key fingerprint is:
7c:8d:a0:81:ac:e6:41:20:b9:bf:41:59:34:18:65:58 federico-coraglio@federico-coraglio
The key's randomart image is:
+--[ RSA 2048]----+
|o..BE            |
|o.oo.o           |
| ..oo . .        |
|..o.   + . o     |
| o+   . S o .    |
| oo.     .       |
|  .o             |
|  .              |
|                 |
+-----------------+



2) Copiamos la clave publica dentro del servidor con este comando: 


ssh-copy-id usuario_del_servidor@host_del_servidor.

Vamos a obtener la siguiente salida:

ssh-copy-id usuario_del_servidor@host_del_servidor
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
usuario_del_servidor@host_del_servidor's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '
usuario_del_servidor@host_del_servidor'"
and check to make sure that only the key(s) you wanted were added.


3) Intentamos realizar el log-in en el servidor con el siguiente comando: 


ssh usuario_del_servidor@host_del_servidor

La primera vez nos va a solicitar la contraseña pero los sucesivos log-in no.

Explicación:

Esto asume que ya tenes una conexion exitosa con tu servidor usando SSH. 
Primero necesitas generar un "SSH keypair" el cual te va a permitir identificarte con el servidor. Lo recomendable es agregarle una password a este par de claves. 

Luego corriendo el comando ssh-keygen va a crear dos archivos id_rsa y id_rsa.pub. El segundo es el que se almacena en el servidor y el otro se mantiene en tu maquina local. 


Por último, copiamos la clave publica a tu servidor usando el comando ssh-copy-id usuario@host_del_servidor. En este punto se te solicita que ingreses la password, una vez realizado estos pasos ya puedes loguearte al servidor sin usar passworod. 

Referencia


Javascript - Precarga con Ajax


Muchas veces tenemos la necesidad de mostrar un texto o una imagen que indique que se esta realizando una operación con Ajax. Los pasos para realizar esto son los siguientes:

1. Código HTML: es necesario definir un div con un id para que podamos actualizar el contenido buscado en la url o para que muestre el texto cargando.   

<div id="dvActualizar" ></div>

2. Codigo JavaScript:

function crearXMLHttpRequest() {
    var xmlHttp=null;
    if (window.ActiveXObject) {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
    return xmlHttp;
}


function loadAjaxUpdate(url,dvNombre){
        var contenido;
        contenido = document.getElementById(dvNombre);
        request=crearXMLHttpRequest();
        request.open("GET", url,true);
        request.onreadystatechange=function(){
          if(request.readyState==1){
                contenido.innerHTML = "Cargando...";
          }else if(request.readyState==4){
                if(request.status==200){                               
                   contenido.innerHTML = request.responseText;
                }else {
                   alert(request.statusText);
                }               
            }
        }
        request.send(null);
}

Para poder ejecutar el ajax solo es necesario pasar por parametro la url y el nombre del div.

loadAjaxUpdate('mi_url', 'dvActualizar');
Eso es todo!

Oracle 10g - Tabla/Vistas Interesantes de Oracle



Prefijo USER: Vista del usuario(lo que está en el esquema; lo que es de su propiedad)
Prefijo ALL: Vista del usuario ampliada(a lo qe puede acceder)
Prefijo DBA: Vista del administrador de la base de datos(lo que hay en los esquemas de todos)
Prefijo V$: Datos relacionados con el rendimiento


V$FIXED_TABLE: se puede obtener todos los nombres de las vistas.

V$ARCHIVE_LOG: muestra los archivos que se han creado, de los que se ha realizado una copia de seguridad y que se han eliminado de la base de datos.

V$BACKUP_CORRUPTION: muestra los bloque detectados como corruptos durante una copia de seguridad de un juego de copias de seguridad.

V$BACKUP_DATAFILE: es útil para crear juegos de copias de seguridad del mismo tamaño determinando el número de bloques de cada archivo de datos. También puede ayudar a buscar el número de bloques corruptos para el archivo de datos.

V$BACKUP_DEVICE: muestra información sobre los dispositivos de copia de seguridad soportados. Esta vista no devuelve el tipo de dispositivo especial DISK porque siempre está disponible.

V$BACKUP_FILES: muestra información sobre todas las copias de seguridad y arhive logs de RMAN.

V$BACKUP_PIECE: muestra partes de copia de seguridad creadas para juegos de copias de seguridad.

V$BACKUP_REDOLOG: muestra archive logs almacenados en juegos de copias de seguridad.

V$BACKUP_SET: muestra los juegos de copias de seguridad creados.

V$COPY_CORRUPTION: muestra los bloque que se han detectado como corruptos durante una copia de imagen.

V$DATABASE_BLOCK_CORRUPTION muestra bloques de base de datos marcados como corruptos durante la copia de seguridad de RMAN más reciente.

V$RMAN_CONFIGURATION muestra información sobre los valores de configuración persistente de RMAN.

V$PROXY_ARCHIVELOG.

V$PROXY_DATAFILE

Para ver estadísticas de rendimiento de copia de seguridad, puede consultar:

V$BACKUP_ASYNC_IO

V$BACKUP_SYNC_IO

Obtener el SCN actual

SELECT current_scn FROM V$DATABASE

Obtener información sobre los objectos de la base de datos

USER_OBJECTS

ALL_OBJECTS

DBA_OBJECTS

V$SESSION_LONGOPS sirve para controlar el progreso de las copias de seguridad y las copias.

DBA_TABLESPACES(tablespace_name):  lista de tablespace disponible en la base de datos necesita los privilegios de administrador.

USER _TABLESPACES((tablespace_name): lista de tablespace disponible en la base de datos  para usuario sin permisos de administrador.

V$PARAMETER(name,value,isdefualt): permite consultar los parametros de inicializacion de la base de datos.

V$SQL_WORKAREA_HISTOGRAM : es utilizada para controlar el área de trabajo de PGA.

V$PGASTAT: es utilizada para controlar el área de trabajo de PGA.

V$SQL_WORKAREA_ACTIVE: es utilizada para controlar el área de trabajo de PGA.

V$SQL_WORKAREA: es utilizada para controlar el área de trabajo de PGA.

V$TEMPSEG_USAGE: es utilizada para controlar el área de trabajo de PGA.

V$PGA_TARGET_ADVICE: brinda información para definir el tamaño del área de trabajo PGA.

V$PGA_TARGET_ADVICE_HISTOGRAM: brinda información para definir el tamaño del área de trabajo PGA.

V$STATISTICS_LEVEL: para determinar qué parámetros se ven afectados por el parámetro STATISTICAL_LEVEL.

V$EVENT_NAME(event_number,event_id,name,parameter1,parameter2,parameter3,wait_class): para ver todos los tipos de eventos de espera.

V$SYSSTAT(statisc,name,class,value,stat_id):  estadisticas acumuladas desde que se inicio la instancia.

V$SYSTEM_WAIT_CLASS(wait_class_id,wait_class,total_waits,time_waited)

V$SERVICE_EVENT: recuentos de esperas y tiempos de espera agregados para cada servicio, por evento.

V$SERVICE_WAIT_CLASS: recuentos de  esperas y tiempos de espera agregados para servicio, por clase de espera.

V$DATABASE: para instancia/Base de datos.

V$INSTANCE: para instancia/Base de datos.

V$SPPARAMETER: para instancia/Base de datos.

V$SYSTEM_PARAMETER: para instancia/Base de datos.

V$PROCESS: para instancia/Base de datos.

V$BGPROCESS: se puede ver la lista de procesos en segundo plano que se están ejecutando.

V$PX_PROCESS_SYSSTAT: para instancia/Base de datos.

V$SYSTEM_EVENT: estadisticas acumulativas de todas las sessiones.

V$BUFFER_POOL_STATISTICS: para datos de la memoria.

V$LIBRARYCACHE: para datos de la memoria.

V$SGAINFO: para datos de la memoria.

V$SGASTAT: puede consultar esta vista para buscar los totales acumulativos del uso detallado de SGA desde que se inicio la instancia.

V$PGASTAT: para datos de la memoria.

V$DATAFILE: para datos del disco.

V$FILESTAT: para datos del disco.

V$LOG: para datos del disco.

V$LOG_HISTORY: para datos del disco.

V$DBFILE: para datos del disco.

V$TEMPFILE:para datos del disco.

V$TEMPSEG_USAGE: para datos del disco.

V$SEGMENT_STATISTICS: para datos del disco.

V$LOCK: para contención.

V$UNDOSTAT: para contención.

V$WAITSTAT: para contención.

V$LATCH: para contención.

V$SESSTAT: obtener las estadisticas de una session en particular.

V$SESSION_WAIT: enumera los recursos o los eventos por los que están esperando las sessiones activas.

V$SESSION_EVENT: esperas de sesion por evento por cada sesión que ha tenido que esperar.

USER_CONS_COLUMNS:  para listar las constraint.

USER_TAB_PRIVS_MADE: consultar los permisos asignados a otro esquema.

DBA_SEGMENTS:  lista todos los segmentos de la base de datos.

V$SQL: permite obtener información de las sentencias que se pueden compartir.

V$SHARED_POOL_ADVICE: muestra información sobre el timpo estimado que se ha ahorrado durante el análisis utilizando diferentes tamaños de pool compartido.

V$DB_OBJECT_CACHE: consulta sobre los objectos que se mantienen o no dentro de la memoria(Cache de biblioteca)

V$BH para consultar que bloques estan en el pool KEEP.

V$SEGMENT_STATISTICS para segmentos asginados al pool KEEP con el fin de verificar que el número de lecturas lógicas es mucho mayor que el número de lecturas fisicas.

V$FLASH_RECOVERY_AREA_USAGE: se utiliza para ver el uso del espacio en disco del área de recuperacion flash.

Oracle 10g - Análisis sobre los cursores



Para saber si se estan compartiendo los cursores en la base de datos se puede realizar las siguientes consultas:

  • Comprobar GETHITRATIO en V$LIBRARYCACHE
     SELECT gethitratio FROM v$librarycache WHERE namaspace = 'SQL AREA';

Esto determina el porcentaje de llamada de análisis que encuentra un cursor para compartir(GETHITS/GETS). Este porcentaje debe ser superior al 90% en los entornos OLTP.
Se puede consultar la vista v$sql_shared_cursor explica porque un cursor secundario concreto no se comparte con otros cursores secundarios existentes.

  •     Determinar las sentencias que se pueden compartir
     SELECT plan_hash_value, count(*) FROM v$sql GROUP BY plan_hash_value ORDER BY 2 desc;

Esta sentencia devuelve el recuento de plan_hash_value de los cursores no compartidos ordenados por el número de cursores que utilizan el mismo plan. Tenga en cuenta que todos los cursores que utilizan el mismo plan se pueden compartir.

     SELECT sql_text, executions FROM v$sqlarea WHERE plan_hash_value = NNNNNNNNN;

Aquí, NNNNNNNNN es plan_hash_value con los recuentos más altos. Indica que las sentencias SQL se pueden compartir.


Oracle 10g - Consulta de Flashback



Para poder obtener los datos en un momento en el tiempo anterior se realiza a través del siguiente ejemplo:

SELECT salary FROM employees  


AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' minute)

WHERE employee_id=150;

Oracle 10g - ORA-00350 Archive log


 Me encontre con el siguiente error:

ORA-00350: el log 3 de la instancia xxx (thread 1) se debe archivar
Y no me dejaba abrir la base de datos.

Realice la siguiente consulta:

Select group#, status from v$log;


GROUP#     STATUS

----------         ----------------

1                  INACTIVE

3                  INACTIVE

2                  CURRENT


Esto me indica que el grupo 3 esta inactivo por ende ejecute el siguente comando:

alter database clear unarchived logfile group 3;

y luego

alter database open;

Para poder abrir la base de datos.

Oracle 10g - Tipo de Conexión a RMAN


Puede utilizar Recovery Manager para conectarse a los siguientes tipos de base de datos:

Base de datos destino: RMAN le conecta a la base de datos destino con el privilegio SYSDBA. Debe tener el privilegio para que la conexión sea correcta. La base de datos destino es la instancia en la que desea realizar las operaciones típicas de RMAN.

Base de datos de catálogo de recuperación: se trata de una base de datos opcional que se configura para el repositorio de RMAN. Se conecta a la base de datos de catálogo de recuperación cuando desea recuperar información almacenada en ella, como información de copia de seguridad o archivos de comandos almacenados.

Base de datos auxiliar: una base de datos auxiliar puede ser, una base de datos creada con el comando RMAN DUPLICATE o una base de datso temporal que se utilice durante la recuperación point-in-time de tablespace o una base de datos en espera o una copia de base de datos de producción que se puede utilizar para la recuperación de fallos.

Oracle 10g - Definición de parámetros que afectan a RMAN


Parámetro de inicialización de la base de datos:

CONTROL_FILE_RECORD_KEEP_TIME: especifica el número mínimo de días durante el que se almacena información de RMAN en el archivo de control antes de sobreescribirla. Un valor bajo origina que la información se sobreescriba antes, con lo que se minimiza el crecimiento del archivo de control.

Si se define un área de recuperación de flash, los archivos de copia de seguridad se escribirán en ella, por defecto. Se debe definir el tamaño y la ubicación del área de recuperación de flash mediante los siguientes parámetros de inicialización:

DB_RECOVERY_FILE_DEST: destino de las copias de seguridad en el área de recuperación flash.

DB_RECOVERY_FILE_DEST_SIZE: tamaño del área de recuperación de flash.

Variables de entorno:

Las variables de entorno NLS_DATE_FORMAT y NLS_LANG determinan el formato utilizado para los parámetros de tiempo en comandos RMAN como por ejemplo, RESTORE, RECOVERY y REPORT.

Oracle 10g - RMAN


Es una utilidad de Oracle que se utiliza para gestionar las operaciones de copias de seguridad, restauración y de recuperación en la base de datos Oracle. Dispone de un potente lenguaje de comandos que es independiente del sistema operativo.

Pasos para configurar RMAN:
  • Determinar la ubicación del repositorio: archivo de control o catálogo de recuperación
  • Definir las variables de entorno y base de datos.
  • Iniciar RMAN conectarse a las bases de datos destino y, opcionalmente, del catálogo de recuperación.
  • Configure los valores persistentes.

El almacenamiento de Datos del repositorio de Rman pueden ser en:

Archivo de control:
  • Administración más sencilla
  • Valor por defecto.

Catálogo de recuperación:

Mantiene la información de copia de seguridad en una base de datos independiente, lo cual resulta útil en caso de que se pierda el archivo de control. De esta forma, puede almacenar un historial de copias de seguridad más largo de lo que es posible con un repositorio basado en archivos de datos. Un único catálogo de recuperación puede almacenar información de varias bases de datos destino.
  • Replica de datos del archivo.
  • Tiene espacio para más datos.
  • Puede dar servicio a muchos destinos.
  • Puede almacenar archivos de comandos de RMAN.

¿Como configurar un Catálogo de Recuperación?
  • Crear la base de datos que se vaya a utilizar como catálogo de recuperación. Se puede utilizar una base de datos que ya existía.
  • En la base de datos de recuperación, crear el usuario al que van a pertenecer los datos del catálogo de recuperación. Ejemplo: suponiendo que rcat_ts es el nombre del tablespace donde se van a almacenar los datos del catálogo y catdb la base de datos de catálogo.
 $ sqlplus sys/password@catdb as sysdba
 sql>CREATE USER rman INDETIFIED BY cat TEMPORARY TABLESPACE temp DEFAULT TABLESPACE rcat_ts QUOTA UNLIMITED ON rcat_ts;

sql>GRANT UNLIMITED ON rcat_ts TO rman;
  • Otorgue el rol RECOVERY_CATALOG_OWNER al propietario del catálogo. Este rol proporciona al usuario todos los privilegios necesarios para mantener y consultar el catálogo de recuperación.
GRANT RECOVERY_CATALOG_OWNER TO RMAN.
  • Inicie RMAN y conectarse como propietario del catálogo.
$rman catalog rman/cat@catdb
RMAN> CREATE CATALOG TABLESPACE rcat_ts;
  • Conectarse a la base de datos destino mediante RMAN y registrarla en el catálogo de recuperación recién creado.
$ rman target sys/oracle@orcl catalog rman/cat@catdb
RMAN> register database;

martes, 21 de octubre de 2014

Oracle 10g - Inicio de una instancia de Base de datos

Al iniciar la instancia de la base de datos, se selecciona el estado en que se inicia. 

Estos estados son los siguientes:

SID: es el identificador del sistema, que identifica la instancia(por ejemplo, ORCL)

1) NOMOUNT: normalmente, una instancia sólo se inicia en modo NOMOUNT durante la creación de la base de datos, durante la nueva creación de archivos de control o en algunos supuestos de copia de seguridad y recuperación.

El inicio de una instancia incluye las siguientes tareas:

  -  Búsqueda en /database de un archivo con un nombre especìfico en este orden
  •   spfile.ora
  •   Si no se encuentra, spfile.ora
  •   Si no se encuentra, init.ora: este es el archivo que contiene los parámetros de inicialización de la instancia. Al especificar el parámetro PFILE con STARTUP se sustituye el comportamiento por defecto.
   - Asignación de SGA(Area Global del Sistema)
   - Inicio de los procesos en segundo plano
   - Apertura del archivo alert.log y los archivos de rastreo

2) MOUNT: el montaje de una base de datos incluye las siguientes tareas:
  • Asociación de una base de datos con una instancia iniciada previamente
  • Búsqueda y apertura de los archivos de control especificos en el archivo de parámetros.
  • Lectura de archivos de control para obtener los nombres y los estados de los archivos de datos y los archivos de redo log en linea.
Para realizar operaciones de mantenimiento específicas se debe iniciar una instancia y montar una base de datos sin abrir la base de datos.

3) OPEN: La operación normal de la base de datos implica que se inicie una instancia y que la base de datos se monta y se abre. Con el funciomamiento normal de la base de datos, cualquier usuario válido puede conectarse a la base de datos y realizar operaciones normales de acceso a los datos.

La apertura de la base de datos incluye las siguientes tareas:
  •     Apertura de los archivos de datos en línea.
  •     Apertura de los archivos redo log en línea.
Si alguno de los archivos de datos o archivos de redo log en línea no está presente cuando se intenta abrir la base de datos, el servidor de Oracle devuelve un error.

Durante esta etapa final el servidor de Oracle verifica que todos los archivos de datos y archivos redo log en línea se pueden abrir y comprueba la consistencia de la base de datos. Si es necesario, el proceso en segundo plano del monitor del sistema (SMON) inicia la recuperación de la instancia.


Oracle 10g - Estructura de la Base de datos


Cada base de datos Oracle en ejecución esta asociada a una instancia de Oracle. Cuando una base de datos se inicia en un servidor de bases de datos, el software de Oracle asigna un área de memoria compartida denomida Area Global del Sistema(SGA) e inicia varios procesos en segundo plano de Oracle. 

Esta combinación de SGA y los procesos en Oracle se denomina Instancia de Oracle. Después de iniciar una instancia, el software de Oracle la asocia a una base de datos concreta. Esto se denomina montaje de la base de datos. La base de datos está ahora lista para su apertura.

La estructura de la base de datos en Oracle esta conformada por:

Estructura de Memoria

La estructura de memoria básicas asociadas a una instancia de Oracle incluye: 

Area Global del Sistema(SGA): compartida por todos los procesos de servidor y en segundo plano. La misma incluye las siguientes estructuras de datos:

Cache de buffers de la base de datos: almacena en cachè los blogues de datos que recuperan de la base de datos.

Buffer de redo log: almacena en cache la información de redo (utilizada para la recuperación de una instancia) hasta que se pueda escribir en los archivos de redo log fisicos almacenados en disco.

Pool compartido: almacena en cache las distintas construcciones que se pueden compartir entre los usuarios.

Pool grande: es un área que proporciona grandes asignaciones de memoria para deteminados procesos grandes, como operaciones de recuperación y copia de seguridad de Oracle y procesos de E/S del servidor.

Pool Java: se utiliza para todos los códigos y datos Java específicos de la sesión dentro de Java Virtual Machine(JVM).

Pool de Streams: utilizado por Oracle Streams.

Existe también un Area Global de Programa(PGA) que es una región de la memoria que contiene datos e información de control para cada proceso de servidor. Un proceso de servidor de Oracle se ocupa de las solicitudes de un cliente.

Estructuras de Proceso

Se pueden destacar tres procesos:
  • Proceso de usuario: se inicia en el momento en que un usuario de base de datos solicita una conexión al servidor de Oracle.
  •  Proceso de servidor: conecta a la instancia de Oracle y se inicia cuando un usuario establece una sesión.
  • Proceso en segundo plano: se inician al iniciar una instancia de Oracle.

Los proceso en segundo plano más comunes son los siguientes:

Monitor del Sistema(SMON): realiza la recuperación de fallos cuando la instancia se inicia después de un fallo. Es encargado también de la limpieza de los segmentos temporales en desuso.

Control de procesos(PMON): realiza la limpieza de procesos cuando falla un proceso de usuario.

Escritor de la base de datos(DBWn): escribe bloques modificados de la cache de buffers de la base de datos en los archivos de datos del disco.

Punto de control(CKPT): actualiza todos los archivos de datos y de control de la base de datos para indicar el punto de control más reciente.

Escritor de log(LGWR): escribe las entradas de redo log en el disco.

Proceso de archivado(ARCn): copia los archivos redo log en un almacenamiento de archivado cuando se produce un cambio de log.

Estructura de Base de Datos Física

Los archivos que costituyen una base de datos Oracle están organizados del siguiente modo:

Archivos de control(Control File): contienen datos sobre la propia base de datos(es decir, información sobre la estructura de la base de datos física). Estos archivos son críticos para la base de datos, sin ellos no se pueden abrir los archivo de datos para acceder a los datos que contiene la base de datos.

Archivos de datos(Data File): contienen los datos de aplicación o de usuario de la base de datos.

Archivos redo log en línea: permiten la recuperación de instancias de la base de datos. Si la base de datos falla y no pierde archivos de datos, la instancia puede recuperar la base de datos con la información de dichos archivos.

Archivos de parametros(Parameter File): se utiliza para definir el modo de configurar la instancia cuando se inicie.

Archivos de contraseñas: permite a los usuarios conectarse a la base de datos de forma remota y realizar tareas administrativas.

Archivos de copia de seguridad: se utilizan para la recuperación de la base de datos. Normalmente restaura un archivo de copia de seguridad cuando un fallo del medio físico o un error del usuario ha dañado o suprimido el archivo original.

Archivos archive log: contienen un historial en curso de los cambios de datos(redo) generados por la instancia. Mediante estos archivos y una copia de seguridad de la base de datos, se puede recuperar un archivo de datos perdido. Es decir, los archive logs permiten la recuperaciòn de archivos de datos restaurados.

Archivos de rastreo: cada proceso de servidor y en segundo plano puede escribir en un archivo de rastreo asociado.Cuando un proceso detecta un error interno, vuelca información sobre el error en un archivo de rastreo.

Archivos log de alertas: son archivos de rastreo especiales. También se conocen como logs de alertas. El log de alertas de una base de datos es un log cronológico de mensajes y errores. Oracle recomienda revisar estos archivos.


domingo, 19 de octubre de 2014

Oracle 10g - Crear Vistas Materializadas


Vamos a suponer que tenemos un esquema que se llama Origen_tabla y otro que se llama Destino_tabla donde se va a alojar la vista materializada. 
Primero creamos una tabla sobre el esquema Origen_tabla llama tabla de la siguiente manera:

create table tabla (campo NUMBER PRIMARY KEY);

Luego creamos los log sobre la tabla para ser utilizados por la vista materializada:

CREATE MATERIALIZED VIEW LOG ON tabla

Luego le damos permisos sobre esta tabla al usuario Destino_tabla de la siguiente manera:

grant select on tabla to Destino_tabla
grant select on mlog$_tabla to Destino_tabla

Este ultimo permiso es muy importante para luego poder refrescar la vista materializada. Cuando creamos un log para una tabla con el comando create materialized view log nos crea una tabla con la información de los movimientos que la misma sufre. En caso de que no encontrar el nombre correcto de la tabla donde genera los logs se puede ejecutar la siguiente consulta:

select * from user_objects where object_name like '%MLOG%'

Y nos retorna todas las tablas que tienen un log creado.
El paso siguiente es conectarnos al usuario Destino_tabla y crear una vista materializada sobre la tabla del esquema Origen_tabla:

CREATE MATERIALIZED VIEW  tabla_view TABLESPACE name_tablespace BUILD IMMEDIATE REFRESH ON DEMAND 
as SELECT campo FROM origen_tabla.tabla;

Esto crea una vista materializada llamada "tabla_view" que se va a actualizar de forma manual.
El ultimo paso es crear un procedure que permita actualizar la vista materializada: 

CREATE OR REPLACE PROCEDURE destino_tabla.refresco_vm IS
BEGIN
   dms_mview.refresh('tabla_view');
   COMMIT;
END refresco;

Con esto creamos una vista materializada en un esquema en particular.

Oracle 10g - Mover Tablas a otro Tablespace

El comando para mover tablas de un tablespace a otro es el siguiente:

ALTER TABLE nombre_tabla MOVE TABLESPACE nombre_tablespace

Pero si lo queremos hacer de manera dinamica podemos crear el siguiente script:

DECLARE
   CURSOR ctables
   IS
      (SELECT object_name AS table_name
         FROM user_objects
        WHERE object_type = 'TABLE');
   registro   ctables%ROWTYPE;
   v_sql      VARCHAR2 (255) := ' ';
BEGIN
   OPEN ctables;
    LOOP
        FETCH ctables INTO registro;           
        EXIT WHEN ctables%NOTFOUND;
            v_sql := 'Alter table ' || registro.table_name || '  MOVE TABLESPACE nombre_tablespace';
            EXECUTE IMMEDIATE v_sql;
           DBMS_OUTPUT.put_line (v_sql);
    END LOOP;
   CLOSE ctables;
END;

El anterior PL/SQL es una alternativa dinámica para migrar todas las tablas a un nuevo tablespace.

Oracle 10g - Construir nuevamente todos los Indices


El comando para poder construir nuevamente todos los indices es :

ALTER INDEX nombre_index REBUILD;

Esto puede ser usado cuando nos encontramos con el siguiente error:

ora-01502: index nombre_index or partition of such index is in unusable state

Para poder reconstruir todos los indices se puede utilizar el siguiente script:

DECLARE
   CURSOR cindex
   IS
      (SELECT object_name AS INDEX_NAME
         FROM user_objects
        WHERE object_type = 'INDEX');
   registro   cindex%ROWTYPE;
   v_sql      VARCHAR2 (255) := ' ';
BEGIN
   OPEN cindex;
    LOOP
        FETCH cindex INTO registro;           
        EXIT WHEN cindex%NOTFOUND;
            v_sql := 'ALTER INDEX ' || registro.index_name || '  REBUILD';
            EXECUTE IMMEDIATE v_sql;
           DBMS_OUTPUT.put_line (v_sql);
    END LOOP;
   CLOSE cindex;
END;

Con el script anterior reconstruimos todos los indices. 

Oracle 10g - Modo de cierre de la base de datos


En la siguiente tabla se especifica los distintos modos de cierre de la base de datos y las operaciones que se pueden realizar.
Modo de cierre:
  • A = ABORT
  • I =   IMMEDIATE
  • T = TRANSACTIONAL
  • N = NORMAL

Modo de cierreAITN
Permite nuevas conexionesNONONONO
Espera hasta que termine la sesiones actualesNONONOSI
Espera hasta que terminen las transacciones actualesNONOSISI
Aplica un punto de control y cierre los archivosNOSISISI

SHUTDOWN NORMAL
El modo de cierre por defecto es normal. El cierre normal de la base de datos continúa con las condiciones siguientes:
  • No se puede realizar nuevas conexiones.
  • El servidor de Oracle espera a que todos los usuarios se desconecten antes de completar el cierre.
  • Los buffers de la base de datos y de redo log se escriben en disco.
  • El servidor de Oracle cierra y desmonta la base de datos antes de cerrar la instancia.
  • El siguiente inicio no necesita recuperación de instancias.
SHUTDOWN TRANSACTIONAL
El cierre transaccional impide que los clientes pierdan los datos, incluyendo los resultados de su actividad actual. El cierre transaccional de la base de datos continúa con las condiciones siguientes:
  • Ningùn cliente puede iniciar una nueva transacción en esta instancia en particular.
  • Un cliente se desconecta cuando el cliente finaliza la transacción en curso.
  • El siguiente inicio no necesita recuperación de instancias.
SHUTDOWN INMEDIATE
El cierre inmediato de la base de datos continua con las condiciones siguientes:
  • Las sentencias SQL actuales que està procesando la base de datos Oracle no se completan.
  • El servidor de Oracle no espera a que se desconecten los usuarios que estàn conectados actualmente a la base de datos.
  • El servidor de Oracle realiza un rollback de transacciones activas y desconecta todos los usuarios conectados.
  • El servidor de Oracle cierra y desmonta la base de datos antes de cerrar la instancia.
  • El siguiente inicio no necesita recuperación de instancias.
SHUTDOWN ABORT 
Si las opciones de cierre NORMAL e INMEDIATE no funcionan, puede abortar la instancia de base de datos actual. El aborto de una instancia continua con las condiciones siguientes:
  • Las sentencias SQL actuales que esta procesando el servidor de Oracle se terminan inmediatamente.
  • El servidor de Oracle  no espera a que se desconecten los usuarios que estàn conectados.
  • Los buffers de la base de datos y redo log no se escriben en el disco.
  • No se realiza un rollback de las transacciones sin confirmar.
  • La instancia se termina sin cerrar los archivos
  • La base de datos no se cierra ni se desmonta
  • El siguiente inicio necesita la recuperación de instancias, lo que se produce automáticamente.