2

我有linuxcentos 6.4服务器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 次,这会占用太多空间。

什么是最好的选择

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

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

4

4 回答 4

6

一旦您将完整的数据库保存到文件中,一种 hacky 方式可能是。将其与每周备份进行比较并将补丁存储在磁盘上。当您要检索时,只需将 diff 应用于每周备份并获得完整的数据库

储藏

  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/

于 2013-07-14T08:42:51.253 回答
1

由于您关心的是空间而不是速度,您总是可以采用类似的模式:仅保留过去 24 小时的每小时备份。将每个工作日的午夜备份保留为该天的备份。每周 - 将备份存档到离线存储。

通过一些谨慎的文件名选择,其中大部分几乎可以肯定是自动化的 - 例如午夜备份称为 Backup_Mon 等,其他时间称为 Backup_00_00、Backup_01_00 等。

您可以通过在每次备份开始时简单地重命名文件来获得更小的 latest_backup、prev_backup、prev_prev_backup。

您还可以考虑使用 zip(python 可以为您做的)来减小文件大小。

于 2013-07-14T09:00:35.447 回答
0

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

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

于 2013-07-14T08:53:10.170 回答
-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。您必须启用从您的服务器到远程服务器的基于密钥的登录,否则您将被询问远程服务器的密码,这是脚本无法提供的。

要启用基于密钥的登录,请参见下文:

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。

于 2013-07-14T14:28:10.390 回答