#! /bin/bash backupdir=/var/dbbackup keeptime="5 day ago" datestamp= # date +format. MYSQL_USR= MYSQL_PWD= compress=none umask 077 [ -r /etc/uls/dbbackups.conf ] && . /etc/uls/dbbackups.conf bexten="sql" case "${compress}" in none) ctool=(cat) ;; gz) bexten+=".gz" ctool=(gzip -9) ;; bz2) bexten+=".bz2" ctool=(bzip2 -9) ;; xz) bexten+=".xz" ctool=(xz -9) ;; *) echo "Unregocnised value for compress, one of none, gz, bz2 or xz is expected." >&2 exit 1 ;; esac export MYSQL_PWD if [ -z "${MYSQL_USR}" ] || ! databases=($(mysql -u"${MYSQL_USR}" -B -N -e "show databases")); then MYSQL_PWD= fi if [ -z "${MYSQL_PWD}" ]; then tty -s || exit 1 if [ -n "${MYSQL_USR}" ]; then echo "Configured credentials failed for user ${MYSQL_USR}. You can" echo "Enter the correct password, or blank to reconfigure from scratch." echo read -p "Updated password for ${MYSQL_USR}: " -s MYSQL_PWD; echo while [ -n "${MYSQL_PWD}" ] && ! databases=($(mysql -u"${MYSQL_USR}" -B -N -e "show databases")); do read -p "Updated password for ${MYSQL_USR}: " -s MYSQL_PWD; echo done fi if [ -z "${MYSQL_PWD}" ]; then echo "We will now create a new user for db backup purposes (We will generate a random password if possible)." read -p "Username to use: " MYSQL_USR if which pwgen &>/dev/null; then MYSQL_PWD=$(pwgen 16 1) echo "Selected password ${MYSQL_PWD}" else read -p "Unable to generate random password, please enter: " -s MYSQL_PWD; echo fi echo "When prompted enter the MySQL root password. This will first drop the user if it exists, and then recreate it." ( echo "DROP USER IF EXISTS '${MYSQL_USR}'@localhost;" echo "GRANT SELECT, LOCK TABLES, SHOW VIEW, EXECUTE, RELOAD ON *.* TO '${MYSQL_USR}'@localhost IDENTIFIED BY '${MYSQL_PWD}';" ) | mysql -uroot -p fi [ -d /etc/uls ] || mkdir /etc/uls || exit 1 [ -r /etc/uls/dbbackups.conf ] && sed -e '/^MYSQL_/ d' -i /etc/uls/dbbackups.conf printf "MYSQL_USR=%q\nMYSQL_PWD=%q\n" "${MYSQL_USR}" "${MYSQL_PWD}" >> /etc/uls/dbbackups.conf fi [ -n "${datestamp}" ] && datestamp="$(date "+-${datestamp}")" for db in "${databases[@]}"; do [ "${db}" = "information_schema" ] && continue [ "${db}" = "performance_schema" ] && continue # Determine if we've got InnoDB only ... innodbonly=$(mysql -u"${MYSQL_USR}" -B -N "${db}" -e "show table status" | awk 'BEGIN{ innodbonly=1 } $2!="InnoDB" && $NF!="VIEW" && $2!="Memory" { innodbonly=0 } END { print innodbonly }') if [ "${innodbonly}" -eq 1 ]; then locktype="--single-transaction" else locktype="--lock-tables" fi mysqldump -u"${MYSQL_USR}" -R ${locktype} "${db}" | "${ctool[@]}" > "${backupdir}/${db}${datestamp}.${bexten}" done keepmins=$(( ( $(date +%s) - $(date +%s -d "${keeptime}") ) / 60 )) || exit 1 find "${backupdir}" \( -name "*.sql" -o -name "*.sql.{gz,bz2,xz}" \) -mmin +${keepmins} -delete