Forma óptima de hacer copias de seguridad de MySQL para bases de datos bastante grandes (MyISAM / InnoDB)

8

Actualmente tenemos una robusta base de datos MySQL que ejecuta un par de sitios web basados ​​en Django de alto tráfico, así como algunos sitios web de comercio electrónico de tamaño decente. Como resultado, tenemos una gran cantidad de bases de datos grandes que usan tablas InnoDB y MyISAM.

Lamentablemente, recientemente hemos topado con un muro debido a la cantidad de tráfico, por lo que he configurado otro servidor maestro para ayudar a aliviar las lecturas / copias de seguridad.

Ahora, por el momento, simplemente uso mysqldump con algunos argumentos y se ha demostrado que está bien ... hasta ahora. Obviamente mysqldump es un método lento y rápido, sin embargo, creo que hemos superado su uso. Ahora necesito una buena alternativa y he estado buscando utilizar la utilidad Maatkits mk-parallel-dump o una solución de instantánea LVM.

Sucinta versión corta:

  • Tengo una base de datos MySQL bastante grande que necesito hacer una copia de seguridad
  • El método actual que usa mysqldump es ineficiente y lento (provoca problemas)
  • Buscando algo como mk-parallel-dump o instantáneas LVM

Cualquier recomendación o idea sería apreciada, ya que tengo que volver a hacer cómo estamos haciendo las cosas, prefiero hacerlo correctamente / lo más eficiente :).

WinkyWolly
fuente

Respuestas:

5

He tenido buen éxito con la replicación MySQL y los tarballs nocturnos. Para db más pequeño, la base de datos mysql y el esquema, uso una combinación de scripts diseñados para usar mysqlhotcopy y mysqldump.

InnoDB hot backup es un gran producto comercial, pero no estoy seguro de cómo maneja tablas mixtas en la misma base de datos. La recomendación de pQd para XtraBackup puede ser buena para comparar con esto.

A otros les gustan las instantáneas de LVM y yo diría que definitivamente es algo a considerar. En definitiva, una combinación de soluciones probablemente sería lo mejor.

También es notable que este es un tema viejo. Entre el libro de MySQL de alto rendimiento , el manual de MySQL y las preguntas anteriores de ServerFault, esto se ha agotado en general. Ver:

Warner
fuente
+1; con myisam nunca se sabe si tiene una copia de seguridad lógicamente coherente [tomada por lvm / mysqldump / from lave] o no. tal vez si la aplicación cambia solo durante el horario comercial (de lo contrario, puede volcarla de forma segura por la noche, de lo contrario) nunca está seguro y ningún método ayudará.
pQd
Creo que tienes razón al mezclar soluciones. Como se menciona en la respuesta de pQd, probablemente tomaré las instantáneas de LVM y buscaré en la utilidad xtrabackup (dice que puede manejar tablas mixtas). Investigué el respaldo en caliente de InnoDB, sin embargo, siempre soy uno para proyectos de código abierto. Gracias por las referencias, busqué en 2 de ellas, pero las respuestas son bastante genéricas / no abordan los problemas que tengo / se refieren a bases de datos más "normales" y "mundanas".
WinkyWolly
4

xtrabackup : al menos para innodb.

pQd
fuente
Interesante, sin embargo, me gustaría una solución más elegante para no preocuparme por mi combinación de tablas InnoDB / MyISAM.
WinkyWolly
xtrabackup viene con un script que puede ayudarte a tomar copias de seguridad de myisams también, pero revisa mi comentario en la publicación de Warner
pQd
Gracias, parece que podría ir en esta dirección y mezclar instantáneas LVM por si acaso. Indica que también puede "manejar" tablas MyISAM a través del script "innobackupex". Supongo que le daré un giro y veré exactamente qué sucede.
WinkyWolly
3

La forma más común de resolver este problema es configurar otro servidor MySQL, que incluso puede estar en la misma máquina, y ejecutar la replicación maestro / esclavo. Luego puede realizar la copia de seguridad en el esclavo, con cero impacto en el maestro.

John Gardeniers
fuente
0

En EC2 EBS, ahora estoy usando xfs_freeze. Estoy buscando posiblemente cambiarme a xtrabackup en algún momento, pero cuando le hice una primera prueba, tenía mucha, mucha CPU.

usuario5336
fuente
Desafortunadamente, solo uso XFS en servidores de medios en este momento, así que esa no es una opción. ¿Qué tipo de experiencia (aparte de hambre de CPU, tal vez más detalles) tuvo con xtrabackup? ¿Estaba haciendo copias de seguridad de tablas InnoDB puras o una mezcla?
WinkyWolly
Mi mayor duda fue que masticó la CPU durante aproximadamente 30 minutos a medida que se completaba (respaldando una base de datos de aproximadamente 35 GB de datos), haciendo que el servidor de la base de datos solo fuera marginalmente funcional, ciertamente no es algo que probablemente estaría ejecutando en un maestro de producción . De hecho, ya había convertido mis pocas tablas restantes de MyISAM a InnoDB parcialmente a los efectos de esto. Creo que probablemente estaría bien correr en un esclavo siempre que no haga que la replicación se quede sustancialmente atrás.
user5336
0

Si está ejecutando la replicación de una base de datos que se comparte entre aplicaciones, parece que hay una pregunta obvia sobre si puede mejorar el rendimiento de muchas cosas, incluidas las copias de seguridad, al dedicar los servidores de bases de datos a las aplicaciones. Compartido es bueno, hasta que no lo es.

Justin Alan Ryan
fuente
0

Si mantiene sus tablas MyISAM solo por motivos heredados (no se ha molestado en modificarlas), esto es lo que uso para solucionarlo fácilmente:

    mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name

Puede excluir e incluir bases de datos con la expresión regular awk, como solo dbs que comienzan con una letra minúscula en mi ejemplo anterior. Por supuesto, esto bloqueará las mesas durante el alter.

Luego use xtrabackup para copiar toda la base de datos directamente a otro servidor sin bloquear ninguna tabla o usar demasiada E / S de disco (después de configurar las claves ssh rsa):

innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/"

y luego puede hacer el paso de registro de aplicación completamente separado y ahorrar espacio en disco, E / S y CPU en el servidor de producción.

Howto's de Percona para usar xtrabackup

Puntilla
fuente