我使用一组简单的 shell 命令来每天创建 mysqldump。该脚本由 cron 守护进程调用。看起来像:
presentdate="`date +%d-%m-%Y_%H:%M.%S`"
basedir="/var/db_my_backup"
mysqldump -u username -ppassword --all-databases |
gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz |
find -L $basedir/'*' -type f -mtime +7 exec rm -f {} \; |
chown -R user:group $basedir | (
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz.
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
cat
) | /bin/mail -s "Report from scheduled job for mysqldumps" root
我关心的是:我怎样才能让它变得更优雅?是否可以构建一个用于选择和重命名超过 7 天的文件的函数?我不喜欢使用 find 因为它会产生奇怪的警告,例如:
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
在这样的脚本中很难处理(至少对我来说)。
答案1
您删除旧备份的方法很好,在我看来比重命名文件更好。最丑陋的是长长的管道链,在您的示例中没有什么用处,但会使线路太长。我会使用{ ... }
这样的块来编写它:
presentdate="`date +%d-%m-%Y_%H:%M.%S`"
basedir="/var/db_my_backup"
{
mysqldump -u username -ppassword --all-databases | gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz
find -L $basedir/'*' -type f -mtime +7 -exec rm -v {} \;
chown -vR user:group $basedir
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz.
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
} 2>&1 | /bin/mail -s "Report from scheduled job for mysqldumps" root
接近2>&1
尾声的是在电子邮件中包含错误输出,如果您不想要,可以将其删除。我还添加了一些-v
标志以更加详细。
正如评论者所说,find
如果正确使用它,不会给出奇怪的错误。您的参数有错误find
,使用exec
而不是-exec
。为了获得正确的参数,请在阅读man find
.