Archivo de la categoría ‘mysql 5’

Insertar NULL en CSV para importarlo desde PHPMyadmin hacia MySQL

Lunes, 28 de Diciembre de 2009

Siguiendo con la importación de un Excel hacia Mysql, tenemos el problema de que los campos que no se han rellenado se insertan como “” (cadena vacía) o como 0 (cero) según sean texto o números lo que estamos insertando.

Bien, si queremos que se guarde un NULL debemos insertar el siguiente carácter: \N

Como en la anterior entrada, simple pero efectivo.

Quitar espacios entre números o palabras en excel (o calc)

Lunes, 28 de Diciembre de 2009

En una migración desde Excel a Mysql tenemos el problema de que en un campo numérico obtenemos espacios, y el entero se nos trunca. Lo que debería ser: 93 222 2222 se guarda como: 93 es decir, se trunca por el primer espacio que encuentra.

La manera más cómoda de solucionar este problema que he encontrado ha sido seleccionar la columna en cuestión y hacer un buscar/reemplazar de un espacio por nada.

Una vez hecho podemos guardar como CSV e importar desde phpmyadmin a nuetra base de datos mysql. Simple pero efectivo.

Dos LEFT JOIN a una misma tabla de Mysql

Lunes, 2 de Marzo de 2009

Tengo dos tablas Mysql llamadas 'Producto' y 'Persona'. Cada producto almacenado en la tabla 'Producto' está asociado a solo un proveedor (o a ninguno) y a un solo cliente (o a ninguno). La información completa tanto de los clientes como de los proveedores se almacena en la tabla 'Persona'. De esta forma, en la tabla 'Producto' dispongo de dos campos INT, llamados 'idCliente' e 'idProveedor' respectivamente, ambos relacionados mediante una FOREIGN KEY hacia la misma tabla 'Persona'.

A la hora de mostrar información de productos me interesa no sólo mostrar el número identificativo de cada proveedor y de cada cliente asociados a un producto ('idProveedor' e 'idCliente'), si no que, por ejemplo, deseo mostrar nombre y apellidos de éstos. Al realizar la consulta SQL necesito crear dos LEFT JOIN puesto que, como se ha comentado anteriormente, en ocasiones puede ser que no tengamos cliente y/o proveedor asociados al producto.

El problema que tenía es que los dos LEFT JOIN deben referirse hacia la misma tabla ('Persona') y surge la necesidad de diferenciarlos de alguna forma. La solución es la siguiente:

SQL:
  1. SELECT Concat(Cliente.nombre,' ',Clienteapellidos) AS 'cliente', Concat(Proveedor.nombre,' ',Proveedor.apellidos) AS 'proveedor'
  2.  
  3. FROM  Producto
  4.  
  5. LEFT JOIN Persona Cliente (Cliente.idPersona = Producto.idCliente)
  6.  
  7. LEFT JOIN Persona Proveedor (Proveedor.idPersona = Producto.idProveedor)
  8.  
  9. WHERE 1

Como se puede observar en el ejemplo, el único requisito exigible para conseguir el objetivo expuesto es poner un alias justo detrás del nombre de la tabla en la sentencia LEFT JOIN.

Como crear copias de seguridad de una base de datos mysql 5 instalada en un servidor Linux (mysqldump + cron)

Jueves, 14 de Agosto de 2008

Para hacer copias de seguridad periódicas de una base de datos Mysql, vamos a utlizar el comando mysqldump. Este comando nos muestra en pantalla la consulta con la sql necesaria para crear de nuevo la base de datos con toda la información. Es exactemente igual que si hacemos un exportar bd a fichero desde el phpMyAdmin.

Esta instrucción única con el programador de tareas cron servirán para copiar un fichero con la sql del backup de la base de datos seleccionada a una carpeta determinada.

veamos un ejemplo de como sería la instrucción de mysqldump, suponemos tener una Base de datos llamada "BaseDeDatos", el usuario para acceder a la base de datos es "USUARIO", y su contraseña es "ContraseñaSegura" :

mysqldump -uUSUARIO -pContraseñaSegura --opt BaseDeDatos

con esta instrucción se nos mostraria en pantalla la sql, para redicreccionarla a un fichero, será necesario añadirle al final: "> /directorioElegido/ficheroConElBackup.sql " quedando así:

mysqldump -uUSUARIO -pContraseñaSegura --opt BaseDeDatos > /directorioElegido/ficheroConElBackup.sql

Recordar que si estamos usando Ubuntu será necesario añadir delante del comando la palabra sudo. Tener encuenta que será necesario crear el fichero la primera vez y darle permisos de escritura. otra opción es que la carpeta destino tenga los permisos necesarios. Si necesitaramos copiar varias bases de datos, mysqldump tiene un parámetro -all que copiaría todas las bases de datos, a las que el usuario de mysql tenga acceso, en un solo fichero.

para cambiar los permisos utilizar el comando chmod, ejemplo de utilización:
chmod 777 ficheroOCarpeta
daría escritura lectura a todos los usuarios, ajustar el nivel de seguridad segun nos interese. Una vez probado que este comando nos funciona correctamente y solo falta automatizar esta instrucción para que se ejecute con la periodicidad que queramos. Para ello utilizamos el comando cron. Veamos un ejemplo:

quiero copiar cada dia a las 13:00 el contenido de la base de datos anterior:

cron 0 13 * * * 'sudo mysqldump -uUSUARIO -pContraseñaSegura --opt BaseDeDatos > /directorioElegido/ficheroConElBackup.sql';

De este modo programamos que a las 13:00 se ejecute el comando mysqldump encargado de hacer la copia de la base de datos. Tener en cuenta que cada día se machaca el fichero que creamos con lo que sólo tenemos una única copia, la del dia anterior. Apartir de aquí se podria hacer un script que guardara todos las copias con la fecha concatenada.

Haciendo pruebas en Xubuntu server , el comando parecia ir, pero no se ejecutaba cuando tocaba. Así que tuvimos que editar manualmente el fichero del crontab, que se encuentra en /etc/crontab

sudo mousepad /etc/crontab

Añadiendo una linea al final, la misma que explicabamos antes. Veamos un ejemplo del fichero:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6 * * 7 root test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6 1 * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly
89 5 13 * * * root sudo mysqldump -uUSUARIO -pContraseñaSegura --opt BaseDeDatos > /directorioElegido/ficheroConElBackup.sql
#

Como se puede ver el primer parametro es el orden de preferencia de ejecuiones poner un numero mas alto. Os quedara todo en una sola linea, aqui en el ejemplo de cae, pero debe estar en la misma linea.

El primer sintoma de este error fue el siguiente. Tratando de recuperar la lista de tareas cron -l  el sistema lanzaba un error

cron: can't open or create /var/run/crond.pid: Permission denied
administrador@ServerTaller:~$ sudo cron -l
Password:
cron: can't lock /var/run/crond.pid, otherpid may be 4978: Resource temporarily unavailable

El primero permision denied, se soluciona añadiendo sudo, delante del comando. Pero despues nos da el error cron: can't lock , que nos impide ver si se ha añadido correctamente nuestra nueva tarea. así es como detectemos el problema y pues busquemos alternativas.

En windows dentro de la carpeta del mysql/bin tambien disponemos del ejecutablre mysqldum.exe, así que seguramente también se podrian hacer algo similar con el programador de tareas de windows y mysql, alquien nos lo cuenta?