¿Cómo hago una copia de seguridad de una base de datos mysql, pero con baja prioridad?

15

Quiero hacer una copia de seguridad de una base de datos, pero durante el día cuando hay carga en el servidor. Es vital que la copia de seguridad no afecte a Apache y otras bases de datos que se ejecutan en el mismo servidor.

Debería ser posible usar el comando mysqldump , pero ejecute el comando con baja prioridad.

¿Cómo puedo hacer esto?

Actualización: Parece que simplemente usar nice con mysqldump no funciona ya que mysqldump genera un nuevo proceso.

andyuk
fuente
¿Has mirado en mysqlhotcopy?
@fsb ¿Cómo soporta mysqlhotcopy lo que quiere el OP?
Tomás

Respuestas:

8

Si tiene un servidor adicional disponible que pueda hacer frente a la carga de escritura de su servidor, puede configurar la replicación en ese servidor y luego realizar una copia de seguridad desde el servidor esclavo. Esto también tiene la ventaja de que puede detener la replicación mientras realiza la copia de seguridad y obtener una instantánea consistente de sus datos en todas las bases de datos, o todas las tablas en una base de datos sin afectar el servidor de la base de datos. Esta es la configuración que siempre recomiendo para hacer una copia de seguridad de MySQL si tiene los recursos.

Como una ventaja adicional, ahora tiene un esclavo de solo lectura que puede usar para consultas lentas de larga duración.

David Pashley
fuente
Desafortunadamente, parece que esta opción es la que funciona más, pero supongo que es la única opción real si quiero un impacto mínimo en el servidor principal.
andyuk
2
Es casi la única forma de obtener una copia de seguridad inmovilizada correctamente si no desea afectar las operaciones. Dado que la desaceleración mysqldumpcausará que se mantenga un bloqueo largo o que las tablas no estén sincronizadas.
Dan Carley
15

Andy, supongo que ya has tenido tiempo de sobra para encontrar una solución. Recientemente se me ocurrió una solución para esto que me funciona muy bien en tsheets , y pensé que la compartiría.

cstream es una herramienta de manejo de flujo de propósito general como UNIX dd, generalmente utilizada en tuberías construidas por línea de comandos. Lo que hace que cstream sea útil para nosotros es que le permite especificar el ancho de banda máximo para todas las entradas. Esto significa que puede limitar el disco IO de su comando mysqldump con un comando simple como este:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

Suponiendo que está haciendo una copia de seguridad de una base de datos que usa todas las tablas de InnoDB, el comando anterior es seguro (no afectará otras consultas) y hará su mysqldump mientras limita sus lecturas de disco a solo un megabyte por segundo. Ajuste el ancho de banda con el parámetro -t a cualquier valor que permita a su entorno realizar la copia de seguridad sin afectar la experiencia de su cliente.

Brandon
fuente
¡Acabo de probar y funciona como un encanto! ¡Gracias por compartir Brandon!
sucotrónico
4

FWIW también deberías poder hacer esto con pv ( http://linux.die.net/man/1/pv )

mysqldump --single-transacción --quick -u -p | pv --rate-limit 1m> destino (o | nc o | tar cfj backup.bz2 -)

Lo bueno de esto son las diversas opciones para monitorear el progreso y la opción -R que le permite pasar opciones a un proceso que ya se está ejecutando, por ejemplo; --rate-limit para alterar la velocidad de transferencia.

alex.pilon
fuente
1

si usa innodb, puede probar xtrabackup con la opción --throttle .

también puedes mirar ionice y ejecutar mysqldump con él.

o tal vez desee habilitar el registro binario en mysql y ejecutar el volcado completo una vez por semana / noche, mientras copia los registros de bin en una ubicación segura cada 1-2 horas. y ... el esclavo de solo lectura para fines de copia de seguridad también es una opción.

pQd
fuente
0

Si lo está ejecutando en Linux u otra variante * nix, puede hacerlo con lo siguiente:

agradable -n ## mysqldump

Esto le dará una menor prioridad de programación. El rango de prioridad de programación de -20 (prioridad más alta) a 19 (prioridad más baja) el valor predeterminado para nice es 10 si se omite el argumento -n.

Kevin K
fuente
0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice para prioridad de E / S y agradable para prioridad de CPU.

Ejecute vmstat 5, verifique la columna que dice WA. Un valor alto significa que la CPU está esperando E / S. Use ionice, si es solo carga de CPU, use nice.

Respuesta a la actualización:

Parece que tienes razón. Llama a mysql que no se nota. Supongo que podría usar renice para esto y establecer el buen valor después de que se ejecute.

Sin embargo, no tengo una base de datos lo suficientemente grande como para volcar un cajero automático para crear un script útil para usted.

La replicación, como sugiere su enlace, es un camino a seguir. Replicar, detener y volcar, en host host.

artifex
fuente
0

Ponga sus datos de MySQL en un LV, y use un trabajo mylvmbackup que tome una instantánea del LV y bloquee los archivos de datos de MySQL. De esta manera, no bloquea las tablas, minimizando el impacto en sus aplicaciones con solo la carga de E / S.

rodjek
fuente
0

Siempre puede intentar no ejecutarlo durante las horas pico. Independientemente de la prioridad que utilice, el volcado aún requerirá un bloqueo en todas sus tablas.

Peter
fuente
Eso no es cierto: si las tablas son InnoDB, no se coloca ningún bloqueo para su lectura.
dr01