diff --git a/localdump.sh b/localdump.sh index ac46b9af71f4fa484416da951dd1f1a3ade08802..2687efa2bbae780d32f84890e74f38f7cdf91f74 100755 --- a/localdump.sh +++ b/localdump.sh @@ -217,12 +217,16 @@ # show help # ------------------------------------------------------------ function showhelp(){ + local _self + _self=$( basename "$0" ) echo "SYNTAX: " - echo "`basename $0` [[operation]] [Name_of_service] [[more services]]" - echo "`basename $0` restore [Name_of_service] [file-to-restore]" + echo "$_self [[operation]] [Name_of_ervice] [[more services]]" + echo + echo "$_self backup [Name_of_service]" + echo "$_self restore [Name_of_service] [[file-to-restore]]" echo echo " operation - one of check|backup|restore; optional parameter; default is backup" - echo " check show info only if the service is available" + echo " check WIP: show info only if the service is available" echo " backup dump all databases/ schemes of a given service" echo " restore import a dump into same or new database" echo " Without a filename it starts an interactive mode" diff --git a/plugins/localdump/mysql.sh b/plugins/localdump/mysql.sh index 7215c7fcf239dc4becd0b59b52145b826eea4f02..c6e206196655515cdd54047b3ec6600a122ac62b 100755 --- a/plugins/localdump/mysql.sh +++ b/plugins/localdump/mysql.sh @@ -10,12 +10,13 @@ # # 2016-11-10 ah,ds v0.8 needs to be testet # 2017-03-28 ..... v1.0 added restore -# 2022-01-20 v1.1 fixes with shellcheck +# 2022-01-20 ah v1.1 fixes with shellcheck +# 2022-02-14 ah v2.0 rewrite with class like functions # ================================================================================ if [ -z "$BACKUP_TARGETDIR" ]; then echo "ERROR: you cannot start $(basename $0) directly" - rc=$rc+1 + rc+=1 exit 1 fi @@ -23,114 +24,224 @@ fi # CONFIG # -------------------------------------------------------------------------------- +mysql_FOUND=0 SOURCE_DIR=/var/lib/mysql -MYSQLDUMP=/usr/bin/mysqldump + # -------------------------------------------------------------------------------- -# FUNCTIONS +# PRIVATE FUNCTIONS # -------------------------------------------------------------------------------- -function doMysqlBackup(){ +# make checks if a service is available on this machine +# it sets mysql_FOUND as flag +function mysql._check(){ + + j_requireBinary "mysql" 1 + j_requireBinary "mysqldump" 1 + j_requireProcess "mysqld|mariadb" 1 + + if [ ! -d $SOURCE_DIR ]; then + echo "INFO: directory $SOURCE_DIR doees not exist." + rc=$rc+1 + fi + + # set flag and reset return code + test $rc -eq 0 && mysql_FOUND=1 + rc=0 +} + +# -------------------------------------------------------------------------------- +# PUBLIC FUNCTIONS I :: DB SCHEME - METHODS LOW LEVEL +# -------------------------------------------------------------------------------- + +# create a database scheme +# param string name of the dabase scheme +function mysql.db.create(){ + local _dbname=$1 + echo "CREATE DATABASE IF NOT EXISTS ${_dbname};" | mysql +} + +# dump [database] --> [file] +# dump a single database into given file +# param string name of database to dump +# param string name of output file +function mysql.db.dump(){ + + local _dbname=$1 + local _dumpfile=$2 + + mysqldump --opt \ + --default-character-set=utf8 \ + --flush-logs \ + --single-transaction \ + --no-autocommit \ + --result-file="$_dumpfile" \ + "$_dbname" + +} + +# import [file] --> [database] +# import a single db dump into a given db +# param string name of file +# param string name of target db scheme +function mysql.db.import(){ + local _dumpfile=$1 + local _dbname=$2 + zcat "$_dumpfile" | mysql "${_dbname}" +} + +# show a list of existing databases +function mysql.db.list(){ + mysql -Ee "show databases ;" | grep "^Database:" | awk '{ print $2 }' +} + +# -------------------------------------------------------------------------------- +# PUBLIC FUNCTIONS II :: HIGH LEVEL +# -------------------------------------------------------------------------------- + +# return result is the current service available +# USAGE: to abort a function if not available: +# mysql.available || return +function mysql.available(){ + typeset -i local _rc=(1-$mysql_FOUND) + return $_rc +} + +# make checks if the current service is available on this machine +# param bool flag: silence; if any parameter is set it shows no output +function mysql.check(){ + + if [ -n "$1" ]; then + mysql._check >/dev/null 2>&1 + else + echo + echo Details: + mysql._check + echo + fi +} + +# start database backup of all schemes of this service +# no prameters +function mysql.backup(){ + # abort if service is not available + mysql.available || return + + local _dbname + local _outfile create_targetdir - for DATABASE_DIR in $(find $SOURCE_DIR/* -type d -prune); + for _dbname in $( mysql.db.list ) do - # DATABASE=`basename $DATABASE_DIR` - DATABASE=$(basename "$DATABASE_DIR" | sed "s#\@002d#-#g" ) - TABLECOUNT=$(find "$DATABASE_DIR"/. -type f -name "*frm" | wc -l) - echo "--- database $DATABASE - $TABLECOUNT tables" - if [ $TABLECOUNT -gt 0 ]; then - echo -n "backup ... " - OUTFILE="${BACKUP_TARGETDIR}/$(get_outfile ${DATABASE}).sql" - # task 1251 - "--master-data=2" was removed - $MYSQLDUMP --opt \ - --default-character-set=utf8 \ - --flush-logs \ - --single-transaction \ - --no-autocommit \ - --result-file="$OUTFILE" \ - "$DATABASE" - fetchrc - - # $myrc is last returncode - set in fetchrc - if [ $myrc -eq 0 ]; then - echo -n "gzip ... " - compress_file "$OUTFILE" - else - echo "ERROR occured - no gzip" - fi - ls -l "$OUTFILE"* + echo "--- database $_dbname" + echo -n "backup ... " + _outfile="${BACKUP_TARGETDIR}/$(get_outfile ${_dbname}).sql" + + mysql.db.dump "$_dbname" "$_outfile" + fetchrc + + # $myrc is last returncode - set in fetchrc + if [ $myrc -eq 0 ]; then + echo -n "gzip ... " + compress_file "$_outfile" + else + color error + echo "ERROR occured - no gzip" + color reset fi + ls -l "$_outfile"* echo done } +# show help +function mysql.help(){ + # local _bShow=false + # tac "$0" | while read line + # do + # if echo $line | grep "^function mysql\.[a-z]" >/dev/null; then + # _bShow = true + # fi + # if echo $line | grep "^# " >/dev/null; then + # _bShow = true + # fi + # done + cat <<EOHELP +help for MYSQL-DOT functions + +(1) high level functions + + mysql.check [0|1] check if mysql is available + mysql.backup backup all databases + mysql.restore FILE DBNAME restore database + +(2) functions on database level + + mysql.db.create DBNAME create database + mysql.db.dump DBNAME OUTFILE dump given database to output file + mysql.db.import FILE DBNAME import file into existing database + mysql.db.list list existing databases + +EOHELP +} # restore database dump file into database # param string database dump file (gzipped) # param string optional: database to import; default: database is parsed from file -function restoreByFile(){ - sMyfile=$1 - sMyDb=$2 - - if [ -z "$sMyDb" ]; then - h2 "analyze dump $sMyfile" - sMyDb=$(guessDB $sMyfile) - echo "detected db schema from file: [${sMyDb}]" +function mysql.restore(){ + + # abort if service is not available + mysql.available || return + + local _infile=$1 + local _dbname=$2 + + if [ -z "$_dbname" ]; then + h2 "analyze dump $_infile" + _dbname=$(guessDB $_infile) + echo "detected db schema from file: [${_dbname}]" else - echo "db schema from param 2: [${sMyDb}]" + echo "db schema from param 2: [${_dbname}]" fi echo - echo import to "$sMyDb"... + echo import to "$_dbname"... h2 ensure that database exists ... color cmd - echo "CREATE DATABASE IF NOT EXISTS ${sMyDb};" | mysql + # echo "CREATE DATABASE IF NOT EXISTS ${_dbname};" | mysql + mysql.db.create "${_dbname}" color reset h2 import ... - ls -l "$sMyfile" - echo "import to database [${sMyDb}]" + ls -l "$_infile" + echo "import to database [${_dbname}]" color cmd - zcat "$sMyfile" | mysql "${sMyDb}" + # zcat "$_infile" | mysql "${_dbname}" + mysql.db.import "$_infile" "${_dbname}" fetchrc color reset } +function mysql.shell(){ + echo "hi" +} # -------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------- - -# ----- check requirements -j_requireBinary "mysql" 1 -j_requireBinary "mysqldump" 1 -j_requireProcess "mysqld|mariadb" 1 - -if [ ! -d $SOURCE_DIR ]; then - echo "INFO: directory $SOURCE_DIR doees not exist." - rc=$rc+1 +"${SERVICENAME}".check 1 +if ! "${SERVICENAME}".available; then + echo "INFO: service [$SERVICENAME] is not avilable on this machine." fi +action=$1 +shift 1 +"${SERVICENAME}.$action" $* -if [ $rc -ne 0 ]; then - rc=0 - echo "SKIP: mysqld seems not to be here" -else - if [ "$1" = "restore" ]; then - echo - shift 1 - restoreByFile $* - - else - doMysqlBackup - fi -fi - -echo "$0 $* [mysql] final returncode rc=$rc" +echo "INFO: $0 $action $* [$SERVICENAME] final returncode rc=$rc" # --------------------------------------------------------------------------------