2012-11-05 7 views
7

次作品:mysqldump cronジョブに時間を追加しますか?

/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ジョブを毎時間かそこらを実行される可能性があります)....だけでなく、ファイル名に-Iが働くので、日付を時間と分を含めるように...日付のための他の典型的な選択肢にはありませんうまくいくようです...私は有効であると言う文書はありますか?そうであれば、ドキュメントには他のオプションもあります。

+1

なぜこの質問が終了したのか分かりません。これは大きな問題のようです。 – ryvantage

答えて

2

date -Iminutesは、ISO 8601形式を使用して移動するための方法、である可能性があります。 Wiki pageにはいくつかの情報があります。

+0

私はcronジョブを1日2回実行していますが、これまでに追加したのは "full_backup_2012-11-14T00:00-0600.sql" 私はそれが動作し続けることを確認します... –

3

利用代わりdate +%Y-%m-%d_%H-%M-%S(またはその他の形式):

EDITED

ファイル/home/<your user>/mycron.shを作成し、CRONからのメールでの長い被験者を避ける使用するには(ファイル名と場所は一例です):

#!/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 
+1

こんにちは私はcPanel Xを使用していて、次のように電子メールで送ってきました: /bin/sh:-c:行0:予期せぬEOFが '' 'と一致するのを探しています /bin/sh:-c: :予期しないファイルの末尾 –

+0

私の前の投稿では、新しい行と '\\'バックスラッシュを削除したいかもしれません。フォーラムの可読性のためにここに配置しました。私は編集中です。 – JScoobyCed

+0

はい、バックスラッシュを削除しました。私は電子メールの件名に「元の/ public_html/backups/full_backup_'date -I'.sql」と言っていましたが、今は ".../public_html/backups/full_backup_'date + " –

1

日(1)コマンドでは、「+ [FORMAT]を持っています"オプション。あなたが望むオプションは、それぞれ秒またはナノ秒を与える '%s'または '%N'オプションのいずれかと考えています。 MySQLのあなたの道から、私はあなたがLinux上にいると仮定するつもりです。これが本当に当てはまる場合は、詳細を示すhereのマンページがあります。

+0

私はcPanel Xを使用しています.... BTW現在の日付オプションは-I ...そのマンページでそのオプションを見ることができないようです。 –

1

私の元のスクリプトは動作しますが、このような何かがはるかに簡単になることがあります。

mysqldump [options] | gzip -c > /backups/data-$(date +%a-%H00).sql.gz 

これは、特にバックアップの価値は7日を維持します。曜日と時間を使用して動作します。したがって、data-Mon-00.sql.gz(月曜日の深夜)のようになります。週が転がると、以前のバックアップが上書きされます。

あなたは6時間ごとに実行するために、あなたのcronを設定する場合は、28のバックアップ(24/6) * 7 = 28まで取得します。

は、あなたがテーブルをロックする必要がmysqldumpを持つ一貫したバックアップを取得するには、これが唯一のレプリカ、または低ボリュームサーバーから実行する必要があります。 mysqldumpも完全なスナップショットを作成するので、バックアップごとに完全なスナップショットが作成され、多くのディスクスペースを占有する可能性があります。これは、大きなデータベースではすぐに管理できなくなる可能性があります。また、レプリカが信頼できるように、レプリカも同期していなければならないので、バックアップを取る必要はありません。

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

個人的に私はxtrabackupに固執し、mysqldumpを気にしません。ほとんどの作業コマンドラインを賢明に実行しなければならず、小さな増分バックアップの利点があります。 Galeraクラスタでも、xtrabackupの使用を自動化するツールがあります。 Facebook uses it


オリジナルスクリプト:

以下のスクリプトは、ハード使用してファイルを回転させ、例えば、「backup.sql.gz」をとり、およびバックアップ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 
0

あなたがcrontabエントリ(とないシェルスクリプト)でそれをすべてをしたい場合は、ここでの方法は次のとおりです。

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

ファイル名が出力されますがよう:52:full_backup_2017-08-18_17。 date +\%F_\%R

注:SQL

あなたのコマンドからのキーの変更はこれですdateコマンドで%は、crontabの中でエスケープする必要があり、そうでなければあなたはおそらくEOFエラーを取得します。 %をエスケープしないでコマンドラインで動作しますが、crontabでは動作しません。お役に立てれば。

関連する問題