O problema é que você está usando o mesmo nome de arquivo de log em cada uma das entradas.
Uma rotação semanal acontece depois de ter passado mais de uma semana desde a última vez em que o arquivo de log foi girado. Como o arquivo é rotacionado a cada dia, você nunca chegará à execução semanal. (Você também nunca chegará à corrida mensal, pelo mesmo motivo.)
Assim, para manter os backups semanais e mensais, você precisa alterar o nome do arquivo antes executando o logrotate. A maneira mais simples seria criar uma tarefa cron separada que copiasse db.sql
para db.sql.weekly
uma vez por semana e copiasse para db.sql.monthly
uma vez por mês. Quando tiver feito isso, você pode alterar sua configuração de logrotate para ler
#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
}