Verwenden Sie logrotate, um 7 tägliche, 4 wöchentliche und 12 jährliche DB-Backups zu speichern

7

Ich habe versucht, mit logrotate eine Datenbanksicherung zu speichern für:

  • letzte 7 Tage (täglich)
  • letzte 4 Wochen (wöchentlich)
  • letzte 12 Monate (monatlich)

Ich habe ein Logrotate-Skript wie dieses erstellt, aber nur die täglichen Rotationen werden ausgeführt.

Was fehlt mir oder mache ich falsch? Bricht das Datumsformat * ' wöchentlich ' * das Skript? Wenn ja, wie kann ein eindeutiger Name für jeden gedrehten Dateityp festgelegt werden? Zum Beispiel mit 'extension .week' ?

Hinweis: Ich habe die Vor- und Nachrotation bei wöchentlichen und monatlichen Rotationen verwendet, um eine Dummy-Datei zu erstellen, um zu überprüfen, ob diese ausgeführt werden, aber die Dateien werden nie erstellt.

Hinweis 2: Die Datei /backups/db.sql wird korrekt erstellt

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

Wenn ich logrotate manuell mit ausführe

logrotate -d /path/to/logrotate_job

Ich bekomme

# 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

Es scheint, dass dieselbe Datei nicht gedreht werden kann. Wie kann also die tägliche Datei gedreht werden, wenn ihr Name das Datum enthält?

Der Versuch, eine wöchentliche Aufgabe einzustellen:

kein Datum

prerotate cp dailyrotated to dailyrotated.week

Und monatlich einstellen

kein Datum

prerotate cp weekrotated to weekrotated.month

Feida Kila
quelle
1
Zunächst haben Sie den weeklyAbschnitt auf eingestellt daily.
Jenny D
geändert, sowieso werden die Prerotate- und Postrotate-Dateien nicht erstellt
Feida Kila

Antworten:

8

Ich bin gerade auf dieses Problem gestoßen und habe diesen Thread gelesen.

Während meiner Recherche habe ich einen anderen Weg gefunden, um das Problem des doppelten Pfads in der logrotate-Konfigurationsdatei zu lösen:

Das Erstellen symbolischer Links ist weniger schmerzhaft und führt den logrotate Parser perfekt aus, indem Sie ihm verschiedene Pfade für den Zugriff auf dieselben Dateien präsentieren.

Im Dateisystem:

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

In der logrotate conf-Datei:

/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
}
Pichel
quelle
Sehr schlau; Daran habe ich nie gedacht, aber es ist eine gute Lösung!
Jenny D
7

Das Problem ist, dass Sie in jedem Eintrag denselben Protokolldateinamen verwenden.

Eine wöchentliche Rotation erfolgt, wenn mehr als eine Woche seit dem letzten Rotieren der Protokolldatei vergangen ist. Da die Datei jeden Tag gedreht wird, gelangen Sie nie zum wöchentlichen Lauf. (Aus dem gleichen Grund wirst du auch nie zum monatlichen Lauf kommen.)

Um die wöchentlichen und monatlichen Sicherungen beizubehalten, müssen Sie den Dateinamen ändern, bevor Sie die Protokollierung ausführen. Am einfachsten wäre es, einen separaten Cron-Job zu erstellen db.sql, der db.sql.weeklyeinmal pro Woche und db.sql.monthlyeinmal pro Monat kopiert wird . Wenn Sie dies getan haben, können Sie Ihre logrotate-Konfiguration in "Lesen" ändern

#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
}
Jenny D.
quelle
3

Ich denke, Ihre Zieldateien sollten sowohl wöchentlich als auch monatlich einen anderen Namen haben. Wenn Sie sich die Statusdatei ansehen, werden Zielname + Datum gespeichert, damit sie weiß, wann das Ziel zuletzt ausgeführt wurde.

Es ist ein Protokollrotationssystem, nicht wirklich ein Sicherungssystem.

Ich würde eine andere Strategie empfehlen. und benutze so etwas wie rsnapshot, das so etwas machen soll.

Es kann hilfreich sein, logrotate mit der Option -d auszuführen, um zu sehen, welche Entscheidungen es trifft.

Alternativ können Sie ein anderes Ziel verwenden

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

Sie möchten jedoch, dass der Monat vor dem Wöchentlichen und der Monat vor dem Täglichen ausgeführt wird (rsnapshot ist in rsnapshot integriert).

X Tian
quelle
Das war ein kluger Weg, um das Dateinamenproblem zu umgehen, ein dickes Lob!
Jenny D