SQL injection cheatsheet

Interesante hoja de trucos para evitar SQL Injection en nuestras aplicaciones. La explicación es bastante intensa y no solo se centra en MySQL sino en otros motores como Microsoft SQL Server, ORACLE y PostgreSQL, aunque para estos últimas son pocos los consejos.
SQL Injection Cheat Sheet

Automatic MySQL Backup

Automatic MySQL Backup es un script que nos permite realizar copias de seguridad de MySQL de forma automática. Ofrece las siguientes características:

  • Realizar backups de múltiples bases de datos de MySQL en un único script.
  • Posibilidad de realizar las backups de todas las BDs en un único fichero o separándolo en directorios y ficheros.
  • Compresión de los ficheros en gzip o bzip2.
  • Hacer backups de un servidor MySQL remoto a uno central.
  • Ejecutable mediante cron
  • Envío de emails con los logs a una dirección de email específica diferente de root.
  • Envío por email de la copia de seguridad comprimida.
  • Se puede especificar el tamaño máximo del backup que se enviará por email.
  • Ejecutar comandos antes y después del backup.
  • Elegir el día de la semana para realizar los backups semanales.

Actualización: Samuel nos recomienda un tutorial que realizó, gracias por la aportación.

Automatic MySQL Backup

Vía / HowtoForge

Engine MySQL para AWS S3

AWS S3 es un servicio de almacenamiento en red de Amazon que muchos lugares utilizan para ahorrar costes de disco duro. Para trabajar con este servicio existe una API que nos facilita la tarea, por lo que su uso no es complicado, aunque lógicamente lo es más que simplemente acceder de disco duro propio.
Para facilitar más las cosas, existe un motor para MySQL que permite transformar el protocolo de S3 en un modelo de datos para MySQL, pudiendo crear tablas y trabajar con ellas. La cuenta S3 viene a ser un comando CREATE SERVER, los buckets tablas, los items filas, las claves de los items serán claves primarias y el contenido de los items BLOB o VARCHAR.
A MySQL Storage Engine for AWS S3 (PDF)

MySQLTuner: consejos para mejorar el rendimiento de MySQL

MySQLTuner es un script en Perl que realiza un SHOW STATUS y ofrece una serie de consejos fáciles de entender de cómo mejorar el rendimiento en nuestro servidor MySQL.
Este script no te soluciona nada, solo te ofrece consejos que se deberían implementar. Siempre es importante mejorar las queries que se ejecutan para que el rendimiento a nivel de servidor sea menos necesario.
MySQLTuner
Vía / The Pythian Group

ExtSQL: Extended Usage Statistics for SQL

ExtSQL es una serie de modificaciones y parches realizados sobre MySQL y PostgresSQL que permiten realizar monitorizaciones e informes sobre el estado de la base de datos, del servidor, la actividad de los usuarios. Las consultas se realizan mediante queries SQL, las cuales quieren que se añadan al estándar SQL. Actualmente, la mayor parte del trabajo se ha realizado en MySQL, ya que están a la espera de la respuesta de la comunidad de PostgreSQL.

Por ejemplo, para saber el número de selects e inserts realizados por todos los usuarios desde que el servidor arrancó, sería así:

SHOW STATISTICS Com_select, Com_insert, Questions FROM user;

Dando el siguiente resultado:

+----------+-------------+------------+------------+
| user     | Com_select  | Com_insert | Questions  |
+----------+-------------+------------+------------+
| bandala  | 8302675     | 95973      | 23153940   |
| sandymao | 1702812     | 6205       | 3829023    |
| ponnetli | 24909       | 4784       | 95646      |

ExtSQL

Vía / VivaLinux

Gracias David por el aviso

Borrar queries lentas en MySQL5.1

MySQL 5.1 añade la posibilidad de programar eventos, pudiendo así ejecutar tareas de forma automática. Una de las tareas más comunes es la de eliminar consultas lentas que aún no han acabado de ejecutarse.
Esta tarea se puede realizar mediante un prodecimiento almacenado que realiza un PROCESS LIST y que comprueba las sentencias con más de 200s (configurable) que están en estado executing o las que está en Spleep.
Purge process list from slow queries/idle connections
Vía / The Data Charmer

Revision Engine: engine para MySQL con control de cambios

Revision Engine es un motor para MySQL que permite llevar el control de cambios en los datos de las tablas. Cuando se necesita llevar un registro de las modificaciones realizadas por los inserts y updates, normalmente se realiza mediante programación. Este engine permite que esa tarea sea ajena al programador y que se realice automáticamente por la base de datos.

Existen tres formas de realizar el control de versiones:

  • Uso de dos tablas: una para los datos actuales y otra para el histórico. Las consultas son rápidas pero los updates lentos, ya que hay que quitar de una tabla y ponerla en otra.
  • Usando una tabla en la que se guardan los datos actuales y los históricos, la escritura es más rápida que la anterior, pero la lectura es más lenta porque hay que buscar en un volumen de datos mayor.
  • Usando tablas internas para guardar los cambios realizados en las columnas, no a nivel de la fila completa. Este caso aún no está disponible y lo realizarán en versiones posteriores.

Revision Engine

Vía / The Data Charmer

Mejora en las consultas anidadas en MySQL6

Buena noticia de rendimiento en la futura versión de MySQL. En este caso se trata de las consultas anidadas dentro de MySQL, pongamos un ejemplo.

Si tenemos esta consulta:

select title, from_date, to_date
from titles
where emp_no in
(select emp_no
from employees
where first_name = 'Mary'
and last_name = 'Sluis'
)

En MySQL5 (usando estos datos) obtendríamos el resultado (1 fila) en 7.88 segundos, mientras que en MySQL6 tardaría 0.13 segundos.

El motivo parece ser que MySQL transforma la subconsulta en un join.

Drizzling MySQL

Consejos para mejorar la paginación

La paginación es algo de lo más costoso a la hora de realizar una búsqueda. Si nos ponemos en el caso de miles de registros con ordenación por cierto campo, la búsqueda puede ser una query muy costosa. Si además unimos el cálculo total de registros encontrados, la página puede tardar mucho en devolverse.

Debido a ello, para agilizar este tipo de páginas existen unos consejos a tener en cuenta:

  • Cachea todo lo que se pueda: el caché evita que se realicen consultas a la BD.
  • No muestres todos los resultados: Google no lo hace y nadie se queja por ello. Limita el total de registros a 100 o 500, nadie visita más de 10 páginas normalmente.
  • No muestres el total de páginas o páginas intermedias: ofrece tan solo en enlace a “página siguiente”, para lo cual puedes obtener 21 registros y mostrar solo 20, así si la consulta te devuelve menos de 21 es que no hay página siguiente.
  • Estima el número de resultados: esto también lo hace Google, en vez de calcular el número exacto, se trata de estimar el número aproximado de resultados. Usa EXPLAIN para obtener ese número, puedes usar el campo rows como aproximación.

Four ways to optimize paginated displays

mylvmbackup: copias de seguridad para MySQL

Ya hace tiempo hablé de mylvnbackup como utilidad para realizar copias de seguridad de MySQL cuando se trataba de entorno Linux. Esta vez hablaré con un poco más de profundidad aprovechando que acaban de lanzar la versión 0.10 de esta aplicación.
Esta aplicación bloqueará para lectura todas las tablas y vaciará el caché de disco del servidor, creando un snapshot del directorio de datos de MySQL, desbloqueando las tablas de nuevo. El snapshot toma poto tiempo y cuando se ha realizado el servidor puede continuar funcionando normalmente mientras que el fichero actual de backup continúa.
El snapshot se monta en un directorio temporal y se comprime usando el comando tar, con un formato de fichero así: YYYYMMDD_hhmmss_mysql.tar.gz.
mylvmbackup