Добавление времени к заданию cron mysqldump?

следующие работы:

/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 выполняется каждую минуту, но имя файла только один раз в день... Я хотел также включить час и минуту в имя файла.... (в итоге задание будет выполняться каждый час или так)

Итак, дата-я работаю... другие типичные варианты свиданий, похоже, не работают... есть ли какая-либо документация, в которой говорится, что я действителен? Если это так, то документация может также есть другие варианты, которые работают.

5 ответов


date -Iminutes может быть, путь, который использует формат ISO 8601. The страница Wiki есть информация.


использовать date +%Y-%m-%d_%H-%M-%S вместо (или любой другой формат):

редактировать

чтобы избежать длинных тем в письмах от CRON, используйте create a file /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 имя сценария, i.e:

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

команда date(1) имеет опцию "+[FORMAT]". Я считаю, что опция, которую вы хотите, - это опции "%s " или "%N", которые дадут вам секунды или наносекунды соответственно. Из вашего пути для MySQL я собираюсь предположить, что вы находитесь в Linux. Если это действительно так, вы можете найти на странице здесь, который даст вам более подробную информацию.


пока мой оригинальный скрипт работает, что-то вроде этого может быть намного проще:

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 по Фирконом. Это с открытым исходным кодом, так что это бесплатный. Он требует таблиц InnoDB и может принимать горячую резервную копию вашего основного сервера MySQL без простоев или блокировок (вы не должны использовать MyISAM в любом случае). Он использует модифицированный движок InnoDB с функцией аварийного восстановления InnoDB для обеспечения согласованности резервных копий. Он даже выполняет инкрементное резервное копирование базового снимка, поэтому вы можете сделать сотни резервных копий и сделать его размером с один снимок. Он работает с MySQL, MariaDB, PerconaDB (вилки MySQL), и InnoDB и XtraDB (улучшенная InnoDB в как в рамках MariaDB и Percona).

лично я бы придерживался xtrabackup и даже не беспокоился о mysqldump. Вы должны делать столько же работы командной строки, и у вас есть дополнительное преимущество небольших инкрементных резервных копий. Есть инструменты, которые автоматизируют использование xtrabackup, даже в кластере Galera. Facebook использует его.


оригинальный скрипт:

сценарий ниже принимает " резервное копирование.язык SQL.ГЗ", например, и превращает его во что-то вроде 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=
backup=

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 (а не в скрипте оболочки), вот как:

/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

Примечание: % в команде date должен быть экранирован в crontab, иначе вы, вероятно, получите ошибку EOF. Он будет работать в командной строке, не экранируя%, но не будет в crontab. Надеюсь, это поможет.