|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +export -n $(egrep -v '^#' .env | xargs) |
| 4 | + |
| 5 | + |
| 6 | +if [ -z "${BACKUP_DIR}" ]; then |
| 7 | + echo "Empty Variable BACKUP_DIR" |
| 8 | +fi |
| 9 | + |
| 10 | +if [ -z "${MYSQL_HOST}" ]; then |
| 11 | + echo "Empty Variable MYSQL_HOST" |
| 12 | +fi |
| 13 | + |
| 14 | +if [ -z "${MYSQL_USER}" ]; then |
| 15 | + echo "Empty Variable MYSQL_USER" |
| 16 | +fi |
| 17 | + |
| 18 | + |
| 19 | +MYSQL_CONN="-h${MYSQL_HOST} -u${MYSQL_USER}" |
| 20 | + |
| 21 | +if [ ! -z "${MYSQL_PASS}" ]; then |
| 22 | + MYSQL_CONN="${MYSQL_CONN} -p${MYSQL_PASS}" |
| 23 | +fi |
| 24 | + |
| 25 | +if [ -z "${EXPERT_ARGS}" ]; then |
| 26 | + EXPERT_ARGS="--default-character-set=utf8 --extended-insert=FALSE --single-transaction --skip-comments --skip-dump-date --hex-blob --tz-utc" |
| 27 | +fi |
| 28 | + |
| 29 | +MYSQLDUMP_DEFAULTS="${MYSQL_CONN} ${EXPERT_ARGS}" |
| 30 | + |
| 31 | +DB_LIST_SQL="SELECT schema_name FROM information_schema.schemata" |
| 32 | + |
| 33 | +# If ${SKIP_DATABASES} is not empty, create a where chain |
| 34 | +if [ ! -z "${SKIP_DATABASES}" ]; then |
| 35 | + DB_LIST_SQL="${DB_LIST_SQL} WHERE schema_name NOT IN (" |
| 36 | + # Split on , |
| 37 | + SKIP_DATABASES=$(echo -e "${SKIP_DATABASES}" | tr "," "\n") |
| 38 | + for DB in ${SKIP_DATABASES} ; do |
| 39 | + DB_LIST_SQL="${DB_LIST_SQL}'${DB}'," ; |
| 40 | + done |
| 41 | + DB_LIST_SQL="${DB_LIST_SQL: : -1}" |
| 42 | + DB_LIST_SQL="${DB_LIST_SQL});" |
| 43 | +fi |
| 44 | +# echo -e "${DB_LIST_SQL}" |
| 45 | +# Get result |
| 46 | +DB_LIST=`mysql ${MYSQL_CONN} -ANe"${DB_LIST_SQL}"` |
| 47 | + |
| 48 | +for DB in $DB_LIST; do # Concat ignore command |
| 49 | + DBS="${DBS} ${DB}" |
| 50 | +done |
| 51 | + |
| 52 | +VIEW_LIST_SQL="SET SESSION group_concat_max_len = 1000000;SELECT GROUP_CONCAT(concat(':!\`',table_schema,'\`.\`',table_name,'\`') SEPARATOR '') FROM information_schema.views" |
| 53 | +# Get result |
| 54 | +VIEWS_LIST=`mysql ${MYSQL_CONN} -ANe"${VIEW_LIST_SQL}"` |
| 55 | + |
| 56 | +VIEW_IGNORE_ARG="" |
| 57 | +# Split on :! |
| 58 | +VIEWS=$(echo -e "${VIEWS_LIST}" | tr ":!" "\n") |
| 59 | + |
| 60 | +for VIEW in $VIEWS; do # Concat ignore command |
| 61 | + VIEW_IGNORE_ARG="${VIEW_IGNORE_ARG} --ignore-table=${VIEW}" |
| 62 | +done |
| 63 | +# echo -e "${VIEW_IGNORE_ARG}" |
| 64 | + |
| 65 | +echo "Structure..." |
| 66 | +mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=FALSE --events=FALSE --no-data ${VIEW_IGNORE_ARG} --databases ${DBS} > ${BACKUP_DIR}/structure.sql |
| 67 | + |
| 68 | +echo "Data ..." |
| 69 | +mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=FALSE --events=FALSE --no-create-info ${VIEW_IGNORE_ARG} --databases ${DBS} > ${BACKUP_DIR}/database.sql |
| 70 | + |
| 71 | +echo "Users ..." |
| 72 | +mysqldump ${MYSQLDUMP_DEFAULTS} mysql --complete-insert --tables user db > ${BACKUP_DIR}/users.sql |
| 73 | + |
| 74 | +echo "Routines ..." |
| 75 | +mysqldump ${MYSQLDUMP_DEFAULTS} --routines=TRUE --triggers=FALSE --events=FALSE --no-create-info --no-data --no-create-db --databases ${DBS} > ${BACKUP_DIR}/routines.sql |
| 76 | + |
| 77 | +echo "Triggers ..." |
| 78 | +mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=TRUE --events=FALSE --no-create-info --no-data --no-create-db --databases ${DBS} > ${BACKUP_DIR}/triggers.sql |
| 79 | + |
| 80 | +echo "Events ..." |
| 81 | +mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=FALSE --events=TRUE --no-create-info --no-data --no-create-db --databases ${DBS} > ${BACKUP_DIR}/events.sql |
| 82 | + |
| 83 | +echo "Views ..." |
| 84 | +VIEWS_SHOW_SQL="" |
| 85 | +for VIEW in $VIEWS; do # Concat SHOW CREATE VIEW command |
| 86 | + VIEWS_SHOW_SQL="${VIEWS_SHOW_SQL}SHOW CREATE VIEW ${VIEW};" |
| 87 | +done |
| 88 | +# echo -e "${VIEWS_SHOW_SQL}" |
| 89 | +echo ${VIEWS_SHOW_SQL} | sed 's/;/\\G/g' | mysql ${MYSQL_CONN} > ${BACKUP_DIR}/views.sql |
| 90 | + |
| 91 | +#Keeps lines starting with Create |
| 92 | +sed -i '/Create/!d' ${BACKUP_DIR}/views.sql |
| 93 | +# Removes 'Create View' |
| 94 | +sed -i -e 's/Create\ View://g' ${BACKUP_DIR}/views.sql |
| 95 | +#add ; at lines end |
| 96 | +sed -i 's/)$/);/' ${BACKUP_DIR}/views.sql |
| 97 | +#Remove spaces before start of line |
| 98 | +sed -i 's/^ *//' ${BACKUP_DIR}/views.sql |
| 99 | +#Add ; at line end |
| 100 | +sed -i 's/$/;/' ${BACKUP_DIR}/views.sql |
| 101 | +#Replace double ;; by ; |
| 102 | +sed -i 's/;;/;/' ${BACKUP_DIR}/views.sql |
| 103 | + |
| 104 | +echo "Grants ..." |
| 105 | +# Needs refactor |
| 106 | +GRANTS_SQL="select distinct concat( \"SHOW GRANTS FOR '\",user,\"'@'\",host,\"';\" ) from mysql.user WHERE user != 'root';" |
| 107 | +GRANTS_LIST=`mysql ${MYSQL_CONN} -ANe"${GRANTS_SQL}"` |
| 108 | +echo ${GRANTS_LIST} | mysql --default-character-set=utf8 --skip-comments ${MYSQL_CONN} | sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/-- \1 --/;/--/{x;p;x;}' > ${BACKUP_DIR}/grants.sql |
| 109 | +# Removes double backslashes > \\ |
| 110 | +sed -i -e 's/\\\\//g' ${BACKUP_DIR}/grants.sql |
| 111 | +# echo -e ${GRANTS_SQL} |
| 112 | + |
| 113 | +echo "Backup done !" |
| 114 | + |
0 commit comments