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

时间:2013-07-14 08:36:14

标签: python mysql linux backup

我有centos 6.4

的linux mysql5.6服务器

我有像这样的每小时mysql数据库备份的cron工作

它在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次备份所有数据库,这需要太多空间。

什么是最佳替代

是否有任何方法可以进行增量备份,以便我对数据库evry周进行1次完整备份,然后只进行增量备份。

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

4 个答案:

答案 0 :(得分:6)

一旦将完整的数据库用于文件,一种黑客方式可能就是这样。将其与每周备份区分开来并将补丁存储在磁盘上。如果要检索,只需将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

我真的不知道sqldump给出了什么样的输出。如果上面的文字可行。否则bsdiff可以在这里帮助你:http://www.daemonology.net/bsdiff/

答案 1 :(得分:1)

由于你关心的是空间而不是速度,你总是可以选择以下模式: 仅保留过去24小时的每小时备份。 保留当天备份的每个工作日的午夜备份。 每周 - 将备份存档到离线存储。

通过一些仔细的文件名选择,很多情况下几乎可以通过大部分自动化 - 例如午夜备份称为Backup_Mon等,其他时间为Backup_00_00,Backup_01_00等。

你可以通过在每次备份开始时重命名文件来获得更小的latest_backup,prev_backup,prev_prev_backup。

你也可以考虑使用zip(python可以为你做),以减少文件大小。

答案 2 :(得分:0)

每个数据库可以通过循环shell脚本中的所有数据库来实现每个数据库一个文件:https://stackoverflow.com/a/10867549/2536029

对于空间缩减,ajain建议的差异是一个好主意,或者使用rsnapshot或obnam等工具对备份进行重复数据删除是另一种方法。 rsnapshot和obnam(可能)要求文件的(部分)相同以节省大量空间。差异可以应付一些变化,只要没有一切都改变,因为没有“顺序”或某些ID移位。

答案 3 :(得分:-1)

您将找不到更好的解决方案,下面是我自己创建的脚本,并且已在许多生产服务器上使用。我用过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)

要记住的事情

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

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

    1. 脚本的第一行使其可执行,因此,为了安排备份,您只需要在crontab中输入完整路径,例如:如果要每隔十分钟运行一次此脚本,请在crontab中输入

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

    2. 使脚本可以通过chmod 777或您想要的任何权限执行。这个脚本适用于linux。