Commit 2f0bdbb0b59e3db8ce844032a85df05d09e64cd3
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 | \ No newline at end of file | 186 | \ No newline at end of file |