Назад | Перейти на главную страницу

Сценарий оболочки Linux для резервного копирования файлов сервера

Я написал сценарий день назад, который выполняет резервное копирование всей моей базы данных и всех моих файлов / 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}

Предварительно его очистить.