7

以下の作品:

/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 ジョブは毎分実行されますが、ファイル名は 1 日に 1 回だけです... ファイル名にも時間と分を含めたかったのです.... (最終的に、cron ジョブは 1 時間ごとに実行される可能性があります) )

したがって、date -I は機能します... date の他の典型的なオプションは機能しないようです... -I が有効であると記載されているドキュメントはありますか? その場合、そのドキュメントには、機能する他のオプションも含まれている可能性があります。

4

5 に答える 5

3

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
于 2012-11-05T01:50:04.523 に答える
2

私の元のスクリプトは機能しますが、次のようなものははるかに簡単かもしれません。

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は完全なスナップショットも作成するため、バックアップごとに完全なスナップショットが作成され、多くのディスク領域を占有する可能性があります。これは、大規模なデータベースではすぐに管理できなくなる可能性があります。また、レプリカも同期を維持する必要があるため、バックアップを取得するレプリカを信頼したくない場合があります。

より良いオプションは、Perconaによるxtrabackupです。オープンソースなので無料です。InnoDBテーブルが必要であり、ダウンタイムやロックなしでプライマリMySQLサーバーのホットバックアップを作成できます(とにかくMyISAMを使用しないでください)。InnoDBのクラッシュリカバリ機能を備えた変更されたInnoDBエンジンを使用して、バックアップの一貫性を確保します。ベーススナップショットの増分バックアップも取得するため、数百のバックアップを作成して、単一のスナップショットのサイズを使用することができます。MySQL、MariaDB、PerconaDB(MySQLのフォーク)、およびInnoDBとXtraDBの両方(MariaDBとPerconaの両方でInnoDBが改善されています)で動作します。

個人的には、xtrabackupを使い続け、mysqldumpを気にすることさえありません。コマンドラインで同じくらい多くの作業を行う必要があり、小さな増分バックアップという追加の利点があります。Galeraクラスターであっても、xtrabackupの使用を自動化するツールがあります。Facebookはそれを使用します。


元のスクリプト:

以下のスクリプトは、たとえば「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
于 2012-11-13T21:31:29.207 に答える
2

date -IminutesISO 8601形式を使用する方法です。Wikiページにはいくつかの情報があります。

于 2012-11-13T06:21:54.037 に答える
1

date(1)コマンドには「+[FORMAT]」オプションがあります。必要なオプションは、「%s」または「%N」オプションのいずれかであると思います。これにより、それぞれ秒またはナノ秒が得られます。MySQLのパスから、Linuxを使用していると仮定します。これが実際に当てはまる場合は、ここで詳細を説明するマンページを見つけることができます。

于 2012-11-05T01:50:30.203 に答える