Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas
Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas

miércoles, 24 de julio de 2013

Mysql borrado rápido filas duplicadas

En este sitio he encontrado una forma muy rápida de eliminar duplicados. Tan rápida que puede hacerse con una sola línea, se trata de crear ununique index con la palabra clave IGNORE. Tal que esto:

ALTER IGNORE TABLE dupTest ADD UNIQUE INDEX(a,b);


Guay eh?

miércoles, 6 de marzo de 2013

Backup de los procedimientos almacenados mysql

El mysqldump no copia los stored procedures por defecto pero si los triggers, es decir, los parámetros por defecto son:

--routines FALSE por defecto
--triggers TRUE por defecto

Para volcar sólo los procedimientos almacenados:

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt database > procedimientos.sql

Para importar los procedimientos a otra db:


mysql database < procedimientos.sql

Para hacer un backup de datos y triggers que también copie los procedimientos almacenados:


mysqldump --routines outputfile.sql


Fuente:
http://www.ducea.com/2007/07/25/dumping-mysql-stored-procedures-functions-and-triggers/

jueves, 28 de febrero de 2013

Depurar procedimientos almacenados mysql

Depurar procedimientos de bases de datos suele ser una tarea ingrata a no ser que tengamos alguna herramienta de desarrollo. Pero aún estas herramientas suelen modificar internamente el procedimiento para efectuar el depurado además de crear multitud de tablas intermedias para guardar el estado de las variables en cualquier punto de la ejecución.

Si no te interesa este enfoque y sólo necesitas ir haciendo un log de lo que ocurre propongo el siguiente sistema que he ido mejorando a partir de diversas fuentes y experiencias.

La idea se basa en la creación de una tabla temporal donde vamos realizando el log mediante una llamada al procedimiento doLog(msg).

Primero creamos una tabla de configuración:

CREATE TABLE `internal_config` (
`debug` tinyint(4) NOT NULL DEFAULT '1'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into internal_config(debug) values(0);

Que nos servirá para activar/desactivar el debug con:

update internal_config set debug=true;

El procedimiento que crea la tabla temporal es:

CREATE PROCEDURE `setupTmpLog`()
BEGIN
 CREATE TEMPORARY TABLE IF NOT EXISTS tmplog(
   lin integer NOT NULL AUTO_INCREMENT primary key,
   msg VARCHAR(512)
 ) ENGINE = MEMORY;
END

y el que escribe el log:

CREATE PROCEDURE `doLog`(IN logMsg VARCHAR(512))
BEGIN
 declare do_debug bool default false;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET do_debug=false;
 DECLARE CONTINUE HANDLER FOR 1146 -- Table not found
  BEGIN
    CALL setupTmpLog();
    INSERT INTO tmplog(msg) VALUES ('resetup tmp table');
    INSERT INTO tmplog(msg) VALUES (logMsg);
  END;

 select debug from internal_config limit 1 into do_debug;

 -- escribimos en el log solo si debug esta activado
 if (do_debug) then
   INSERT INTO tmplog(msg) VALUES (logMsg);
 end if;
END

y finalmente, un procedimiento que nos muestra el log (con el último mensaje primero) y después borra la tabla:

CREATE PROCEDURE `view_log`()
BEGIN
  DECLARE CONTINUE HANDLER FOR 1146 -- Table not found
   BEGIN
    CALL setupTmpLog();
   end;

   select msg from tmplog order by lin desc;

   drop table tmplog;
END

Ya lo tenemos todo, para ir logeando en nuestros procedimientos sólo tenemos que llamar a doLog así:

call doLog(concat("Hola", " que ", " tal " ));

Y cuando queramos ver (y limpiar) el log hacemos:

call view_log();

Espero que os sirva. Good Luck ;-)


Fuentes:
http://www.drdobbs.com/database/debugging-mysql-stored-procedures/218100564?pgno=1

domingo, 11 de marzo de 2012

Usar cliente Mysql python en windows

Si has intentado, sin éxito, instalar el módulo MySQLdb en windows tal vez te interese pasar por este sitio web y bajarte el instalador para windows en vez de tener que compilar las librerías en tu PC ;-)

lunes, 5 de marzo de 2012

Acceso remoto a servidor Mysql

Para acceder remotamente a un servidor Mysql lo mejor es usar ssh y hacerlo en local desde la shell pero en los casos en que tengamos que conectar necesariamente desde otro host lo podemos hacer de la siguiente forma:

1.- Editamos (/etc/mysql/my.cnf en Debian, /etc/my.cnf en CentOS) y ponemos la bind-address como la IP del propio servidor. Reiniciar el servicio mysql. Esto hará que escuche en el puerto 3306 del propio servidor en vez de sólo el bucle local localhost.

bind-address = ip_servidor

Si está presente la directiva skip-networking hay que comentarla

2.- Crear un usuario remoto. Entar en mysql y hacer

GRANT ALL ON nombre_db.* TO 'usuario'@'ip-usuario' IDENTIFIED BY 'password';

O si queremos otorgar acceso remoto a root:


GRANT ALL PRIVILEGES on *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;


3.- Abrir el puerto 3306 con iptables,
#iptables -A INPUT -i eth0 -s ip_remota -p tcp --destination-port 3306 -j ACCEPT
#service iptables save
O bien, si usamos ufw,
sudo ufw allow proto tcp from ip/mascara to any port 3306

jueves, 23 de junio de 2011

Ejecutar scripts mysql a lo Unix

Una forma es

mysql -u root -p -h localhost nombre_bd < script.sql

y otra

cat script.sql | mysql -u root -p -h localhost