From f68ce6860454379f65131046dbba8cd4e65acda1 Mon Sep 17 00:00:00 2001 From: Nirbhay Choubey Date: Fri, 20 Feb 2015 17:51:33 -0500 Subject: MDEV-7615: Remove --galera-sst-mode option from mysqldump Removed 'galera-sst-mode' option from mysqldump and added logic in wsrep_sst_mysqldump script to retrieve gtid_binlog_state from donor node and send it to the joiner node. --- client/mysqldump.c | 49 --------------------------------------- mysql-test/t/galera_sst_mode.test | 43 ---------------------------------- scripts/wsrep_sst_mysqldump.sh | 49 +++++++++++++++++++++------------------ 3 files changed, 27 insertions(+), 114 deletions(-) delete mode 100644 mysql-test/t/galera_sst_mode.test diff --git a/client/mysqldump.c b/client/mysqldump.c index 3adbe87a8bb..e1181985499 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -114,7 +114,6 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0, opt_slave_apply= 0, opt_include_master_host_port= 0, opt_events= 0, opt_comments_used= 0, - opt_galera_sst_mode= 0, opt_alltspcs=0, opt_notspcs= 0; static my_bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0; static ulong opt_max_allowed_packet, opt_net_buffer_length; @@ -351,14 +350,6 @@ static struct my_option my_long_options[] = {"force", 'f', "Continue even if we get an SQL error.", &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"galera-sst-mode", OPT_GALERA_SST_MODE, - "This mode should normally be used in mysqldump snapshot state transfer " - "(SST) in a Galera cluster. If enabled, mysqldump additionally dumps " - "commands to turn off binary logging and SET global gtid_binlog_state " - "with the current value. Note: RESET MASTER needs to be executed on the " - "server receiving the resulting dump.", - &opt_galera_sst_mode, &opt_galera_sst_mode, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, {"gtid", OPT_USE_GTID, "Used together with --master-data=1 or --dump-slave=1." "When enabled, the output from those options will set the GTID position " "instead of the binlog file and offset; the file/offset will appear only as " @@ -4903,43 +4894,6 @@ static int dump_selected_tables(char *db, char **table_names, int tables) } /* dump_selected_tables */ -/** - Add the following statements to the generated dump: - a) SET @@session.sql_log_bin=OFF; - b) SET @@global.gtid_binlog_state='[N-N-N,...]' -*/ -static int wsrep_set_sst_cmds(MYSQL *mysql) { - MYSQL_RES *res; - MYSQL_ROW row; - - if (mysql_get_server_version(mysql) < 100005) { - /* @@gtid_binlog_state does not exist. */ - return 0; - } - - if (mysql_query_with_error_report(mysql, &res, "SELECT " - "@@global.gtid_binlog_state")) - return 1; - - if (mysql_num_rows(res) != 1) - /* No entry for @@global.gtid_binlog_state, nothing needs to be done. */ - return 0; - - if (!(row= mysql_fetch_row(res)) || !(char *)row[0]) - return 1; - - /* first, add a command to turn off binary logging, */ - fprintf(md_result_file, "SET @@session.sql_log_bin=OFF;\n"); - - /* followed by, a command to set global gtid_binlog_state. */ - fprintf(md_result_file, "SET @@global.gtid_binlog_state='%s';\n", - (char*)row[0]); - - mysql_free_result(res); - return 0; -} - - static int do_show_master_status(MYSQL *mysql_con, int consistent_binlog_pos, int have_mariadb_gtid, int use_gtid) { @@ -5936,9 +5890,6 @@ int main(int argc, char **argv) if (opt_slave_apply && add_stop_slave()) goto err; - if (opt_galera_sst_mode && wsrep_set_sst_cmds(mysql)) - goto err; - if (opt_master_data && do_show_master_status(mysql, consistent_binlog_pos, have_mariadb_gtid, opt_use_gtid)) goto err; diff --git a/mysql-test/t/galera_sst_mode.test b/mysql-test/t/galera_sst_mode.test deleted file mode 100644 index dd8f9531c9d..00000000000 --- a/mysql-test/t/galera_sst_mode.test +++ /dev/null @@ -1,43 +0,0 @@ -# Embedded server doesn't support external clients ---source include/not_embedded.inc -# Binlog is required ---source include/have_log_bin.inc - ---echo # ---echo # Test for mysqldump's galera-sst-mode option ---echo # - ---echo # ---echo # MDEV-6490: mysqldump unknown option --galera-sst-mode ---echo # -CREATE DATABASE bug6490; -USE bug6490; -CREATE TABLE t1(c1 INT); -INSERT INTO t1 values (1); -INSERT INTO t1 values (2); - ---echo # Save the current gtid_binlog_state. ---let $before= `SELECT @@global.gtid_binlog_state` - ---echo # Take a dump of bug6490 database ---exec $MYSQL_DUMP --galera-sst-mode bug6490 > $MYSQLTEST_VARDIR/tmp/bug6490.sql -DROP TABLE t1; - ---echo # Load the dump -RESET MASTER; ---exec $MYSQL -uroot bug6490 < $MYSQLTEST_VARDIR/tmp/bug6490.sql - -SELECT * from t1; - ---echo # Compare the two gtid_binlog_state's ---let $after= `SELECT @@global.gtid_binlog_state` -if (`SELECT STRCMP($before, $after)`) -{ - --die ERROR: The two gtid_binlog_state's did not match. -} - ---echo # Cleanup ---remove_file $MYSQLTEST_VARDIR/tmp/bug6490.sql -DROP DATABASE bug6490; - ---echo # End of test diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index 3f4ada39a9d..df6f816132c 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -22,13 +22,12 @@ WSREP_SST_OPT_CONF="" . $(dirname $0)/wsrep_sst_common +PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin EINVAL=22 local_ip() { - PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin - [ "$1" = "127.0.0.1" ] && return 0 [ "$1" = "localhost" ] && return 0 [ "$1" = "$(hostname -s)" ] && return 0 @@ -97,33 +96,39 @@ DROP PREPARE stmt;" SET_START_POSITION="SET GLOBAL wsrep_start_position='$WSREP_SST_OPT_GTID';" +# Retrieve the donor's @@global.gtid_binlog_state. +GTID_BINLOG_STATE=$(echo "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_state'" |\ +mysql $AUTH -S$WSREP_SST_OPT_SOCKET --disable-reconnect --connect_timeout=10 |\ +tail -1 | awk -F ' ' '{ print $2 }') + MYSQL="mysql $AUTH -h$WSREP_SST_OPT_HOST -P$WSREP_SST_OPT_PORT "\ "--disable-reconnect --connect_timeout=10" -RESET_MASTER="" -OPT_GALERA_SST_MODE="" # Check if binary logging is enabled on the joiner node. # Note: SELECT cannot be used at this point. -LOG_BIN=$(echo "SHOW VARIABLES LIKE 'log_bin'" | $MYSQL) -LOG_BIN=$(echo $LOG_BIN | awk -F ' ' '{ print $4 }') +LOG_BIN=$(echo "SHOW VARIABLES LIKE 'log_bin'" | $MYSQL |\ +tail -1 | awk -F ' ' '{ print $2 }') # Check the joiner node's server version. -SERVER_VERSION=$(echo "SHOW VARIABLES LIKE 'version'" | $MYSQL) -SERVER_VERSION=$(echo $SERVER_VERSION | awk -F ' ' '{ print $4 }') +SERVER_VERSION=$(echo "SHOW VARIABLES LIKE 'version'" | $MYSQL |\ +tail -1 | awk -F ' ' '{ print $2 }') + +RESET_MASTER="" +SET_GTID_BINLOG_STATE="" +SQL_LOG_BIN_OFF="" # Safety check if echo $SERVER_VERSION | grep '^10.0' > /dev/null then - # Check if binary logging is enabled on the Joiner node. If it is enabled, - # RESET MASTER needs to be executed on the Joiner node. Also, mysqldump - # should be executed with additional 'galera-sst-mode' option so that it - # adds a command to set gtid_binlog_state with that of Donor node in the - # dump, to be executed on the Joiner. + # If binary logging is enabled on the joiner node, we need to copy donor's + # gtid_binlog_state to joiner. In order to do that, a RESET MASTER must be + # executed to erase binary logs (if any). Binary logging should also be + # turned off for the session so that gtid state does not get altered while + # the dump gets replayed on joiner. if [[ "$LOG_BIN" == 'ON' ]]; then - # Reset master for 10.0 to clear gtid state. RESET_MASTER="RESET MASTER;" - # Set the galera-sst-mode option for mysqldump. - OPT_GALERA_SST_MODE="--galera-sst-mode" + SET_GTID_BINLOG_STATE="SET @@global.gtid_binlog_state='$GTID_BINLOG_STATE';" + SQL_LOG_BIN_OFF="SET @@session.sql_log_bin=OFF;" fi fi @@ -131,7 +136,7 @@ fi MYSQLDUMP="mysqldump $AUTH -S$WSREP_SST_OPT_SOCKET \ --add-drop-database --add-drop-table --skip-add-locks --create-options \ --disable-keys --extended-insert --skip-lock-tables --quick --set-charset \ ---skip-comments --flush-privileges --all-databases $OPT_GALERA_SST_MODE" +--skip-comments --flush-privileges --all-databases" # need to disable logging when loading the dump # reason is that dump contains ALTER TABLE for log tables, and @@ -148,11 +153,11 @@ RESTORE_SLOW_QUERY_LOG="SET GLOBAL SLOW_QUERY_LOG=$SLOW_LOG_OPT;" if [ $WSREP_SST_OPT_BYPASS -eq 0 ] then - (echo $STOP_WSREP && echo $RESET_MASTER) | $MYSQL || true - (echo $STOP_WSREP && $MYSQLDUMP && echo $CSV_TABLES_FIX \ - && echo $RESTORE_GENERAL_LOG && echo $RESTORE_SLOW_QUERY_LOG \ - && echo $SET_START_POSITION \ - || echo "SST failed to complete;") | $MYSQL + (echo $STOP_WSREP && echo $RESET_MASTER && \ + echo $SET_GTID_BINLOG_STATE && echo $SQL_LOG_BIN_OFF && \ + echo $STOP_WSREP && $MYSQLDUMP && echo $CSV_TABLES_FIX && \ + echo $RESTORE_GENERAL_LOG && echo $RESTORE_SLOW_QUERY_LOG && \ + echo $SET_START_POSITION || echo "SST failed to complete;") | $MYSQL else wsrep_log_info "Bypassing state dump." echo $SET_START_POSITION | $MYSQL -- cgit v1.2.1