Автоматизированное создание backup MySQL с уведомлением в Телеграм

  • Автор темы Автор темы Dobriyk0t
  • Дата начала Дата начала

Dobriyk0t

Client
Регистрация
28.12.2016
Сообщения
121
Реакции
74
Баллы
28
Что нужно сделать после того как перенес все базы данных по всем проектам на свой локальный сервер? Правильно! Нужно настроить автоматизированные бэкапы, причем желательно с уведомлениями чтобы знать что они действительно делаются и не произошла какая-либо ошибка и при непредвиденной ситуации ты остался без бэкапов.
Для этого создадим пользователя в базе данных, пропишем ему права и напишем скрипт на bash для бэкапов и уведомлений. Уведомления будем слать в Телеграм. Все делаем через командую строку.


1. Создадим пользователя mysql с нужными правами
- Входим в базу данных командой:
Bash:
Развернуть Свернуть Копировать
sudo mysql
или
Bash:
Развернуть Свернуть Копировать
sudo mysql -u root -p
, должно появиться MariaDB [(none)]>.

- Создаем нового пользователя для бэкапов:
SQL:
Развернуть Свернуть Копировать
CREATE USER 'backuper'@'localhost' IDENTIFIED BY 'пароль для backuper';
, где "backuper"- это имя пользователя, а "пароль для backuper" придуманный пароль.

- Даем пользователю права на чтение всех баз данных и блокировку таблиц:
SQL:
Развернуть Свернуть Копировать
GRANT SELECT, LOCK TABLES, SHOW DATABASES, RELOAD, EVENT ON *.* TO 'backuper'@'localhost';

- Применяем:
SQL:
Развернуть Свернуть Копировать
FLUSH PRIVILEGES;
Пользователя для бэкапов мы создали, теперь приступаем к написанию скрипта.

2. Создаем скрипт для бэкапов
- Создаем папку для хранения бэкапов:
Bash:
Развернуть Свернуть Копировать
sudo mkdir -p /mnt/ssd/backup/mariadb
, где /mnt/ssd/backup/mariadb - это задаваемый путь, в моем случае это папка на подключенном SSD.

- Создаем новый файл для скрипта:
Bash:
Развернуть Свернуть Копировать
sudo nano /usr/local/bin/backup_mariadb.sh
, где /usr/local/bin/ - это задаваемый путь(после файл скрипта можно перенести в любое место), а backup_mariadb.sh - это название файла скрипта.

и пишем код:
Bash:
Развернуть Свернуть Копировать
#!/bin/bash
# Дата и время для имени файла бэкапа
TIMESTAMP=$(date +"%F_%T")

# Директория для хранения бэкапов, это папка которую мы раньше создали
BACKUP_DIR="/mnt/ssd/backup/mariadb"

# Имя файла бэкапа
BACKUP_FILE="$BACKUP_DIR/mariadb_backup_$TIMESTAMP.sql"

# Данные для подключения к MariaDB
DB_USER="backuper"
DB_PASSWORD="пароль для пользователя backuper"

# Данные для Telegram
TELEGRAM_TOKEN="Ваш бот API ключ"
TELEGRAM_CHAT_ID="Ваш чат ID"

# Функция отправки сообщения в Telegram
send_telegram_message() {
    local message=$1
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
    -d chat_id="$TELEGRAM_CHAT_ID" \
    -d text="$message"
}

# Создание бэкапа всех баз данных
if mysqldump --user=$DB_USER --password=$DB_PASSWORD --all-databases > "$BACKUP_FILE"; then
    send_telegram_message "Бэкап MariaDB выполнен успешно: $BACKUP_FILE"
else
    send_telegram_message "Ошибка при создании бэкапа MariaDB"
fi

# Удаление старых бэкапов (старше 7 дней)
find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;

echo "Бэкап завершен"

Сохраните и закройте файл.

- Теперь нужно сделать скрипт исполняемым:
Bash:
Развернуть Свернуть Копировать
sudo chmod +x /usr/local/bin/backup_mariadb.sh

- А теперь давайте настроим автоматический запуск скрипта. Откроем планировщик cron:
Bash:
Развернуть Свернуть Копировать
sudo crontab -e
Добавим строку в конец файла:
Bash:
Развернуть Свернуть Копировать
0 5 * * * /usr/local/bin/backup_mariadb.sh >> /var/log/mariadb_backup.log 2>&1
Планировщик будет ежедневно запускать наш скрипт в 5 утра(можно изменить на любое время, 0 5).
backup.png

Я храню бэкапы локально на отдельном диске, мне так проще. Но как вы понимаете, все зависит только от вашей фантазии, бэкапы можно отправлять на сетевое хранилище, удаленный сервер по ssh(тут описано как это сделать) или облачное хранилище Google Drive, Dropbox, S3, Yandex Disk, Mail и т.д.

 
Последнее редактирование модератором:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)