jueves, 11 de abril de 2013

Transacciones Oracle y MySQL


Transacciones          

Rollback.-es un término inglés que designa la anulación de operaciones realizadas anteriormente en uno o varios servidores de bases de datos. Concierne uno o varios tipos de operaciones precisas, según el modo en que se archiven los datos del servidor. En cualquier caso nunca conciernen a una cuenta o a un personaje individualmente.

Commit.-la instrucción commit garantiza que todas las modificaciones de la transacción se conviertan en una parte permanente de la base de datos. la instrucción commit también libera recursos que utiliza la transacción como, por ejemplo, los bloqueos.

Recovery (Restore).-Restaura copias de seguridad realizadas con el comando BACKUP. La base de datos se restaura a su estado de copia de seguridad completa de base de datos. Al recuperar una base de datos, se recomienda especificar explícitamente la opción RECOVERY por motivos de claridad, aunque es la opción predeterminada.

 
Rollback en MySQL
mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
mysql> INSERT INTO innotest VALUES(1);
mysql> INSERT INTO innotest VALUES(2);
mysql> INSERT INTO innotest VALUES(3);
mysql> SELECT * FROM innotest;

+-------+

| campo |

+-------+

|     1 |

|     2 |

|     3 |

+-------+

mysql> BEGIN;
mysql> INSERT INTO innotest VALUES(4);
mysql> SELECT * FROM innotest;

+-------+

| campo |

+-------+

|     1 |

|     2 |

|     3 |

|     4 |

+-------+

mysql> ROLLBACK; 
mysql> SELECT * FROM innotest;

+-------+

| campo |

+-------+

|     1 |

|     2 |

|     3 |

+-------+

Commit en MySQL
mysql> CREATE TABLE t (name CHAR(20), UNIQUE (name)) TYPE = INNODB;
mysql> BEGIN;
mysql> INSERT INTO t SET name = 'William';
mysql> INSERT INTO t SET name = 'Wallace';
mysql> COMMIT;
mysql> SELECT * FROM t;

+---------+

| name    |

+---------+

| Wallace |

| William |

+---------+

 

Restore Table en MySQL
RESTORE TABLE tbl_name [, tbl_name] ... FROM '/path/to/backup/directory'


Commit en Oracle
INSERT INTO paisVALUES(‘PY’, ‘PARAGUAY’);
UPDATE persona SET pais = ‘PY’ WHERE id = 1;
COMMIT;

Rollback en Oracle
INSERT INTO paisVALUES(1, ‘PY’, ‘PARAGUAY’);
UPDATE persona SET pais = ‘PY’ WHERE id = 1;
ROLLBACK;

 

Restore Base de datos Oracle

RECOVER [AUTOMATIC] [FROM 'localizacion'] [BD]

   [UNTIL CANCEL]

   [UNTIL TIME fecha]

   [UNTIL CHANGE entero]

[USING BACKUP CONTROLFILE]

 

Restore (tabla) en Oracle

RECOVER [AUTOMATIC] [FROM 'localizacion']

   TABLESPACE nombre_tablespace [, nombre_tablespace]

 

Bibliografía    






miércoles, 10 de abril de 2013















 
Codificación.- Enunciación de un mensaje mediante un código determinado de palabras, letras, números o signos.
 
Decodificación.- descifrado de un mensaje cifrado con las reglas de su código

jueves, 21 de marzo de 2013

martes, 19 de marzo de 2013

Bases de datos en la nube


Bases de datos en la nube
Una base de datos en la nube es una base de datos que se ejecuta en la nube. Hay dos modelos de implementación: los usuarios pueden ejecutar la bases de datos en la nube de forma independiente, utilizando una imagen de máquina virtual, o pueden comprar el acceso a un servicio de base de datos, gestionada por un proveedor de base de datos en nube. De las bases de datos disponibles en la nube, algunas son basadas en SQL y algunos utilizan un modelo de datos NoSQL.


Implementación del modelo
Existen dos métodos principales para ejecutar una base de datos en la nube:
• Imagen de máquina virtual: Las plataformas en la nube permiten a los usuarios comprar instancias de máquinas virtuales por un tiempo limitado. Es posible ejecutar una base de datos en estas máquinas virtuales. Los usuarios pueden subir su imagen propia con una base de datos instalada en ella, o utilizar imágenes prefabricadas de máquinas que ya incluyen una instalación optimizada de una base de datos. Por ejemplo Oracle provee una imagen prefabricada con una instalación de Oracle Database 11g Enterprise Edition on Amazon EC2
• Base de datos como servicio: Algunas plataformas en la nube ofrecen opciones para el uso de bases de datos como servicio, sin lanzar físicamente una instancia de máquina virtual para la base de datos. En esta configuración, los propietarios de aplicaciones no tienen que instalar y mantener la base de datos por su cuenta. En cambio, el proveedor de servicios de base de datos se encarga de la instalación y el mantenimiento de la base de datos, y los propietarios de aplicaciones pagan de acuerdo a su uso. Por ejemplo, Amazon Web Services provee dos servicios de base de datos como parte de su oferta en la nube, SimpleDB que almacena pares llave-valor en formato NoSql y Amazon Relational Database Service que esta basado en SQL con una interfaz MySql.
Una tercera opción es administrar el alojamiento de una base de datos en la nube, donde la base de datos no se ofrece como un servicio, pero el proveedor de la nube aloja la base de datos y administra en nombre del propietario de la aplicación. Por ejemplo, el servicio en la nube de Rackspace ofrece alojamiento gestionado para bases de datos MySQL



Modelo de datos
También es importante diferenciar entre bases de datos en la nube que son relacionales en oposición a las no relacionales (NoSQL):
• Bases de datos SQL, son un tipo de base de datos que se puede ejecutar en la nube (ya sea como una imagen de máquina virtual o como un servicio, dependiendo del proveedor). Las bases de datos SQL poseen baja escalabilidad, ya que no fueron nativamente diseñadas para entornos en la nube, aunque los servicios en la nube de base de datos basado en SQL están tratando de hacer frente a este desafío.
• Bases de datos NoSQL, son otro tipo de base de datos que puede ejecutarse en la nube. Las bases de datos NoSQL están diseñados para servir cargas pesadas de lecto-escritura y son capaces de escalar hacia arriba y hacia abajo con facilidad.[7] y por lo tanto son más adecuadas para funcionar de forma nativa en la nube. Sin embargo, la mayoría de las aplicaciones actuales se construyen en torno a un modelo de datos SQL, así que trabajar con bases de datos NoSQL con frecuencia requiere una reescritura completa del código de la aplicación.



Algunas bases de datos en la nube son:
• Amazon Web Services.- Amazon Web Services tiene una variedad de servicios de bases de datos basadas en la nube, incluyendo bases de datos relacionales y NoSQL. Amazon Relational Database (SDR) ejecuta MySQL, Oracle o instancias de SQL Server, mientras que Amazon SimpleDB es una base de datos en menor escala pensada para cargas de trabajo más pequeñas. Por el lado de NoSQL, Amazon DynamoDB es su base de datos de unidad de estado sólido (SSD) que automáticamente replica cargas de trabajo en al menos tres zonas de disponibilidad. El CTO de AWS, Werner Vogels, señala que DynamoDB es el servicio de más rápido crecimiento en la historia de AWS. Amazon también ofrece una variedad de servicios auxiliares de gestión de datos, tales como su almacén de datos denominado Redshift, así como Data Pipeline, que ayuda a que los usuarios integren datos de múltiples fuentes para facilitar la gestión.
• EnterpriseDB.- Enterprise DB se centra en las bases de datos de código abierto PostgreSQL, pero su verdadero reclamo a la fama es su capacidad para trabajar con las aplicaciones de la base de datos Oracle. Con Postgres Plus Advanced Server de EnterpriseDB, las organizaciones pueden utilizar las aplicaciones escritas para bases de datos en las instalaciones de Oracle a través de EnterpriseDB, que se ejecuta en nubes de Amazon Web Services y HP. Tiene replicación binaria y copias de seguridad programadas.
• Garantia Data.- Garantia ofrece un servicio de puerta de enlace para que los usuarios ejecuten Redis de código abierto y servicios de bases de datos Memcached NoSQL en memoria en la nube pública de AWS. El uso de software de Garantia permite la configuración automática de estos datos de código abierto al ayudar a que los desarrolladores de plataformas escalen nodos, creen grupos y construyan la tolerancia a fallas.
• Google Cloud SQL.- El servicio de base de datos en la nube de Google se centra en dos productos principales: Google Cloud SQL, que Google describe como una infraestructura de base de datos MySQL completamente relacional; y Google BigQuery, una herramienta de análisis para ejecutar consultas en grandes conjuntos de datos almacenados en la nube.
• Microsoft Azure.- Microsoft utiliza su tecnología de servidor de SQL para proporcionar una base de datos relacional, permitiendo que los clientes accedan a una base de datos SQL ya sea en su nube, o en instancias de servidor SQL en las máquinas virtuales. Microsoft también hace hincapié en las bases de datos híbridas que combinan datos tanto en las instalaciones del cliente como en la nube Azure a través de SQL Data Sync. Microsoft tiene un servicio de nube alojada en la base de datos NoSQL llamada Tables, mientras que Blobs (almacenamiento de objeto binario grande), se ha optimizado para archivos multimedia, como audio y video.
• MongoLab.- En el mundo NoSQL, hay una variedad de plataformas de base de datos para elegir, incluyendo MongoDB. MongoLab ofrece a los usuarios el acceso a MongoDB en una variedad de otros importantes proveedores de nube, incluyendo AWS, Azure y Joyent. Al igual que los otros tipos de servicios de puerta de enlace, MongoLab también se integra con varias herramientas de plataformas como servicio (PaaS) en el nivel de aplicación. MongoLab funciona con entornos compartidos o dedicados, siendo el último ligeramente más caro.
• Rackspace.- La base de datos de Rackspace viene en una nube o en una oferta gestionada a través de Cloud Databases, que es el nombre de su producto. Rackspace pone énfasis en la virtualización basada en contenedores de sus Cloud Databases, que dicen permitir un mayor rendimiento en el servicio de base de datos en comparación a si se ejecuta por completo en la infraestructura virtualizada. Cloud Databases también incorpora una red de almacenamiento SAN y se basa en una plataforma OpenStack. En diciembre pasado, Rackspace anunció una base de datos NoSQL en su nube del proveedor Cloudant.
• SAP.- La gigante de software SAP está jugando en la nube con HANA, una plataforma basada en la tecnología en memoria. Su base de datos en nube complementa las herramientas de base de datos que están en las instalaciones de la empresa -incluyendo Sybase-, y está disponible en la nube de Amazon Web Services. HANA incluye otras aplicaciones que no son de bases de datos, como herramientas de gestión empresarial y desarrollo de aplicaciones.
• StormDB.- A diferencia de otras bases de datos en la nube, StormDB sigue su distribución completa de base de datos relacional en los servidores de metal, lo que significa que no hay virtualización de máquinas. Los funcionarios de StormDB afirman que esto conduce a un mejor rendimiento y a una gestión más sencilla, porque los usuarios no tienen que elegir el tamaño de las instancias de máquina virtual que se ejecuta en su base de datos. A pesar de que se ejecuta en ‘bare metal’, los clientes no tienen que escoger el tamaño de instancias de máquinas virtuales sobre la que se ejecuta su base de datos, aunque StormDB promete aislamiento entre las bases de datos de los clientes. StormDB también fragmenta automáticamente bases de datos en la nube. La compañía se encuentra actualmente en versión beta gratuita.
• Xeround.- Xeround es una herramienta de gestión para la implementación de bases de datos MySQL fácilmente escalables a través de una variedad de proveedores y plataformas de nube. Su software permite una alta disponibilidad y escalabilidad, y funciona a través de una variedad de proveedores de nube incluyendo AWS, Rackspace, Joyent y HP, así como OpenStack y plataformas Citrix.

martes, 12 de marzo de 2013

Particionar


Crear particiones en MySQL

Particionar tablas en MySQL nos permite rotar la información de nuestras tablas en diferentes particiones, consiguiendo así realizar consultas más rápidas y recuperar espacio en disco al borrar los registros. El uso más común de particionado es según fecha (date). Para ver si nuestra base de datos soporta particionado simplemente ejecutamos:

SHOW VARIABLES LIKE '%partition%';

A continuación veremos un ejemplo de cómo particionar una tabla por mes y posteriormente borrar o modificar su información.

Las particiones son por tabla, es decir parto una tabla en n partes, el numero n impacta en la performance por lo tanto hay que elegir el mejor posible y ir probando. Para partir una tabla necesito un criterio de partición; por ejemplo las facturas más viejas a esta fecha se encuentran en una parte; las más viejas que esta otra fecha en otra y así … MySql implementa el particionado horizontal. Básicamente, se pueden realizar cuatro tipos de particionado, que son:

·         RANGE: la asignación de los registros de la tabla a las diferentes particiones se realiza según un rango de valores definido sobre una determinada columna de la tabla o expresión. Es decir, nosotros indicaremos el numero de particiones a crear, y para cada partición, el rango de valores que serán la condición para insertar en ella, de forma que cuando un registro que se va a introducir en la base de datos tenga un valor del rango en la columna/expresion indicada, el registro se insertara en dicha partición.

·         LIST: la asignación de los registros de la tabla a las diferentes particiones se realiza según una lista de valores definida sobre una determinada columna de la tabla o expresión. Es decir, nosotros indicaremos el numero de particiones a crear, y para cada partición, la lista de valores que serán la condición para insertar en ella, de forma que cuando un registro que se va a introducir en la base de datos tenga un valor incluido en la lista de valores, el registro se insertara en dicha partición.

·         HASH: este tipo de partición esta pensado para repartir de forma equitativa los registros de la tabla entre las diferentes particiones. Mientras en los dos particionados anteriores eramos nosotros los que teníamos que decidir, según los valores indicados, a que partición llevamos los registros, en la partición HASH es MySql quien hace ese trabajo. Para definir este tipo de particionado, deberemos de indicarle una columna del tipo integer o una función de usuario que devuelva un integer. En este caso, aplicamos una función sobre un determinado campo que devolvera un valor entero. Según el valor, MySql insertará el registro en una partición distinta.

·         KEY: similar al HASH, pero la función para el particionado la proporciona MySql automáticamente (con la función MD5). Se pueden indicar los campos para el particionado, pero siempre han de ser de la clave primaria de la tabla o de un índice único.

·         SUBPARTITIONS: Mysql permite además realizar subparticionado. Permite la división de cada partición en múltiples subparticiones.

 

Luego de toda esta teoría solo quedan ganas de partir, de partir tablas! Y se parten así:

CREATE TABLE by_year ( d DATE ) PARTITION BY RANGE (YEAR(d)) ( PARTITION P1 VALUES LESS THAN (2001), PARTITION P2 VALUES LESS THAN (2002), PARTITION P3 VALUES LESS THAN (2003), PARTITION P4 VALUES LESS THAN (MAXVALUE) );

Borrar particiones

Lo bueno de trabajar con particiones es que podemos borrar rápidamente registros sin tener que recorrer toda la tabla e inmediatamente recuperar el espacio en disco utilizado por la tabla.

Por ejemplo si queremos borrar la partición más antigua simplemente ejecutamos:

ALTER TABLE reports DROP PARTITION p201111;

Añadir particiones
En el ejemplo anterior las 2 últimas particiones creadas han sido:
PARTITION p201205 VALUES LESS THAN (TO_DAYS("2012-06-01")),
PARTITION pDefault VALUES LESS THAN MAXVALUE

El problema es que todos los INSERTs que se hagan después de mayo de 2012 se insertarán en pDefault. La solución sería añadir particiones nuevas para cubrir los próximos meses:

ALTER TABLE reports REORGANIZE PARTITION pDefault INTO (
  PARTITION p201206 VALUES LESS THAN (TO_DAYS("2012-07-01")),
  PARTITION pDefault VALUES LESS THAN MAXVALUE);

En el caso que no tuvieramos una partición del tipo pDefault simplemente ejecutamos:

ALTER TABLE reports ADD PARTITION (PARTITION p201206 VALUES LESS THAN (TO_DAYS("2012-07-01")));

Consultar particiones

Para consultar información de particiones creadas en una tabla así como también los registros que contiene cada una ejecutamos:

SELECT PARTITION_NAME,TABLE_ROWS FROM information_schema.PARTITIONS WHERE TABLE_NAME='reports';

 

Particionado de Tablas en Oracle

Basicamente, el particionado se realiza utilizando una clave de particionado (partitioning key), que determina en que partición de las existentes en la tabla van a residir los datos que se insertan. Oracle también permite realizar el particionado de indices y de tablas organizadas por indices. Cada partición ademas puede tener sus propias propiedades de almacenamiento.
  • Particionado Range: la clave de particionado viene determinada por un rango de valores, que determina la partición donde se almacenara un valor.
  • Particionado Hash: la clave de particionado es una función hash, aplicada sobre una columna, que tiene como objetivo realizar una distribución equitativa de los registros sobre las diferentes particiones. Es útil para particionar tablas donde no hay unos criterios de particionado claros, pero en la que se quiere mejor el rendimiento.
  • Particionado List: la clave de particionado es una lista de valores, que determina cada una de las particiones.
  • Particionado Composite: los particionados anteriores eran del tipo simples (single o one-level), pues utilizamos un unico método de particionado sobre una o mas columnas. Oracle nos permite utilizar metodos de particionado compuestos, utilizando un primer particionado de un tipo determinado, y luego para cada particion, realizar un segundo nivel de particionado utilizando otro metodo. Las combinaciones son las siguientes (se han ido ampliando conforme han ido avanzando las versiones): range-hash, range-list, range-range, list-range, list-list, list-hash y hash-hash (introducido en la versión 11g).
  • Particionado Interval: tipo de particionado introducido igualmente en la versión 11g. En lugar de indicar los rangos de valores que van a determinar como se realiza el particionado, el sistema automáticamente creara las particiones cuando se inserte un nuevo registro en la b.d. Las técnicas de este tipo disponible son Interval, Interval List, Interval Range e Interval Hash (por lo que el particionado Interval es complementario a las técnicas de particionado vistas anteriormente).
  • Particionado System: se define la tabla particionada indicando las particiones deseadas, pero no se indica una clave de particionamiento. En este tipo de particionado, se delega la gestión del particionado a las aplicaciones que utilicen la base de datos (por ejemplo, en las sentencias sql de inserción deberemos de indicar en que partición insertamos los datos).
Particionado Range
Esta forma de particionamiento requiere que los registros estén identificado por un “partition key” relacionado por un predefinido rango de valores. El valor de las columnas “partition key” determina la partición a la cual pertenecerá el registro.
CREATE TABLE sales
  ( prod_id       NUMBER(6)
  , cust_id       NUMBER
  , time_id       DATE
  , channel_id    CHAR(1)
  , promo_id      NUMBER(6)
  , quantity_sold NUMBER(3)
  , amount_sold   NUMBER(10,2)
  )
 PARTITION BY RANGE (time_id)
 ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))     TABLESPACE tsa
 , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))    TABLESPACE tsb
 , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))    TABLESPACE tsc
 , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))    TABLESPACE tsd
 );
 
Particionado Hash
Los registros de la tabla tienen su localización física determinada aplicando un valor hash a la columna del partition key. La funcion hash devuelve un valor automatico que determina a que partición irá el registro. Es una forma automática de balancear el particionado. Hay varias formas de construir este particionado. En el ejemplo siguiente vemos una definición sin indicar los nombres de las particiones (solo el número de particiones):
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
     PARTITION BY HASH(deptno) PARTITIONS 16;
Igualmente, se pueden indicar los nombres de cada particion individual o los tablespaces donde se localizaran cada una de ellas:
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
     STORAGE (INITIAL 10K)
     PARTITION BY HASH(deptno)
       (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2,
        PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);
Particionado List
Este tipo de particionado fue añadido por Oracle en la versión 9, permitiendo determinar el particionado según una lista de valores definidos sobre el valor de una columna especifica.
CREATE TABLE sales_list (salesman_id NUMBER(5), salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois')
PARTITION sales_other VALUES(DEFAULT)
);
Este particionado tiene algunas limitaciones, como que no soporta múltiples columnas en la clave de particionado (como en los otros tipos), los valores literales deben ser únicos en la lista, permitiendo el uso del valor NULL (aunque no el valor MAXVALUE, que si puede ser utilizado en particiones del tipo Range).
Particionado Interval
El particionado Interval ha sido introducido en la versión 11g para habilitar un mantenimiento de particiones desasistido. Normalmente, cuando realizamos un particionado sobre una tabla, indicamos una lista de valores o rangos para crear de antemano las particiones.
un ejemplo:
 CREATE TABLE T_11G(C1 NUMBER(38,0),
 C2 VARCHAR2(10),
 C3 DATE)
 PARTITION BY RANGE (C3) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
 (PARTITION P0902 VALUES LESS THAN (TO_DATE('2009-03-01 00:00:00','YYYY-MM-DD HH24:MI:SS')));
 
Particionado System
Una de las nuevas funcionalidades introducida en la version 11g es el denominado partitioning interno o de sistema. En este particionado Oracle no realiza la gestión del lugar donde se almacenaran los registros, sino que seremos nosotros los que tendremos que indicar en que partición se hacen las inserciones.
create table t (c1 int,
                c2 varchar2(10),
                c3 date)
     partition by system
    (partition p1,
     partition p2,
     partition p3);