systemadmin.es > DBA > Engine blackhole de MySQL

Engine blackhole de MySQL

En engine BLACKHOLE de MySQL se puede usar para hacer desparecer los datos de algunas tablas que no nos interesen. Por ejemplo, en un entorno master-slave podemos eliminar una tabla grande que no nos cabe en disco. O también, si tenemos una aplicación que no podemos modificar, descartar los datos que se introducen en dicha tabla.

Primero deberemos mirar si la instalación de MySQL soporta el engine BLACKHOLE, lo podemos ver con SHOW ENGINES:

mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         | 
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         | 
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         | 
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        | 
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         | 
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance         | NO           | NO   | NO         | 
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
6 rows in set (0.00 sec)

En caso que lo soporte, podemos escoger la tabla que nos interese descartar:

mysql> select count(*) from vpopmail.vlog;
+----------+
| count(*) |
+----------+
|  1157911 | 
+----------+
1 row in set (0.01 sec)

Y le hacemos un ALTER TABLE indicando que cambiamos al storage engine BLACKHOLE:

mysql> ALTER TABLE vpopmail.vlog ENGINE=BLACKHOLE;
Query OK, 1157911 rows affected (3.87 sec)
Records: 1157911  Duplicates: 0  Warnings: 0

Esto eliminará todos los registros, liberando el espacio y manteniendo la tabla vacía:

mysql> select count(*) from vpopmail.vlog;
+----------+
| count(*) |
+----------+
|        0 | 
+----------+
1 row in set (0.00 sec)

Cada vez que la aplicación haga un INSERT, el storage engine li indicará que ha ido bien, però en realidad estará descartando silenciosamente los datos.

One comment to “Engine blackhole de MySQL”

  1. Otro uso que se le suele dar es para montar una especie de “proxy” entre el maestro y el esclavo. De esta forma si un maestro tiene muchos esclavos conectados y esto afecta al rendimiento lo que se hace es:

    Crear un nuevo slave con las tablas en blackhole.
    Conectar este “proxy” al master.
    Conectar el resto de slaves al proxy.

    Así reduces la carga en el master, que solo tendrá un slave.

    Es importante recalcar que el uso de engines como blackhole en entornos de producción no es del todo recomendable. Todo lo que no sea InnoDB no está realmente bajo desarrollo (MyISAM, backhole, merge, federate, archive…) por lo que te expones a bugs.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>