web-dev-qa-db-ja.com

logrotateを使用して、毎日7回、週4回、年12回のdbバックアップを保存します

Logrotateを使用してデータベースバックアップを保存しようとしています。

  • 過去7日間(毎日)
  • 過去4週間(毎週)
  • 過去12か月(毎月)

このようなlogrotateスクリプトを実行しましたが、毎日のローテーションのみが実行されます。

何が欠けているか、間違っていますか?日付形式* 'weekly' *文字列はスクリプトを壊していますか?もしそうなら、どのようにして回転されたファイルの各タイプに独特の名前を設定することができますか?たとえば'extension .week'

注:毎週および毎月のローテーションでprerotateとpostrotateを使用してダミーファイルを作成し、これらが実行されているかどうかを確認しましたが、ファイルは作成されません。

注2:/backups/db.sqlファイルが正しく作成されます

#daily (son)
"/backups/db.sql" {
        daily
        rotate 7
    missingok
    copy
    compress
}

#weekly (father)
"/backups/db.sql" {
        weekly
        rotate 4
    missingok
    copy
    dateext
    dateformat _weekly_%Y-%m-%d.
    compress
    prerotate
        touch /backups/weekly_pre.txt
    endscript
    postrotate
        touch /backups/weekly_post.txt
    endscript
}

#monthly (grandfather)
"/backups/db.sql" {
        monthly
        rotate 12
    missingok
    copy
    dateformat _monthly_%Y-%m-%d.
    compress
    prerotate
        touch /backups/monthly_pre.txt
    endscript
    postrotate
        touch /backups/monthly_post.txt
    endscript
}

Logrotateを手動で実行すると

logrotate -d /path/to/logrotate_job

私は得る

# logrotate -d /path/to/logrotate_job
reading config file logrotate_job
reading config info for "/backups/db.sql"
error: db_backup:11 duplicate log entry for /backups/db.sql
error: found error in "/backups/db.sql" , skipping
removing last 1 log configs

Handling 2 logs

rotating pattern: "/backups/db.sql"  after 1 days (7 rotations)
empty log files are rotated, old logs are removed
considering log /backups/db.sql
  log does not need rotating

rotating pattern: "/backups/db.sql"  1048576 bytes (no old logs will be kept)
empty log files are rotated, old logs are removed

同じファイルをローテーションできないようですが、名前に日付が含まれている場合、デイリーファイルをローテーションするにはどうすればよいですか

毎週のタスクで設定しようとしています:

日付なし

prerotate cp dailyrotatedをdailyrotated.weekに

そして毎月の設定

日付なし

prerotate cp weeklyrotatedからweeklyrotated.monthへ

7
Feida Kila

私はこの問題に遭遇し、たまたまこのスレッドを読みました。

私の調査中に、logrotate構成ファイルの重複パスの問題を解決する別の方法を見つけました。

シンボリックリンクを作成するのは簡単ではなく、同じファイルにアクセスするための異なるパスを彼に提示するという点で、logrotateパーサーを完全に騙します。

ファイルシステムで:

$ls -l
mysql.monthly -> mysql/
mysql.weekly -> mysql/
mysql

Logrotate confファイルで:

/path/mysql/*.sql.gz {
    daily
    rotate 8
    copy
    compress
    ifempty
    missingok
    olddir /path/mysql/archives
    sharedscripts
    nocreate
}

/path/mysql.weekly/*.sql.gz {
        weekly
        copy
        rotate 4
        compress
        ifempty
        missingok
        olddir /path/mysql/archives/1-Semaine
        nocreate
}

/path/mysql.monthly/*.sql.gz {
        monthly
        copy
        rotate 12
        compress
        ifempty
        missingok
        olddir /path/mysql/archives/2-Mois
}
8
pichel

問題は、各エントリで同じログファイル名を使用していることです。

毎週ローテーションは、最後にログファイルがローテーションされてから1週間以上経過すると発生します。ファイルは毎日ローテーションされるため、毎週実行されることはありません。 (同じ理由で、山岳地帯に行くこともできません。)

したがって、毎週および毎月のバックアップを保持するには、ファイル名を変更する必要がありますbefore logrotateを実行します。最も簡単な方法は、db.sqldb.sql.weeklyに週1回コピーし、それをdb.sql.monthlyに月1回コピーする別のcronジョブを作成することです。それが終わったら、logrotate設定を次のように変更できます。

#daily (son)
"/backups/db.sql" {
        daily
        rotate 7
    missingok
    copy
    compress
}

#weekly (father)
"/backups/db.sql.weekly" {
        weekly
        rotate 4
    missingok
    copy
    dateext
    dateformat %Y-%m-%d.
    compress
    prerotate
        touch /backups/weekly_pre.txt
    endscript
    postrotate
        touch /backups/weekly_post.txt
    endscript
}

#monthly (grandfather)
"/backups/db.sql.monthly" {
        monthly
        rotate 12
    missingok
    copy
    dateformat %Y-%m-%d.
    compress
    prerotate
        touch /backups/monthly_pre.txt
    endscript
    postrotate
        touch /backups/monthly_post.txt
    endscript
}
7
Jenny D

ターゲットファイルは、毎週と毎月で別の名前にする必要があると思います。ステータスファイルを見ると、ターゲット名 + 日付が格納されているため、ターゲットが最後に実行された日時がわかります。

これはログローテーションシステムであり、実際にはバックアップシステムではありません。

別の戦略をお勧めします。そして、このようなことをするように設計されたrsnapshotのようなものを使用します。

-dオプションを指定してlogrotateを実行すると、どのような決定が行われるかを確認できます。

または、別のターゲットを使用します

#Weekly example 1
/backups/db.sql.1.gz {
# some strategy to copy/rename most recent or oldest daily 
# (note db.sql.1.gz above is most recent )

}

#Weekly example 2 (another way)
/backups/db.sql.*.gz {
# some strategy to copy most recent or archive the set

}

#Monthly 
/backups/db.sql_weekly*.gz {
# some strategy to copy most recent
}

ただし、毎月を毎週の前に実行し、毎週を毎日の前に実行する必要があります(rsnapshotはrsnapshotに組み込まれています)。

3
X Tian