He encontrado varios sitios que hablan de hacer exactamente esto, pero me faltan algunos detalles importantes. Los pasos generales son
- correr
FLUSH TABLES WITH READ LOCK
- Tome la instantánea de ZFS
- correr
UNLOCK TABLES
Varias fuentes informan que InnoDB, que estoy usando, en realidad no respeta a FLUSH
. El manual de usuario de MySQL señala que hay una FLUSH TABLES...FOR EXPORT
variante para usar con InnoDB, pero eso requiere especificar cada tabla individualmente, en lugar de hacer una copia de seguridad de toda la base de datos. Prefiero evitar especificar cada tabla individualmente porque hay una posibilidad decente de que la lista de tablas no esté sincronizada con las tablas que realmente existen.
El otro problema que tengo es que planeé hacer algo así mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK"
. Sin embargo, esto cierra el bloqueo inmediatamente después de que finaliza la sesión. Esto tiene sentido, pero también es bastante molesto ya que necesito mantener el bloqueo de lectura cuando tomo mi instantánea.
Mi otra idea es hacer una copia de seguridad en caliente usando una herramienta como Percona XtraBackup y tomar instantáneas de la copia de seguridad, pero preferiría no pagar el costo de escribir todos mis datos en una segunda ubicación solo para capturarla.