【问题标题】:Adding the time to mysqldump cron job?将时间添加到 mysqldump cron 作业?
【发布时间】:2012-10-24 20:45:30
【问题描述】:

以下作品:

/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date -I`.sql

结果为“full_backup_2012-11-04.sql”

cron 作业每分钟运行一次,但文件名每天只运行一次……我也想在文件名中包含小时和分钟……(最后,cron 作业可能每运行一次)一个小时左右)

所以 date -I 有效...其他典型的 date 选项似乎不起作用...是否有任何文档表明 -I 有效?如果是这样,该文档可能还有其他可行的选项。

【问题讨论】:

  • 我不知道为什么这个问题被关闭了。这似乎是一个很好的问题。

标签: unix cron mysqldump cron-task


【解决方案1】:

改用date +%Y-%m-%d_%H-%M-%S(或任何其他格式):

已编辑

为避免来自 CRON 的电子邮件中的主题过长,请使用创建文件 /home/<your user>/mycron.sh(文件名和位置只是一个示例):

#!/bin/sh
/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +%Y-%m-%d_%H-%M-%S`.sql

确保你chmod +x /home/<your user>/mycron.sh

此日期格式将输出:

full_backup_2012-11-05_08-49-19.sql

然后在你的 cron 中使用脚本的名称,即:

[cron parameters]    /home/<your user>/mycron.sh

【讨论】:

  • 您好,我正在使用 cPanel X,并收到以下电子邮件:/bin/sh: -c: line 0: 寻找匹配的 ``' /bin/sh: -c: line 时出现意外 EOF 1:语法错误:文件意外结束
  • 在我之前的帖子中,您可能想要删除新行和 `\` 反斜杠。我只是将它们放在这里是为了论坛的可读性。我正在编辑。
  • 是的,我删除了反斜杠。顺便说一句,在它发送给我的电子邮件的主题行中,它最初说“.../public_html/backups/full_backup_date -I.sql‏”但现在它说“.../public_html/backups/full_backup_`date +‏”
  • 查看我的编辑。电子邮件的主题不会被解释。您可以使用脚本来缩短主题(仅脚本的路径)而不是完整的命令
  • 我的意思不是邮件主题有问题。问题是date -I 有效,而其他所有日期格式都会出错。 (我只有在出现某种错误时才会收到一封电子邮件 - 对于 -I 通常没有错误,它会创建 sql 文件) hd1 提到的日期命令手册没有提到 -I 选项......我认为该解决方案是一种识别 -I 选项但也包括其他选项的解决方案。
【解决方案2】:

date(1) 命令有一个“+[FORMAT]”选项。我相信您想要的选项是 '%s' 或 '%N' 选项,这将分别给你秒或纳秒。根据您的 MySQL 路径,我假设您使用的是 Linux。如果确实如此,您可以找到手册页here,它将为您提供更多详细信息。

【讨论】:

  • 我正在使用 cPanel X....顺便说一句,当前日期选项是 -I...我似乎在该手册页上看不到该选项。
【解决方案3】:

date -Iminutes 可能是要走的路,它使用 ISO 8601 格式。 Wiki page 有一些信息。

【讨论】:

  • 我有一个每天运行两次的 cron 作业,到目前为止它已添加:“full_backup_2012-11-14T00:00-0600.sql”我将检查它是否继续工作。 ..
【解决方案4】:

虽然我的原始脚本有效,但这样的事情可能要简单得多:

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 还会制作完整快照,因此您最终会为每个备份创建完整快照,这最终会占用大量磁盘空间。对于大型数据库,这很快就会变得难以管理。您也可能不想信任副本以从中获取备份,因为副本也必须保持同步。

更好的选择是xtrabackup by Percona。它是开源的,所以它是免费的。它需要 InnoDB 表,并且能够对您的主 MySQL 服务器进行热备份,而无需停机或锁定(无论如何您都不应该使用 MyISAM)。它使用经过修改的 InnoDB 引擎和 InnoDB 的崩溃恢复功能来确保备份是一致的。它甚至可以对基本快照进行增量备份,因此您可以进行数百个备份,并使其占用单个快照的大小。它适用于 MySQL、MariaDB、PerconaDB(MySQL 的分支)以及 InnoDB 和 XtraDB(在 MariaDB 和 Percona 中改进了 InnoDB)。

我个人会坚持使用 xtrabackup,甚至不会使用 mysqldump。您必须在命令行方面做同样多的工作,并且您还可以获得小型增量备份的额外好处。有一些工具可以自动使用 xtrabackup,即使在 Galera 集群中也是如此。 Facebook uses it.


原文:

以下脚本以“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

【讨论】:

    【解决方案5】:

    如果您想在 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_\%R

    注意:日期命令中的 % 必须在 crontab 中转义,否则您可能会收到 EOF 错误。它将在命令行上工作而不会转义 % 但不会在 crontab 中。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2022-01-01
      • 2012-02-08
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多