Fei*_*ila 9 linux rhel backup logrotate
我一直在尝试使用 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
}
Run Code Online (Sandbox Code Playgroud)
如果我手动执行 logrotate
logrotate -d /path/to/logrotate_job
Run Code Online (Sandbox Code Playgroud)
我得到
# 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
Run Code Online (Sandbox Code Playgroud)
同一个文件好像不能轮换,那么日文件名中包含日期怎么轮换呢?
尝试设置每周任务:
无日期
prerotate cp dailyrotated 到 dailyrotated.week
并在每月设置
无日期
prerotate cp 每周旋转到每周旋转。
小智 8
我刚刚偶然发现了这个问题,碰巧读到了这个线程。
在我的研究过程中,我找到了另一种解决 logrotate 配置文件中重复路径问题的方法:
创建符号链接并不痛苦,并且完美地欺骗了 logrotate 解析器,因为您向他展示了访问相同文件的不同路径。
在文件系统中:
$ls -l
mysql.monthly -> mysql/
mysql.weekly -> mysql/
mysql
Run Code Online (Sandbox Code Playgroud)
在 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
}
Run Code Online (Sandbox Code Playgroud)
问题是您在每个条目中使用相同的日志文件名。
自从上次轮换日志文件超过一周后,就会进行每周轮换。由于文件每天都会轮换,因此您将永远无法进行每周运行。(出于同样的原因,您也永远不会参加月刊。)
因此,为了保持每周和每月备份,您需要在运行 logrotate之前更改文件名。最简单的方法是创建一个单独的cron作业拷贝db.sql到db.sql.weekly每周一次,并将其复制到db.sql.monthly每月一次。完成后,您可以将 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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14496 次 |
| 最近记录: |