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.
Respuestas:
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.
fuente
mysqldump
causará que se mantenga un bloqueo largo o que las tablas no estén sincronizadas.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:
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.
fuente
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.
fuente
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.
fuente
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.
fuente
cron.d / mysql_dump:
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.
fuente
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.
fuente
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.
fuente