Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 是否将时间添加到mysqldump cron作业?_Unix_Cron_Mysqldump_Cron Task - Fatal编程技术网

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