我正在为使用 DataFlame 网络托管的客户创建一个简单的数据库备份解决方案。
网络托管帐户提供对 cron 的访问权限,但不提供对 shell 的访问权限。
我有一个创建定期备份的数据库备份脚本,我想自动删除那些超过 N 天的备份。
我尝试使用
find -v $backup_dir -mtime +$keep_days -name "*db.tar.gz" -delete
但是执行脚本的用户没有运行的权限find
。
您能建议如何在不使用find
命令的情况下实现这一点吗?
答案1
一个 hack-ish 想法可能是将自纪元以来的天数(即date +%s
除以 86400)乘以 $keep_days 后的结果合并到文件名称中。
在这种情况下,您不必删除较旧的备份文件。一旦自纪元以来的天数模 $keep_days 数字再次出现,您只需覆盖旧文件即可。
像这样:
#!/bin/bash
keepdays=60
epochdays=$(expr $(date +%s) / 86400)
backupindx=$(expr $epochdays % $keepdays)
backupfile=/path/to/backup/file.${backupindx}.db.tgz
因此,今天,即 2012 年 3 月 27 日,您将拥有备份文件 file.7.db.tgz,它将在 60 天后被覆盖。
答案2
这是我根据@cjc 的回答最终使用的脚本的删节版。
#!/bin/sh
# Script to backup ... database.
#
# A rolling backup is used. The size of period backed up is configurable.
# The period size is expressed in terms of an arbitary time unit "timeunit".
#
# Files are saved with format:
# <date>-...-<index within period>.sql.tar.gz
#
# Author: Calum J. Eadie
### Configuration
backup_dir=/home/..../backups
# The size of a timeunit. Eg. 300 for a timeunit that is 5 minutes long.
seconds_per_timeunit=$(expr 60 \* 60 \* 6) # 6 hours
# The size of backup period in timeunits.
keep_timeunits=$(expr 4 \* 30) # 30 days
### Script
# Form files names
date_string=`date +%Y-%m-%d-%H-%M-%S`
# Time since unix epoch in timeunits
epoch_timeunits=$(expr $(date +%s) / $seconds_per_timeunit)
# Index unique to timeperiod.
backup_index=$(expr $epoch_timeunits % $keep_timeunits)
raw=$backup_dir/$date_string-...-$backup_index.sql
compressed=$raw.tar.gz
# Remove old backup
rm -v $backup_dir/*-...-$backup_index.sql.tar.gz
# Create new backups
mysqldump -u ... -p... --databases ... --add-drop-database --add-drop-table > $raw
tar czf $compressed $raw
rm $raw
答案3
您确定您无权访问find
?还是它不在路径中?尝试以 身份运行它/usr/bin/find
,看看是否适合您。
如果这不起作用,你就陷入困境了。如果find
没有,而且你又无法访问 shell,你就不知道该怎么办了是可用。如果 Perl 可用,那么执行上述任务将是一个相当简单的 perl 脚本。仅使用 shell ……我可能会尝试类似这样的操作:
ls -t /backup_dir/*.db.tar.gz | sed "1,5d" | xargs rm -f
在哪里5是您想要保留的天数(根据需要修改)。
简短说明:ls -t
列出目录,按时间排序(最新文件在前)。指示sed "1,5d"
从sed
输入中删除前 5 行(对应于我们的 5 个最新文件)。最后,xargs
合并列表并指示rm
删除它们。
答案4
您说您没有 shell 访问权限。假设您指的是没有交互式 shell 访问权限,则此 Bash 脚本会在 3 天内递归删除数据库 tarball(计算方法是取当前日期并减去 3 天的秒数,然后将其与 tarball 的 mod 时间进行比较)。
#!/bin/bash
for linkname; do
if [[ -d "$linkname" ]]; then
"$0" "$linkname"
elif [[ "$linkname" =~ '^.*db\.tar\.gz$' ]]; then
if (( $(stat --format=%y "$linkname") < ( $(date +%s) - 259200) )); then
rm -f "$linkname"
fi
fi
fi