martes, 2 de diciembre de 2014

Extraer una tabla de un respaldo.

Para no tener que levantar todo el respaldo de una base de datos para solo extraer una tabla, hice el siguiente script:

   #! /bin/bash

   if test -z "$1"
   then
       echo First parameter will be "table"
       exit
   else
       TABLE=$1
   fi
  
  echo Table name: $1.
  echo File in to search: $2.
  echo File out: $3.
  sed -n -e '/CREATE TABLE.*'$TABLE'/,/CREATE TABLE/p' $2 > $3.dump
  echo Need to edit file $3.dump
  echo and extract just what you need.
  echo Lucky

 Se manda de parámetro el nombre de la tabla, el archivo del .dump y el nombre del archivo de salida.

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 

lunes, 13 de octubre de 2014

Comandos que JAMAS debes ejecutar Linuxs.

Comandos que jamas debes ejecutar en un ambiente #Linuxs.

Algunos comandos, unos comunes, que no deberías de ejecutar nunca, al menos que seas sumamente consciente de lo que estas haciendo, y aun así tampoco es buena idea.

"rm -rf /"
Al menos que quieras hacer una maldad, con este comando borrar todo recursivo y desde la raíz, si lo corres con un usuario con derechos, te podrás despedir de tu S.O.

"mv ~/dev/null"
Mover todo a ningún lugar, lo perderías todo.

"mkfs.ext3 /dev/sda"

Formatear el disco completo a una partición ext3:

"any-command > /dev/sda"

Enviar un comando a la salida del disco, perderías tu información.


lunes, 26 de mayo de 2014

Querys curiosos para MySQL

Manera de calcular el tamaño de cierta tabla, junto con eso, cantidad de registros, y el tamaño de los datos, del indice.

SELECT table_name, table_rows, data_length, index_length,
round(((data_length + index_length) / 1024 / 1024),2) "Size in MB",
(round(((data_length + index_length) / 1024 / 1024),2) / (SELECT COUNT(id) FROM nombre_basedatos.nombre_tabla)) as "Avg Row", (SELECT COUNT(id) FROM cbt.asociado) as rows FROM information_schema.TABLES WHERE table_schema = "nombre_basedatos"
and table_name = 'nombre_tabla';


Ver los derechos que tienen los usuarios sobre cierta base de datos:

SELECT grantee, privilege_type, is_grantable
  FROM information_schema.schema_privileges
  WHERE table_schema = 'nombre_basedatos';


Directorio en el que se encuentra nuestra base de datos:
SELECT @@basedir AS 'Directorio base';

Directorio donde se encuentran los datos.
SELECT @@datadir AS 'Directorio datos';

martes, 13 de mayo de 2014

Instalar mongodb

Comenzando con mongodb...

Instalación mongodb.

Descargar la versión de mongodb AQUI.

El archivo que se desempaque, lo hara por lo general a Donwload.

Lo desempacamos:

tar xvf ~/Downloads/mongodb-osx-x86_64-2.6.1.tar.gz

Entramos a la carpeta:
cd mongodb-osx-x86_64-2.6.1/

y listamos lo que se desempaco:
ls -lh

Entre muchas otras cosas, veremos 2 carpetas
mongo -> que es donde se encuentran los comandos ó shells
mongod -> que es donde esta el proceso del servicio del mongo

Nos cambiamos a usuario root (ó admin) y creamos la carpeta 
donde contendremos la base de datos y le otorgamos derechos

mkdir -p/data/db
cbmod 777 /data/db

Nos regresamos a nuestro usuario mortal e iniciaremos el servicio
./mongod

Aquí se finaliza la instalación de mongo, podemos hacer una prueba,
de que nuestro servicio esta levantado...

cd ~/Downloads/mongodb-osx-x86_64-2.6.1/bin/

./mongo

miércoles, 7 de mayo de 2014

Sublime 2.# Plugins


Package Control de Sublime Text 2

Hace un tiempo ya les había platicado sobre el editor (y mas que eso), Sublime Text 2, ahora les traigo un paquete que contiene y que no viene por defecto, Package Control, recomendadisimo..!!

Este es un controlador de paquetes (algo obvio el nombre), con el cual podremos instalar diferentes plugins para otorgarle diferentes utilidades y ayudas a los usuarios al manejar Sublime Text 2... es importante también caso contrario, no cargar de tantos plugins, ya que esto puede ocasionar lentitud, sin embargo hay unos plugins muy útiles.

Instalación de Package Control


  1. Abrimos Sublime Text 2 
  2. View > Show Console
  3. En la caja que aparesera, pegar el siguiente codigo: import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation' 
  4. Al final nos pedirá reiniciar Sublime Text.
  5. Una vez reiniciado, veremos en, Preferencias > Package Control.

Para instalar plugins, apartir de aquí, lo podremos hcaer con los comandos Shift + Ctrl + P. Aparecera una caja de texto donde escribiremos "Install Package", presionamos Enter, despues nos aparecera una lista para seleccionar elpaquete que nos interesa.


Algunos recomendados por mi son:
Aligment
FileDiffs
Git

Saludos, y disculpen si tardo en postear, pero a ratos ando por estos lados.



viernes, 21 de marzo de 2014

Actualizar #consecutivo a tabla #MySQL


Para actualizar un consecutivo,

Sin necesidad de realizar un ciclo, podemos actualizar un campo dado, comenzando con su maximo valor y que de ahi continue en consecutivo:

Creamos la tabla

CREATE TABLE tabla_prueba (id integer(4), valor varchar(40));

Insertamos registros a la tabla:
INSERT INTO tabla_prueba (id, valor) values(1,'valor1'),(2,'valor2'),(3,'valor3'),
       (0,'valor4'),(0,'valor5'),(0,'valor5');

Insertamos 3 registros con valor 0 en el campo id.

Actualizaremos esos registros que quedaron en 0, con un consecutivo.

UPDATE tabla_prueba as a, (SELECT @numeroConsecutivo:= (SELECT max(id) FROM tabla_prueba)) as tabla
SET a.id=@numeroConsecutivo:=@numeroConsecutivo+1 WHERE a.id = 0;


Cabe mencionar y como podrán observar que solo seleccione los campos con id = 0 para que se notara, si no, hubiera actualizado todos los registros con consecutivo a partir del 3, ya que era el máximo en su momento.

martes, 25 de febrero de 2014

Ejecutar sublime por consola (MAC)

Por comodidad y si a alguien le es de utilidad...

Desde la consola de MAC, se puede ejecutar Sublimetext esto por una linea de comandos muy sencilla:

subl file_name
Les dejo el link, para que sigan los pasos a seguir para poder realizarlo.. recuerden que una hora de planeación puede ahorrar hasta 5 horas de trabajo.

Sublimetext MAC (OSX)

Saludos a  todos, que tengan excelente día.

Comparar archivos #Linux

Para comparar 2 archivos desde Linuxs o Unix, existe un comando que probablemente ya conozcan, Diff.

La sintaxis es tan sencilla como:

diff archivo1 archivo2 > salida.txt

Pero si queremos hacer la comparación entre archivos de diferentes servidores, sin la necesidad de tener que copiar el archivo a uno u otro servidor:


ssh user@hostserver "cat ~/public_html/index.php" | diff - ~/public_html/index.php > diff.txt

Donde compara el archivo index.php del servidor al que hacemos referencia con el "hostserver", obviamente tendremos que tener acceso al servidor donde se encuentra el archivo foráneo.

Query por consola a Base de Datos

Para ejecutar una consulta que extraiga información de una base de datos(#database) por consola, el resultado mandarlo a un archivo de salida:


En este ejemplo, vamos a obtener la url de una imagen, y concatenando otros string, vamos a generar una salida como "cp /home/user/imagen.pjg /home/user/imagenes/", esto dentro de un archivo llamado, salida.sql

echo "SELECT  concat('cp ', url, '/', file, ' ', url, 'imagenes/'  FROM table_imagenes WHERE LEFT(file,2)='p_';" | mysql -A database_name > salida.sql

La sintaxis seria:

 echo "SELECT  campo  FROM table_name;" | mysql -A database_name > output.sql

viernes, 3 de enero de 2014

Keychain, certificado para conectarse de manera segurda por SSH


Para activar el certificado de seguridad por ssh y conectarse de manera mas sencilla y segura
desde nuestra maquina con ubuntus o derivado de linuxs, instalamos el programa #keychain:

Para Ubuntus y Debian (desde consola):

 sudo apt-get update && apt-get install keychain

Luego ejecutamos el comando, ya sea para cada uno de los tipos de certificados que
queremos usar:

$ ssh-keygen -t rsa

o

$ ssh-keygen -t dsa

Este nos va a pedir el nombre del archivo que se va a generar, yo por lo general le pongo
id_rsa_host

y nos pedire despues una frase que es la que no debemos olvidar, que sera la cual nos pedire
en vez de la contraseña.

Nos va a generar 2 archivos en el
$HOME/.ssh/id_rsa_host.pub  y $HOME/.ssh/id_rsa_host

El archivo que tiene extensión .pub (id_rsa_host.pub) y lo copiamos al servidor el archivo.
Despues tendremos que concatenar la información de dicho archivo al archivo authorized_keys
que ya existe en el servidor:

 cat ~/.ssh/id_rsa_host.pub >> ~/.ssh/authorized_keys


 Espero haberme explicado, de cualquier modo, pueden preguntar y tratare de resolverles,

 Saludos.