Python 如何创建mysql数据库的增量备份

Python 如何创建mysql数据库的增量备份,python,mysql,linux,backup,Python,Mysql,Linux,Backup,我的linuxcentos 6.4服务器带有mysql5.6 我有一个cron的工作,可以像这样每小时备份一次mysql数据库 它是用python编写的 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, file

我的linux
centos 6.4
服务器带有
mysql5.6

我有一个cron的工作,可以像这样每小时备份一次mysql数据库

它是用python编写的

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))
问题是很少有数据被篡改,但每次我都要备份所有数据库24次,这占用了太多的空间

最好的选择是什么

有没有办法进行增量备份,以便我每周对数据库进行一次完整备份,然后只进行增量备份


我希望为单独的数据库创建单独的文件,而不是所有的mysql这样,如果我需要恢复单个数据库,那么我也可以这样做

一种黑客方法可能是,一旦您将完整的数据库添加到一个文件中。将其与每周备份进行比较,并将修补程序存储在磁盘上。当您想要检索时,只需对每周备份应用diff并获取完整的db

储存

  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
要检索:

  cp weeklyFile hourlyFile
  patch hourlyFile <hourlyFile.patch
cp每周文件小时文件

patch hourlyFile通过在shell脚本中循环所有数据库,可以实现每db一个文件:


对于减少空间,ajain建议的差异是一个好主意,而使用rsnapshot或obnam等工具对备份进行重复数据消除则是另一个好主意。rsnapshot和obnam(may)要求文件(部分)相同,以节省值得注意的空间。只要不是所有的东西都改变了,diff就可以应付一定量的变化,因为没有“order by”或一些id发生了变化。

因为您关心的是空间而不是速度,所以您可以选择如下模式: 仅保留过去24小时的每小时备份。 将每个工作日的午夜备份保留为当天备份。 每周—将备份归档到脱机存储

通过一些谨慎的文件名选择,几乎可以肯定大部分操作都是自动化的,例如,午夜备份被称为Backup\u Mon,等等,其他时间备份\u 00,Backup\u 01\u 00,等等

只需在每次备份开始时重命名文件,就可以进行更小的最新备份、上一次备份、上一次上一次备份


您也可以考虑使用zip,(Python可以为您做什么),以减小文件大小。

您将找不到更好的解决方案,下面是我自己创建的脚本,并已在许多生产服务器上使用。我使用了Python3

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)

要记住的事情

  • cmd4命令执行scp。您必须启用从服务器到远程服务器的基于密钥的登录,否则将询问您远程服务器的密码,而脚本无法提供该密码
  • 要启用基于密钥的登录,请参见以下内容:

  • 脚本的第一行使其可执行,因此对于计划备份,您只需要在crontab中输入完整路径,例如,如果您想每十分钟运行一次脚本,请在crontab中执行以下输入

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

  • 通过chmod 777或任何您想要的权限使脚本可执行。此脚本适用于linux


  • 这对我来说很好,人们在生产中使用了这些东西吗?我得到了一个错误:
    diff weeklyFile hourlyFile>hourlyFile.patch diff:memory expired
    我不知道这是如何增量的。您似乎每次都只是复制整个数据库转储。此外,“你不会找到更好的解决方案”是一个非常有力的说法,如果可能的话,需要理由。