¿Cómo puedo crear copias de seguridad incrementales de bases de datos mysql?

Tengo un servidor linux centos 6.4 con mysql5.6

Tengo el trabajo cron para hacer copias de seguridad de base de datos mysql cada hora como esta

Esta en piton

 os.popen("mysqldump -u %s --password=%s -h %s -e --opt --skip-lock-tables --skip-extended-insert -c %s | gzip -c > %s.gz" % (username, password, hostname, database, filename)) 

El problema es que muy pocos datos se gestionan, pero cada vez que tengo que hacer una copia de seguridad de todas las bases de datos 24 veces, lo que ocupa demasiado espacio.

¿Cuál es la mejor alternativa para eso?

¿Hay alguna forma de realizar copias de seguridad incrementales de modo que tome 1 copia de seguridad completa de la base de datos de cada semana y luego solo copias de seguridad incrementales?

Quiero tener archivos separados para bases de datos separadas, no todo mysql, de modo que si necesito restaurar una base de datos única, también puedo hacerlo.

Una forma de piratería puede ser, una vez que haya llevado la base de datos completa a un archivo. Diferencie la copia de seguridad semanal y almacene el parche en el disco. Cuando desee recuperar, simplemente aplique diff a la copia de seguridad semanal y obtenga una db completa

Almacenar

  mysqldump -u $USERNAME --password=$PASSWORD -h $HOSTNAME -e --opt --skip-lock-tables --skip-extended-insert -c $DATABASE >hourlyFile diff weeklyFile hourlyFile >hourlyFile.patch rm hourlyFile 

Para recuperar:

  cp weeklyFile hourlyFile patch hourlyFile  

No estoy realmente consciente de qué tipo de salida da sqldump. si el texto de arriba funcionara De lo contrario, bsdiff puede ayudarlo aquí: http://www.daemonology.net/bsdiff/

Ya que su preocupación es el espacio en lugar de la velocidad, siempre puede optar por un patrón como: Solo mantenga la copia de seguridad por hora durante las últimas 24 horas. Mantenga la copia de seguridad de medianoche para cada día de la semana como la copia de seguridad de esos días Semanal: archiva las copias de seguridad en el almacenamiento sin conexión.

Gran parte de esto podría ser casi completamente automatizado por algunas opciones de nombres de archivos cuidadosos, por ejemplo, las copias de seguridad de medianoche se llaman Backup_Mon, etc., otras horas, Backup_00_00, Backup_01_00, etc.

Usted podría optar por un latest_backup, prev_backup, prev_prev_backup aún más pequeño simplemente cambiando el nombre de los archivos al inicio de cada copia de seguridad.

También podría considerar usar zip, (lo que Python puede hacer por usted), para reducir el tamaño del archivo.

se puede lograr un archivo por base de datos haciendo un bucle sobre todas las bases de datos en un script de shell: https://stackoverflow.com/a/10867549/2536029

para la reducción de espacio, las diferencias según lo sugerido por una visita son una buena idea, o la deduplicación de las copias de seguridad con herramientas como rsnapshot u obnam son otra. rsnapshot y obnam (podrían) requieren que (partes de) los archivos sean idénticos para ahorrar una cantidad considerable de espacio. diffs puede hacer frente a cierta cantidad de cambios siempre y cuando no todo haya cambiado porque no hay “orden por” o algunas identificaciones cambiadas.

No encontrará una mejor solución, a continuación se encuentra un script creado por mí mismo y se ha utilizado en muchos servidores de producción. He utilizado python 3.

 import os import time import datetime date1 = time.strftime('%Y%m%d%H%M%S') f = open('/root/mypython/dblist.txt') # this files contains the name of databases line = f.readline() f.close() words = line.split() for word in words: cmd = "mysqldump -u root -pabhishek {0} > {0}_{1}.sql".format(word, date1) # takes backup in the same location as script cmd2 = "zip {0}_{1}.zip {0}_{1}.sql".format(word, date1) # zips the backup just taken cmd3 = "rm -f {0}_{1}.sql".format(word, date1) # deletes the .sql backup just taken. after this step only .zip backup remains. remove this line if u need both .sql and .zip cmd4 = " scp {0}_{1}.zip root@192.168.1.105:/home/dev_test ".format(word, date1) os.system(cmd) os.system(cmd2) os.system(cmd3) if os.system(cmd4)== 0: result = "Backup Successful" print(result) 

Cosas para recordar

  1. El comando cmd4 hace un scp. Debe habilitar el inicio de sesión basado en clave desde su servidor al servidor remoto, de lo contrario se le pedirá la contraseña del servidor remoto, que el script no puede proporcionar.

Para habilitar el inicio de sesión basado en clave, vea a continuación:

http://pc2solution.blogspot.in/2013/03/how-to-enable-key-based-login-in-linux.html

  1. La primera línea del script lo hace ejecutable, por lo tanto, para progtwigr la copia de seguridad, solo necesita ingresar la ruta completa en crontab, por ejemplo, si desea ejecutar este script cada diez minutos, siga la entrada en crontab

    * / 10 * * * * /home/myscript.py

  2. Haga el script ejecutable por chmod 777 o el permiso que desee. Este script funciona para Linux.