miércoles, 17 de abril de 2013

Rendimiento de una base de datos

rendimiento de consultas
7.2.3. VELOCIDAD de las Consultas SELECT
En general, cuando se quiere hacer un SELECT lento ... DONDE consulta más rápida, lo primero que debe hacer es comprobar si se puede añadir un índice. Todas las referencias entre las diferentes tablas normalmente se debe hacer con los índices. Usted puede utilizar la sentencia EXPLAIN para determinar los índices que se utilizan para una SELECT. Consulte Sección 7.4.5, "como utiliza MySQL LOS índices" y Sección 7.2.1, "Sintaxis de EXPLAIN (Obtener Información about sin SELECT)".
Algunos consejos generales para acelerar las consultas en tablas MyISAM:
•
Para ayudar a MySQL mejores optimizar las consultas, use ANALYZE TABLE o myisamchk - analizar en una mesa después de que se ha cargado con datos. Esto actualiza un valor para cada parte de índice que indica el número medio de filas que tienen el mismo valor. (Para los índices únicos, esto es siempre 1.) MySQL utiliza para decidir qué índice para elegir cuando se une a dos tablas en función de una expresión no constante. Puede comprobar el resultado del análisis de la tabla usando SHOW INDEX FROM tbl_name y examinar el valor de cardinalidad. myisamchk - description - verbose muestra información sobre la distribución del índice.
•
Para ordenar un índice y datos de acuerdo con un índice, utilice myisamchk - sort-index - sort-records = 1 (si desea ordenar el índice 1). Esta es una buena manera de hacer las consultas más rápidamente si usted tiene un índice único de la que quieres leer todos los registros en orden de acuerdo con el índice. Tenga en cuenta que la primera vez que ordena una gran mesa de esta manera, puede tomar mucho tiempo.

7.2.2. Estimar el renidimiento De Una consulta
En la mayoría de los casos, se puede estimar el rendimiento contando disco busca. Para las tablas pequeñas, generalmente se puede encontrar una fila en un disco seek (porque el índice es probablemente en caché). Para tablas grandes, se puede estimar que, mediante índices B-tree, necesita esta cantidad de busca para encontrar una fila: log (row_count) / log (index_block_length / 3 * 2 / (Index_length + data_pointer_length)) + 1.
En MySQL, un bloque de índice es generalmente 1024 bytes y el puntero de datos suele ser 4 bytes. Para ver una tabla 500000-fila con una longitud de índice de 3 bytes (medio entero), la fórmula indica log (500000) / log (1024/3 * 2 / (3 4)) + 1 = 4 busca.
Este índice requeriría de almacenamiento de alrededor de 500 000 * 7 * 3/2 = 5,2 MB (suponiendo un búfer de índice típico relleno proporción de 2/3), por lo que probable que gran parte del índice en la memoria y por lo tanto necesitan una o dos llamadas a leer los datos para encontrar la fila.
Para las escrituras, sin embargo, necesita cuatro solicitudes de acceso (como arriba) para saber dónde colocar el nuevo índice y, normalmente, de dos pretende actualizar el índice y escribir la fila.
Tenga en cuenta que la discusión anterior no significa que el rendimiento de las aplicaciones degenera lentamente log N. Mientras todo se almacena en caché por el sistema operativo o el servidor MySQL, las cosas son sólo marginalmente más lento que la tabla se hace más grande. Después de los datos es demasiado grande para ser almacenado en caché, las cosas empiezan a ir mucho más lento hasta que las aplicaciones sólo están vinculados por búsquedas en disco (que aumentan en log N). Para evitar esto, aumentar el tamaño de la caché de claves como los datos crece. Para tablas MyISAM, el tamaño de clave de caché se controla mediante la variable de sistema key_buffer_size. Consulte Sección 7.5.2, "afinar Lista de parámetros del Servidor".


Debian / Ubuntu Tips & Tricks nos sugiere dos consejos párr mejorar El Tiempo de Respuesta de MySQL, basado en la ONU Caso proprio.
Muchas veces, un Pesar de Que El Sistema Operativo sí encuentre con Una Carga de Trabajo normal, MySQL Florerias mostrarse algoritmo lento.
Hay Muchas Formas párr mejorar El Tiempo de Respuesta del Servidor MySQL, Aquí nos enfocaremos en dos Formas:
■ Deshabilitar la Resolución de Nombre
■ Modificar el tamano de la caché


La Primera Opción es deshabilitar la Resolución de NOMBRES, de ESTA forma el Servidor no pierde Tiempo Intentando convertir NOMBRES de Dominio a IP. El Unico Inconveniente Sera Que deberas USAR Solamente Direcciones IP párrafo Definir los permisos.
Ademas, Por Una Cuestión de Seguridad No Se Recomienda Nunca USAR NOMBRES de Dominio o nombres de host en la Autenticación de MySQL.
Para deshabilitar la Resolución de NOMBRES de Dominio Debes correr el demonio de MySQL (mysqld) con el Argumento-skip-name-resolve, o bien, en el archivo de configuracion / etc / my.cnf agregar la entrada ¿skip-name-resolve.
[Mysqld]
.....
......
skip-name-resolve

Observa los Resultados del siguiente sencillo de referencia:
■ Con Resolución de NOMBRES, el Servidor sí tarda Entre dos y tres Segundos en responder:
fecha; mysql-u root-h 192.168.1.4, la fecha
Vie Jul 21 23:56:58 CEST 2006
ERROR 1130 (00000): Host .168.1.3 '192 'no tiene permiso para conectarse a este servidor MySQL
Vie Jul 21 23:57:00 CEST 2006
■ Sin Resolución de NOMBRES, el Servidor Responde instantaneamente:
fecha; mysql-u root-h 192.168.1.4, la fecha
Vie Jul 21 23:56:37 CEST 2006
ERROR 1130 (00000): Host .168.1.3 '192 'no tiene permiso para conectarse a este servidor MySQL
Vie Jul 21 23:56:37 CEST 2006

La Segunda pertenezcan Recomendación es Activar la caché de Consultas (chache consulta). La caché de Consultas guarda el Texto de la ONU SELECT junto al Resultado Que FUE Enviado al Cliente. Si despues sí recibe Una consulta identica el Servidor Recupera los Datos de la caché en Vez de ejecutar la consulta NuevaMente.
Para chequear la consulta chache ejecuta:
mysql> SHOW STATUS LIKE 'Qcache%';
Para ver el Estado de la Misma:
mysql> VARIABLES LIKE '% query_cache%' Show;
Para change Tamano de la Misma:
mysql> SET GLOBAL query_cache_size = 52428800;
Para mantener la configuracion de la Misma, heno Que Modificar el archivo / etc / my.cnf:
[Mysqld]
...
...
query_cache_size = 52428800
query_cache_type = 1


7.1.4. El Paquete de Pruebas de RENDIMIENTO (benchmarks) de MySQL
This section deberia Contener Una Descripción Técnica del Paquete de Pruebas de RENDIMIENTO de MySQL (ASI COMO del crash-me), Pero ESA Descripción Aun no ha Sido Escrita. Sin embargo, Florerias hacerse Una buena idea de Como hacer Pruebas de RENDIMIENTO viendo el Código y los Resultados Dentro del Directorio sql-bench en el Código fuente de la Distribución de MySQL.
La finalidad de Este Paquete de Pruebas de RENDIMIENTO es visualizar QUÉ Operaciones sí Realizan bien y Cuales lo Hacen pobremente en Cada Implementación de SQL.
ESTAS Pruebas de RENDIMIENTO ningún hijo múltiples hilo, Asi Que Miden El Tiempo Mínimo párr las Operaciones Realizadas. Se Planea agregar en la ONU Futuro Pruebas múltiples hilo al Paquete.
Para USAR el Paquete, Deben satisfacerse the following requirements:
•
El Paquete de Pruebas de RENDIMIENTO SE proporciona con el Código fuente de la Distribución de MySQL. Also Florerias descargar Distribución Una liberada de http://dev.mysql.com/downloads/, o USAR Nuestro repositorio de Código fuente (ver Sección 2.8.3, "Instalar desde el Árbol de Código fuente de Desarrollo").
•Los guiones de las Pruebas de RENDIMIENTO estan Escritos en Perl y Usan el módulo de Perl DBI to enter a los Servidores de Bases de Datos, Asi Que DBI debe Estar Instalado. Also es Necesario el Controlador DBI especifico párrafo Cada Servidor al Que se QUIERE realizar las Pruebas. Por EJEMPLO, párrafo ProBar MySQL, PostgreSQL y DB2, debe Tener los módulos DBD :: mysql, DBD :: Pg y DBD :: DB2 instalados. Ver Sección 2.13, "Notas Sobre la Instalación de Perl".

Una Vez Retrieved el Código fuente de la Distribución de MySQL, el Paquete de Pruebas de RENDIMIENTO SE encuentra en el Directorio sql-bench. Para ejecutar las Pruebas de RENDIMIENTO, compílese MySQL, váyase al Directorio sql-bench y ejecútese el script de run-all-tests:shell> cd sql-benchshell> perl run-all-tests - server = nombre_servidor
nombre_servidor debe servi Uno De Los Servidores soportados. Para Obtener La Lista Completa de options y Servidores soportados, invóquese el comando:-all-tests de ejecución shell> perl - helpEl script de crash-me also no está SITUADO Dentro del Directorio sql-bench. crash-me intenta Determinar QUÉ Características Soporta Una de base de Datos y Cuales hijo suspensión Capacidades y limitations. Ésto lo consigue ejecutando Consultas


El Mas de factor Importante párrafo HACER UN Sistema Rápido es Do Diseño Básico. Ademas, es necessary CONOCER los Procesos Que cumple el Sistema y Cuales hijo suspensión cuellos de botella. En la Mayoría de los Casos cuellos de botella NACEN de the following FACTORES:
•
Búsqueda en Disco. El disco de NECESITA Cierto Tiempo párr ENCONTRAR UN Paquete de Datos. Con discos Modernos, El Tiempo Medio párr Esto Es usualmente Menor a 10 ms, Asi Que en Teoría sí pueden HACER 100 busquedas porción Segundo. Este Tiempo Mejora Lentamente con los discos nuevos soles y es muy Difícil optimizarlo párr Una sola tabla. La Manera de optimizar El Tiempo de búsqueda es Distribuir los Datos Dentro de Mas de las Naciones Unidas discoteca.
•
Lectura y escritura en la discoteca. De Cuando el disco de sí encuentra en la posicion correcta viene, NECESITAMOS leer los Datos. Los discos Modernos transfieren al Menos 10-20MB / s. Esto Es Mucho Más Fácil de optimizar QUE LAS busquedas, PUESTO QUE PODEMOS Read in Paralelo from múltiplos discotecas.
•
Ciclos de CPU. De Cuando TENEMOS Datos en la memoria principal NECESITAMOS procesarlos párrafo Obtener Resultado algun. Tener los tablas Pequenas es comparacion Con La CANTIDAD De memoria Es El mas Factor Común de limitacion. Pero con tablas Pequeñas, la Rapidez no es usualmente el Problema.
•
Ancho de banda de Memoria. CUANDO EL CPU NECESITA Más Datos de Los Que Florerias Almacenar en la memoria caché de la CPU, el ancho principal de la memoria sí convierte en sin cuello de botella. Es Poco Común en la Mayoría de Casos, Pero debe tenerse en Cuenta.

martes, 16 de abril de 2013

Creación De Indices en BD Veterinaria


Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cdcol              |
| mysql              |
| performance_schema |
| phpmyadmin         |
| test               |
| veterinaria            |
| webauth            |
+--------------------+
8 rows in set (0.05 sec)

mysql> use veterinaria;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_veterinaria |
+-------------------+
| antenfermedades   |
| caracteristicas   |
| clientes          |
| direccion         |
| hmedica           |
| info              |
| mascota           |
| mconsulta         |
| servicios         |
+-------------------+
10 rows in set (0.00 sec)

mysql> describe info;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| num     | int(11)     | NO   | PRI | NULL    |       |
| NombreC | varchar(25) | YES  |     | NULL    |       |
| NombreM | varchar(25) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.82 sec)


mysql> create index part_of_name on info (num(4));
Query OK, 0 rows affected (0.65 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index part_of_num on info (num(4));
Query OK, 0 rows affected (0.57 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index part_of_NombreC on info (NombreC(25));
Query OK, 0 rows affected (0.26 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index part_of_NombreM on info (NombreM(25));
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe mascota;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| NumP        | int(11)     | NO   | PRI | NULL    |       |
| nombre      | varchar(15) | YES  |     | NULL    |       |
| peso        | float       | YES  |     | NULL    |       |
| sexo        | varchar(1)  | YES  |     | NULL    |       |
| raza        | varchar(15) | YES  |     | NULL    |       |
| FNacimiento | varchar(10) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.13 sec)


mysql> create index infmascota on mascota (sexo(1));
Query OK, 5 rows affected (0.20 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> create index infraza on mascota (raza(15));
Query OK, 5 rows affected (0.60 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> describe servicios;
ERROR 1146 (42S02): Table 'veterin.servicios' doesn't exist
mysql> describe servicio;
ERROR 1146 (42S02): Table 'veterin.servicio' doesn't exist
mysql> describe servicios;
ERROR 1146 (42S02): Table 'veterin.servicios' doesn't exist
mysql> describe clientes;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| NumCliente | int(11)     | NO   | PRI | NULL    |       |
| nombrec    | varchar(25) | YES  |     | NULL    |       |
| direccion  | varchar(25) | YES  |     | NULL    |       |
| telefono   | varchar(15) | YES  |     | NULL    |       |
| oficio     | varchar(25) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.49 sec)

mysql> create index FClientes on clientes(NumClientes(11));
ERROR 1072 (42000): Key column 'NumClientes' doesn't exist in table

mysql> create index FClientes on clientes(NumCliente(4));
Query OK, 5 rows affected (0.59 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> create index FTelefono on clientes(telefono(15));
Query OK, 5 rows affected (0.54 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> exit

Creacion de Indices en Mysql y Oracle


Creación de Índices
.
Un índice es una estructura interna que el sistema puede usar para encontrar uno o más registros en una tabla de forma rápida. En efecto, un índice de base de datos es, conceptualmente, similar a un índice encontrado al final de cualquier libro de texto. De la misma forma que el lector de un libro acudiría a un índice para determinar en qué páginas se encuentra un determinado tema, un sistema de base de datos leerá un índice para determinar las posiciones de registros seleccionados por una consulta SQL. En otras palabras, la presencia de un índice puede ayudar al sistema a procesar algunas consultas de un modo más eficiente.

Un índice de base de datos se crea para una columna o grupo de columnas. La figura siguiente muestra un índice (XCNOMBRE) basado en la columna CNOMBRE de la tabla CURSO. Observemos que el índice, a diferencia de la tabla CURSO, representa valores CNOMBRE en orden. Además, el índice es pequeño en relación con el tamaño de la tabla. Por lo tanto, es, probablemente, más fácil que el sistema busque el índice para localizar un registro con un valor CNOMBRE dado, a que explore toda la tabla en busca de ese valor. Por ejemplo, el índice XCNOMBRE podría ser muy útil al sistema cuando ejecute la siguiente sentencia SELECT.

Tenemos tres tipos de índices.
El primero corresponde a las claves primarias, que como vimos, también se pueden crear en la parte de definición de columnas. La sintaxis para definir claves primarias es:

definición_columnas | PRIMARY KEY (index_nombre_col,...)

mysql> CREATE TABLE ciudad4(nombre CHAR(20) NOT NULL,
poblacion INT NULL DEFAULT 5000,
PRIMARY KEY (nombre));

Pero esta forma tiene más opciones, por ejemplo, entre los paréntesis podemos especificar varios nombres de columnas, para construir claves primarias compuestas por varias columnas:

mysql> CREATE TABLE mitabla1 (id1 CHAR(2) NOT NULL,
id2 CHAR(2) NOT NULL,
texto CHAR(30),
PRIMARY KEY (id1, id2));


El segundo tipo de índice permite definir índices sobre una columna, sobre varias, o sobre partes de columnas. Para definir estos índices se usan indistintamente las opciones KEY o INDEX.

mysql> CREATE TABLE mitabla2(id INT, nombre CHAR(19), INDEX (nombre));
O su equivalente:
mysql> CREATE TABLE mitabla3(id INT, nombre CHAR(19), KEY (nombre));
También podemos crear un índice sobre parte de una columna:
mysql> CREATE TABLE mitabla4(id INT, nombre CHAR(19), INDEX (nombre(4)));







Indices En Oracle

Creacion de indices en oracle
Los indices se usan para mejorar el rendimiento de las operaciones sobre una tabla.

En general mejoran el rendimiento las SELECT y empeoran (minimamente) el rendimiento de los INSERT y los DELETE.

Una vez creados no es necesario nada más, oracle los usa cuando es posible (ver EXPLAIN PLAN).

Tipos de indices en ORACLE
Lectura/Escritura
B-tree(arboles binarios)
Functional Based
Reserve key

Solo Lectura 
Bitmap
Bitmap join
Index-organized table(algunas veces usados en lectura/escritura)
Cluster y hash cluster

Domail(muy especificos en aplicaciones Oracle)

En oracle existen tres tipos de indices:

1)Table Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
      ON [esquema.]table_name [tbl_alias]
         (col [ASC | DESC]) index_clause index_attribs

2)Bitmap Join Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
      ON [esquema.]table_name [tbl_alias]
         (col_expression [ASC | DESC])
            FROM [esquema.]table_name [tbl_alias]
               WHERE condition [index_clause] index_attribs


3)Cluster Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name
      ON CLUSTER [esquema.]cluster_name index_attribs

Creacion 







Bitacora Veterinaria


Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ;
ERROR:
No query specified

mysql> ;
ERROR:
No query specified

mysql> use veterinaria;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_veterinaria |
+---------------------+
| clientes            |
| mascota             |
| veterinaria         |
+---------------------+
3 rows in set (4.19 sec)

mysql> drop table clientes;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> exit
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database edgarI;
Query OK, 1 row affected (0.81 sec)

mysql> create table clientes(num int not null primary key,nombre varchar(25),direccion varchar(25),telefono varchar(15),oficio varchar(25));
ERROR 1046 (3D000): No database selected
mysql> use edgarI;
Database changed
mysql> create table clientes(num int not null primary key,nombre varchar(25),direccion varchar(25),telefono varchar(15),oficio varchar(25));
Query OK, 0 rows affected (4.99 sec)

mysql> insert into clientes values(1,'Edgar Harry','Los Matorrales #4532','6457843','carpintero');
Query OK, 1 row affected (2.12 sec)

mysql> create table mascota(num int not null primary key,nombre varchar(15),peso float(4),sexo varchar(1),raza varchar(15),FNacimiento varchar(10));
Query OK, 0 rows affected (0.68 sec)

mysql> insert into mascota values(001,'Cane',4.5,'M','pitbull','20-02-2010');
Query OK, 1 row affected (0.63 sec)

mysql> select*from clientes;
+-----+-------------+----------------------+----------+------------+
| num | nombre      | direccion            | telefono | oficio     |
+-----+-------------+----------------------+----------+------------+
|   1 | Edgar Harry | Los Matorrales #4532 | 6457843  | carpintero |
+-----+-------------+----------------------+----------+------------+
1 row in set (0.44 sec)

mysql> select*from mascota;
+-----+--------+------+------+---------+-------------+
| num | nombre | peso | sexo | raza    | FNacimiento |
+-----+--------+------+------+---------+-------------+
|   1 | Cane   |  4.5 | M    | pitbull | 20-02-2010  |
+-----+--------+------+------+---------+-------------+
1 row in set (0.04 sec)


+-----+-------------+
| num | nombre      |
+-----+-------------+
|   1 | Edgar Harry |
+-----+-------------+
1 row in set (0.13 sec)

mysql> select nombre from clientes mascota;
+-------------+
| nombre      |
+-------------+
| Edgar Harry |
+-------------+
1 row in set (0.01 sec)

mysql> drop table mascota;
Query OK, 0 rows affected (5.49 sec)

mysql> drop table clientes;
Query OK, 0 rows affected (0.74 sec)

mysql> create table mascota(NumP int not null primary key,nombre varchar(15),peso float(4),sexo varchar(1),raza varchar(15),FNacimiento varchar(10));
Query OK, 0 rows affected (1.45 sec)

mysql> create table clientes(NumCliente int not null primary key,nombre varchar(25),direccion varchar(25),telefono varchar(15),oficio varchar(25));
Query OK, 0 rows affected (0.25 sec)

mysql> alter table mascota add clientes varchar(25)references clientes(NumCliente);
Query OK, 0 rows affected (3.92 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select*from clientes;
Empty set (0.90 sec)

mysql> insert into clientes values(1,'Edgar Harry','Los Matorrales #4532','6457843','carpintero');
Query OK, 1 row affected (0.25 sec)

mysql> insert into clientes values(2,'Alejandro Saenz','Oasis #4543','6454343','carnicero');
Query OK, 1 row affected (0.21 sec)

mysql> insert into mascota values(1,'Cane',4.5,'M','pitbull','20-02-2010');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> show create table mascota;



mysql> select*from mascota;
+------+--------+------+------+---------+-------------+----------+
| NumP | nombre | peso | sexo | raza    | FNacimiento | clientes |
+------+--------+------+------+---------+-------------+----------+
|    1 | Cane   |  4.5 | M    | pitbull | 20-02-2010  | 1        |
+------+--------+------+------+---------+-------------+----------+
1 row in set (0.07 sec)

mysql> insert into mascota values(2,'Aleman',15.5,'M','pastorAleman','12-03-2009',2);
Query OK, 1 row affected (0.12 sec)

mysql> select mascota.nombre clientes.nombre from mascota clientes;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.nombre from mascota clientes' at line 1
mysql> select*from clientes;
+------------+-----------------+----------------------+----------+------------+
| NumCliente | nombre          | direccion            | telefono | oficio     |
+------------+-----------------+----------------------+----------+------------+
|          1 | Edgar Harry     | Los Matorrales #4532 | 6457843  | carpintero |
|          2 | Alejandro Saenz | Oasis #4543          | 6454343  | carnicero  |
+------------+-----------------+----------------------+----------+------------+
2 rows in set (0.00 sec)


+--------+--------------------+
| nombre | Nombre Propietario |
+--------+--------------------+
| Cane   | Edgar Harry        |
| Aleman | Alejandro Saenz    |
+--------+--------------------+
2 rows in set (0.12 sec)


+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Cane   | Edgar Harry     |
| Aleman | Alejandro Saenz |
+--------+-----------------+
2 rows in set (0.01 sec)

mysql> select*from clientes;
+------------+-----------------+----------------------+----------+------------+
| NumCliente | nombre          | direccion            | telefono | oficio     |
+------------+-----------------+----------------------+----------+------------+
|          1 | Edgar Harry     | Los Matorrales #4532 | 6457843  | carpintero |
|          2 | Alejandro Saenz | Oasis #4543          | 6454343  | carnicero  |
+------------+-----------------+----------------------+----------+------------+
2 rows in set (0.00 sec)

mysql> select mascota.nombre,clientes.nombre from mascota,clientes ;
+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Cane   | Edgar Harry     |
| Aleman | Edgar Harry     |
| Cane   | Alejandro Saenz |
| Aleman | Alejandro Saenz |
+--------+-----------------+
4 rows in set (0.00 sec)

mysql> select distinct mascota.nombre,clientes.nombre from mascota,clientes ;
+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Cane   | Edgar Harry     |
| Aleman | Edgar Harry     |
| Cane   | Alejandro Saenz |
| Aleman | Alejandro Saenz |
+--------+-----------------+
4 rows in set (0.13 sec)
+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Cane   | Edgar Harry     |
| Aleman | Alejandro Saenz |
+--------+-----------------+
2 rows in set (0.00 sec)

mysql> insert into mascota values(003,'lord',10,'M','labrador','15-04-2011',3);
Query OK, 1 row affected (0.75 sec)


mysql> select*from clientes;
+------------+-----------------+----------------------+----------+--------------+
| NumCliente | nombre          | direccion            | telefono | oficio       |
+------------+-----------------+----------------------+----------+--------------+
|          1 | Edgar Harry     | Los Matorrales #4532 | 6457843  | carpintero   |
|          2 | Alejandro Saenz | Oasis #4543          | 6454343  | carnicero    |
|          3 | Omar Ruiz       | Centro #7834         | 6324354  | Ing.Sistemas |
|          4 | Ivan Morales    | Revolucion #0942     | 6891254  | ContadorP    |
|          5 | Oscar Hernandez | Mezquital #4412      | 6677667  | Electrico    |
|          6 | Jose Salas      | Americas #1972       | 1876578  | Medico       |
+------------+-----------------+----------------------+----------+--------------+
6 rows in set (0.00 sec)

mysql> select*from mascotas;
ERROR 1146 (42S02): Table 'edgari.mascotas' doesn't exist
mysql> select*from mascota;
+------+--------+------+------+----------------+-------------+----------+
| NumP | nombre | peso | sexo | raza           | FNacimiento | clientes |
+------+--------+------+------+----------------+-------------+----------+
|    1 | Cane   |  4.5 | M    | pitbull        | 20-02-2010  | 1        |
|    2 | Aleman | 15.5 | M    | pastorAleman   | 12-03-2009  | 2        |
|    3 | lord   |   10 | M    | labrador       | 15-04-2011  | 3        |
|    4 | pinky  |    3 | M    | Chihuahua      | 11-02-2012  | 4        |
|    5 | pelusa |  1.5 | M    | french poodle  | 02-01-2013  | 5        |
|    6 | BigDog |   50 | M    | Schnauzer      | 05-08-2008  | 6        |
+------+--------+------+------+----------------+-------------+----------+
6 rows in set (0.00 sec)

mysql> select mascota.nombre,clientes.nombre from mascota,clientes where clientes.NumCliente=mascota.clientes;
+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Cane   | Edgar Harry     |
| Aleman | Alejandro Saenz |
| lord   | Omar Ruiz       |
| pinky  | Ivan Morales    |
| pelusa | Oscar Hernandez |
| BigDog | Jose Salas      |
+--------+-----------------+
6 rows in set (0.00 sec)

mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql> select mascota.nombre,clientes.nombre from mascota,clientes where clientes.NumCliente=mascota.clientes;
+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Cane   | Edgar Harry     |
| Aleman | Alejandro Saenz |
| lord   | Omar Ruiz       |
| pinky  | Ivan Morales    |
| pelusa | Oscar Hernandez |
| BigDog | Jose Salas      |
+--------+-----------------+
6 rows in set (0.01 sec)

mysql> select *from mascota;
+------+--------+------+------+----------------+-------------+----------+
| NumP | nombre | peso | sexo | raza           | FNacimiento | clientes |
+------+--------+------+------+----------------+-------------+----------+
|    1 | Cane   |  4.5 | M    | pitbull        | 20-02-2010  | 1        |
|    2 | Aleman | 15.5 | M    | pastorAleman   | 12-03-2009  | 2        |
|    3 | lord   |   10 | M    | labrador       | 15-04-2011  | 3        |
|    4 | pinky  |    3 | M    | Chihuahua      | 11-02-2012  | 4        |
|    5 | pelusa |  1.5 | M    | french poodle  | 02-01-2013  | 5        |
|    6 | BigDog |   50 | M    | Schnauzer      | 05-08-2008  | 6        |
+------+--------+------+------+----------------+-------------+----------+
6 rows in set (0.00 sec)

mysql> exit;

jueves, 11 de abril de 2013

Roolback, commit, recovery de un sgbd


En tecnologías de base de datos, un rollback es una operación que devuelve a la base de datos a algún estado previo. Los Rollbacks son importantes para la integridad de la base de datos, a causa de que significan que la base de datos puede ser restaurada a una copia limpia incluso después de que se han realizado operaciones erróneas. Son cruciales para la recuperación de crashes de un servidor de base de datos; realizando rollback(devuelto) cualquier transacción que estuviera activa en el tiempo del crash, la base de datos es restaurada a un estado consistente.
 En SQL, ROLLBACK es un comando que causa que todos los cambios de datos desde la última sentencia BEGIN WORK, o START TRANSACTION sean descartados por el sistema de gestión de base de datos relacional (RDBMS), para que el estado de los datos sea "rolled back"(devuelto) a la forma en que estaba antes de que aquellos cambios tuvieran lugar.
 Una sentencia ROLLBACK también publicará cualquier savepoint existente que pudiera estar en uso.
 En muchos dialectos de SQL, ROLLBACKs son específicos de la conexión. Esto significa que si se hicieron dos conexiones a la misma base de datos, un ROLLBACK hecho sobre una conexión no afectará a cualesquiera otras conexiones. Esto es vital para el buen funcionamiento de la Concurrencia.
 A funcionalidad de rollback está normalmente implementada con un Log de transacciones, pero puede también estar implementada mediante control de concurrencia.

Hacer un recovery en MySQL
Si queremos realizar una copia de seguridad desde entornos Windows, deberemos utilizar la línea de comandos ("cmd"). Para abrir la línea de comandos en Windows podemos ir al menú Inicio>Ejecutar, escribir cmd y pulsar enter). Se nos abrir la línea de comandos de Windows. Ahora hemos de situarnos en la carpeta donde tenemos instalados los binarios de MySQL por ejemplo: c:\mysql\bin (esta ruta depende de donde instalaste MYSQL) y escribimos el mismo comando que en linux:
mysqldump --opt -u nombredeusuario -p basededatos tabla1 > archivodebackup.txt

Recovery de una base de datos InnoDB
Para una base de datos transaccional (de tipo InnoDB o BDB) y de gran tamaño, se puede utilizar este comando
mysqldump --opt -q --single-transaction -u nombredeusuario -p  basededatos tabla1 > archivodebackup.txt
El parámetro -q es útil para bases de datos de gran tamaño.

mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO innotest VALUES(1);
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO innotest VALUES(2);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO innotest VALUES(3);
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
+-------+
3 rows in set (0.00 sec)
De acuerdo, nada espectacular. Ahora veamos como usar transacciones.
mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
+-------+
4 rows in set (0.00 sec)
Si en este momento ejecutamos un ROLLBACK, la transacción no será completada, y los cambios realizados sobre la tabla no tendrán efecto.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
+-------+
3 rows in set (0.00 sec)
Ahora vamos a ver que sucede si perdemos la conexión al servidor antes de que la transacción sea completada.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
+-------+
4 rows in set (0.00 sec)

mysql> EXIT;
Bye
Cuando obtengamos de nuevo la conexión, podemos verificar que el registro no se insertó, ya que la transacción no fue completada.
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 449 to server version: 4.0.13

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.


mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
+-------+
3 rows in set (0.00 sec)
Ahora vamos a repetir la sentencia INSERT ejecutada anteriormente, pero haremos un COMMIT antes de perder la conexión al servidor al salir del monitor de MySQL.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)

mysql> EXIT;
Bye
Una vez que hacemos un COMMIT, la transacción es completada, y todas las sentencias SQL que han sido ejecutadas previamente afectan de manera permanente a las tablas de la base de datos.
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 450 to server version: 4.0.13

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> SELECT * FROM innotest;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
+-------+
4 rows in set (0.00 sec)

mysql> CREATE TABLE ventas(
    -> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    -> producto VARCHAR(30) NOT NULL,
    -> cantidad TINYINT NOT NULL) TYPE = InnoDB;
Query OK, 0 rows affected (0.96 sec)
Insertamos un registro.
mysql> INSERT INTO ventas VALUES(0,'Gansito marinela',3);
Query OK, 1 row affected (0.16 sec)
 
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto         | cantidad |
+----+------------------+----------+
|  1 | Gansito marinela | 3        |
+----+------------------+----------+
1 row in set (0.01 sec)
Ahora vamos a iniciar una transacción con la sentencia BEGIN.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
Actualizamos el registro.
mysql> UPDATE ventas SET cantidad=4 WHERE id=1;
Query OK, 1 row affected (0.07 sec)
Líneas correspondientes: 1  Cambiadas: 1  Avisos: 0
Verificamos que los cambios han sucedido.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto         | cantidad |
+----+------------------+----------+
|  1 | Gansito marinela | 4        |
+----+------------------+----------+
1 row in set (0.00 sec)
Si queremos deshacer los cambios, entonces ejecutamos un ROLLBACK.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
Verificamos que se deshicieron los cambios.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto         | cantidad |
+----+------------------+----------+
|  1 | Gansito marinela | 3        |
+----+------------------+----------+
1 row in set (0.00 sec)
Vamos a actualizar el registro usando otra transacción.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
 
mysql> UPDATE ventas SET cantidad=2 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Líneas correspondientes: 1  Cambiadas: 1  Avisos: 0
 
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto         | cantidad |
+----+------------------+----------+
|  1 | Gansito marinela | 2        |
+----+------------------+----------+
1 row in set (0.00 sec)
Vamos a confirmar que deseamos los cambios.
mysql> COMMIT;
Query OK, 0 rows affected (0.05 sec)
En este momento los cambios son permanentes y definitivos.
mysql> SELECT * FROM ventas;
+----+------------------+----------+
| id | producto         | cantidad |
+----+------------------+----------+
|  1 | Gansito marinela | 2        |
+----+------------------+----------+
1 row in set (0.00 sec)


Oracle
Declaraciones de control de transacciones gestionar los cambios realizados por las sentencias DML.
¿Qué es una transacción?
Una transacción es un conjunto de sentencias SQL de Oracle, que traten como una sola unidad. Es decir, todos los estados deben llevar a cabo con éxito o ninguna de las sentencias se ejecutan debería.
Para el control de las transacciones de Oracle no hace permanente instrucciones DML a menos que lo cometió. Si no confirmar la transacción y que se apague o se bloquea el sistema entonces la transacción es respaldada rollo.
Declaraciones TCL disponibles en Oracle son
COMMIT: Hacer cambios realizados en la transacción permanente.
ROLLBACK: Revertir el estado de la base de datos para el último punto de confirmación.
SAVEPOINT: Se utiliza para especificar un punto en operación a la que más tarde puede revertir.
COMMIT
Para que los cambios realizados en un número de transacción permanente la sentencia COMMIT.

La sintaxis de la sentencia COMMIT es
COMMIT [WORK] [COMENTARIO 'tu comentario "];
De trabajo es opcional.
COMENTARIO también es opcional, especifique esta opción si desea identificar la transacción en DBA_2PC_PENDING diccionario de datos.
Ejemplo
insertar en emp (empno, Ename, sal) valores (101, 'Abid', 2300);
cometerlo;
ROLLBACK
 Para deshacer los cambios realizados en una transacción de dar rollback comunicado. Rollback restaurar el estado de la base de datos para el último punto de confirmación.
Ejemplo:
eliminar de emp;
rollback / * deshacer los cambios * /
SAVEPOINT
Especifique un punto de una operación a la que más tarde se puede deshacer.
Ejemplo
insertar en emp (empno, Ename, sal) values ​​(109, 'Sami', 3000);
un punto de retorno;
insertar en los valores dept (10, 'Ventas', 'Hyd');
punto de retorno b;
insertar en los valores SALGRADE ('III', 9000,12000);
Ahora, si se le da
revertir a una;
Entonces fila de SALGRADE mesa y sección será respaldado por rodar. Ahora usted puede cometer la fila insertada en la tabla emp o deshacer la transacción.
Si usted le da
rollback para b;
A continuación, la fila se inserta en la tabla SALGRADE será respaldado por rollo. Ahora usted puede cometer la fila insertada en dept tabla y la tabla emp o revertir a un punto de retorno o rodar completamente respaldado la transacción.
Si usted le da
rollback;
Entonces las transacciones completas se rollo respaldó.
Si usted le da
cometerlo;