El formato CSV resulta muy cómodo tanto de generar como leer, por eso muchos programas lo aceptan. Se trata simplemente de valores separados por comas (Comma-Separated Values). Vamos a ver como generar un fichero desde MySQL para almacenar datos.

Para generar el fichero desde un comando SQL en MySQL deberemos indicar INTO OUTFILE con el nombre de fichero y las siguientes opciones:

  • FIELDS TERMINATED BY: Indicamos como terminan los campos, en este caso deben ser separados por comas ‘,’
  • OPTIONALLY ENCLOSED BY: Como se deben indicar en el caso que tengan el separador como valor. En este caso mediante comillas dobles ‘”‘
  • ESCAPED BY: Indicamos como debemos escapar los carácteres, en este caso mediante la contrabarra ‘\\’
  • LINES TERMINATED BY: Indicamos como especificamos una nueva fila, en este caso mediante un intro ‘\n’

Por lo tanto el comando SQL quedaría:

mysql>  select * from loquesea
INTO OUTFILE "/tmp/inventari.txt"
FIELDS TERMINATED BY  ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY  '\\'
LINES TERMINATED BY '\n' from RackObject;
Query OK, 168 rows affected (0.29 sec)

Nuestra fuente: Systemadmin.es

Modos de la query cache   
Author: admin

Mayo 23, 2011

Posted in mysql, tutoriales | |

La query cache es un mecanismo mediante el cual si ejecuta la misma query multiples veces, sin que los datos se hayan modificado, devuelve los resultados de una zona de memoria que los conserva para no tener que tener que ir a buscarlos de nuevo si son pedidos repetidas veces.

Mediante SHOW VARIABLES podemos ver si tenemos la query cache disponible en el servidor de MySQL:

mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.00 sec)

(más…)

MySQL en modo bootstrap (similar a single user)   
Author: admin

Abril 27, 2011

Posted in artículos, mysql, programación | |

Una opción interesante del mysqld es la opción –bootstrap, esta se usa para inicializar la base de datos sin arrancar totalmente la instancia. Vamos a ver como funciona y como podemos usarla para tener el MySQL en un modo similar a lo que sería el single user de Unix.

Con dicha opción –bootstrap arranca el mínimo de la instancia sin tener disponible ni el socket ni el puerto TCP para conexiones de clientes, sino que únicamente se comunica con el usuario por stdin.

Por lo tanto, deberemos pasar los comandos que queremos que ejecute. Cuando le mandemos el EOF, se cerrará la base de datos y terminará la aplicación. Por ejemplo, con el MySQL apagado ejecutamos el mysqld con la opción bootstap y le mandamos crear una base de datos:

(más…)

Índices en tablas particionadas   
Author: admin

Febrero 14, 2010

Posted in artículos, mysql, programación | |

En MySQL 5.1 se introdujo la posibilidad de particionar tablas, en algunos casos puede causar más problemas que soluciones. Vamos a ver a continuación un ejemplo de tabla que para las consultas que indicaremos no tiene sentido particionarla.

En la documentación de MySQL hay un listado de limitaciones del particionamiento de MySQL 5.1. A continuación veremos aplicados algunas de las limitaciones:

Primero de todo supondremos la siguiente tabla:

CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `usuario` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `usuario` (`usuario`)
) ENGINE=MyISAM AUTO_INCREMENT=1645135 DEFAULT CHARSET=utf8;

Con un total de 1.645.134 registros de ejemplo:

mysql> select count(*) from usuarios;
+----------+
| count(*) |
+----------+
|  1645134 |
+----------+
1 row in set (0.00 sec)

Nuestra fuente:systemadmin.es
(más…)

Posted in Javascript, mysql | |

Cada vez se van puliendo más las inyecciones de HTML o javascript en las webs, pero como no se suelen gestionar de una forma unificada acaban apareciendo de nuevo en lugares más escondidos, por ejemplo en el TITLE, pero siguen sin desaparecer.

NuestraFuente:  SystemAdmin.es

BigDump: facilita recuperar dumps de MySQL grandes   
Author: admin

Febrero 5, 2010

Posted in mysql | |

A veces es un lío enorme recuperar BDs obtenidos de dumps cuando el fichero es enorme, sobre todo si usamos phpMyAdmin (y no tenemos acceso a él). Por ello este script nos puede venir muy bien para recuperar backups anteriores, ya que recupera de poco en poco y se auto-reinicia él mismo.

BigDump

Nuestra Fuente: SentidoWeb.com

Posted in mysql | |

El Maatkit es un conjunto de utilidades para la administración de MySQL. Una de ellas permite buscar los indices duplicados para una base de datos en concreto.

Para obterner dicha utilidad lo podemos hacer mediante el siguiente wget:

# cd /usr/local/bin
#  wget http://www.maatkit.org/get/mk-duplicate-key-checker
# chmod +x mk-duplicate-key-checker

Si no los teneis ya instalados, necesitareis los siguientes modulos de perl:

  • DBD::mysql
  • Term::ReadKey

Se pueden instalar mediante cpan (recortanda la salida):

# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install Term::ReadKey
(...)
cpan> install DBD::mysql
(...)

A continuación ya se puede ejecutar mk-duplicate-key-checker así:

$ mk-duplicate-key-checker --user maite --askpass --host 172.12.1.130

Su salida sería similar a esta:

DATABASE TABLE                  ENGINE OBJECT                   TYPE STRUCT   PARENT COLUMNS
site32   zzzta_9                MyISAM PRIMARY                  KEY  BTREE    NULL   `ta_id`
site32   zzzta_9                MyISAM ta_id                    KEY  BTREE    NULL   `ta_id`
site32   zzzta_9                MyISAM ta_id_2                  KEY  BTREE    NULL   `ta_id`

Para este caso veriamos no un índice duplicado, sinó triplicado. Podemos ver su create table:

mysql> show create table zzzta_9\G
*************************** 1. row ***************************
       Table: zzzta_9
Create Table: CREATE TABLE `zzzta_9` (
  `ta_id` int(11) unsigned NOT NULL auto_increment,
  `ta_section` varchar(100) default NULL,
  `ta_url` text,
  `ta_keywords` text,
  `ta_description` text,
  PRIMARY KEY  (`ta_id`),
  UNIQUE KEY `meta_id` (`ta_id`),
  KEY `meta_id_2` (`ta_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Vemos como el desarrolador ha definido:

  • Un índice para el campo ta_id mediante la keyword KEY
  • A continuación una restricción UNIQUE, por lo que se crea un índice implicatamente restringuiendo la columna a valores únicos incluyendo NULL como possible valor.
  • Finalmente, define la columna como PRIMARY KEY, creando el tercer índice y restringiendo a valores únicos excluyendo NULL

Este tipo de errores són más comunes de lo que parece. Además los desarrolladores acostumbran a ser reticentes a quitar estos índices, incluso si estan triplicados. Para este caso sólo con la PRIMARY KEY sería suficiente.

Otro caso común sería el siguiente:

site53 areas                  MyISAM area_pt                  KEY  BTREE    NULL   `area_pt`
site53 areas                  MyISAM area_pt_name            KEY  BTREE    NULL   `area_pt`,`area_name`

En este caso vemos que el índice area_pt es prefijo del índice area_pt_name. MySQL puede usar cualquier prefijo possible de un índice multicolumna, por lo que el índice area_pt se puede eliminar, ya que MySQL podría usar el índice compuesto en su lugar.

fuente: SystemAdmin.es

Posted in mysql | |

Para las bases de datos que por el tipo de acceso a estos es imprescindible tenerlos expuestos a Internet para cualquier usuario no resulta mala idea eliminar el usuario “root” para evitar ataques de diccionario.

Para ello primero de todo entramos como root y creamos el nuevo usuario, por ejemplo lo vamos a llamar sysdba:

$ mysql -uroot -prootpass
mysql> create user sysdba@localhost identified by 'passdba';
mysql> grant all on *.* to sysdba@localhost with grant option;

A continuación podemos comprobar su funcionamiento con:

$ mysql -usysdba -ppassdba

Finalmente podemos eliminar el usuario root:

$ for i in 127.0.0.1 localhost $(hostname); do drop user root@$i | mysql -usysdba -ppassdba; done

fuente: SystemAdmin.es

SQL Injection no solo trata de comillas   
Author: admin

Enero 13, 2010

Posted in mysql | |

En el día de hoy el colega Jordi Prats de Systemadmin.es ha publicado un post sobre este tema de tanto interes para quienes se dedican al desarrollo de aplicaciones web.

Aunque estrictamente no se trata de un tema de sistemas, no es de extrañar que alguien pregunte estos temas. Por ejemplo, ayer me encontré con un programador que asociaba SQL Injection (un problema que tuvo en la base de datos) con las comillas: “Ya escapo las comillas

Revisando el código (PHP) encontré que hacia una diferenciación según el tipo de datos. En el caso de añadir un string a la query el código era:

$query.=" variable = '".mysql_real_escape_string($var)."'";

Mientras que si la variable era un identificador numérico:

$query.=" variable = ".mysql_real_escape_string($var);

En el caso que la variable en lugar del valor numérico contenga lo siguiente:

3; drop database ejemplo;

La query se construiría de la siguiente forma:

select name from users where variable=3; drop database ejemplo;

En este caso sólo usando comillas también para datos numéricos tendríamos un problema menos porque la query se construiría de la siguiente forma (dando un error al ejecutarse):

select name from users where variable='3; drop database ejemplo;'

SQL Injection realmente es una técnica genérica referida a añadir código SQL y no “usar comillas para hacer cosas malas

fuente: SystemAdmin.es