Entries Tagged 'MySQL' ↓

Oracle compra a Sun: ¿Qué pasará con MySQL?

Después de mucho tiempo tengo que comentar un acontecimiento muy estremecedor: Oracle, la mayor compañía que provee software de bases de datos, se compró a Sun Microsystems. Y como sabemos Sun hace algún tiempo compró MySQL que es una amenaza a Oracle por que MySQL es el gestor de base de datos mas utilizado en el mundo (claro que no tiene las mismas prestaciones).

Los que conocen la base de datos Oracle saben que Java esta presente en todas partes, y creo que ahora estará mucho mas. ¿Pero que pasará con MySQL?

No quiero ser muy desalentador pero dentro de muy poco veremos artículos relacionados a “Consejos para migrar una base de datos MySQL a Oracle” o peor aun titulares como “Oracle decide dejar de lado a MySQL”.

Hoy, el día de mi cumpleaños, se ensombreció con esta noticia ya que soy seguidor de MySQL casi desde sus inicios, lo he visto mejorar y crecer como base de datos hasta ser lo que es ahora: un gestor de base de datos respetable.

Debo decir finalmente que no estoy seguro de lo que va a suceder en los próximos días, pero creo que serán los últimos días del soporte de MySQL, la comunidad de software libre tendrá que reunir sus mejores elementos para que este proyecto siga.

Fuente de la noticia:
http://www.sun.com/third-party/global/oracle/index.jsp

Poniendo a prueba MySQL

MySQL
Hace unas semanas tengo planeado volcar algo de 13 millones de registros en mi servisor MySQL que corre sobre Fedora 3 con 1Gb de memoria.

Es imposible que se presenten problemas al momento de efectuar la prueba por que heché un vistazo a los casos de estudio que publica MySQL, solo tendré que cambiar ligeramente la configuracion y con el dolor de mi corazon reiniciar el servidor MySQL.

MySQL - Case Studies
http://www.mysql.com/why-mysql/case-studies/

La cantidad de datos y la infraestructura con la que trabajan estas empresas no se comparan con lo que tengo aqui, pero veremos que pasa. La siguiente semana les comentaré como me fué.

Maldita sea…!

Un sabor amargo me queda despues de hoy!

Sucede que estamos en medio de la implantación de un pequeño software en la Municipalidad de Puno y hace algunas horas nos dimos con la sorpresa que el tipo de dato time_t incrustado en la clase CTime solo soporta fechas desde 01/01/1970 al 31/12/2039… maldita sea!

Tendremos que trabajar algunas horas extra solucionando ese “problemita”.

Se había tomado la decisión de guardar las fechas en segundos para poder hacer mejor los cálculos posteriormente, creo que eso no va a cambiar. Pero se trabajo de igual manera con el resto de campos de tipo fecha. (craso error)

El problema saltó cuando se intentó registrar a alguien que había nacido en el año 1949: ¡Horror!

¿Por que no nos dimos cuenta? Aun que el problema pueda ser solucionado con unas cuantas líneas de código y previa modificación del modelo de la base de datos, ¿Por qué no pensaron en esto? (Esto se parece al problema de la memoria base de 256K) Creo que echarle la culpa a otros es de malos amigos, así es que dejémoslo ahí.

De ahora en adelante, utilizaremos la clase COleDatetime que evitarán sorpresas futuras y post’s como éste.

PD. Hay que estar preparados para el año 2039.

Problema solucionado ODBC Connector

MySQL Generalmente me conecto a MySQL con ayuda del controlador ODBC que provee el mismo MySQL. Como sabemos todo MySQL esta en pledo desarrollo, ocurre que se presentan situaciones que no fueron contempladas, por consiguiente hay errores que perjudican el desarrollo haciendo que uno tome precausiones antes de utilizar un codigo especifico. Muchos hemos crecido con MySQL y creo que si no hubiera sido asi lo hubieramos desechado por detalles como este que les voy a mostrar a continuacion.

Para no darle mas vueltas al asunto concretamente el problema es como sigue:

Cuando se intentaba leer un campo varchar (o relacionado) que este vacio o NULL, el controlador ODBC lo reconocía como UNKNOWN, evidentemente no podía realizarse el paso de valores al tipo CString o char* del Visual C++.

Para evitar ese problema se tenía que averiguar la longitud del campo que se va a leer, algo asi como esto:

ULONG len = 0;
rs.GetAccessor()->GetLength(2,&len); // segundo campo
if(len > 0)
{
	rs.GetFieldValue(2,sValue);
	//...
}

Esto sucedia con las versiones del ODBC Connetor inferiores a la 3.51.12. Ahora el codigo anterior se reduce a la linea que lee el campo y hace el paso del valor a la variable.

Leer datos MySQL desde C++ sobre Linux

Tux Programming Resulta que algunas veces es necesario acceder desde C++ a MySQL, razones hay muchas…. el asunto es como hacerlo.

Esta mañana intenté hacer una conexion sobre Fedora Core 3 con C++, tengo instalado MySQL 5.0.17, y mysql-devel 5.0.18 ( Todo eso lo pueden descargar de http://dev.mysql.com )

El codigo no es gran cosa, pero puede servir a muchos.

Enjoy!

//conexion.cpp

#include <iostream.h>
#include <mysql.h>

int main()
{
    MYSQL mysql;

    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql
		,"localhost"
		,"root"
		,""
		,"munipuno",0,NULL,0))
    {
        cerr<<"Horror ! : "
			<<mysql_error(&mysql));
    }
    char *query = "select * from maestro_departamentos";

    mysql_real_query(&mysql,query,strlen(query));
    MYSQL_RES *res = mysql_store_result(&mysql);
    MYSQL_ROW row;

    while ((row = mysql_fetch_row(res)))
    {
            cout << row[0] << ” ” << row[1] << endl;
    }

    mysql_close(&mysql);
    return 0;
}

Parametros gcc para compilar este programa.

gcc conexion.cpp -o conexion -Wno-deprecated
           -I/usr/include/mysql -L/usr/lib/mysql
           -lmysqlclient -lstdc++ -lz

El resultado de este programa es el siguiente:

[ivancp@servidor1 cpp]# ./conexion
01 AMAZONAS
02 ANCASH
03 APURIMAC
04 AREQUIPA
05 AYACUCHO
06 CAJAMARCA
07 CALLAO
08 CUSCO
09 HUANCAVELICA
10 HUANUCO
11 ICA
12 JUNIN
13 LA LIBERTAD
14 LAMBAYEQUE
15 LIMA
16 LORETO
17 MADRE DE DIOS
18 MOQUEGUA
19 PASCO
20 PIURA
21 PUNO
22 SAN MARTIN
23 TACNA
24 TUMBES
25 UCAYALI

MySQL Backups con crond

MySQL Muchos prefieren hacer backups de su valiosa data en formatos predefinidos por el gestor (.backup, .dbf, etc…) por mi parte prefiero el formato SQL guardado en un archivo de texto.

MySQL no tiene un formato SQL tan migrable que digamos (eso se puede arreglar), pero es muy util hacer mysqldump de vez en cuando.

Si lo que uno quieres es liberarse de la tarea de estar haciendo backups diarios o semanales (segun la paranoya de cada uno) puede utilizar anacron.

El comando para sacar una copia de la base de datos:

mysqldump -u backup munipuno > /... /munipunobackup.sql

Para que el comando de copia de seguridad se ejecute cada dia a eso de las 11.pm agregamos esta linea a la configuracion de nuestro anacron

0 23 * * * mysqldump -u backup munipuno > /var/log/backups/munipunobackup.sql

Para sacar una copia de toda la base de datos

mysqldump -u backup --all-databases > /var/log/backups/mysqlbackup.sql

Le pueden agregar el parametro –password=”clave” al comando por si se necesita. Lo unico malo es que no tendremos copias historias, solo un archivo: munipunobackup.sql Eso se puede arreglar con SH, pero luego.

InnoBase y Oracle

Hoy me llevé una tremenda sorpresa al ver el logo de Oracle
en la pagina de InnoBase Oy:

InnoBase

Averiguando por la red me enteré que Oracle, una de las empresas de produccción de software de base de datos mas grande de la tierra, se habia comprado la compañía que produce el motor de almacenamiento InnoDB que hoy en dia es una parte fundamental de MySQL.

Esto hace pensar que Oracle esta viendo a MySQL como un serio competidor, pero por otro lado Oracle apoya el desarrollo de software libre, eso es evidente por que se instala con Apache y tambien hay versiones para Linux.

Entontre un comentario en MySQL-Hispano.com con casi las mismas preguntas que se me vino a la mente cuando me enteré de esto. http://www.mysql-hispano.org/index.php?m=read&id=397

En la pagina de Oracle anuncia la bienvenida de Innobase, indicando que seguirá apoyando el software libre, tambien indica que se espera renovar los vinculos con MySQL el proximo año.

http://www.oracle.com/innodb/index.html

Finalmente, esperemos que MySQL no deje de crecer y que Oracle no se lo “trague”.

MySQL 5 Paso la prueba

MySQL Hace unos dias que estoy haciendo pruebas de rendimiento en MySQL 5.0 y paso todas las pruebas de rendimiento que le hice.

MySQL esta en los corazones de muchos de nosotros, por eso se hace dificil dejarlo. Pensé seriamente en dejar de utilizarlo y migrar todo a un gestor, tambien libre y mas poderoso (pero no tan popular): PostgreSQL. Las utltimas pruebas de rigor fueron definitivas: Me quedo con MySQL!

Pero eso no quiere decir que no se presenten errores en el futuro. Si alguien encuentra algun error en este gestor puede postearlo en http://bugs.mysql.com/ Antes de postear un bug uno debe estar muy seguro que sea realmente un bug.

Hay una Apple iPod para quien encuentre un bug importante. Pueden ver los detalles en:

http://dev.mysql.com/mysql_5_contest.html

Filnalmente MySQL 5.0 !

MySQLEl 24 de Octubre me llego un mail con el asunto “MySQL 5.0 Now Available for Production Use”, en esos dias estaba pensando seriamente en dejar de utilizar mi gestor de base de datos preferido y empezar con PostgreSQL, pero ahora tengo que pensarlo dos veces antes de cometer una locura.

MySQL ultimamente me ha estado fallando en algunas consultas y la necesidad de implementar procedimientos almacenados me hicieron dudar.

Ahora es momento de evaluar esta version y ver si realmente funciona y quedarme con MySQL hasta nuevo aviso.

En el mail describe estas (no tan nuevas) caracteristicas:

  • Stored Procedures and SQL Functions — to embed business logic in the database and improve performance;
  • Triggers — to enforce complex business rules at the database level;
  • Views — to ensure protection of sensitive information;
  • Cursors — to allow easier database development and reference of lar!
    ge datasets;
  • Information Schema — to provid!
    e easy a
    ccess to metadata;
  • XA Distributed Transactions — supports complex transactions across multiple databases in heterogeneous environments;
  • SQL Mode — provides server-enforced data integrity for new and existing data;
  • New Federated and Archive Storage Engines — MySQL’s unique pluggable storage engine architecture allows greater flexibility, functionality and performance by making it easy to swap database engines in and out, based on users’ application requirements;
  • New Migration Toolkit — A new graphical toolkit that completely migrates all data and objects from Oracle, Microsoft SQL Server, Microsoft Access and other database platforms to MySQL;
  • Instance Manager — new management assistant that allows remote starting/stopping of any MySQL Server, as well as remote editing of configuration files, reading of error and query logs, and more;
  • Updated Connectors and Visual Tools!
    — new high-performance versions of MySQL’s ODBC, Java and .NET database drivers are now available, along with updated versions of the MySQL Query Browser and MySQL Administrator.

Direccion de descarga:
http://dev.mysql.com/downloads/mysql/5.0.html

No tuve tiempo para traducir :D

Detectar el pais de procedencia del visitante en PHP

PHP Logo Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras páginas, para ello utilizamos herramientas muy útiles como contadores de visitas, analizadores de tráfico, etc.

Por otro lado, uno puede programar su propio sistema de análisis de tráfico haciendo un extracto de todas las variables de entorno que contienen esta información. Dependiendo del servidor Web (Apache, IIS, etc.)

Hace mucho tiempo encontré una base de datos (actualizada periódicamente) que contiene todos los números de IP que se pueden encontrar en la red. Estos están almacenados en forma de rangos y también indican el País o la ubicación geográfica de cada rango. Con esta información es fácil determinar el país de procedencia del visitante simplemente con saber su número de IP.

La dirección donde pueden descargar esa base de datos es:

http://ip-to-country.webhosting.info/node/view/6

Dichos datos están delimitados por comas (CSV) con el fin de ser actualizados rápidamente a cualquier gestor de datos que lo permita. Incluyendo a MySQL por su puesto.

Importando el archivo csv en MySQL

El archivo que contiene la base de datos de IP tiene esta estructura:

"0033996344","0033996351","GB","GBR","UNITED KINGDOM"
"0050331648","0083886079","US","USA","UNITED STATES"
"0094585424","0094585439","SE","SWE","SWEDEN"
...

Paso 1: Crear la tabla ipdatabase (u otra que deseen) con la siguiente estructura:

CREATE TABLE ipdatabase
(
  ip_from int(10) unsigned,
  ip_to int(10) unsigned,
  country_code2 char(2),
  country_code3 char(3),
  country_name varchar(50),
  KEY ip_from (ip_from),
  KEY ip_to (ip_to)
);

Paso 2: Importar los datos con LOAD DATA:

LOAD DATA LOCAL INFILE 'ip-to-country.csv'
INTO TABLE test_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';

Paso 3. Finalmente escribir el codigo para detectar el pais:


<?$link = mysql_connect(“localhost” , [...] , [...]);mysql_select_db(“ipdatabase”,$link);

$sql = “SELECT country_code2,country_name     FROM ipdatabase “.       “WHERE IP_FROM<=inet_aton(’$REMOTE_ADDR’) “.       “AND IP_TO>=inet_aton(’$REMOTE_ADDR’) “;

if( $res = mysql_query($sql,$link)){  $row =mysql_fetch_row($res);  echo “<br>Numero de IP: <b>$REMOTE_ADDR:</b><br>”;  echo “Pais : “.$row[0].” - “.$row[1];  echo “<img src=/images/flags/”;  echo strtolower($row[0]).“.gif width=18 height=12>”;  mysql_free_result($res);}else{ echo mysql_error($link);}mysql_close($link);?>

He estado haciendo pruebas con esta base, pueden ver el script PHP en acción en esta dirección:
http://www.latindevelopers.com/country.php .

Este script lo integraré a Latindevelopers.com en las proximas semanas.

Update:
Habia olvidado poner el codigo fuente del archivo country.php: