Commit 2f0bdbb0b59e3db8ce844032a85df05d09e64cd3

Authored by Уласов Алексей
0 parents

Add script and readme files.

Showing 2 changed files with 208 additions and 0 deletions
README.md 0 → 100644
  1 +++ a/README.md
  1 +# Скрипт для резервного копирования БД MySQL
  2 +
  3 +## Для работы скрипта необходимо указать данные для подключения к CУБД
  4 +
  5 +```bash
  6 +# Расположение лог-файла результата работы скрипта
  7 +SCRIPT_LOG=/var/log/backups_mysql.log
  8 +# Имя пользователя для подключения к СУБД
  9 +DB_USER=""
  10 +# Пароль пользователя для подключения к СУБД
  11 +DB_PASSWORD=""
  12 +# Имя хоста для подключения к СУБД
  13 +DB_HOST=""
  14 +# Опции с которыми будут делаться дамбы БД
  15 +DUMP_OPTIONS="--single-transaction --quick --no-autocommit --force --add-drop-table --skip-add-locks"
  16 +# Расположение временного каталога для дампов
  17 +DUMP_FOLDER=/backups/tmp
  18 +# Имя временного архивного файла с дампами БД
  19 +ARCHIVE_NAME=archive.tar.gz
  20 +# Каталог где будут храниться архивы с дампами БД
  21 +DESTINATION_FOLDER=/backups
  22 +```
  23 +
... ...
backup_mysql.sh 0 → 100644
  1 +++ a/backup_mysql.sh
  1 +#!/usr/bin/env bash
  2 +
  3 +set -o pipefail
  4 +
  5 +PATH="$PATH:/usr/local/bin:/usr/local/sbin"
  6 +
  7 +SCRIPT_LOG=/var/log/backups_mysql.log
  8 +
  9 +DB_USER=""
  10 +
  11 +DB_PASSWORD=""
  12 +
  13 +DB_HOST=""
  14 +
  15 +DB_LIST=()
  16 +
  17 +DUMP_OPTIONS="--single-transaction --quick --no-autocommit --force --add-drop-table --skip-add-locks"
  18 +
  19 +DUMP_FOLDER=/backups/tmp
  20 +
  21 +ARCHIVE_NAME=archive.tar.gz
  22 +
  23 +DESTINATION_FOLDER=/backups
  24 +
  25 +
  26 +function LOG()
  27 +{
  28 + local msg="$1"
  29 + date=$(date '+%Y-%m-%d %H:%M:%S')
  30 + echo "[$date] $msg" >> $SCRIPT_LOG
  31 +}
  32 +
  33 +function DELETE_TMP_FOLDER()
  34 +{
  35 + if [ -d "${DUMP_FOLDER}" ]; then
  36 + rm -rf "${DUMP_FOLDER}" &> /dev/null
  37 + if [ $? -ne 0 ]; then
  38 + LOG "ERROR: Can not delete ${DUMP_FOLDER}"
  39 + exit 2
  40 + else
  41 + LOG "SUCCESS: Delete ${DUMP_FOLDER}"
  42 + fi
  43 + fi
  44 +}
  45 +
  46 +function CREATE_TMP_FOLDER()
  47 +{
  48 + if [ -d "${DUMP_FOLDER}" ]; then
  49 + LOG "ERROR: Dump folder ${DUMP_FOLDER} exists."
  50 + exit 2
  51 + else
  52 + mkdir -p "${DUMP_FOLDER}" &> /dev/null
  53 + if [ $? -ne 0 ]; then
  54 + LOG "ERROR: Create dump folder ${DUMP_FOLDER} failed."
  55 + DELETE_TMP_FOLDER
  56 + exit 2
  57 + else
  58 + LOG "SUCCESS: ${DUMP_FOLDER} is created."
  59 + fi
  60 + fi
  61 +}
  62 +
  63 +function READ_DBS()
  64 +{
  65 +
  66 + sql="SHOW DATABASES WHERE \`Database\` NOT IN('information_schema', 'performance_schema', 'mysql')"
  67 +
  68 + DB_LIST=$(mysql -N --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} -e "$sql") &> /dev/null
  69 + if [ $? -ne 0 ]; then
  70 + LOG "ERROR: Getting list of databases failed."
  71 + exit 2
  72 + else
  73 + if [[ -n $DB_LIST ]]; then
  74 + LOG "SUCCESS: Getting list of databases success."
  75 + else
  76 + LOG "ERROR: List of databases is empty."
  77 + exit 2
  78 + fi
  79 + fi
  80 +}
  81 +
  82 +
  83 +function CHECK_DISK_USAGE()
  84 +{
  85 + sql="SELECT table_schema , ROUND(SUM(data_length + index_length) / 1024 / 1024, 0) FROM information_schema.TABLES;"
  86 +
  87 + DBS_SIZE=$(mysql -N --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} -e "$sql"| awk '{print $2}') &> /dev/null
  88 + if [ $? -eq 0 ] ; then
  89 + LOG "SUCCESS: Determining the size of MySQL databases."
  90 + else
  91 + LOG "ERROR: Determining the size of MySQL databases failed."
  92 + exit 2
  93 + fi
  94 +
  95 + DST_AVAIL_SIZE=$(df -m ${DESTINATION_FOLDER} | awk 'NR==2{print $4}') &> /dev/null
  96 + if [ $? -eq 0 ] ; then
  97 + LOG "SUCCESS: Determining the amount of available disk space on ${DESTINATION_FOLDER} partition."
  98 + else
  99 + LOG "ERROR: Determining the amount of available disk space on ${DESTINATION_FOLDER} partition failed."
  100 + exit 2
  101 + fi
  102 +
  103 +
  104 + if [ $DST_AVAIL_SIZE -lt $DBS_SIZE ] ; then
  105 + LOG "ERROR: There is not ${DESTINATION_FOLDER} enough available disk space."
  106 + exit 2
  107 + else
  108 + LOG "SUCCESS: There is ${DESTINATION_FOLDER} enough available disk space."
  109 + fi
  110 +}
  111 +
  112 +function DUMP_DBS()
  113 +{
  114 + for DB_NAME in $DB_LIST
  115 + do
  116 + LOG "Dumping ${DB_NAME}..."
  117 + mysqldump --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} ${DUMP_OPTIONS} ${DB_NAME} > ${DUMP_FOLDER}/${DB_NAME}.sql
  118 +
  119 + if [ $? -eq 0 ] ; then
  120 + LOG "SUCCESS: Dump ${DB_NAME} is created."
  121 + else
  122 + LOG "ERROR: Dump ${DB_NAME} is failed."
  123 + DELETE_TMP_FOLDER
  124 + exit 2
  125 + fi
  126 + done
  127 +}
  128 +
  129 +function COMPRESS_DUMPS()
  130 +{
  131 + (cd ${DUMP_FOLDER} && tar cf - *.sql) | gzip -9 > ${DUMP_FOLDER}/${ARCHIVE_NAME}
  132 +
  133 + if [ $? -eq 0 ] ; then
  134 + LOG "SUCCESS: Archive has been created."
  135 + else
  136 + LOG "ERROR: Archive creation failed."
  137 + DELETE_TMP_FOLDER
  138 + exit 2
  139 + fi
  140 +}
  141 +
  142 +function CHECK_ARCHIVE()
  143 +{
  144 + tar -tf ${DUMP_FOLDER}/${ARCHIVE_NAME} &> /dev/null;
  145 + if [ $? -eq 0 ] ; then
  146 + LOG "SUCCESS: Archive verification completed."
  147 + else
  148 + LOG "ERROR: Archive verification failed"
  149 + DELETE_TMP_FOLDER
  150 + exit 2
  151 + fi
  152 +}
  153 +
  154 +function MOVE_ARCHIVE()
  155 +{
  156 + date=$(date '+%Y-%m-%d_%H-%M')
  157 + mv ${DUMP_FOLDER}/${ARCHIVE_NAME} ${DESTINATION_FOLDER}/${DB_HOST}_${date}.tar.gz &> /dev/null
  158 + if [ $? -eq 0 ] ; then
  159 + LOG "SUCCESS: Archive has been moved."
  160 + else
  161 + LOG "ERROR: Archive moving failed"
  162 + DELETE_TMP_FOLDER
  163 + exit 2
  164 + fi
  165 +
  166 +}
  167 +
  168 +
  169 +LOG "### Backup mysql started ###"
  170 +LOG "Checking the amount of available disk space on ${DESTINATION_FOLDER} partition."
  171 +CHECK_DISK_USAGE
  172 +LOG "Creatting temporary folder:"
  173 +CREATE_TMP_FOLDER
  174 +LOG "Getting list of databases:"
  175 +READ_DBS
  176 +LOG "Dump databases:"
  177 +DUMP_DBS
  178 +LOG "Compressing dumps:"
  179 +COMPRESS_DUMPS
  180 +LOG "Checking archive:"
  181 +CHECK_ARCHIVE
  182 +LOG "Moving archive:"
  183 +MOVE_ARCHIVE
  184 +DELETE_TMP_FOLDER
  185 +LOG "### Backup mysql ended ###"
0 186 \ No newline at end of file
... ...