From 621fceac78bf23d32fd0ac8b728059fbc0362f1e Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Thu, 22 Jan 2009 21:54:16 +0100 Subject: [PATCH] mysql: No longer prepend vroot to the backupdir. Prepending the vroot can still be done manually by starting the backupdir config variable with %v. For backwards compatibility, prepending %v is done automatically when vsname is used (instead of vsnames). This requires the vsname -> vsnames change and this change to be released at the same time. --- examples/example.mysql | 10 ++++++ handlers/mysql.in | 80 +++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 37 deletions(-) diff --git a/examples/example.mysql b/examples/example.mysql index a16a9d0..0029845 100644 --- a/examples/example.mysql +++ b/examples/example.mysql @@ -70,6 +70,10 @@ compress = yes # # hotcopy = < yes | no > (default = no) # make a backup of the actual database binary files using mysqlhotcopy. +# When using hotcopy, backupdir must be a dir inside each vserver! You can use +# the interpolation feature to do this for multiple vservers by starting +# backupdir with %v (not /%v), which will be replaced by the current +# vserver root. # # sqldump = < yes | no > (default = no) # make a backup using mysqldump. this creates text files with sql commands @@ -87,5 +91,11 @@ compress = yes # in /etc/backupninja.conf), if you do not specify vsnames the # host will be operated on. # +# Note that backupninja 0.9.6 and before used "vsname" to run in a single +# vserver. It also automatically prepended the vserver root directory to +# backupdir. Newer versions still do this if you're using the deprecated (but +# still supported) "vsname" variable. To achieve the same effect while using +# the vsnames variable, prepend backupdir with %v +# # NB: databases = all doesn't seem to work with hotcopy = yes # when vsname is specified, I would like to know how to fix this. diff --git a/handlers/mysql.in b/handlers/mysql.in index d3e15ab..db4159d 100644 --- a/handlers/mysql.in +++ b/handlers/mysql.in @@ -31,6 +31,8 @@ if [ -n "$vsname" ]; then if [ -z "$vsnames" ]; then warning "Using deprecated 'vsname' configuration variable" vsnames="$vsname" + info "Prepending '%v' to backupdir to emulate legacy behaviour" + backupdir="%v/$backupdir" else warning "Ignoring (deprecated) vsname configuration variable, since vsnames is given" fi @@ -76,16 +78,15 @@ function make_backup() { interpolated=`interpolate "$backupdir" "$vsname"` - # create backup dirs, $vroot will be empty if no vsname was specified - # and we will instead proceed to operate on the host - [ -d $vroot$interpolated ] || mkdir -p $vroot$interpolated - [ -d $vroot$interpolated ] || fatal "Backup directory '$vroot$backupdir'" + # create backup dirs + [ -d $interpolated ] || mkdir -p $interpolated + [ -d $interpolated ] || fatal "Failed to create backup directory '$interpolated'" hotdir="$interpolated/hotcopy" dumpdir="$interpolated/sqldump" - [ "$sqldump" == "no" -o -d $vroot$dumpdir ] || mkdir -p $vroot$dumpdir - [ "$hotcopy" == "no" -o -d $vroot$hotdir ] || mkdir -p $vroot$hotdir + [ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir + [ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir ####################################################################### ## AUTHENTICATION @@ -173,46 +174,51 @@ EOF if [ "$hotcopy" == "yes" ] then - info "Initializing hotcopy method" - if [ "$databases" == "all" ] - then - info "dbhost: $dbhost" - execstr="$vexec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $hotdir" - - debug "su $user -c \"$execstr\"" - if [ ! $test ] + if starts_with "$hotdir" "$vroot"; then + info "Initializing hotcopy method" + vhotdir=`strip_prefix "$hotdir" "$vroot"` + if [ "$databases" == "all" ] then - output=`su $user -c "$execstr" 2>&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished hotcopy of all mysql databases" - else - warning $output - warning "Failed to hotcopy all mysql databases" - fi - fi - else - for db in $databases - do - execstr="$vexec $MYSQLHOTCOPY -h $dbhost --allowold $db $hotdir" + info "dbhost: $dbhost" + execstr="$vexec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $vhotdir" - debug 'su $user -c \"$execstr\"' + debug "su $user -c \"$execstr\"" if [ ! $test ] then output=`su $user -c "$execstr" 2>&1` code=$? if [ "$code" == "0" ] then - debug $output - info "Successfully finished hotcopy of mysql database $db" + debug $output + info "Successfully finished hotcopy of all mysql databases" else - warning $output - warning "Failed to hotcopy mysql database $db" + warning $output + warning "Failed to hotcopy all mysql databases" fi fi - done + else + for db in $databases + do + execstr="$vexec $MYSQLHOTCOPY -h $dbhost --allowold $db $vhotdir" + + debug 'su $user -c \"$execstr\"' + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of mysql database $db" + else + warning $output + warning "Failed to hotcopy mysql database $db" + fi + fi + done + fi + else + error "hotcopy method can only be used when the backupdir ($hotdir) is within the vserver ($vroot)" fi fi @@ -258,9 +264,9 @@ EOF fatal "Either you have an authentication problem, or mysqld doesn't appear to be running!" fi if [ "$compress" == "yes" ]; then - execstr="$vexec $DUMP | $GZIP > $vroot$dumpdir/${db}.sql.gz" + execstr="$vexec $DUMP | $GZIP > $dumpdir/${db}.sql.gz" else - execstr="$vexec $DUMP -r $vroot$dumpdir/${db}.sql" + execstr="$vexec $DUMP -r $dumpdir/${db}.sql" fi debug "su $user -c \"$execstr\"" -- 2.30.2