cronjob для автоматического резервного копирования БД на сегодняшний день с префиксом файла

12

Я использую последнюю версию Linux Mint. Мне было интересно, можно ли создать специальный cronjob для резервного копирования базы данных.

В моем /etc/cronjobфайле у меня есть следующий код:

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
30        4          *            *                1-6            /home/users/backup.sh

По моему у /home/users/backup.shменя есть:

mysqldump -uroot -p MyDatabase > /home/users/backup_MyDB/full_myDB.sql

Вместо этого full_myDB.sqlя хотел бы иметь что-то вроде того, 2014-04-04_full_myDB.sqlгде дата добавляется динамически в зависимости от даты, которую мы имеем.

Если файл резервной копии SQL старше одной недели, я бы хотел, чтобы cronjob удалил его автоматически.

pbaldauf
источник

Ответы:

15

С GNU date(по умолчанию в Linux Mint) вы можете сделать:

mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +%F)_full_myDB.sql

Чтобы удалить файлы старше 1 недели:

find /home/users/backup_MyDB -type f -mtime +7 -exec rm {} +

Хотя, как правило, целесообразно увидеть, что вы удаляете, прежде чем удалять (по крайней мере, при тестировании сценария), для этого просто сделайте:

find /home/users/backup_MyDB -type f -mtime +7
Graeme
источник
Я готовил ответ, но ты побил меня: P
Рамеш
2
@Ramesh, рад, что я избил кого-то другого для разнообразия - обычно я пишу, и у кого-то уже есть подобный ответ.
Грэм,
Очень хорошо. Единственное, что я изменяю для своего использования, это помещаю детали доступа к базе данных в файл .my.cnf.
Иоганн Дейк,
4

Я использовал вышеуказанную информацию и хотел предоставить еще одно незначительное обновление, которое на самом деле усекает одну из действительно больших таблиц, которая замедляла наше резервное копирование.

Надеюсь, это поможет кому-то еще.

Используя вышеуказанную информацию, я создал базовый скрипт оболочки с именем mysqlbackup.sh со следующим содержимым:

#!/bin/sh
find /data/var/backups/mysql/dumps -type f -mtime +3 -exec rm {} +
mysql -e "truncate table sitename_prod.cache_table"
mysqldump sitename_prod > /data/var/backups/mysql/dumps/$(date +%F)_full_sitename_prod.sql

Обязательно запустите: chmod + x mysqlbackup.sh

Я также поместил это в свой crontab -e:

# MYSQL Dump and retention for 3 days
30 22 * * * bash /root/bin/mysqldump.sh > /dev/null 2>&1
Джейсон Райл
источник
3

Я знаю, что это большой старый, но я использовал вышеупомянутые ответы и добавил инструкцию сжатия файла. Надеюсь, кто-то найдет это полезным.

1) Изучив немного, 7-zip кажется лучшим компрессором. Если ваш дистрибутив Linux поддерживает его, вы можете использовать установщик apt:

sudo apt-get install p7zip-full

Кроме того, вы можете использовать tar.gz, если вы чувствуете себя более комфортно с ним.

2) Затем вы создаете скрипт, например, /home/users/backup.sh с содержанием:

#!/bin/sh
find /home/users/backup_MyDB -type f -mtime +7 -exec rm {} +
mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +%F)_full_myDB.sql
7z a /home/users/backup_MyDB/$(date +%F)_full_myDB.7z /home/users/backup_MyDB/*.sql
rm -f /home/users/backup_MyDB/*.sql

Этот скрипт найдет файлы с более чем 7 днями и удалит их, затем создаст дамп sql, затем 7-zip всех файлов .sql в каталоге, затем удалит все .sql в каталоге ( Кстати, вы можете при желании добавить команду mysql перед дампом, как отмечено в предыдущем ответе, если вам это нужно)

3) Мы делаем chmod +x /home/users/backup.shтак, чтобы он мог быть исполняемым.

3.1) Вы должны проверить ваш скрипт, если он работает как задумано

4) Программируем задачу crontab -e

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
30        4          *            *                1-6            /home/users/backup.sh >> /dev/null 2>&1

Вот и все. Он будет выполнять резервное копирование базы данных MySQL каждый день в неделю в 4:30 (кроме воскресенья) и сжимать резервную копию

Густав Джил
источник
1

Чтобы добавить ответ @ Graeme, возможно, стоит отметить, что иногда вам может понадобиться экранировать символ «%» в задании cron, чтобы он выглядел так:

 mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +\%F)_full_myDB.sql
frezq
источник