Автоматизация задач — это нормальное поведение вменяемого и ленивого разработчика. Одной из задач, которые обычно автоматизируются, является резервное копирование баз данных на серверах. С MySQL логические резервные копии, использующие mysqldump, довольно легко сделать и автоматизировать. Однако в среде Plesk у вас могут возникнуть проблемы с деталями, такими как знание пароля для доступа с правами администратора / root на сервере MySQL. MySQL установлен и настроен с помощью Plesk. По умолчанию у него нет пользователя с именем root. Он переименован в «admin» и имеет доступ только «localhost». В Linux пароль зашифрован и хранится в /etc/psa/.psa.shadow
, Зная это, вы, возможно, захотите написать собственный сценарий оболочки, чтобы самостоятельно автоматизировать неинкрементные (полные) резервные копии ваших баз данных, но что если мы скажем вам, что для него уже написан сценарий, который может быть полезен для вас?
В этой статье мы поделимся с вами очень простым сценарием для создания сжатых резервных копий с помощью mysqldump в Plesk.
1. Создать резервный скрипт
Приступить к созданию скрипта резервного копирования, который в этом случае мы назовем plesk_db_backup.sh
и добавьте к нему следующий код:
#!/bin/bash
# Script to export all the databases stored in MySQL Server in Plesk
# Note: This file needs to use the LF break line format, not CRLF
# Is recommendable as well to use absolute paths for the directories
# @author Carlos Delgado
# Define constants of the script
USERNAME="admin"
BACKUP_DIRECTORY="/var/ourcodeworld-db-backups/backups"
# Important:
# This directory will be created and **DELETED** after executing the script
TMP_BACKUP_DIRECTORY="/var/ourcodeworld-db-backups/tmp-backups"
EXCLUDED_DATABASES="Database|information_schema|performance_schema|mysql"
# 1. Build array of databases registered
BASES_DE_DATOS=$(MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql -u $USERNAME -e "SHOW DATABASES;" | tr -d "| " | egrep -v $EXCLUDED_DATABASES)
printf "Starting backup of databases ... \n\n"
# 2. Verify if the temporary backup folders exists, otherwise create it
[ -d $TMP_BACKUP_DIRECTORY ] || mkdir $TMP_BACKUP_DIRECTORY
# 3. Iterate over the database array available for the signed user (admin)
for db in $BASES_DE_DATOS; do
printf " Exporting database: '$db' | "
# 3. Dump database with mysqldump
# MYSQL_PWD is used to access as admin in MySQL inside Plesk based servers
# MYSQL_PWD=`cat /etc/psa/.psa.shadow`
BKP_FILENAME=`date +%Y%m%d`.$db.sql.gz
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysqldump -u $USERNAME --databases $db | gzip > $TMP_BACKUP_DIRECTORY/$BKP_FILENAME
printf "OK\n"
done
printf "\nThe backups have been succesfully generated ... Compressing all databases into a single file ... \n"
# 5. Verify if the backup folder exists in the current directory, otherwise create it
[ -d $BACKUP_DIRECTORY ] || mkdir $BACKUP_DIRECTORY
# 6. Compress generated backups (.sql files)
FNL_BKP_FILENAME=`date +%Y_%m_%d_%H_%M_%S`.mysql_databases_backup.tar.gz
tar -zcvf $BACKUP_DIRECTORY/$FNL_BKP_FILENAME $TMP_BACKUP_DIRECTORY
printf "\nCleaning up !\n"
# 7. Delete the temporary directory of backups
rm -rf $TMP_BACKUP_DIRECTORY
printf "\nBackup succesfully generated. \n"
После вставки содержимого убедитесь, что сценарий оболочки сохранен в вашей системе с использованием конца строк LF (unix), а не CLRF (Windows), иначе сценарий оболочки не запустится (даже с разрешениями на выполнение).
Как это устроено
Логика резервного копирования работает следующим образом: во-первых, вам необходимо определить постоянное имя пользователя, которое вы используете для доступа к plesk от имени администратора, в нашем случае имя пользователя — это то же самое «admin». Вам также необходимо определить некоторые переменные, которые содержат некоторые каталоги, которые будут использоваться во время резервного копирования, некоторые для хранения временных файлов и другие, которые будут содержать окончательные файлы резервных копий. Затем будет создана новая переменная, которая будет содержать массив имен баз данных, доступных на сервере MySQL, у вас также будет другая переменная для исключения некоторых баз данных в случае необходимости их исключения.
Как только массив станет доступен, сценарию необходимо проверить, существует ли временный каталог резервных копий, который будет содержать дампы, которые будут сжаты позже, если он не существует, он будет создан, и дампы будут созданы внутри. Теперь важный момент резервного копирования — выполнение команды mysqldump, которая выполняется для каждого элемента в массиве имен баз данных. Сброшенный .sql
Файл архивируется и сохраняется во временном каталоге. После того как каждая база данных будет выгружена, скрипт сжимает все содержимое временного каталога и создает новый архив gzipped tar внутри каталога резервного копирования.
После создания резервной копии временная папка удаляется и процесс завершается!
2. Запустите скрипт резервного копирования
Теперь, когда вы знаете, как работает скрипт, вам нужно только выполнить его, поэтому обязательно предоставьте разрешения на выполнение файла SH с помощью следующей команды:
chmod +x plesk_db_backup.sh
А затем запустите скрипт оболочки так, как вы хотите:
# Simply run the shell script directly if it has write permissions
./plesk_db_backup.sh
# Or run the shell script with the sh command
sh ./plesk_db_backup.sh
Сгенерированный в терминале вывод будет выглядеть примерно так:
Starting backup of databases ...
Exporting database: 'ourcodeworld-es' | OK
Exporting database: 'ourcodeworld' | OK
Exporting database: 'ourcodeworld-docs' | OK
Exporting database: 'other_database' | OK
The backups have been succesfully generated ... Compressing all databases into a single file ...
/var/ourcodeworld-db-backups/tmp-backups/20180517.ourcodeworld-es.sql.gz
/var/ourcodeworld-db-backups/tmp-backups/20180517.ourcodeworld.sql.gz
/var/ourcodeworld-db-backups/tmp-backups/20180517.ourcodeworld-docs.sql.gz
/var/ourcodeworld-db-backups/tmp-backups/20180517.other_database.sql.gz
Cleaning up !
Backup succesfully generated.
После того, как скрипт завершится, у вас будет в каталоге, где был создан скрипт, новая папка, а именно резервные копии. Внутри вы найдете сжатый файл, содержащий все сжатые дампы, сгенерированные mysqldump для каждой базы данных, доступной на сервере MySQL вашего Plesk: