Mejores prácticas para hacer una copia de seguridad de una base de datos MySQL

23

Recientemente descubrí que nuestros servidores web de producción que se ejecutan fuera de MySQL no se respaldan regularmente (o en absoluto). Estoy acostumbrado a hacer copias de seguridad de las bases de datos de SQL Server, pero no tengo mucha experiencia con las bases de datos MySQL. ¿Alguna práctica recomendada para usar 'mysqldump' o cualquier otra herramienta de respaldo de base de datos?

Probablemente cronometre el trabajo para que se haga todas las noches y luego haga una copia de seguridad de los archivos con mi sistema de copia de seguridad.

Gracias.

Valien
fuente

Respuestas:

29

Mejores prácticas para realizar copias de seguridad del servidor MySQL:

Replicación MySQL

Configuración de replicación en MySQL. Deberá configurar el servidor maestro y esclavo. Todas las lecturas de escritura en la base de datos podrían ir a su servidor esclavo. La ventaja de tener replicación es que puede realizar una copia de seguridad de su servidor esclavo sin interrumpir el servidor maestro. Su aplicación continuará funcionando en el maestro sin ningún tiempo de inactividad.

Usando MySQL Dump

Si su conjunto de datos es pequeño (me doy cuenta de que "pequeño" es un término relativo ... para calificarlo, digamos <10GB), entonces mysqldump probablemente funcionará muy bien. Es fácil, está en línea y es muy flexible. Solo algunas cosas que mysqldump puede hacer: hacer una copia de seguridad de todo o solo ciertas bases de datos o tablas, solo el DDL optimiza el volcado para una restauración más rápida, hace que el archivo sql resultante sea más compatible con otros RDBMS y muchas cosas más.

Sin embargo, las opciones más importantes están relacionadas con la consistencia de su copia de seguridad. Mis opciones favoritas son: - transacción única: esta opción proporciona una copia de seguridad consistente, si (y solo si) las tablas están usando el motor de almacenamiento InnoDB. Si tiene alguna tabla MyISAM que no sea de solo lectura, no use esta opción cuando realice una copia de seguridad. --master-data = 2: esta opción se asegurará de que su volcado sea consistente (haciendo un bloqueo de todas las tablas a menos que haya agregado la opción --single-transaction). La opción --master-data también registra la posición del registro binario en el archivo de volcado resultante (= 2 hace que esta línea sea un comentario en el archivo de volcado)

Nota final sobre mysqldump: tenga en cuenta que el tiempo de restauración puede ser significativamente más largo que el tiempo de copia de seguridad. Dependerá de varios factores, por ejemplo, cuántos índices tiene.

Instantánea de LVM

Para aquellos que tienen conjuntos de datos más grandes, una copia de seguridad física es el camino a seguir. Si bien podría realizar una copia de seguridad en frío (es decir, cerrar el servicio MySQL, copiar el directorio de datos, reiniciar el servicio), muchas personas no quieren tiempo de inactividad. Mi solución favorita son las instantáneas. Esto puede estar caliente (para InnoDB) o requerir un breve bloqueo (para MyISAM). No olvide incluir todos sus datos (incluya ib_logfiles). Lenz proporciona una buena utilidad para ayudar con esto: http://www.lenzg.net/mylvmbackup/

Usando MySQL Enterprise Backup

Ventajas de usar MySQL Enterprise Backup:

  • Las copias de seguridad "en caliente" de las tablas de InnoDB se realizan completamente en línea, sin bloquear la copia de seguridad solo de tablas o espacios de tablas particulares
  • Solo haga una copia de seguridad de los datos que han cambiado desde una copia de seguridad anterior
  • Copia de seguridad comprimida: ahorra almacenamiento hasta un 90% y muchos más.

Referencia: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html

Peter Venderberghe
fuente
7

Recomendaría configurar una réplica dedicada para usar como copia de seguridad. Esto le permitirá realizar cualquier tarea de copia de seguridad sin afectar la primaria. Como esto agrega complejidad a su arquitectura, querrá monitorear el retraso de la replicación para asegurarse de que todo funcione.

En cuanto al proceso real, tiene un par de opciones sin herramientas de terceros. Las instantáneas se pueden tomar utilizando el mysqldumpcomando (asumiendo que usted está utilizando InnoDB): mysqldump --all-databases --single-transaction > all_databases.sql. Dependiendo del tamaño de los datos, puede ser preferible cerrar MySQL y hacer una copia de seguridad de los archivos de datos directamente. Cuando se reinicia la réplica, reproducirá todos los eventos que el primario recibió en la duración en que estuvo inactivo. Si está utilizando MySQL Enterprise, la mysqlbackuputilidad hace esto.

Se pueden realizar copias de seguridad incrementales habilitando el registro binario en la réplica. Obviamente, esto solo registra eventos que mutan datos, por lo que deberá combinar esto con las instantáneas anteriores.

Rich Schumacher
fuente
3
+1 para --single-transactionpero no se olvide de agregar --events --routinesy siempre uso --triggerstambién, aunque está habilitado de forma predeterminada, ya que puede deshabilitarse en my.cnf. Yo diría que siempre es bueno usarlos como práctica estándar, independientemente de si actualmente tiene ese tipo de objetos en su base de datos o no.
Michael - sqlbot
Tenga en cuenta mysqldump: todas las bases de datos pueden desencadenar errores cuando tiene una configuración de tablas abiertas máximas bajas definida. así que vigila tu mysql.log. La replicación sería la mejor forma de respaldo
Raymond Nijland el
¿Cómo guardas copias históricas de los datos? (A menudo, un cliente querrá conservar un mes o más de copias de seguridad, y cuando un error de la aplicación corrompe los datos, los desarrolladores quieren una copia de la base de datos anterior al error).
RonJohn