如何在不覆盖旧备份的情况下进行此备份?这是我制作的 crontab:
* 2 * * * /opt/bitnami/mysql/bin/mysqldump -u root -password--databases BDname>~/Backup/DBname
答案1
您可以简单地写入带日期标记的转储文件:
* 2 * * * /opt/bitnami/mysql/bin/mysqldump -u root -password--databases BDname >"$HOME/Backup/DBname_$(date +\%F).sql"
date +%F
将在表格上生成一个日期YYYY-MM-DD
。必须%
在 crontab 条目中用反斜杠转义,因为%
那里有特殊含义。
生成的转储文件名今天将会DBname_2017-10-06.sql
。
如果将转储命令放入其自己的脚本中并进行安排,您将获得更易于管理的操作。这个 crontab 条目是当某些事情发生时的边界情况轻微地对于 cron 作业来说太“不简单”。
我倾向于在交互式 shell 之外的所有地方使用$HOME
而不是主目录,主要是因为它不充当变量,并且在脚本中更具描述性,或者像这里一样,在 crontab 中。参见示例~
~
$HOME
为什么波形符 (~) 不在双引号内展开?
如果您还需要清理旧的数据库备份,请参阅以下问题的答案删除 X 天以上之前的文件
这可以作为单独的 cron 作业来完成,或者您可以将两个操作(备份 + 清理)合并在一个脚本中并安排该脚本(我会这样做)。
答案2
如果您编写一个脚本来管理与数据库备份相关的所有步骤,您可以将数据时间戳应用于您的备份名称,您可以删除旧备份以将空间使用量保持在最低限度,记录活动。您需要做的就是调用备份脚本。否则,您可能必须为您想要运行的每个不同命令将不同的行放入 crontap 中。更有效的方法是使用简单的脚本。
[thebtm@server Backup] cat db_backup.sh
#!/bin/bash
BASE="~/Backup";
YESTERDAY=`TZ=$ENV{'TZ'}+30 date '+%Y%m%d'`
echo "****************"
date
echo Backing up Database
#find $BASE/DB/ -mtime +30 -type f -delete
/usr/bin/mysqldump -u root --password=password --routines dbname | bzip2 --best -c > $BASE/DB/dbname.$YESTERDAY.bz2
echo Done
date
然后设置 crontab 来运行脚本
# MySQL database backups for <dbname>
15 1 * * * ~/Backup/db_backup.sh >> ~/Backup/logs/db_backup.log 2>&1