#
# 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
# 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.
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
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
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
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\""