summaryrefslogtreecommitdiff
path: root/scripts/wsrep_sst_xtrabackup.sh
diff options
context:
space:
mode:
authorSeppo Jaakola <seppo.jaakola@codership.com>2013-06-19 10:35:40 +0300
committerSeppo Jaakola <seppo.jaakola@codership.com>2013-06-19 10:35:40 +0300
commit862c6b219e672a39d24db6555084ad6e3a1cbbfd (patch)
tree7f0a89d8c06cf151e4da08e588e7eca6a1301ac1 /scripts/wsrep_sst_xtrabackup.sh
parent6793d7f1146639f03e3d860bcd668ba2e2d028eb (diff)
downloadmariadb-git-862c6b219e672a39d24db6555084ad6e3a1cbbfd.tar.gz
References lp:1191778 - merged xtrabackup SST fixes from PXC
Diffstat (limited to 'scripts/wsrep_sst_xtrabackup.sh')
-rw-r--r--scripts/wsrep_sst_xtrabackup.sh141
1 files changed, 67 insertions, 74 deletions
diff --git a/scripts/wsrep_sst_xtrabackup.sh b/scripts/wsrep_sst_xtrabackup.sh
index 68e8c0309fb..16f29e6e358 100644
--- a/scripts/wsrep_sst_xtrabackup.sh
+++ b/scripts/wsrep_sst_xtrabackup.sh
@@ -1,6 +1,5 @@
#!/bin/bash -ue
-
-# Copyright (C) 2011 Percona Inc
+# Copyright (C) 2013 Percona Inc
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -17,9 +16,46 @@
# MA 02110-1301 USA.
# This is a reference script for Percona XtraBackup-based state snapshot tansfer
+# Dependencies: (depending on configuration)
+# xbcrypt for encryption/decryption.
+# qpress for decompression. Download from http://www.quicklz.com/qpress-11-linux-x64.tar till
+# https://blueprints.launchpad.net/percona-xtrabackup/+spec/package-qpress is fixed.
+# my_print_defaults to extract values from my.cnf.
+# netcat for transfer.
+# xbstream for streaming.
. $(dirname $0)/wsrep_sst_common
+ealgo=""
+ekey=""
+ekeyfile=""
+encrypt=0
+
+get_keys()
+{
+ # There is no metadata in the stream to indicate that it is encrypted
+ # So, if the cnf file on joiner contains 'encrypt' under [xtrabackup] section then
+ # it means encryption is being used
+ if ! my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q encrypt; then
+ return
+ fi
+ wsrep_log_info "Encryption enabled in my.cnf - not supported at the moment - Bug in Xtrabackup - lp:1190343"
+ ealgo=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt=' | cut -d= -f2)
+ ekey=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key=' | cut -d= -f2)
+ ekeyfile=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key-file=' | cut -d= -f2)
+
+ if [[ -z $ealgo ]];then
+ wsrep_log_error "FATAL: Encryption algorithm empty from my.cnf, bailing out"
+ exit 3
+ fi
+
+ if [[ -z $ekey && ! -r $ekeyfile ]];then
+ wsrep_log_error "FATAL: Either key or keyfile must be readable"
+ exit 3
+ fi
+ encrypt=1
+}
+
cleanup_joiner()
{
local PID=$(ps -aef |grep nc| grep $NC_PORT | awk '{ print $2 }')
@@ -27,6 +63,7 @@ cleanup_joiner()
[ -n "$PID" -a "0" != "$PID" ] && kill $PID && (kill $PID && kill -9 $PID) || :
rm -f "$MAGIC_FILE"
if [ "${WSREP_SST_OPT_ROLE}" = "joiner" ];then
+ wsrep_log_info "Removing the sst_in_progress file"
wsrep_cleanup_progress_file
fi
}
@@ -88,7 +125,6 @@ rm -f "${MAGIC_FILE}"
if [ "$WSREP_SST_OPT_ROLE" = "donor" ]
then
- encrypt=0
# UUID=$6
# SEQNO=$7
@@ -116,34 +152,17 @@ then
INNOBACKUPEX_ARGS="${INNOBACKUPEX_ARGS} --password="
fi
- set +e
- if my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q encrypt; then
- wsrep_log_info "Encryption enabled in my.cnf - NOT SUPPORTED - look at lp:1190343"
- #encrypt=1
- fi
+ get_keys
if [[ $encrypt -eq 1 ]];then
-
- ealgo=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt=' | cut -d= -f2)
- ekey=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key=' | cut -d= -f2)
- ekeyfile=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key-file=' | cut -d= -f2)
-
- if [[ -z $ealgo || (-z $ekey && -z $ekeyfile) ]];then
- wsrep_log_error "FATAL: Encryption parameters empty from my.cnf, bailing out"
- exit 3
- fi
-
if [[ -n $ekey ]];then
INNOBACKUPEX_ARGS="${INNOBACKUPEX_ARGS} --encrypt=$ealgo --encrypt-key=$ekey"
else
- if [[ ! -r $ekeyfile ]];then
- wsrep_log_error "FATAL: Key file not readable"
- exit 3
- fi
INNOBACKUPEX_ARGS="${INNOBACKUPEX_ARGS} --encrypt=$ealgo --encrypt-key-file=$ekeyfile"
fi
fi
+ set +e
${INNOBACKUPEX_BIN} ${INNOBACKUPEX_ARGS} ${TMPDIR} \
2> ${DATA}/innobackup.backup.log | \
${NC_BIN} ${REMOTEIP} ${NC_PORT}
@@ -177,7 +196,16 @@ then
echo "continue" # now server can resume updating data
echo "${STATE}" > "${MAGIC_FILE}"
echo "1" > "${DATA}/${IST_FILE}"
- (cd ${DATA}; tar cf - ${INFO_FILE} ${IST_FILE}) | ${NC_BIN} ${REMOTEIP} ${NC_PORT}
+ get_keys
+ if [[ $encrypt -eq 1 ]];then
+ if [[ -n $ekey ]];then
+ (cd ${DATA}; xbstream -c ${INFO_FILE} ${IST_FILE} | xbcrypt --encrypt-algo=$ealgo --encrypt-key=$ekey) | ${NC_BIN} ${REMOTEIP} ${NC_PORT}
+ else
+ (cd ${DATA}; xbstream -c ${INFO_FILE} ${IST_FILE} | xbcrypt --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile) | ${NC_BIN} ${REMOTEIP} ${NC_PORT}
+ fi
+ else
+ (cd ${DATA}; xbstream -c ${INFO_FILE} ${IST_FILE}) | ${NC_BIN} ${REMOTEIP} ${NC_PORT}
+ fi
rm -f ${DATA}/${IST_FILE}
fi
@@ -185,14 +213,12 @@ then
elif [ "${WSREP_SST_OPT_ROLE}" = "joiner" ]
then
+ [[ -e $SST_PROGRESS_FILE ]] && wsrep_log_info "Stale sst_in_progress file: $SST_PROGRESS_FILE"
touch $SST_PROGRESS_FILE
sencrypted=1
- encrypt=0
- ekey=""
- ealgo=""
- ekeyfile=""
ecode=0
+ declare -a RC
MODULE="xtrabackup_sst"
@@ -212,51 +238,28 @@ then
trap "exit 3" INT TERM
trap cleanup_joiner EXIT
- # There is no metadata in the stream to indicate that it is encrypted
- # So, if the cnf file on joiner contains 'encrypt' under [xtrabackup] section then
- # it means encryption is being used
- if my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q encrypt; then
- #wsrep_log_info "Encryption enabled in my.cnf, decrypting the stream/backup"
- wsrep_log_error "Encryption enabled in my.cnf - NOT SUPPORTED - look at lp:1190343"
- #encrypt=1
- fi
-
+ get_keys
set +e
if [[ $encrypt -eq 1 && $sencrypted -eq 1 ]];then
-
-
- ealgo=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt=' | cut -d= -f2)
- ekey=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key=' | cut -d= -f2)
- ekeyfile=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key-file=' | cut -d= -f2)
-
- if [[ -z $ealgo || (-z $ekey && -z $ekeyfile) ]];then
- wsrep_log_error "FATAL: Encryption parameters empty from my.cnf, bailing out"
- exit 3
- fi
-
if [[ -n $ekey ]];then
- ${NC_BIN} -dl ${NC_PORT} | xbcrypt -d --encrypt-algo=$ealgo --encrypt-key=$ekey | xbstream -x -C ${DATA} 1>&2
- RC=( "${PIPESTATUS[@]}" )
+ ${NC_BIN} -dl ${NC_PORT} | xbcrypt -d --encrypt-algo=$ealgo --encrypt-key=$ekey | xbstream -x -C ${DATA}
else
- if [[ ! -r $ekeyfile ]];then
- wsrep_log_error "FATAL: Key file not readable"
- exit 3
- fi
- ${NC_BIN} -dl ${NC_PORT} | xbcrypt -d --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile | xbstream -x -C ${DATA} 1>&2
- RC=( "${PIPESTATUS[@]}" )
+ ${NC_BIN} -dl ${NC_PORT} | xbcrypt -d --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile | xbstream -x -C ${DATA}
fi
else
- ${NC_BIN} -dl ${NC_PORT} | xbstream -x -C ${DATA} 1>&2
- RC=( "${PIPESTATUS[@]}" )
+ ${NC_BIN} -dl ${NC_PORT} | xbstream -x -C ${DATA}
fi
+ RC=( "${PIPESTATUS[@]}" )
set -e
wait %% # join wait_for_nc thread
for ecode in "${RC[@]}";do
if [[ $ecode -ne 0 ]];then
- wsrep_log_error "Error while getting st data from donor node: " \
+ wsrep_log_error "Error while getting data from donor node: " \
"exit codes: ${RC[@]}"
+ wsrep_log_error "Data directory ${DATA} needs to be empty for SST:" \
+ "Manual intervention required in that case"
exit 32
fi
done
@@ -276,37 +279,24 @@ then
if [ ! -r "${IST_FILE}" ]
then
+ rebuild=""
wsrep_log_info "Removing existing ib_logfile files"
rm -f ${DATA}/ib_logfile*
- rebuild=""
-
# Decrypt only if not encrypted in stream.
# NOT USED NOW.
# Till https://blueprints.launchpad.net/percona-xtrabackup/+spec/add-support-for-rsync-url
# is implemented
-
+ #get_keys
if [[ $encrypt -eq 1 && $sencrypted -eq 0 ]];then
- ealgo=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt=' | cut -d= -f2)
- ekey=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key=' | cut -d= -f2)
- ekeyfile=$(my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -- '--encrypt-key-file=' | cut -d= -f2)
-
# Decrypt the files if any
find ${DATA} -type f -name '*.xbcrypt' -printf '%p\n' | while read line;do
- if [[ -z $ealgo || (-z $ekey && -z $ekeyfile) ]];then
- wsrep_log_error "FATAL: Encryption parameters empty from my.cnf, bailing out"
- exit 3
- fi
input=$line
output=${input%.xbcrypt}
if [[ -n $ekey ]];then
xbcrypt -d --encrypt-algo=$ealgo --encrypt-key=$ekey -i $input > $output
else
- if [[ ! -r $ekeyfile ]];then
- wsrep_log_error "FATAL: Key file not readable"
- exit 3
- fi
xbcrypt -d --encrypt-algo=$ealgo --encrypt-key-file=$ekeyfile -i $input > $output
fi
done
@@ -331,7 +321,6 @@ then
exit 22
fi
-
set +e
wsrep_log_info "Removing existing ibdata1 file"
@@ -355,6 +344,8 @@ then
fi
fi
+ wsrep_log_info "Preparing the backup at ${DATA}"
+
${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} --apply-log $rebuild \
${DATA} 1>&2 2> ${DATA}/innobackup.prepare.log
if [ $? -ne 0 ];
@@ -362,6 +353,8 @@ then
wsrep_log_error "${INNOBACKUPEX_BIN} finished with errors. Check ${DATA}/innobackup.prepare.log"
exit 22
fi
+ else
+ wsrep_log_info "Running IST"
fi
cat "${MAGIC_FILE}" # output UUID:seqno