sábado, 29 de noviembre de 2014

Leer fichero mysql-bin

Este archivo se genera a partir de que se tiene activo que se guarde el log de toda modificación en la base de datos, este archivo es leído por el servidor espejo, lo lee y toma los cambios y se ejecutan, para mantener la integridad de datos en los servidores.

¿Como leer este fichero binario?

Por fortuna contamos con el comando mysqlbinlog, con los parámetros correctos, podemos extraer la información para posteriormente ser leída y procesada.

 mysqlbinlog binlog.000046 > archivo.out
Y con algunos parámetros
mysqlbinlog --start-datetime="2008-05-28 16:41:00" --stop-datetime="2008-05-28 16:43:00" > archivo.out
Ya es cuestión de jugar con sus parámetros.

mas información aquí

Muy útil hasta para recuperar información.

viernes, 21 de noviembre de 2014

Se me lleno el disco de Base de Datos (ESPEJO uff!!)

Caso curioso...

Caso:
El servidor espejo( de mi productivo)  lleno el disco duro donde se encontraba la partición de mi base de datos, 100%, y como buena Ley de Murphy, el monitoreo que le tenia activado no estaba activado para esa unidad de disco, motivo por el cual no me di cuenta antes de que sucediera.

Síntoma:
El servicio de MySQL por obvias razones dejo de funcionar, no permitía accesar al servicio MySQL.

Causa:
Un descuido de una opción del sistema, comenzó a grabar mucha información en pocas horas inserto mas de 4millones de registros con mucha información de por medio.

Solución:
Una puede ser, depurar información en producción, dar mantenimiento en la base de datos productiva, respaldar nuevamente y restaurar y iniciar el espejo nuevamente ya con menos información.

Otra, liberar espacio en la unidad que se lleno copiando toda la carpeta de una de las base de datos a otro disco ó otro servidor, para levantar esa base de datos en ese otro disco.






Conectarse sin batallar a servidor Linux (Protocolo ssh)

Conectarse sin batallar a servidor Linux (Protocolo #ssh)

Cuando no queremos batallar al conectarnos a un servidor, podemos generar credenciales que nos autentifiquen con el servidor, y no nos pida contraseñas que por lo general(por seguridad) son muy complicadas. (Esto en servidores Linux).

En el home del usuario de nuestra PC (Linux) ejecutamos:

ssh-keygen -t rsa -b 1024

Este comando nos pedira que pongamos el nombre de un archivo:
id_rsa_xxx

y luego nos pedira una palabra (contraseña) que podamos recordar, ya que sera la que estaremos tecleando de ahora en adelante cada vez que nos queramos conectar a los servidores, en vez de la contraseña complicada.

No genera dos archivos:
id_rsa_xxx
id_rsa_xxx.pub

El archivo id_rsa_xxx.pub lo vamos a copiar al servidor donde queremos estarnos logueando con certificado y su contenido servidoragregara a 
al archivo, del usuario del servidor que se encuentra en la siguiente ruta: /home/usuario/.ssh/authorized_keys lo podemos hacer de la siguiente
manera:

cat /home/usuario/id_rsa_xxx.pub >> authorized_keys

Una vez hecho esto, ya no ocuparemos el archivo id_rsa_xxx.pub, es mejor borrarlo.

rm -f /home/usuario/id_rsa_xxx.pub

Por ultimo nos logueamos al servidor

ssh usuario@hostservidor

Nos pedirá la contraseña que le dimos en el proceso de creación del archivo id_rsa_xxx.pub, esto solo la primera vez que reniciamos la pc, después ya no será necesario.

Notese que al loguearse por ssh, escribimos el usuario, este usuario debe ser al que agreamos el contenido del archivo id_rsa_xxx.pub y se lo agregamos
a su archivo authorized_keys. Si queremos que a los "n" usuarios del servidor sea igual, tenemos que entrar a todos los "n" usuarios del servidor y agregarle el contenido de id_rsa_xxx.pub al authorized_keys

martes, 11 de noviembre de 2014

MySQL implode, join resultados.

Por algún motivo en particular me nació la necesidad de agrupar, unir o concatenar los campos que pertenecían a una tabla, primero pensé en hacer un ciclo con un contador de la cantidad de campos que tenia dicha tabla y al final hacer el query final.

Oh sorpresa!! que con group_concat de MySQL me soluciono dicho problema, lo explico mejor con un ejemplo:

Query:
SELECT GROUP_CONCAT(DISTINCT column_name SEPARATOR ' , ') FIELD FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'nombre_basedatos' and table_name = 'nombre_tabla';

Consultando la tabla COLUMNS de sistema, busco extraer sus campos y ponerlos en una sola variable, dado que ocupo formar la consulta dinámicamente de los campos, pensaríamos que con un "*" funcionaria pero requería comparar la estructura de una "misma" tabla de dos base de datos.


Habra quien le encuentre otras utilidades como quizás formar un "score-board".

jueves, 6 de noviembre de 2014

Extraer tablas con falta de indices.

Si requerimos extraer de una manera dinamica, a que campos de las tablas les falta crearles indice, podemos generarlo dando como parámetros la base de datos y el nombre o alias de campos.

En ocasiones nuestras reglas nos dicen que los campos que representan una llave foranea terminan con "_id", es asi que realizo la siguiente consulta


Consulta para extraer el query con la creación de indices para las tablas de una base de datos data, donde


SELECT CONCAT('CREATE INDEX ix_', a.table_name,'_',a.column_name, ' ON ',a.table_name,'(',a.column_name,')') as indice
FROM information_schema.columns as a INNER JOIN  information_schema.tables as b
ON a.table_schema = b.table_schema and a.table_name = b.table_name
WHERE a.table_schema = 'nombre_basedatos' and a.column_name like ('%_id') and b.table_rows > 1000 and column_key = '';


nombre_basedatos: La base de datos donde queremos revisar.
%_id: El alias de los campos que se estan buscando.

Dudas?

Tips optimización 1 MySQL

Lo primero que hay que revisar cuando queremos hacer una consulta mas rápida, es el 
uso de indices. 

Tips para Optimización de Consultas:

- Usar el comando EXPLAIN <consulta>, regresa información con respecto a la consulta.
- id: Numero secuencial de la consulta
- select_type: Tipo de consulta, los cuales pueden ser:
- SIMPLE: Consulta simple, sin subquerys.
- PRIMARY: Similar a la consulta simple.
- UNION: Segunda o tercera consulta dentro de una union. 
- DEPEDENT UNION: Similar a UNION.
- UNION RESULT: Resultado de la UNION.
- SUBQUERY: Primer subconsulta 
- DEPENDENT SUBQUERY: Similar a subquery 
- DERIVED: Subconsulta en una clausula FROM.
- table: Tabla a la que hace refernecia los registros.
- type: Tipo de join.
- system: Solo tiene un registro
- const:  
- eq_ref: 
- refref_or_null: 
- index_merge: 
- unique_subquery: 
- index_subquery: Es similar al unique_subquery, remplaza las subconsultas en IN, pero trabaja sobre indices no unicos.
- range: Solo los registros que fueron solicitaos son los que se regresan.
- index: Similar al "ALL", por lo general es mas rápido que el de ALL ya que se basa en el scaneo del arbol del indice. 
- ALL: Escaneo completo de la tabla.

- Suponiendo que tenememos una consulta con comparaciones entre campos, ya sea en un inner join ON, ó where, es importante mantener el mismo tipo de campos y padding en ambos. varchar(10) vs varchar(15) no es bueno, varchar(10) vs char(10) si lo es.

- En la clausula WHERE:
- Remover los parentecis inecesarios.
- Las constantes con indices se evaluan solo una vez.
- Count(*) sin WHERE, es obtenido de la información del cabcesero de la tabla.
- Para cada tabla en un join, 
- Las tablas constantes son leidas antes que cualquier otra tabla; las tablas constantes son, tablas vacias o con un solo registro, 
tablas que son usadas en WHERE en una llave primaria o unica.
-  La mejor forma de