Actualizar bash para evitar ataques Shellshock

Cuando vi el titular dije: «Debe tratarse de IE o algo con Windows…» pero cuando leí el contenido: WTF!! bash metido en esto? no puede ser!!

Aún no hay una solución precisa que resuelva el problema pero por lo pronto debemos actualizar bash «rait nau». Para saber si tu sistema es vulnerable puedes ejecutar los siguientes comandos en consola:

Comando 1:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

Si el comando muestra `vulnerable` entonces tu sistema lo es.

Comando 2:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

Si el comando muestra una fecha, sigues siendo vulnerable.

Comando 3:

env -i X=' () { }; echo hello' bash -c 'date'

Si el comando anterior muestra `hello` sigues siendo vulnerable.

Como actualizar bash?

En Ubuntu/Debian: (solo para versiones LTS)

sudo apt-get update && sudo apt-get install --only-upgrade bash

En Centos/Redhat/Fedora:

sudo yum update bash

 

Esto hasta que publiquen una solución definitiva, sería buena idea realizar esas actualizaciones a diario hasta que la alerta roja desaparezca.

 

Tomado de: shellshocker

Consultas de referencias cruzadas en MySQL

Hace algún tiempo que uso Redmine para gestionar proyectos, la herramienta en general es buena pero a veces necesitaba de reportes diarios de tiempo utilizado por los miembros del proyecto.

En este punto se me ocurrió si podría lograr una consulta de referencias cruzadas (al estilo MS Excel), MySQL no soporta consultas de ese tipo pero pueden simularse:

1. Escribir la consulta principal que contenga las filas más importantes: project identifier, task subject y total_hours, todo en un rango de fechas.

select p.identifier, 
	e.issue_id, i.subject, round(sum(e.hours),2) as total_hours
	from redmine_nsp.time_entries e
	inner join redmine_nsp.issues i on e.issue_id = i.id
	inner join redmine_nsp.projects p on e.project_id = p.id
	where e.spent_on between '2014-07-01' and '2014-07-07'
 group by p.identifier,e.issue_id;

Resultado:

+------------+----------+----------------------------+-------------+
| identifier | issue_id | subject                    | total_hours |
+------------+----------+----------------------------+-------------+
| bg02       |     3223 | Gestion de proyecto        |        0.25 |
| bg04       |     3256 | 1.1 Preparación del entor  |        0.63 |
| emision    |     3251 | Desarrollar la aplicación  |        3.97 |
| nsp00      |     3236 | Preparar propuesta para G  |        2.02 |
| nsp02      |     3234 | Subida al servidor de pro  |        0.52 |
| nsp02      |     3240 | Agregar funcionalidad de   |        0.55 |
| nsp02      |     3241 | Revertir el Documento      |        2.80 |
| nsp02      |     3242 | Agregar Filtros en las vi  |        0.72 |
| nsp02      |     3243 | Reportes de Cargo de entr  |        2.35 |
| nsp02      |     3254 | Control de sesiones        |        3.23 |
| nsp05      |     3252 | Mantenimiento del servido  |        0.18 |
| nsp05      |     3253 | Mantenimiento a redmine    |        0.53 |
| nsp06      |     3203 | Elaborar el visualzador d  |        0.23 |
| nsp06      |     3228 | Evitar que se tome mas de  |        0.25 |
| nsp06      |     3255 | Actualizar el porcentaje   |        1.50 |
| nsp08      |     3239 | Asistencia remota          |        1.38 |
+------------+----------+----------------------------+-------------+

2. Ahora queda averiguar quienes han estado activos en ese mismo rango de tiempo:

select e.user_id, u.login
from redmine_nsp.time_entries e
	inner join redmine_nsp.users u on e.user_id = u.id 
where e.spent_on between '2014-07-01' and '2014-07-07'
group by e.user_id;
+---------+----------+
| user_id | login    |
+---------+----------+
|       1 | user1    |
|       4 | user2    |
|       5 | user3    |
|       6 | user4    |
+---------+----------+

3. La tarea es insertar ese resultado como columnas del primer resultado, de tal modo que tengamos una consulta de referencias cruzadas. He creado un procedimiento (no explico mucho al respecto) que hace esa tarea recibiendo como parámetros las fechas:

DELIMITER $$

CREATE PROCEDURE `get_range_summary`(dDate1 date,dDate2 date)
BEGIN

DECLARE done INT DEFAULT 0;
declare p_user_id int;
declare p_sql text;
declare p_login varchar(255);
declare c_users cursor for
	select e.user_id, u.login
	from redmine_nsp.time_entries e
		inner join redmine_nsp.users u on e.user_id = u.id 
	where e.spent_on between  dDate1 and dDate2 
	group by e.user_id;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

set p_sql = 'select s.codigo,s.issue_id,s.subject ';
open c_users;

read_loop: LOOP
	FETCH c_users INTO p_user_id, p_login;
    IF done THEN
      LEAVE read_loop;
    END IF;
	set p_sql = concat(p_sql,
      ', (select round(sum(t.hours),2) as total
		from redmine_nsp.time_entries t
		where t.spent_on between \'',dDate1,'\' and \'',dDate2,'\'  
        and t.issue_id = s.issue_id
		and t.user_id = ',p_user_id,') as `',p_login,'` ');

END LOOP;

set @sql = concat(p_sql,' ,s.total_hours from 
	(select p.identifier, e.issue_id, i.subject, 
         round(sum(e.hours),2) as total_hours
	from redmine_nsp.time_entries e
	inner join redmine_nsp.issues i on e.issue_id = i.id
	inner join redmine_nsp.projects p on e.project_id = p.id
	where e.spent_on between \'',dDate1,'\' and \'',dDate2,'\' group by p.identifier,e.issue_id) as s');


close c_users;

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1; 

END

Al probar con la llamada: call get_range_summary(‘2014-07-01′,’2014-07-07’):

+---------+----------+----------------------------+-------+--------+---------+----------+-------------+
| identif | issue_id | subject                    | user1 | user2  |  user3  |   user4  | total_hours |
+---------+----------+----------------------------+-------+--------+---------+----------+-------------+
| bg02    |       23 | Gestion de proyecto        |  NULL |   0.25 |    NULL |     NULL |        0.25 |
| bg04    |       56 | 1.1 Preparación del entor  |  NULL |   0.63 |    NULL |     NULL |        0.63 |
| emision |       51 | Desarrollar la aplicación  |  NULL |   NULL |    3.97 |     NULL |        3.97 |
| nsp00   |       36 | Preparar propuesta para G  |  NULL |   2.02 |    NULL |     NULL |        2.02 |
| nsp02   |       34 | Subida al servidor de pro  |  NULL |   0.52 |    NULL |     NULL |        0.52 |
| nsp02   |       40 | Agregar funcionalidad de   |  NULL |   NULL |    0.55 |     NULL |        0.55 |
| nsp02   |       41 | Revertir el Documento      |  1.40 |   NULL |    1.40 |     NULL |        2.80 |
| nsp02   |       42 | Agregar Filtros en las vi  |  NULL |   NULL |    0.72 |     NULL |        0.72 |
| nsp02   |       43 | Reportes de Cargo de entr  |  NULL |   NULL |    NULL |     2.35 |        2.35 |
| nsp02   |       54 | Control de sesiones        |  NULL |   NULL |    NULL |     3.23 |        3.23 |
| nsp05   |       52 | Mantenimiento del servidor |  NULL |   0.18 |    NULL |     NULL |        0.18 |
| nsp05   |       53 | Mantenimiento a redmine    |  NULL |   0.53 |    NULL |     NULL |        0.53 |
| nsp06   |        3 | Elaborar el visualzador de |  NULL |   0.23 |    NULL |     NULL |        0.23 |
| nsp06   |       28 | Evitar que se tome mas de  |  NULL |   0.25 |    NULL |     NULL |        0.25 |
| nsp06   |       55 | Actualizar el porcentaje d |  NULL |   1.50 |    NULL |     NULL |        1.50 |
| nsp08   |       39 | Asistencia remota          |  NULL |   1.38 |    NULL |     NULL |        1.38 |
+---------+----------+----------------------------+-------+--------+---------+----------+-------------+

Es todo! Luego con ese resultado es fácil crear un pequeño reporte diario/semanal sobre las horas utilizadas por cada usuario.

MySQL Vista global de las bases de datos

Cansado de tener que averiguar manualmente  cuanto espacio ocupan mis bases de datos, acabo de crear un procedimiento almacenado para tener una vista global de las bases de datos que tenemos en nuestro servidor MySQL.

En MySQL no hay disponible  un comando que nos permita tener una resumen global de las bases de datos, algo que se parezca a SHOW TABLE STATUS pero para todas las bases de datos. El comando SHOW DATABASES sólo lista las bases actuales pero no nos dice cuanto espacio ocupan o cuantas tablas hay, etc.

El procedimiento que escribí esta basado en la base de datos INFORMATION_SCHEMA, que contiene mucha información de todas las bases de datos existentes.

Ya antes en un post anterior mencioné que podemos tener todas estas «herramientas» en una base de datos llamada tools, es por eso que recomiendo que éste procedimiento este en la misma base de datos tools (pero de todos modos puedes elegir otro lugar)

Al llamar al procedimiento si tenemos una vista global con información que nos será de utilidad para tas tareas de mantenimiento.

 

mysql> call tools.sp_overview();
+------------------------------+---------+--------+----------+---------+
| Database                     | Charset | Tables | Routines | Size Mb |
+------------------------------+---------+--------+----------+---------+
| database1                    | utf8    |     43 |       28 |     7.0 |
| database2                    | latin1  |     43 |       28 |   205.0 |
| database3                    | utf8    |    116 |        0 |   126.2 |
| database4                    | utf8    |     99 |        0 |     0.3 |
| database5                    | utf8    |    165 |        0 |    77.4 |
| database6                    | utf8    |    121 |        2 |   719.4 |
| database7                    | utf8    |    122 |        0 |    91.3 |
| database8                    | utf8    |    116 |        0 |    89.7 |
| database9                    | utf8    |    124 |        0 |     4.5 |
| database10                   | utf8    |    113 |        0 |   147.7 |
| database11                   | latin1  |    119 |        3 |   436.4 |
| database12                   | latin1  |    122 |        0 |   439.1 |
| database13                   | latin1  |    122 |        4 |   452.7 |
| database14                   | utf8    |    115 |        0 |   273.0 |
| database15                   | utf8    |    122 |        0 |   265.5 |
| database16                   | utf8    |      0 |        0 |    NULL |
| database17                   | latin1  |     26 |        0 |     0.9 |
| database18                   | latin1  |      9 |        0 |     0.0 |
| database19                   | latin1  |     22 |        0 |     0.3 |
+------------------------------+---------+--------+----------+---------+
19 rows in set (3.01 sec)

 

Advierto que la primera vez el procedimiento es muy lento, y puede demorar varios segundos.

Aquí tienen El código fuente del procedimiento:

 

DELIMITER $$

DROP PROCEDURE IF EXISTS tools.sp_overview$$
CREATE PROCEDURE tools.sp_overview()
BEGIN

    SELECT s.SCHEMA_NAME as `Database`, s.DEFAULT_CHARACTER_SET_NAME as `Charset`,
        count(t.TABLE_NAME) as `Tables`,

        (SELECT count(*) from information_schema.ROUTINES as r
            WHERE r.routine_schema = s.SCHEMA_NAME) as `Routines`,

         round(sum(t.DATA_LENGTH + t.INDEX_LENGTH) / 1048576 ,1) as `Size Mb`

        FROM information_schema.SCHEMATA AS s
            LEFT JOIN information_schema.TABLES t on s.schema_name = t.table_schema
        WHERE s.SCHEMA_NAME not in ('information_schema', 'performance_schema')

    GROUP BY s.SCHEMA_NAME;
END$$
DELIMITER ;

Instalar bmon como servicio

bmon es una herramienta para monitorear el estado de red actual, es muy útil para saber que cantidad del ancho de banda esta siendo utilizado en ese momento.

Lo mas útil es que guarda (en memoria solamente) información histórica de los últimos 60 segundos, minutos,horas y dias; el único problema es que es necesario que este corriendo todo el tiempo.

 

En un escenario en el que un servidor Linux es usado como proxy para una red (basicamente) Windows nos será de utilidad acceder a esa información en tiempo real desde cualquier parte de la red.

Para ello podemos dejar ejecutando bmon en una sesión cargada con screen al mismo tiempo configuramos bmon para que genere salida HTML cada segundo la cual leeremos desde Apache.

Pasos para instalar y ejecutar:

  1. Instalar screen y bmonsudo apt-get install screen bmon
  2. Crear el directorio /var/www/bmon-html
  3. Crear el archivo /etc/init/bmon.conf  con el siguiente contenido
    description "bmon bandwidth monitoring process"
    
    start on (local-filesystems and net-device-up and runlevel [2345])
    stop on runlevel [016]
    
    exec screen -d -m -S bmon bmon -O html:path=/var/www/bmon-html
  4. Iniciar el servicio:sudo service bmon start
  5. Luego estará disponible la pagina  http://localhost/bmon-html/ , y estará actualizada constantemente.

Enjoy!

 

Lo que no me gusta de Linux Mint 12

Linux Mint se esta afianzando como la distribución, basada en Ubuntu, mas interesante en lo que a interfaz gráfica de usuario se refiere, me imagino que la a la mayoría no le agradó la idea de usar Unity en primer momento.

Con Linux Mint 12 inicialmente tenemos una interfaz con Gnome3 que da la sensación de «menta fresca», que es muy amigable pero algunas de sus características no me han gustado tanto:

  1. El administrador de conexiones de red no permite mas de un perfil. Es cierto, cuando uno lleva su maquina a muchos lugares con conexiones diferentes, es muy útil tener perfiles de conexión individuales de tal modo que no tengamos que ir cambiando los números de IP, DNS, etc., cada vez! al igual que Windows, llega a ser fastidioso.  Puedes utilizar algunos aditamentos/scripts que te ayuden pero no hay la misma comodidad.
  2. Las conexiones de red adicionales no conectan automáticamente. No hay como disfrutar de conectar y usar (plug and play) con las conexiones nuevas (como 3G), Linux Mint 12 necesita que uno active manualmente la red para poder utilizarla, igualmente hay que tomar un tiempo configurando para que sea automático.
  3. El indicador de fecha/hora disminuye su tamaño cuando hay muchos iconos en la barra superior. Mas de una vez eso me causó problemas, mas aun cuando eres conocido como «el rey de la puntualidad».
  4. La tecla Super (Windows) no esta muy bien controlada cuando uno tiene instalado Windows en VirtualBox. Muchos accesos directos de Windows combinan la tecla [Windows] evitando que tengamos que estirar la mano hasta el Mouse, ya se imaginarán usar Windows sin la funcionalidad de la tecla con su nombre.
  5. Las notificaciones visuales cumplen su objetivo pero llegan a ser un fastidio, por que es necesario acercar el Mouse y cerrar la notificación, a menos que nos guste ver el mensaje durante varios minutos.
  6. No es posible situar ventanas en la parte superior sin que éstas se maximicen. Es una característica genial que con solo acercar una ventana a la barra superior ésta se maximice como por arte de magia, pero en Linux Mint 12 necesitan ajustar los parámetros para que no ocurra siempre. Por ejemplo para mover a la parte superior la ventana principal de Skype o Pigdin tenemos que hacer malabares para evitar que se maximicen automáticamente.
  7. Ya no puedo usar Negative de Compiz. Hay otros efectos que se ven geniales, pero Negative me ayuda a bajar la intensidad de brillo de mi laptop cuando estoy en ambientes con poca luminosidad.
  8. Ya no esta disponible las divertidas Fortunes. Con Linux Mint 11 teníamos configurado por defecto Fortunes, era divertido abrir una terminal, no es difícil de configurar pero debieron mantener esa característica.
  9. Hay mas, pero no creo que sea necesario mencionar el resto de los detalles incómodos que encontré.

A pesar de las cuestiones mencionadas, Linux Mint 12 sirve para hacer lo que necesites (como cualquier distribución) pero todas muchas de esas características son configurables y podemos hacer que trabajen como nosotros queremos, pero toma un tiempo y la verdad no me interesa hacer eso cuando hay tareas mas importantes y sobre todo si eres un usuario gruñón.

Creo que la balanza se inclina mas al «No me gusta», regresaré a Ubuntu y veré como madura Linux Mint con mucha atención.

Enlaces:

 

Readers’ Choice Awards 2011

Y salieron los premios anuales de la revista Linux Journal, me topé con algunas sorpresas y otras no tanto, y puedo resaltar los ganadores de algunas categorías que me interesan:

  • Mejor distribución de Linux: Ubuntu (faltaba mas)
  • Mejor entorno de escritorio: Gnome 3 (de verdad no esta tan mal)
  • Mejor navegador: Firefox  :/
  • Mejor gestor de base de datos: MySQL (seguido muy de cerca por PostgreSQL)
  • Mejor lenguaje de programación: Python? (creo que es hora de empezar con «esa nota»)
  • Mejor juego: World of Goo (creo que vale la pena las 20 fichas que cuesta)

La lista es larga, son 45 categorías, les sugiero que le hechen un vistazo:

http://www.linuxjournal.com/slideshow/readers-choice-2011

 

Y pronto (abril 2012) Percona Live: MySQL Conference And Expo 2012

Pueden ver y descargar las conferencias del evento 2011 ahi mismo!

 

Eliminar numeros de linea con Vim

¿Quién no ha buscado código fuente en la red? Algunos sitios comparten segmentos de codigo fuente incluyendo el numero de línea, sé que lo hacen intencionalmente por que disfruntan sabiendo que debemos darnos el trabajo de eliminar las numeraciones de linea para poder compilar el codigo brindado, ademas de fijarnos en otros detalles.

Aqui una muestra clásica de un copy paste desde una pagina web hacia Vim (u otro editor):

Codigo fuente con numeros de linea

Para un segmento de codigo de unas cuantas lineas no hay ningun problema, pero si se tratan de cientos de lineas, nos tomaría varios minutos… me da pereza de solo pensarlo.

Solucion rápida: Vim nos ofrece una manera facil de reemplazar texto usando expresiones regulares. Para este caso es muy fácil armar una expresión que reconozca:

  1. Espacios en blanco al inicio ^\s*
  2. Al menos un digito (numero de línea) [0-9]\+
  3. Unos espacios mas, 0 ó 3 espacios. \s\{0,3}

La expresión regular quedaría así: ^\s*[0-9]\+\s\{0,3}, luego aplicamos la busqueda y reemplazo en todo el documento con el siguiente comando: 
:%s/^\s*[0-9]\+\s\{0,3}//g

el resultado es el siguiente:

VIM: Despues de aplicar el reemplazo grep

Las expresiones regulares son mucho mas poderosas, este es sólo un caso trivial que nos hace ganar un poco mas de tiempo.

Probando UDFs para MySQL: Title Case

Conocemos «de sobra» lo que hacen las funciones LCASE y UCASE en MySQL, otros gestores también la implementan con alguna variación en el nombre pero con el mismo resultado.

Pero que pasa si queremos una función que convierta un texto al tipo Titulo, conocido también como title case, es decir convertir «un texto arbitrario» en «Un Texto Arbitrario«, para este caso no existe la función mágica que haga esa conversión y tenemos que escribir una propia.

No es necesario «reinventar la rueda» (aunque podría hacerlo), buscando encontré un repositorio de funciones UDF para MySQL: http://www.mysqludf.org/ , hay varias funciones agrupadas según el objetivo/funcionalidad, solo tienen que descargar el código fuente, compilarlo y agregarlo como funciones nuevas en vuestros servidores MySQL.

He aislado la función str_ucwords (que convierte un texto a «Title Case») en un archivo separado para mostrarles como es que podemos compilar una UDF para MySQL.Pero he modificado el archivo por que solo funcionaba con parámetros constantes, ahora la función acepta nombres de columnas como parámetros.

Pueden descargar el archivo fuente: ucwords.c

Para compilarlo necesitan unas tres instrucciones:

#Compilamos el programa
ivancp@ubuntu$ gcc ucwords.c -o ucwords.so -shared -lmysqlclient -I/usr/include/mysql

#Copiamos el archivo de salida en la carpeta de plugins de mysql
ivancp@ubuntu$ sudo cp ucwords.so /usr/lib/mysql/plugin

#Quitamos el permiso de ejecución del archivo
#para que pueda cargarlo correctamente
ivancp@ubuntu$ sudo chmod -x  /usr/lib/mysql/plugin/ucwords.so

 

  • La opción -shared compila el archivo para que pueda ser usado como librería.
  • La descripción del resto de parámetros van a encontrarla en la entrada: Leer datos de MySQL desde C

Ahora debemos agregar la función a MySQL:

mysql> create function str_ucwords returns string soname 'ucwords.so';
Query OK, 0 rows affected (0.00 sec)

mysql>

 

Ahora veamos algunas pruebas, esta es una consulta común (los datos están almacenados en mayúsculas o Upper Case):

mysql>select nombres from tabla;
+----------------------------------+
| nombres                          |
+----------------------------------+
| AGUILAR PALACIOS RICARDO         |
| ANDIA MARQUEZ LUIS MELITON       |
| CUYUBAMBA RAMOS VICTOR ALEJANDRO |
| FELICIANO VELAZCO VICTORIA       |
| FLORIDA EVANGELISTA LILA REYNA   |
| LEON LAULATE FERNANDO            |
| PALACIOS LOPEZ ROXANA BEATRIZ    |
| REATEGUI RAMIREZ CARLOS          |
| REINOSO MORI JORGE WILLY         |
| SALAZAR VALDIVIA WALTER          |
| SANCHEZ TUTUSIMA CARMEN ROSA     |
| VELAZCO BERROA PETRONA           |
+----------------------------------+
12 rows in set (0.00 sec)

 

Aquí esta lo que queremos ver, la consulta primero convierte a minúsculas todo el campo y luego convierte éste resultado a Title Case, vean:

mysql>select str_ucwords(lcase(nombres)) from tabla;
+----------------------------------+
| str_ucwords(lcase(nombres))      |
+----------------------------------+
| Aguilar Palacios Ricardo         |
| Andia Marquez Luis Meliton       |
| Cuyubamba Ramos Victor Alejandro |
| Feliciano Velazco Victoria       |
| Florida Evangelista Lila Reyna   |
| Leon Laulate Fernando            |
| Palacios Lopez Roxana Beatriz    |
| Reategui Ramirez Carlos          |
| Reinoso Mori Jorge Willy         |
| Salazar Valdivia Walter          |
| Sanchez Tutusima Carmen Rosa     |
| Velazco Berroa Petrona           |
+----------------------------------+
12 rows in set (0.00 sec)

 

Funciona a la perfección!

Por favor revisen la documentación, en otro post explicaré que deben tener en cuenta para elaborar sus propios UDF:

http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html

Mis bugs reportados de MySQL-Workbench

Hace algunos meses, mientras usaba MySQL Workbench 3.2.33, noté varios bugs los cuales reporté inmediatamente, Oracle ya publicó la versión 3.2.35 y está apunto de publicar la versión 3.2.36, no había recibido noticias acerca de mis reportes.

Siempre es bueno colaborar a la mejora de herramientas libres, en este caso me dí cuenta de algunos detalles, incluso algunos de ellos pasarían desapercibidos. Pasado el tiempo ya, quise saber sobre mis bugs reportados y resulta que todos ya habían sido resueltos, y éstos son:

60354    Workbench can’t open a stored procedure
60557    Workbench closes without ask to save modified file
60562    The action pane won’t checks the selected database.
60576    Workbench adds a extra quote
60610    Don’t assign a correct tab name when open a sql script

Son solamente 5 de cientos de reportes, el equipo que desarrolla MySQL Workbench se encarga de ir resolviendo de a pocos los bugs y van soltando las versiones según les parezca, llegará el día en que los bugs sean solamente unos cuantos por versión, ese día Workbench habrá madurado y será mucho mas estable que hasta ahora.

Cualquiera puede reportar un bug, solo debes ir a la pagina de bugs: http://bugs.mysql.com/report.php detallar lo mejor posible las condiciones donde se genera el «horror». Puede que sea necesario buscar un error similar ya reportado.

Activar el motor FEDERATED en MySQL

El motor FEDERATED de MySQL, aunque no es muy versátil, puede resultar útil, por ejemplo, para conectarnos directamente a una tabla en otro servidor MySQL sin necesidad de un intermediario, como un script PHP que copie/verifique/vea datos de otro servidor.

El motor FEDERATED no esta habilitado por defecto en instalaciones estándares sobre Linux, no hay que compilar nada, solo agregarle el parametro --federated en el archivo /etc/init/mysql.conf:

#Busquen esta linea en el archivo /etc/init/mysql.conf
exec /usr/sbin/mysqld --federated

Luego de reiniciar el servicio mysql, verán los resultados:

ivancp@ubuntu$ sudo service mysql restart

 

Para ver que motores están disponibles ejecuten SHOW ENGINES en la linea de comando MySQL:

mysql> show engines;
+------------+---------+-----------+--------------+------+------------+
| Engine     | Support | Comment   | Transactions | XA   | Savepoints |
+------------+---------+-----------+--------------+------+------------+
| InnoDB     | YES     | Supports t| YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection| NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null | NO           | NO   | NO         |
| CSV        | YES     | CSV storag| NO           | NO   | NO         |
| MEMORY     | YES     | Hash based| NO           | NO   | NO         |
| FEDERATED  | YES     | Federated | NO           | MO   | NO         |
| ARCHIVE    | YES     | Archive st| NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default en| NO           | NO   | NO         |
+------------+---------+-----------+--------------+------+------------+
8 rows in set (0.00 sec)

 

Para conectarnos a una tabla remota y consultar que datos contiene, tenemos que crear la tabla, debe ser muy similar a la tabla remota, pueden ayudarse con el comando SHOW CREATE TABLE para ahorrar tiempo y agregar el parámetro CONNECTION al final.

-- Tabla con conexion a una base de datos remota
CREATE TABLE tabla_remota
(
    id     INT NOT NULL AUTO_INCREMENT,
    campo1  VARCHAR(32),
    campo2  INT,
    PRIMARY KEY  (id),
    INDEX campo1 (campo1)
)
ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://usuario:contraseña@1952.168.6.5/base_datos/tabla';

 

Recomendaciones:

  • El único problema es que la consulta puede demorar un poco mas de lo debido, así es que traten de no hacer consultas cuyos resultados sean realmente grandes.
  • Es una pena que aun no esté disponible la posibilidad de conectarse a otros gestores de datos como PostgreSQL o SQL Server, eso sí que sería útil.
  • Deben crear un usuario sin contraseña en la base de datos de destino, para evitar poner la contraseña en la conexión, ya que es fácil de averiguar (con SHOW CREATE TABLE).
  • Las conexiones son permitidas incluso hacia servidores MySQL mas antiguos.
  • Leer la documentación para mas detalles:
    http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
  • Pueden ayudarse con un Stored Procedure para crear estas tablas FEDERATED.

Espero les sirva.