Mysqlhotcopy

12 Octubre 2011 at 11:29 by Adrián Pérez

Hot CopyPara realizar backups de bases de datos MySQL, se suele usar el comando mysqldump. Este comando, se encarga de generar las consultas necesarias para recrear toda la estructura de tablas y su contenido, a base de sentencias SQL. Sin embargo, este comando, puede resultar muy lento, para bases de datos grandes.

Si se quiere hacer un backup de una base de datos con tablas MyISAM, desde la propia documentación oficial de MySQL se insta a usar mysqlhotcopy en lugar de mysqldump:

"If you are doing a backup on the server and your tables all are MyISAM tables, consider using the mysqlhotcopy instead because it can accomplish faster backups and faster restores"
Fuente: aquí

Mysqlhotcopy, sin embargo, tiene una serie de requisitos que no tiene mysqldump, en cuanto a privilegios del usuario que ejecuta el comando. Concretamente, se requieren:

  • Permisos de SELECT sobre las tablas de la base de datos
  • Permisos de LOCK TABLES
  • Permisos de RELOAD

Se puede crear un usuario de backup con estos permisos, con tal de que el usurario se use únicamente para tareas de copias de seguridad, sin necesidad de otorgarle permisos adicionales.

mysql> create user ‘backup’@'localhost’ identified by ‘mipassword’;
mysql> grant select on basededatos.* to ‘backup’@'localhost’ with grant option;
mysql> grant lock tables on basededatos.* to backup@localhost;
mysql> grant reload on *.* to backup@localhost;

El usuario backup quedará entonces con los siguientes permisos:

mysql> show grants for backup@localhost;
+---------------------------------------------------------------------------------------+
| Grants for backup@localhost |
+---------------------------------------------------------------------------------------+
| GRANT RELOAD ON *.* TO 'backup'@'localhost' IDENTIFIED BY PASSWORD '7363gd5' |
| GRANT SELECT, LOCK TABLES ON `basededatos`.* TO 'backup'@'localhost' |
+---------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Con este usuario, ya se podrá ejecutar el comando mysqlhotcopy sobre la base de datos 'basededatos', tal y como sigue:

mysqlhotcopy basededatos --user=backup --password=mipassword /destino

Las primeras ejecuciones han reducido el tiempo del backup de 20 minutos (realizado con mysqldump) a poco más de 1 min 30 segundos, aunque también es verdad que los backups realizados con mysqlhotcopy, ocupan el doble que los resultantes de usar mysqldump, una vez comprimidos ambos.

Flickr! Foto por Eric Lim Photography