Logrotateを使用してデータベースバックアップを保存しようとしています。
このような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へ
私はこの問題に遭遇し、たまたまこのスレッドを読みました。
私の調査中に、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
}
問題は、各エントリで同じログファイル名を使用していることです。
毎週ローテーションは、最後にログファイルがローテーションされてから1週間以上経過すると発生します。ファイルは毎日ローテーションされるため、毎週実行されることはありません。 (同じ理由で、山岳地帯に行くこともできません。)
したがって、毎週および毎月のバックアップを保持するには、ファイル名を変更する必要がありますbefore logrotateを実行します。最も簡単な方法は、db.sql
をdb.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
}
ターゲットファイルは、毎週と毎月で別の名前にする必要があると思います。ステータスファイルを見ると、ターゲット名 + 日付が格納されているため、ターゲットが最後に実行された日時がわかります。
これはログローテーションシステムであり、実際にはバックアップシステムではありません。
別の戦略をお勧めします。そして、このようなことをするように設計された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に組み込まれています)。