Я написал сценарий день назад, который выполняет резервное копирование всей моей базы данных и всех моих файлов / var / www в общий сетевой ресурс. Это была моя первая попытка создания сценариев в Linux, и в целом я считаю, что это действительно круто. Я хочу добавить функцию в свой сценарий резервного копирования. В настоящее время сценарий использует rsync для перезаписи любых существующих данных в месте назначения для резервного копирования. Я бы хотел, чтобы он действительно создавал уникальную полную резервную копию при каждом запуске. Прямо сейчас он у меня работает каждую ночь в полночь. Тем не менее, я хочу иметь только 15 одновременных полных резервных копий за раз - поэтому, как только будет достигнуто 15 резервных копий, я хочу, чтобы он начал удалять старые резервные копии. Может кто-то указать мне верное направление?
Вот мой текущий сценарий:
#!/usr/bin/env bash
# Mount the share
smbmount //address/folder /mnt/folder -o credentials=/root/.smbpasswd
# Synchronize the Web folder
rsync --delete -C -v -a -r /var/www /mnt/folder
# Create a backup of all databases
mysqldump -uuser -ppassword --all-databases | gzip -9 > /root/backup/Databases.sql.zip
# Copy the backup to the backup folder
cp /root/backup/Databases.sql.zip /mnt/folder/Databases.sql.zip
echo "Backup complete!"
Не изобретайте велосипед - используйте грязный!
mv Databases.sql.zip sql-backup-`date +%Y-%m-%d`.zip
find *.zip -mtime +15 -exec rm {} \;
Первая строка меняет имя почтового индекса на имя в зависимости от текущей даты, вторая строка удаляет все почтовые индексы старше 15 дней.
Один из способов генерировать имена файлов, которые меняются каждую неделю, - использовать date
чтобы получить название или номер дня недели:
TODAYS_BACKUP=$(date +'Databases-%a.sql.gz')
mysqldump --all-databases | gzip -9 > /root/backup/$TODAYS_BACKUP
Таким образом, скажем, в понедельник перед резервным копированием, Databases-Sun.sql.gz будет вчерашней резервной копией, Databases-Sat.sql.gz будет создана позавчера и т. Д. Databases-Mon.sql.gz будет резервная копия от недели назад. (Другой способ подумать об этом: Databases-XXX.sql.gz взят из последний XXX.)
После сегодняшней резервной копии файл Databases-Mon.sql.gz будет перезаписан.
Это немного более надежно, чем решение unknown, потому что, если по какой-то причине в течение одной недели не создается резервных копий, его (ее?) Решение удалит все резервные копии, а с этим решением они останутся нетронутыми.
Чтобы ротация происходила каждые ~ 30 дней, вы можете использовать %d
день месяца в виде десятичного числа. (Узнайте, что означают эти загадочные% escape-последовательности, на странице руководства по strftime
.)
Чтобы производить ротацию каждые 15 дней, ну ... вы можете использовать этот прием:
date +'%s 86400 / 15 %% p' | dc
который считает дни с начала эпохи и берет остаток при делении их на 15.
Недостатки: 1) выглядит запутанным, 2) не дает вам ведущего 0 ниже 10 ... как я уже сказал: это хак.
Одно замечание: не помещайте пароль в сценарий, где он может быть прочитан из таблицы процессов во время резервного копирования! По крайней мере, поместите его в ~ / .my.cnf и защитите его соответствующими правами доступа к файлам!
Второе примечание: правильный суффикс для файлов, сжатых с помощью gzip
является .gz
. .zip
предназначен для файлов, сжатых с помощью WinZip, 7zip и т. д.
Третье примечание: если по какой-то причине smbmount не работает (возможно, сервер не работает), ваш скрипт запишет резервную копию в раздел, где находится точка монтирования, вероятно, заполнив ваш корневой раздел. Хороший способ защититься от этого - chmod
точка монтирования 000.
расчет даты
Вот как это сделать хмельДата взлома с нулем в начале:
rotation="0$(( ( $(date +%s) / 86400 ) % 15 ))" # add a leading zero
rotation="${rotation: -2}" # keep the rightmost 2 chars
Как видите, использовать dc
.
rsync вращение
Подобно тому, что другие указывали для резервного копирования базы данных, вы можете создать несколько резервных копий веб-каталогов с помощью rsync
:
rsync -Carv /var/www /mnt/folder/backup${rotation}/
Это создает каталог с именами от «00» до «14» для ротации 15 резервных копий. Ты можешь сделать:
rm -rf /mnt/folder/backup${rotation}
Предварительно его очистить.