mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
MDEV-18863: Galera SST scripts can't read [mysqldN] option groups
Some users and some scripts (for example, mysqld_multi.sh) use special option groups with names like [mysqld1], [mysqld2], ..., [mysqldN]. But SST scripts can't currently fully support these option groups. The only option group-related value it gets from the server is --defaults-group-suffix, if that option was set for mysqld when the server was started. However, the SST scripts does not get told by the server to read these option groups, so this means that the SST script will fail to read options like innodb-data-home-dir when it is in a option group like [mysqld1]...[mysqldN]. Moreover, SST scripts ignore many parameters that can be passed to them explicitly and cannot transfer them further, for example, to the input of mariabackup utility. Ideally, we want to transfer all the parameters of the original mysqld call to utilities such as mariabackup, however the SST script does not receive these parameters from the server and therefore cannot transfer them to mariabackup. To correct these shortcomings, we need to transfer to the scripts all of the parameters of the original mysqld call, and in the SST scripts themselves provide for the transfer all of these parameters to utilities such as mariabackup. To prevent these parameters from mixing with the script's own parameters, they should be transferred to SST script after the special option "--mysqld-args", followed by the string argument with the original parameters, as it received by the mysqld call at the time of launch (further all these parameters will be passed to mariabackup, for example). In addition, the SST scripts themselves must be refined so that they can read the parameters from the user-selected group, not just from the global mysqld configuration group. And also so that they can receive the parameters (which important for their work) as command-line arguments.
This commit is contained in:
@@ -308,7 +308,9 @@ sub report_mysqlds
|
||||
|
||||
sub start_mysqlds()
|
||||
{
|
||||
my (@groups, $com, $tmp, $i, @options, $j, $mysqld_found, $info_sent);
|
||||
my (@groups, $com, $tmp, $i, @options, $j, $mysqld_found, $suffix_found, $info_sent);
|
||||
|
||||
$suffix_found= 0;
|
||||
|
||||
if (!$opt_no_log)
|
||||
{
|
||||
@@ -347,6 +349,10 @@ sub start_mysqlds()
|
||||
$options[$j]= quote_shell_word($options[$j]);
|
||||
$tmp.= " $options[$j]";
|
||||
}
|
||||
elseif ("--defaults-group-suffix=" eq substr($options[$j], 0, 24))
|
||||
{
|
||||
$suffix_found= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$options[$j]= quote_shell_word($options[$j]);
|
||||
@@ -364,6 +370,12 @@ sub start_mysqlds()
|
||||
}
|
||||
$com.= $tmp;
|
||||
|
||||
if (!$suffix_found)
|
||||
{
|
||||
$com.= " --defaults-group-suffix=";
|
||||
$com.= $groups[$i];
|
||||
}
|
||||
|
||||
if ($opt_wsrep_new_cluster) {
|
||||
$com.= " --wsrep-new-cluster";
|
||||
}
|
||||
|
||||
@@ -28,7 +28,12 @@ WSREP_SST_OPT_PSWD=${WSREP_SST_OPT_PSWD:-}
|
||||
WSREP_SST_OPT_DEFAULT=""
|
||||
WSREP_SST_OPT_EXTRA_DEFAULT=""
|
||||
WSREP_SST_OPT_SUFFIX_DEFAULT=""
|
||||
WSREP_SST_OPT_SUFFIX_VALUE=""
|
||||
WSREP_SST_OPT_MYSQLD=""
|
||||
INNODB_DATA_HOME_DIR_ARG=""
|
||||
INNODB_LOG_GROUP_HOME_ARG=""
|
||||
INNODB_UNDO_DIR_ARG=""
|
||||
LOG_BIN_ARG=""
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
@@ -83,6 +88,18 @@ case "$1" in
|
||||
readonly INNODB_DATA_HOME_DIR_ARG="$2"
|
||||
shift
|
||||
;;
|
||||
'--innodb-log-group-home-dir')
|
||||
readonly INNODB_LOG_GROUP_HOME_ARG="$2"
|
||||
shift
|
||||
;;
|
||||
'--innodb-undo-directory')
|
||||
readonly INNODB_UNDO_DIR_ARG="$2"
|
||||
shift
|
||||
;;
|
||||
'--log-bin')
|
||||
readonly LOG_BIN_ARG="$2"
|
||||
shift
|
||||
;;
|
||||
'--defaults-file')
|
||||
readonly WSREP_SST_OPT_DEFAULT="$1=$2"
|
||||
shift
|
||||
@@ -93,6 +110,7 @@ case "$1" in
|
||||
;;
|
||||
'--defaults-group-suffix')
|
||||
readonly WSREP_SST_OPT_SUFFIX_DEFAULT="$1=$2"
|
||||
readonly WSREP_SST_OPT_SUFFIX_VALUE="$2"
|
||||
shift
|
||||
;;
|
||||
'--host')
|
||||
@@ -143,6 +161,46 @@ case "$1" in
|
||||
readonly WSREP_SST_OPT_GTID_DOMAIN_ID="$2"
|
||||
shift
|
||||
;;
|
||||
'--mysqld-args')
|
||||
original_cmd=""
|
||||
shift
|
||||
while [ $# -gt 0 ]; do
|
||||
option=${1%%=*}
|
||||
if [ "$option" != "--defaults-file" ]; then
|
||||
value=${1#*=}
|
||||
case "$option" in
|
||||
'--innodb-data-home-dir')
|
||||
if [ -z "$INNODB_DATA_HOME_DIR_ARG" ]; then
|
||||
readonly INNODB_DATA_HOME_DIR_ARG="$value"
|
||||
fi
|
||||
;;
|
||||
'--innodb-log-group-home-dir')
|
||||
if [ -z "$INNODB_LOG_GROUP_HOME_ARG" ]; then
|
||||
readonly INNODB_LOG_GROUP_HOME_ARG="$value"
|
||||
fi
|
||||
;;
|
||||
'--innodb-undo-directory')
|
||||
if [ -z "$INNODB_UNDO_DIR_ARG" ]; then
|
||||
readonly INNODB_UNDO_DIR_ARG="$value"
|
||||
fi
|
||||
;;
|
||||
'--log-bin')
|
||||
if [ -z "$LOG_BIN_ARG" ]; then
|
||||
readonly LOG_BIN_ARG="$value"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if [ -z "$original_cmd" ]; then
|
||||
original_cmd="$1"
|
||||
else
|
||||
original_cmd+=" $1"
|
||||
fi
|
||||
fi
|
||||
shift
|
||||
done
|
||||
readonly WSREP_SST_OPT_MYSQLD="$original_cmd"
|
||||
break
|
||||
;;
|
||||
*) # must be command
|
||||
# usage
|
||||
# exit 1
|
||||
|
||||
@@ -698,8 +698,7 @@ if [[ ${FORCE_FTWRL:-0} -eq 1 ]];then
|
||||
iopts+=" --no-backup-locks "
|
||||
fi
|
||||
|
||||
|
||||
INNOEXTRA=""
|
||||
INNOEXTRA=$WSREP_SST_OPT_MYSQLD
|
||||
|
||||
INNODB_DATA_HOME_DIR=${INNODB_DATA_HOME_DIR:-""}
|
||||
# Try to set INNODB_DATA_HOME_DIR from the command line:
|
||||
@@ -707,6 +706,9 @@ if [ ! -z "$INNODB_DATA_HOME_DIR_ARG" ]; then
|
||||
INNODB_DATA_HOME_DIR=$INNODB_DATA_HOME_DIR_ARG
|
||||
fi
|
||||
# if INNODB_DATA_HOME_DIR env. variable is not set, try to get it from my.cnf
|
||||
if [ -z "$INNODB_DATA_HOME_DIR" ]; then
|
||||
INNODB_DATA_HOME_DIR=$(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE innodb-data-home-dir '')
|
||||
fi
|
||||
if [ -z "$INNODB_DATA_HOME_DIR" ]; then
|
||||
INNODB_DATA_HOME_DIR=$(parse_cnf --mysqld innodb-data-home-dir '')
|
||||
fi
|
||||
@@ -827,7 +829,9 @@ then
|
||||
exit 93
|
||||
fi
|
||||
|
||||
if [[ -z $(parse_cnf --mysqld tmpdir "") && -z $(parse_cnf xtrabackup tmpdir "") ]];then
|
||||
if [[ -z $(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE tmpdir "") && \
|
||||
-z $(parse_cnf --mysqld tmpdir "") && \
|
||||
-z $(parse_cnf xtrabackup tmpdir "") ]]; then
|
||||
xtmpdir=$(mktemp -d)
|
||||
tmpopts=" --tmpdir=$xtmpdir "
|
||||
wsrep_log_info "Using $xtmpdir as xtrabackup temporary directory"
|
||||
@@ -950,8 +954,24 @@ then
|
||||
[[ -n $SST_PROGRESS_FILE ]] && touch $SST_PROGRESS_FILE
|
||||
|
||||
ib_home_dir=$INNODB_DATA_HOME_DIR
|
||||
ib_log_dir=$(parse_cnf --mysqld innodb-log-group-home-dir "")
|
||||
ib_undo_dir=$(parse_cnf --mysqld innodb-undo-directory "")
|
||||
|
||||
# Try to set ib_log_dir from the command line:
|
||||
ib_log_dir=$INNODB_LOG_GROUP_HOME_ARG
|
||||
if [ -z "$ib_log_dir" ]; then
|
||||
ib_log_dir=$(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE innodb-log-group-home-dir "")
|
||||
fi
|
||||
if [ -z "$ib_log_dir" ]; then
|
||||
ib_log_dir=$(parse_cnf --mysqld innodb-log-group-home-dir "")
|
||||
fi
|
||||
|
||||
# Try to set ib_undo_dir from the command line:
|
||||
ib_undo_dir=$INNODB_UNDO_DIR_ARG
|
||||
if [ -z "$ib_undo_dir" ]; then
|
||||
ib_undo_dir=$(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE innodb-undo-directory "")
|
||||
fi
|
||||
if [ -z "$ib_undo_dir" ]; then
|
||||
ib_undo_dir=$(parse_cnf --mysqld innodb-undo-directory "")
|
||||
fi
|
||||
|
||||
stagemsg="Joiner-Recv"
|
||||
|
||||
@@ -1028,7 +1048,13 @@ then
|
||||
find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -prune -regex $cpat -o -exec rm -rfv {} 1>&2 \+
|
||||
fi
|
||||
|
||||
tempdir=$(parse_cnf --mysqld log-bin "")
|
||||
tempdir=$LOG_BIN_ARG
|
||||
if [ -z "$tempdir" ]; then
|
||||
tempdir=$(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE log-bin "")
|
||||
fi
|
||||
if [ -z "$tempdir" ]; then
|
||||
tempdir=$(parse_cnf --mysqld log-bin "")
|
||||
fi
|
||||
if [[ -n ${tempdir:-} ]];then
|
||||
binlog_dir=$(dirname $tempdir)
|
||||
binlog_file=$(basename $tempdir)
|
||||
|
||||
@@ -149,7 +149,14 @@ then
|
||||
fi
|
||||
|
||||
WSREP_LOG_DIR=${WSREP_LOG_DIR:-""}
|
||||
# Try to set WSREP_LOG_DIR from the command line:
|
||||
if [ -z "$WSREP_LOG_DIR" ]; then
|
||||
WSREP_LOG_DIR=$INNODB_LOG_GROUP_HOME_ARG
|
||||
fi
|
||||
# if WSREP_LOG_DIR env. variable is not set, try to get it from my.cnf
|
||||
if [ -z "$WSREP_LOG_DIR" ]; then
|
||||
WSREP_LOG_DIR=$(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE innodb-log-group-home-dir '')
|
||||
fi
|
||||
if [ -z "$WSREP_LOG_DIR" ]; then
|
||||
WSREP_LOG_DIR=$(parse_cnf --mysqld innodb-log-group-home-dir '')
|
||||
fi
|
||||
@@ -168,6 +175,9 @@ if [ ! -z "$INNODB_DATA_HOME_DIR_ARG" ]; then
|
||||
INNODB_DATA_HOME_DIR=$INNODB_DATA_HOME_DIR_ARG
|
||||
fi
|
||||
# if INNODB_DATA_HOME_DIR env. variable is not set, try to get it from my.cnf
|
||||
if [ -z "$INNODB_DATA_HOME_DIR" ]; then
|
||||
INNODB_DATA_HOME_DIR=$(parse_cnf mysqld$WSREP_SST_OPT_SUFFIX_VALUE innodb-data-home-dir '')
|
||||
fi
|
||||
if [ -z "$INNODB_DATA_HOME_DIR" ]; then
|
||||
INNODB_DATA_HOME_DIR=$(parse_cnf --mysqld innodb-data-home-dir '')
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user