Ich habe eine neue Anforderung zum Löschen von MySQL-Dump-Dateien, die älter als 30 Tage sind. Die Dateien verwenden die Namenskonvention "all-mysql-YYYYMMDD-HHMM.dump". Die Dateien befinden sich in einem SAN-gemounteten Dateisystem, sodass die Wiederherstellung kein Problem darstellt. Der Speicherplatz auf dem Laufwerk ist jedoch leider begrenzt und füllt sich schnell, sodass häufige menschliche Eingriffe erforderlich sind.
Beispiel für Dateinamen
- all-mysql-20130324-2330.dump
- all-mysql-20130325-2330.dump
- all-mysql-20130326-2330.dump
Mein erster Gedanke war, "find" in einem Batch-Skript mit -mtime +30 zu verwenden. Die Änderungszeiten können jedoch nicht garantiert werden und einige der älteren Archive könnten sich dem Löschdatum entziehen :)
Ich habe das folgende BASH-Skript erstellt, aber ich hatte gehofft, dass es eine sauberere Möglichkeit gibt, diesen Vorgang auszuführen.
#!/bin/bash
STARTING_DIR=$(pwd)
FILE_PREFIX=all-mysql-
BACKUP_DIR=/opt/backup/mysql/dumps
ARCHIVE_WINDOW_DAYS=30
cd $BACKUP_DIR
# Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS
ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc)
PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d)
for backup_file in $FILE_PREFIX*
do
# Trim prefix, time portion of date stamp, and file extension
# from $backup_file to allow numeric comparison against YYYYMMDD
backup_trim_tmp=${backup_file#${FILE_PREFIX}}
backup_trimmed=${backup_trim_tmp%-****.dump}
if [ ${PURGE_BEFORE_DATE} -gt ${backup_trimmed} ]
then
rm $backup_file
fi
done
cd $STARTING_DIR
logrotate
eine sauberere Lösung?