martes, 30 de abril de 2013

replicacion


QUE ES REPLICA?
Un buen número de aplicaciones informáticas están accesibles a través de la red, siguiendo un modelo cliente-servidor. En algunos casos, tiene gran importancia que tales servicios se presten de manera continua. Para esto, se deben utilizar técnicas de replicación.
La replicación es un mecanismo utilizado para propagar y diseminar datos en un ambiente distribuido, con el objetivo de tener mejor performance y confiabilidad, mediante la reducción de dependencia de un sistema de base de datos centralizado.
La replicación de la información en una BDD apunta a aumentar la disponibilidad de la información. Esta disponibilidad puede observarse desde dos perspectivas:
·         Aumentar el paralelismo en las consultas, dado que la misma información residirá en más de una localidad de la red.
·         Mejorar la disponibilidad de los datos ante eventuales caídas de nodos de la red.
El concepto de replicación es muy amplio e involucra muchos aspectos que hacen al diseño de datos de la BDD. Los protocolos de aseguramiento de integridad de la información y los protocolos de actualización de las replicas son los puntos más interesantes para ser tenidos en cuenta.

 Beneficios de la réplica de Datos en un DBMS
Con la replicación se pueden llegar a obtener dos mejoras importantes:
·         1. Por un lado, se garantiza que el servicio ofrecido por la aplicación, no se vea interrumpido en caso de que se dé un fallo en alguna de las réplicas. Además, el tiempo necesario para restablecer el servicio en la aplicación podría llegar a ser grande en algunos tipos de fallo.
·         2. Por otra parte, la capacidad de servicio se ve incrementada cuando las peticiones efectuadas por los clientes únicamente implican consultas.
  • Disponibilidad.-El modo en que la replicación incrementa la disponibilidad de los datos para los usuarios y aplicaciones.
  •  Fiabilidad.- Al haber múltiples copias de los datos disponibles en el sistema, se dispone de un mecanismo excelente de recuperación cuando existan fallos en nodos.
  •  Rendimiento.- Se mejora para las transacciones de consulta cuando se introduce la replicación en un sistema que estuviera aquejado de sobrecarga de recursos centralizados.
  •  Reducción de la carga.- Modo en q se utiliza la replicación para distribuir datos en ubicaciones remotas
  • 4. Procesamiento Desconectado.- Modo en que la replicación puede implementarse mediante mecanismo instantáneas.
  • Soporta muchos usuarios.- Se puede crear múltiples instantáneas personalizadas que satisfagan los requisitos de cada usuario o grupo de usuarios del sistema.
  • Soporta Aplicaciones Avanzadas.- Para OLPT(Online transaction Processing), OLAP(Online Analitical Processing)
COMO APLICARLO
Nota: este procedimiento y algunos de los comandos de replicación SQL mostrados en secciones posteriores necesita el privilegio SUPER.
1.    Asegúrese de que las versiones de MySQL instalado en el maestro y en el esclavo son compatibles según dice la tabla mostrada en Sección 6.5, “Compatibilidad entre versiones de MySQL con respecto a la replicación”.
2.    Prepare una cuenta en el maestro que pueda usar el esclavo para conectar. Este cuenta debe tener el privilegioREPLICATION SLAVE . Si la cuenta se usa sólo para replicación (lo que se recomienda), no necesita dar ningún privilegio adicional.
Suponga que su dominio es mydomain.com y que quiere crear una cuenta con un nombre de usuario de replque puedan usar los esclavos para acceder al maestro desde cualquier equipo en su dominio usando una contraseña de slavepass. Para crear la cuenta, use el comando GRANT:
mysql> GRANT REPLICATION SLAVE ON *.*
    -> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
Si quiere usar los comandos LOAD TABLE FROM MASTER o LOAD DATA FROM MASTER desde el servidor esclavo, necesita dar a esta cuenta privilegios adicionales:
  1. De a la cuenta el privilegio global SUPER y RELOAD .
  2. De el privilegio SELECT para todas las tablas que quiere cargar. Cualquier tabla maestra desde la que la cuenta no puede hacer un SELECT se ignoran por LOAD DATA FROM MASTER.
5.    Si usa sólo tablas MyISAM , vuelque todas las tablas y bloquee los comandos de escritura ejecutando un comandoFLUSH TABLES WITH READ LOCK :
6.    mysql> FLUSH TABLES WITH READ LOCK;

Para usar tar para crear un archivo que incluya todas las bases de datos, cambie la localización en el directorio de datos del maestro, luego ejecute el comando:
shell> tar -cvf /tmp/mysql-snapshot.tar .
Si quiere que el archivo sólo incluya una base de datos llamada this_db, use este comando:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
Luego copie el archivo en el directorio /tmp del servidor esclavo. En esa máquina, cambie la localización al directorio de datos del esclavo, y desempaquete el fichero usando este comando:
shell> tar -xvf /tmp/mysql-snapshot.tar
Puede no querer replicar la base de datos mysql si el servidor esclavo tiene un conjunto distinto de cuentas de usuario a la existente en el maestro. En tal caso, debe excluírla del archivo. Tampoco necesita incluir ningún fichero de log en el archivo, o los ficheros master.info o relay-log.info files.
Mientras el bloqueo de FLUSH TABLES WITH READ LOCK está en efecto, lee el valor del nombre y el desplazamiento del log binario actual en el maestro:
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73       | test         | manual,mysql     |
+---------------+----------+--------------+------------------+

Una vez que tiene los datos y ha guardado el nombre y desplazamiento del log, puede reanudar la actividad de escritura en el maestro:
mysql> UNLOCK TABLES;
Si está usando tablas InnoDB , debería usar la herramienta InnoDB Hot Backup. Realiza una copia consistente sin bloquear el servidor maestro, y guarda el nombre y desplazamiento del log que se corresponden a la copia para usarlo posteriormente en el esclavo.

Para guardar los nombres de ficheros actual y desplazamientos, debe ejecutar el siguiente comando antes de parar el servidor:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

Tras guardar el nombre del log y el desplazamiento, pare el servidor sin bloquear las tablas para asegurarse que el servidor para con el conjunto de datos correspondiente al fichero de log correspondiente y desplazamiento:
shell> mysqladmin -u root shutdown
Asegúrese que la sección [mysqld] del fichero my.cnf en el maestro incluye una opción log-bin . Esta sección debe también tener la opción server-id=master_id , donde master_id debe ser un entero positivo de 1 a 2^32 - 1. Por ejemplo:
[mysqld]
log-bin=mysql-bin
server-id=1
Si estas opciones no están presentes, añádalas y reinicie el servidor.
Pare el servidor que se vaya a usar como esclavo y añada lo siguiente a su fichero my.cnf :
[mysqld]
server-id=slave_id
El valor slave_id , como el valor master_id , debe ser un entero positivo de 1 a 2^32 - 1. Además, es muy importante que el ID del esclavo sea diferente del ID del maestro. Por ejemplo:
[mysqld]
server-id=2
1.    Si hace una copia de seguridad de los datos del maestro usando mysqldump, cargue el fichero de volcado en el esclavo:
shell> mysql -u root -p < dump_file.sql
2.    Ejecute los siguientes comandos en el esclavo, reemplazando los valores de opciones con los valores relevantes para su sistema:
3.    mysql> CHANGE MASTER TO
4.        ->     MASTER_HOST='master_host_name',
5.        ->     MASTER_USER='replication_user_name',
6.        ->     MASTER_PASSWORD='replication_password',
7.        ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;
La siguiente tabla muestra la longitud máxima para las opciones de cadenas de caracteres:
MASTER_HOST
60
MASTER_USER
16
MASTER_PASSWORD
32
MASTER_LOG_FILE
255
8.    Arranque el flujo esclavo:
mysql> START SLAVE;
Si olvida asignar un valor para server-id en el esclavo, obtiene el siguiente error en el log de errores:
Warning: You should set server-id to a non-0 value if master_host is set;
we will force server id to 2, but this MySQL server will not act as a slave.
También encuentra mensajes de error en el log de errores del esclavo si no es capaz de replicar por ninguna otra razón.


miércoles, 17 de abril de 2013

RENDIMIENTO DE UNA BASE DE DATOS


            RENDIMIENTO DE UNA BASE DE DATOS
Técnicas de estimación para medir el rendimiento de la base de datos
Cuando diseña e implementa una base de datos, debe identificar las tablas de gran tamaño y los procesos más complejos que realizará la base de datos. También debe prestar una atención especial al rendimiento cuando diseña estas tablas. Además, debe considerar los efectos que puede tener en el rendimiento el aumento del número de usuarios con acceso a la base de datos.
Los siguientes cambios de diseño, entre otros, pueden mejorar el rendimiento:
·         Si una tabla que contiene cientos de miles de filas debe resumirse en un informe diario, puede agregar a la tabla una o varias columnas que contengan datos previamente agregados para utilizarlos sólo en dicho informe.
·         Las bases de datos pueden normalizarse en exceso. Esto significa que la base de datos se define con un gran número de tablas pequeñas interrelacionadas. Cuando la base de datos procesa los datos de estas tablas, debe realizar muchas más operaciones para combinar los datos relacionados. Este procesamiento adicional puede repercutir negativamente en el rendimiento de la base de datos. En esos casos, una reducción de la normalización de la base de datos para simplificar procesos complejos puede mejorar el rendimiento.
Este planeamiento o diseño debería tener en cuenta lo siguiente:
·         El tipo de disco que se va a utilizar, por ejemplo, los dispositivos RAID (matriz redundante de discos independientes). Para obtener más información, vea Acerca de las soluciones basadas en hardware.
·         Cómo se van a colocar los datos en los discos. Para obtener más información, vea Usar archivos y grupos de archivos.
·         El diseño de índices que se va a utilizar con el fin de mejorar el rendimiento de las consultas para tener acceso a los datos. Para obtener más información, vea Diseñar índices.
·         Cómo se van a establecer correctamente todos los parámetros de configuración para que la base de datos obtenga un buen rendimiento. Para obtener más información, vea Optimizar el rendimiento del servidor.
existen diferentes técnicas que se pueden usar aisladas ó en conjunto que ayudan en muchos casos a mejorar el rendimiento. Aqui teneis una pequeña lista con algunos consejos generales que suelen ayudar en muchas ocasiones cuando se necesita mejorar el rendimiento. En esta lista no tendremos en cuanta las mejorias que se pueden obtener con el uso adecuado de SQL y normalización de los datos.
  • Ejecutar VACUUM ANALYZE tan a menudo como sea necesario, Bien manualmente ó ajustanto autovacuum si es necesario
  • Un sistema de discos de alto rendimiento suele ser más importante que la cantidad de memoria disponible y esta a su vez más importante que la CPU utilizada.
  • Un servidor de bases de datos nunca tendra suficiente memoria. Cuanta más memoria, mejor.
  • Cuanto más discos disponibles en RAID, mejor. Usar Tablespaces para organizar los datos.
  • RAID 1+0 / 0+1 suele funcionar mejor que RAID 5.
  • Saparar el registro de transacciones (ficheros WAL) del resto de datos, usar diferentes discos.
  • Aumentar el valor de checkpoint_segments en sistemas con una alta concurrencia de actualizaciones de los datos (insert,update,delete)
  • Discos SCSI y SAS som preferibles en servidores con un alto nivel de utilización
  • Múltiples CPUs ayudan a ejecutar/realizar trabajos paralelos en nuestras bases de datos.
  • Ejecutar CLUSTER cuando sea viable en tablas con una alto nivel de actualización de datos.
  • Utilizar un servidor dedicado siempre que sea posible. Será más facil de configurar y ajustar para mejorar nuestro rendimiento.
  • Al inicializar/poblar una nueva base de datos con una gran cantidad de datos:
    • Usar COPY en vez de INSERT
    • Remover los indices durante la restauración de los datos.
    • Aumentar el valor de maintenance_work_mem
    • Aumentar el valor de checkpoint_segments
    • fsync=false !! No olvidar cambiar este valor a TRUE cuando termineis de restaurar los datos !!
    • No olvidar ejecutar ANALYZE al termino de la restauración de los datos
Bueno, y hasta aqui los consejos generales, más adelante iremos profundizando en aspectos concretos que pueden afectar al rendimiento.
Los índices se utilizan para buscar las filas con valores de columna específicos rápidamente. Sin un índice, MySQL debe comenzar con el primer disco y luego leer a través de toda la tabla para buscar las filas correspondientes. Cuanto mayor sea la tabla, más esto cuesta. Si la tabla tiene un índice para las columnas en cuestión, MySQL puede determinar rápidamente la posición de buscar en el medio del archivo de datos sin tener que mirar a todos los datos. Si una tabla tiene 1000 filas, entonces este es al menos 100 veces más rápido que la lectura secuencial. Tenga en cuenta que si usted necesita para acceder a la mayoría de las filas, es más rápido para leer de forma secuencial, ya que esto minimiza el disco busca.
http://www.postgresql.org.es/node/223
http://msdn.microsoft.com/es-es/library/ms190619(v=sql.105).aspx

TIEMPO DE CONSULTA




lunes, 15 de abril de 2013

tipos de indices e indices en la base de datos


ÍNDICE BASE DE DATOS
El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla en una base de datos. Al aumentar drásticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes búsquedas.
El índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, sólo hay que buscar en el índice dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice.

ARCHIVO ÍNDICE
Un índice de acceso es un archivo auxiliar utilizado internamente por el SGDB para acceder directamente a cada registro del archivo de datos. La operación de indexación, creada por el SGDB, ordena a los registros de un archivo de datos de acuerdo con los campos utilizados como llave primaria e, incrementa sensiblemente la velocidad de ejecución de algunas operaciones sobre el archivo de datos. Normalmente para cada archivo de datos debe existir un índice cuya llave de indexación sea idéntica a su llave primaria. Este índice es llamado índice primario.
TIPOS DE ARCHIVO
Los archivos pueden clasificarse en cuatro tipos básicos; que son: los archivos maestros, los archivos de transacciones, los archivos de control y los archivos de planeamiento. Esta clasificación dependerá de la relación lógica que tengan que tener los datos, para dar apoyo a la actividad de la organización.
ARCHIVO MAESTRO
Un archivo maestro es un conjunto de registros que se refieren a algún aspecto importante de las actividades de una organización, como por ejemplo el archivo de VENDEDORES. Un archivo maestro también puede reflejar la historia de los eventos que afectan a una entidad determinada, como es en el caso de un archivo HISTÓRICO DE VENTAS. Otros ejemplos son los archivos maestros de: PLAN DE CUENTAS; BANCOS, NÓMINA DEL PERSONAL, CLIENTES, VENDEDORES, PRODUCTOS, PROVEEDORES, COMPETIDORES.
ARCHIVO DE TRANSACCIONES.
Un archivo de transacciones es un archivo temporal que persigue básicamente dos propósitos; uno es el de acumular datos de eventos en el momento que ocurran, y el segundo propósito es el de actualizar los archivos maestros para reflejar los resultados de las transacciones actuales. En otras palabras, guardan información sobre los eventos que afectan a la organización y sobre los cuales se calculan datos; como es en el caso de los archivos de VENTAS, ORDENES DE PRODUCCIÓN o PAGO DE SALARIOS. Otros ejemplos de archivos de transacciones son los archivos de: REGISTROS CONTABLES, COSTOS, FACTURAS, PAGOS A RECIBIR, PROCESOS DE EXPORTACIÓN, CONSULTA DE CLIENTES, PEDIDOS DE CLIENTES Y PEDIDOS A PROVEEDORES.

ARCHIVOS DE CONTROL.
Los archivos de control contienen datos de los archivos maestros y de transacciones, para permitir el análisis del desempeño de la organización. Estos archivosgeneran medidas de control de los negocios, como ser el VOLUMEN DE VENTA POR PRODUCTO, VOLUMEN DE VENTA POR VENDEDOR, VOLUMEN DE VENTA POR CLIENTE, COMPRAS POR PROVEEDOR, COSTO DE REPOSICIÓN.
ARCHIVO DE PLANEAMIENTO.
Los archivos de planeamiento, contienen datos referentes a los niveles esperados de los datos existentes en los archivos maestros y de transacciones; como por ejemplo: PROGRAMA DE VENTAS, PROGRAMA DE COMPRAS, PROGRAMA DE PRODUCCIÓN; PRESUPUESTO FINANCIERO. Por lo tanto los datos existentes en un archivo de planeamiento provienen de los archivos maestros, de transacciones, y de control.

Creando índices en MySQL

Usando el ejemplo inicial, para que la consulta anterior se ejecutase más rápido en nuestro sistema gestor de base de datos, nos vendría bien crear un índice por apellido. Para crear ese índice podemos utilizar una sentencia en lenguaje SQL como la siguiente:
ALTER TABLE personas ADD INDEX (apellido)
De esta forma sencilla indicamos a MySQL que genere una lista ordenada de todos los apellidos de la tabla personas, así como en el ejemplo del libro tenemos los números de teléfono ordenados por el apellido


CREAR INDICES EN 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  
las index_clauses posibles son:
LOCAL STORE IN (tablespace)

LOCAL STORE IN (tablespace)
  (PARTITION [partition
       [LOGGING|NOLOGGING]
       [TABLESPACE {tablespace|DEFAULT}]
       [PCTFREE int]
       [PCTUSED int]
       [INITRANS int]
       [MAXTRANS int]
       [STORAGE storage_clause]
       [STORE IN {tablespace_name|DEFAULT]
       [SUBPARTITION [subpartition [TABLESPACE tablespace]]]])

LOCAL (PARTITION [partition
       [LOGGING|NOLOGGING]
       [TABLESPACE {tablespace|DEFAULT}]
       [PCTFREE int]
       [PCTUSED int]
       [INITRANS int]
       [MAXTRANS int]
       [STORAGE storage_clause]
       [STORE IN {tablespace_name|DEFAULT]
       [SUBPARTITION [subpartition [TABLESPACE tablespace]]]])

GLOBAL PARTITION BY RANGE (col_list)
   ( PARTITION partition VALUES LESS THAN (value_list)
       [LOGGING|NOLOGGING]
       [TABLESPACE {tablespace|DEFAULT}]
       [PCTFREE int]
       [PCTUSED int]
       [INITRANS int]
       [MAXTRANS int]
       [STORAGE storage_clause] )

INDEXTYPE IS indextype [PARALLEL int|NOPARALLEL] [PARAMETERS ('ODCI_Params')]
 {Esto es solo para table index, no para bitmap join Index}
Indices base de datos veterinaria
Microsoft Windows [Version 6.0.6002]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Users\familia leyva>cd..
C:\Users>cd..
C:\>cd..
C:\>cd xampp
C:\xampp>cd mysql
C:\xampp\mysql>cd bin
C:\xampp\mysql\bin>mysql -hlocalhost -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.16 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> use veterinaria
Database changed
mysql> create index mascota on customer(name (15));
ERROR 1146 (42S02): Table 'veterinaria.customer' doesn't exist
mysql> create table datos_perro(id varchar(15),nombre varchar(30),sexo varchar(1
0),fecha_nacimiento varchar(15));
ERROR 1050 (42S01): Table 'datos_perro' already exists
mysql> create table datos_mascota(id varchar(15),nombre varchar(30),sexo varchar
(10),fecha_nacimiento varchar(15));
Query OK, 0 rows affected (0.14 sec)

mysql> create table datos_propietario(id varchar(15),nombre varchar(30),telefono
 varchar(10),direccion varchar(15));
ERROR 1050 (42S01): Table 'datos_propietario' already exists
mysql> create table datos_dueno(id varchar(15),nombre varchar(30),telefono varch
ar(10),direccion varchar(15));
Query OK, 0 rows affected (0.14 sec)

mysql> create index datos_mascotas on customer (id(10));
ERROR 1146 (42S02): Table 'veterinaria.customer' doesn't exist
mysql> create index index_mascota  (id(10));
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 '(id(1
0))' at line 1
mysql> create index index_mascota ON datos_mascota( id (10));
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> create index index_mascota ON datos_mascota( nombre (10));
ERROR 1061 (42000): Duplicate key name 'index_mascota'
mysql> create index index_nombre ON datos_mascota( nombre (10));
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> create index index_sex ON datos_mascota( sexo (10));
Query OK, 0 rows affected (0.27 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> create index index_id ON datos_dueno( id (10));
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> create index index_nomb ON datos_dueno( nombre (10));
Query OK, 0 rows affected (0.26 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index index_tele ON datos_dueno( telefono (10));
Query OK, 0 rows affected (0.22 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show tables;
+-------------------------+
| Tables_in_veterinaria   |
+-------------------------+
| analisis_sistema        |
| constantes_fisiologicas |
| datos_dueno             |
| datos_mascota           |
| datos_medio             |
| datos_perro             |
| datos_propietario       |
| sistema_cardiovascular  |
| sistema_musculoso       |
| sistema_nervioso        |
| sistema_respiratorio    |
+-------------------------+
11 rows in set (0.01 sec)

mysql>