使用 logrotate 存储 7 个每日、4 个每周和 12 个每年的数据库备份

Fei*_*ila 9 linux rhel backup logrotate

我一直在尝试使用 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
}
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)


Jen*_*y D 7

问题是您在每个条目中使用相同的日志文件名。

自从上次轮换日志文件超过一周后,就会进行每周轮换。由于文件每天都会轮换,因此您将永远无法进行每周运行。(出于同样的原因,您也永远不会参加月刊。)

因此,为了保持每周和每月备份,您需要运行 logrotate之前更改文件名。最简单的方法是创建一个单独的cron作业拷贝db.sqldb.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)