Skip to content
Snippets Groups Projects
Commit 27e66532 authored by Hahn Axel (hahn)'s avatar Hahn Axel (hahn)
Browse files

Merge branch 'update-localdump-to-classlike-functions' into 'master'

mysql as prototype/ POC

See merge request !42
parents 5b32faa6 6fde8187
No related branches found
No related tags found
1 merge request!42mysql as prototype/ POC
......@@ -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"
......
......@@ -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(){
create_targetdir
j_requireBinary "mysql" 1
j_requireBinary "mysqldump" 1
j_requireProcess "mysqld|mariadb" 1
for DATABASE_DIR in $(find $SOURCE_DIR/* -type d -prune);
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 \
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="$OUTFILE" \
"$DATABASE"
--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 _dbname in $( mysql.db.list )
do
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"
compress_file "$_outfile"
else
color error
echo "ERROR occured - no gzip"
color reset
fi
ls -l "$OUTFILE"*
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
if [ $rc -ne 0 ]; then
rc=0
echo "SKIP: mysqld seems not to be here"
else
if [ "$1" = "restore" ]; then
echo
action=$1
shift 1
restoreByFile $*
else
doMysqlBackup
fi
fi
"${SERVICENAME}.$action" $*
echo "$0 $* [mysql] final returncode rc=$rc"
echo "INFO: $0 $action $* [$SERVICENAME] final returncode rc=$rc"
# --------------------------------------------------------------------------------
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment