我前一天写了一个脚本,把我的整个数据库和所有/ var / www文件备份到一个networking共享。 这是我第一次尝试在Linux下编写脚本,总而言之,我觉得这很酷。 我想添加一个function到我的备份脚本。 目前,脚本使用rsync来覆盖备份目标上的任何现有数据。 我希望它实际上创build一个独特的,完整的备份,每次运行。 现在我每天晚上都要运行。 但是,我只希望同时进行15个并发完整备份 – 所以一旦达到15个备份,我希望它开始删除较旧的备份。 任何人都可以指向正确的方向吗?
这是我目前的脚本:
#!/usr/bin/env bash # Mount the share smbmount //address/folder /mnt/folder -o credentials=/root/.smbpasswd # Synchronize the Web folder rsync --delete -C -v -a -r /var/www /mnt/folder # Create a backup of all databases mysqldump -uuser -ppassword --all-databases | gzip -9 > /root/backup/Databases.sql.zip # Copy the backup to the backup folder cp /root/backup/Databases.sql.zip /mnt/folder/Databases.sql.zip echo "Backup complete!"
不要重新发明轮子 – 使用dirvish !
mv Databases.sql.zip sql-backup-`date +%Y-%m-%d`.zip find *.zip -mtime +15 -exec rm {} \;
第一行将邮编名称根据当前date更改为名称,第二行删除所有大于15天的邮编。
生成每周轮换的文件名的一种方法是使用date来获取星期几的名称或号码:
TODAYS_BACKUP=$(date +'Databases-%a.sql.gz') mysqldump --all-databases | gzip -9 > /root/backup/$TODAYS_BACKUP
那样的话,在星期一备份之前说,Databases-Sun.sql.gz是昨天的备份,Databases-Sat.sql.gz就是前天的那个,Databases-Mon.sql.gz就是从一周前备份。 (另一种思考的方法是:Databases-XXX.sql.gz来自上一个 XXX。)
在今天的备份之后,Databases-Mon.sql.gz将被覆盖。
这比未知的解决scheme强大一点,因为如果由于某种原因没有备份一周,他的(?)解决scheme将删除所有的备份,而这种解决scheme,他们保持不变。
要每30天左右轮换一次,可以使用%d作为十进制数。 (找出这些神秘的%escapes在手册页中对strftime意味着什么。)
要每15天轮换一次,那么…你可以使用这个黑客:
date +'%s 86400 / 15 %% p' | dc
它计算自epoc以来的日子,并将剩余时间除以15。
缺点:1)看起来很复杂,2)不会给你一个低于10的领先0 …正如我所说:这是一个黑客。
一方面请注意:不要将密码放在脚本中,在备份运行时可以从进程表中读取密码! 至less把它放在〜/ .my.cnf中,用适当的文件权限来保护它!
第二方面说明:使用gzip压缩的文件的正确后缀是.gz 。 .zip是用WinZip,7zip等压缩的文件
第三方注意:如果smbmount出于某种原因失败(也许服务器closures),脚本会将备份写入挂载点所在的分区,可能会填满根分区。 防止这种情况的一个好办法是调整安装点000。
date计算
这里是如何做一个前导零跳跃的date黑客:
rotation="0$(( ( $(date +%s) / 86400 ) % 15 ))" # add a leading zero rotation="${rotation: -2}" # keep the rightmost 2 chars
正如你所看到的,没有必要使用dc 。
rsync旋转
与其他人为数据库备份指示的一样,您可以使用rsync创build多个Web目录备份:
rsync -Carv /var/www /mnt/folder/backup${rotation}/
这将创build一个名为“00”到“14”的15个备份轮换的目录。 你可以做:
rm -rf /mnt/folder/backup${rotation}
事先清除它。