Use o logrotate para armazenar 7 backups diários, 4 semanais e 12 anuais do banco de dados

7

Estou tentando usar o logrotate para armazenar um backup de banco de dados para:

  • últimos 7 dias (diariamente)
  • últimas 4 semanas (semanalmente)
  • últimos 12 meses (mensalmente)

Eu fiz um script logrotate como este, mas apenas as rotações diárias são feitas.

O que eu estou perdendo ou fazendo errado? O formato de data * ' semanal ' * string quebra o script? Se sim, como conseguir definir um nome distinto para cada tipo de arquivo girado? Por exemplo, usando 'extensão .week' ?

Observação: usei o prerotado e postroto em rotações semanais e mensais para criar um arquivo fictício para verificar se eles estão sendo executados, mas os arquivos nunca são criados.

Nota 2: o arquivo /backups/db.sql é criado corretamente

#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
}

Se eu executar logrotate manualmente com

logrotate -d /path/to/logrotate_job

Eu obtenho

# 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

Parece que o mesmo arquivo não pode ser girado, então, como girar o arquivo diário se o nome incluir a data?

Tentando definir uma tarefa semanal:

nodate

cp pré-rotacionado rotacionado diariamente para dailyrotated.week

E definindo mensalmente

nodate

cp de pré-rotação semanalmente rotacionado para weeklyrotated.month

    
por Feida Kila 26.02.2014 / 08:44

3 respostas

6

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
}
    
por 26.02.2014 / 10:10
5

Acabei de me deparar com este problema e por acaso li este tópico.

Durante minha pesquisa, encontrei outra maneira de resolver o problema do caminho duplicado no arquivo de configuração logrotate:

A criação de links simbólicos é menos do que dolorosa e engana perfeitamente o analisador de logrotate em que você apresenta diferentes caminhos para acessar os mesmos arquivos.

No sistema de arquivos:

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

No arquivo conf logrotate:

/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
}
    
por 15.02.2017 / 02:57
3

Acho que seus arquivos de destino devem ter um nome diferente para semanal e mensalmente. Se você olhar para o arquivo de status, ele armazena nome de destino + Data para que saiba quando o destino foi executado pela última vez.

É um sistema de rotação de logs que não é realmente um sistema de backup.

Eu recomendaria uma estratégia diferente. e usar algo como o rsnapshot que é projetado para fazer algo assim.

Pode ajudar rodar o logrotate com a opção -d para ver quais decisões ele toma?

Como alternativa, use um alvo diferente

#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
}

Mas você quer que o mensal seja executado antes do semanal e do semanal para ser executado antes do dia (o rsnapshot é construído no rsnapshot).

    
por 26.02.2014 / 10:13