Unix 是否将时间添加到mysqldump cron作业?
以下工作:Unix 是否将时间添加到mysqldump cron作业?,unix,cron,mysqldump,cron-task,Unix,Cron,Mysqldump,Cron Task,以下工作: /usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date -I`.sql 结果是“完整备份”\u 2012-11-04.sql cron作业每分钟运行一次,但文件名每天仅运行一次。。。我想在文件名中也包括小时和分钟。。。。(最后,cron作业可能每小时左右运行一次
/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date -I`.sql
结果是“完整备份”\u 2012-11-04.sql
cron作业每分钟运行一次,但文件名每天仅运行一次。。。我想在文件名中也包括小时和分钟。。。。(最后,cron作业可能每小时左右运行一次)
所以约会-我工作。。。其他典型的日期选择似乎不起作用。。。是否有任何文件表明-I是有效的?如果是这样的话,该文档可能还有其他可用的选项。改用
日期+%Y-%m-%d\uh-%m-%S
(或任何其他格式):
已编辑
要避免来自CRON的电子邮件主题过长,请使用创建文件/home//mycron.sh
(文件名和位置只是一个示例):
确保您chmod+x/home//mycron.sh
此日期格式将输出:
full_backup_2012-11-05_08-49-19.sql
然后在cron中使用脚本的名称,即:
[cron parameters] /home/<your user>/mycron.sh
[cron参数]/home//mycron.sh
日期(1)命令有一个“+[格式]”选项。我相信您需要的选项是“%s”或“%N”选项,这将分别为您提供秒或纳秒。从MySQL的路径来看,我将假设您在Linux上。如果确实是这样,您可以找到手册页,它将为您提供更多详细信息。date-Iminutes
可能是一种方法,它使用ISO 8601格式。
有一些信息。虽然我的原始脚本可以工作,但类似这样的内容可能要简单得多:
mysqldump [options] | gzip -c > /backups/data-$(date +%a-%H00).sql.gz
这将专门保留7天的备份时间。它使用一周中的一天加上一小时来工作。所以它看起来像data-Mon-00.sql.gz
(周一午夜)。一周过后,以前的备份会被覆盖
如果您将cron设置为每6小时运行一次,您将得到最多28个备份(24/6)*7=28
要使用mysqldump获得一致的备份,您必须锁定表,因此这只能从副本或低容量服务器进行。mysqldump还生成一个完整的快照,因此每次备份都会有一个完整的快照,这可能会占用大量磁盘空间。对于大型数据库,这可能很快变得无法管理。您也可能不希望信任复制副本从中进行备份,因为复制副本还必须保持同步
更好的选择是。它是开源的,所以是免费的。它需要InnoDB表,并且能够在没有停机或锁定的情况下对主MySQL服务器进行热备份(无论如何,您不应该使用MyISAM)。它使用改进的InnoDB引擎和InnoDB的崩溃恢复功能来确保备份的一致性。它甚至对一个基本快照进行增量备份,因此您可以进行数百次备份,并使其占据单个快照的大小。它与MySQL、MariaDB、PerconaDB(MySQL的分支)以及InnoDB和XtraDB(在MariaDB和Percona中改进了InnoDB)一起工作
就我个人而言,我会坚持使用xtrabackup,甚至不会为mysqldump操心。您必须以命令行方式完成同样多的工作,而且您还可以从小型增量备份中获得额外的好处。即使在Galera集群中,也有一些工具可以自动使用xtrabackup
原文: 下面的脚本以“backup.sql.gz”为例,将其转换为类似backup-13Nov2012-01_30.sql.gz的内容,然后使用硬链接旋转文件
#!/bin/bash
###########################################################################
# snapshot
#
# Rotates snapshots of backups using hard links
#
# Keeps track of:
# - 48 hours of snapshots (48*60/interval)
# - 60 days worth of midnight snapshots
# - 24 months of snapshots from the 1st
# Ussage:
# snapshot /path/to/backup.sql.gz
# mysqldump ... | gzip -c | snapshot /path/to/backup.sql.gz
#
###########################################################################
if ! hash date 2> /dev/null; then
echo "-snapshot: date command not found" 1>&2
exit 1
fi
if ! hash ln 2> /dev/null; then
echo "-snapshot: ln: command not found" 1>&2
exit 1
fi
# Date Info
month=$(date +"%b")
day=$(date +"%d")
year=$(date +"%Y")
time=$(date +"%H_%M")
date=$(date +"%d%b%Y")
dateFirst=$(date --date="$month 01" +"%d%b%Y" 2> /dev/null)
# Test to see if we're using GNU date or BSD date
if [ "$dateFirst" == "" ]; then
dateFirst=$(date -v1d +"%d%b%Y")
back2date=$(date -v-2d +"%d%b%Y")
back2monthY=$(date -v-2m +"%b%Y")
back2year=$(date -v-2y +"%Y")
else
back2date=$(date --date="-2 day" +"%d%b%Y")
back2monthY=$(date --date="-2 month" +"%b%Y")
back2year=$(date --date="-2 year" +"%Y")
fi
if [ "$dateFirst" == "" ]; then
echo "-snapshot: Unknown version of date command." 1>&2
exit 1
fi
# Directories
filepath=$1
backup=$2
if [ "$filepath" == "" ]; then
echo "-snapshot: Expecting filename as first argument" 1>&2
exit 1
fi
if [ "$backup" == "" ]; then
backup=/backup
fi
if [ ! -d "$backup" ]; then
echo "-snapshot: Directory "$backup" doesn't exist" 1>&2
exit 1
fi
snapshots=$backup/snapshots
daily=$backup/daily
monthly=$backup/monthly
basename=${filepath##*/}
ext=${basename#*.}
basename=${basename%%.*}
filename=$basename-$date-$time.$ext
##############################
# Make new snapshot
##############################
if [ ! -d "$snapshots/$date" ]; then
mkdir -p "$snapshots/$date"
fi
if [ -t 0 ]; then
if [ ! -f "$filepath" ]; then
echo "-snapshot: '$filepath' doesn't exist" 1>&2
exit 1
fi
ln "$filepath" "$snapshots/$date/$filename"
else
cat > "$snapshots/$date/$filename"
fi
##############################
# Daily/monthly snapshots
##############################
if [ "$time" == "00_00" ]; then
if [ ! -d "$daily/$month$year" ]; then
mkdir -p "$daily/$month$year"
fi
ln "$snapshots/$date/$filename" "$daily/$month$year/$filename"
if [ "$day" == "01" ]; then
if [ ! -d "$monthly/$year" ]; then
mkdir -p "$monthly/$year"
fi
ln "$snapshots/$date/$filename" "$monthly/$year/$filename"
fi
fi
##############################
# Clean up old snapshots
##############################
if [ -d "$snapshots/$back2date" ]; then
rm -fr "$snapshots/$back2date"
fi
if [ -d "$daily/$back2monthY" ]; then
rm -fr "$daily/$back2monthY"
fi
if [ -d "$monthly/$back2year" ]; then
rm -fr "$monthly/$back2year"
fi
如果您想在crontab条目(而不是shell脚本)中完成这一切,下面介绍如何:
/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +\%F_\%R`.sql
文件名将输出为:full_backup_2017-08-18_17:52.sql
命令的关键更改如下:date+\%F\u\%R
注意:日期命令中的%必须在crontab中转义,否则可能会出现EOF错误。它将在命令行上工作,而不转义%s,但在crontab中不会。希望这能有所帮助。您好,我正在使用cPanel X,收到以下电子邮件:/bin/sh:-c:line 0:在查找匹配的“```/bin/sh:-c:line 1:语法错误:意外的文件结尾在我上一篇文章中,您可能希望删除新行和“\`反斜杠”。我把它们放在这里只是为了论坛的可读性。我正在编辑。是的,我删除了反斜杠。顺便说一句,在它发给我的电子邮件的主题行中,它最初写着“../public\u html/backups/full\u backup\ucode>date-I.sql”" 但现在它显示“../public\u html/backups/full\u backup\u”日期+“查看我的编辑。电子邮件的主题将不会被解释。您可以使用脚本将主题缩短(仅脚本的路径),而不是完整的命令。我的重点不是电子邮件主题有问题。问题是,
date-I
起作用,其他任何类型的日期格式都会出现错误。(我只在出现某种错误时收到一封电子邮件,因为通常没有错误,它会创建sql文件)hd1提到的date命令手册没有提到-I选项…我认为解决方案可以识别-I选项,但还包括其他选项。我使用的是cPanel X…顺便说一句,当前的日期选项是-I…我在手册页上似乎看不到该选项。我有一个cron作业每天运行两次,到目前为止,它添加了:完整备份\u 2012-11-14T00:00-0600.sql“我会检查它是否继续工作……我不知道为什么这个问题会结束。这似乎是一个很好的问题。
/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +\%F_\%R`.sql