¿Cómo hacer un UPDATE en una tabla grande sin bloquearla?

De vez en cuando nos toca hacer un gran UPDATE sobre una tabla grande que nos puede llevar 10 min. para completar su ejecución, el problema es que si lo hacemos directamente bloqueamos la tabla hasta que termine, eso puede ocasionar varios problemas muy graves a nivel de aplicación, hoy presento una alternativa usando Procedimientos Almacenados.

Básicamente consiste en tener una sentencia que hace UPDATE a cada 1000 rows, se ejecuta dicha query N veces hasta llegar a 0 rows actualizados, en cada interacción hacemos una pequeña pausa de 2 segundos para dejar que pasen las transacciones que están esperando usar dicho recurso.

DROP PROCEDURE IF EXISTS sp_users_update;

DELIMITER |
CREATE PROCEDURE sp_users_update()
  BEGIN
    SET @row_count = 0;

    REPEAT
      -- Query to update:
      UPDATE LOW_PRIORITY users SET username = CONCAT('DELETED_', username)
      WHERE deleted_at IS NOT NULL
      AND username NOT LIKE 'DELETED_%' …
[Altro]
MySQL Utilities - Installazione

MySQL è uno dei database opensource più conosciuti ed utilizzati con numerose risorse disponibili sul web.
Quello che però ho trovato nella mia esperienza è che le pagine in italiano non sono poi così tante e quindi mi sono deciso a contribuire scrivendo periodicamente un po' di informazioni.
Spero così di aiutare chi parla italiano e magari un po' meno la lingua inglese, ma vuole comprendere meglio il prodotto e alcune sue opzioni.
MySQL è un database opensource, quindi liberamente scaricabile da internet (http://dev.mysql.com).

E' disponibile anche una versione con supporto a pagamento, che aggiunge plugin e strumenti interessanti. Dedicherò di sicuro uno dei prossimi post a questo argomento, per la mia esperienza poco conosciuto.

Ma tornando alle opzioni disponibili gratuitamente troviamo le MySQL Utilities, un pacchetto di strumenti che …

[Altro]
¿Por qué no debes usar relaciones polimórficas?

La verdad no se como empezar este post, ya que el tema es muy delicado en el mundo de RubyOnRails y algo en Java, no quiero ofender a la comunidad, sino ayudarlos hacer un buen modelo de datos dentro de un Manejador de Bases de Datos Relacionales (RDBMS). Considero que primero debemos enterarnos que son las relaciones polimórficas, luego hablar de los problemas que conlleva y por último como podemos evitarlos.

¿Qué son las relaciones polimórficas?

Es una forma de relacionar muchas tablas con una sola mediante una única relación, esto se debe que programamos orientado a objetos y tratamos la base de datos de la misma forma, creando relaciones entre objetos, es una implementación de la librería (gema) ActiveRecord que compone el framework RubyOnRails. Depende del enfoque, esto nos puede traer un ahorro en el uso de tablas como …

[Altro]
Bases de datos relacionales y no relacionales

El gran dilema, bases de datos relacionales (RDBMS) y no relacionales (NoSQL), todos preguntan, todos hablan de ello, estamos comparando cual es mejor, en fin, hay una gran incertidumbre en el tema, muchos apuntan a un extremo o al otro, cometen errores y nos olvidamos de ver con objetividad. Quiero explicar de que va todo esto de una forma simple para entendernos. Quiero recordar que grandes volúmenes de datos no son un simple millón de rows, son mucho más, billones por ejemplo, ahora imagina billones de rows que interactúan con otros billones de rows para generar información más significativa, cuando hay grandes volúmenes de información se aprecia todo de una forma diferente, esto impacta en tiempo y dinero.

Cada tipo de base de datos nació en una época …

[Altro]
Niveles de aislamiento en Base de Datos

El aislamiento es una parte importante de la propiedad ACID que garantiza que las transacciones sean fiables. Esto permite que las transacciones que se ejecutan simultáneamente no interfieran con otras, garantizando la integridad de los datos, al no existir aislamiento en una transacción podría modificar los datos que otra transacción está leyendo, por lo que se crea una inconsistencia cuando se crean datos.

Ahora que entendemos que es el aislamiento en términos generales, vamos a conocer cuales son los niveles de aislamiento, estos determinan como las transacciones se comportan con otras transacciones, es como ser más o menos restrictivo. Escoger cual es el mejor nivel depende de las necesidades de la aplicación, primero debe entender cuales son los beneficios y consecuencias de cada una de ellas.

InnoDB soporta los cuatro niveles de aislamiento estándar, a continuación se describen los estándares usados …

[Altro]
El rol de un DBA

Puede que este papel hoy en día se este perdiendo, y se haya mezclado con los de Operaciones o con algún Desarrollador, está mal!, en proyectos grandes es muy importante dedicarle todo el tiempo posible, llega un momento que el volumen de datos y el tráfico se vuelve insostenible, a este punto, cuando algo falla es catastrófico y no suele arreglarse rápidamente, la prevención es bastante crucial y se vuelve una eterna lucha.

Ser Administrador de Bases de Datos es algo bastante exigente, porqué debes saber un poco de todo; de programación, de sistemas y mucho de Bases de Datos. El dominio de cada una de ellas es bastante crucial para entender como gestionar bien los recursos, prevenir incidencias e incluso resolverlas.

Debes trabajar codo a codo con los Desarrolladores, antes que ellos se …

[Altro]
Darle un poco de color a la consola de MySQL

En el post anterior explicamos como paginar la salida de datos, usando ese mismo truco con un comando de linux llamado grcat, podemos darle color al texto; números, direcciones IP, fechas, etc… así deja de ser aburrida la consola de MySQL.

Ejecutamos el siguiente comando para instalar la nueva tool:

apt-get install grc

Ahora nos bajamos el fichero de configuración del grcat, aquí es donde están definidas las reglas de colores:

wget https://raw.githubusercontent.com/nicola51980/myterm/master/bash/dotfiles/grcat -O ~/.grcat

Nos queda un último paso, y es editar este fichero para decirle al pager que use el grcat:

vim .my.cnf

Así debería quedar el fichero:

[mysql]
auto-rehash
user = root
pager = grcat …

[Altro]
MySQL y HAProxy es una Arquitectura de Balanceo de Carga & Failover

La Base de Datos es un servicio muy importante que debe estar operativo el 99.99%, hay muchas arquitecturas para lograr esto, todo depende de las necesidades, hoy les explico la más básica usando un Master y dos Slaves con AWS y HAProxy.

Los Slaves se usan para las lecturas, todo el tráfico que es de disposición NO inmediata (<1s) debe ser accedido desde los Slaves, la idea es hacer un balanceo de carga, le quitamos peso al Master y se lo delegamos a los Slaves.

Como podemos imaginar, usar Slaves no son muy seguros, de vez en cuando se rompe por una serie de motivos, o necesitamos hacer mantenimiento y no debemos detener el servicio, entonces creamos una arquitectura tolerante a fallos como se muestra en la siguiente imagen:

Podemos observar que todo lo que está susceptible a fallos está duplicado. Hago una breve descripción de cada elemento que interviene en el diagrama:

[Altro]
Trabajando con largas listas de procesos en MySQL

Los fans de la terminal nos encontramos frecuentemente con algunas limitaciones por el tamaño del monitor y todo el contenido, en este caso hablo de listar y filtrar entre muchos rows en MySQL sin la opción WHERE como; “SHOW PROCESSLIST;” y “SHOW TABLES;”. Generalmente necesitamos buscar algo en largas listas para; matar procesos, verificar conexiones, consultas, etc… y como podemos hacer para mostrar los que nos interesa? En el post anterior hable de como usar el parámetro pager, y resulta que éste nos puede ayudar en más cosas.

Lo podemos cambiar estando dentro de la consola de MySQL, por ejemplo; Necesito listar todas las conexiones que sean distintas al estado Sleep:

mysql> \P grep -v Sleep
PAGER set to 'grep -v Sleep'
mysql> SHOW PROCESSLIST; …
[Altro]
Paginar en la consola de MySQL

Yo uso mucho la consola de MySQL, la verdad que es muy útil, pero muchas veces ejecutamos una Query que nos arroja un gran número de rows y columns que no caben en nuestra pantalla, y terminamos recurriendo a usar el scroll de la terminal para explorar los datos, ahora podemos implementar la paginación en la consola de una forma muy fácil.

Solo debemos editar o modificar un fichero de configuración, el que usa MySQL Command Line, manos a la obra:

vim ~/.my.cnf

Agregamos estas líneas al final:

pager = less -RSFXin

Debe quedar así:

[mysql]
user = root
pager = less -RSFXin

Podemos observar que hay un parámetro de configuración llamado pager que se encarga de pasar por STDOUT los datos a otro programa de la terminal de Linux para …

[Altro]