summaryrefslogtreecommitdiff
path: root/sql/tztime.cc
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2019-08-15 07:46:41 +0300
committerJan Lindström <jan.lindstrom@mariadb.com>2019-08-16 07:01:30 +0300
commitfa74088838c12210d782aa6c69faa5acebc1d3bc (patch)
tree3612cb9d241503fda6938a69aaea84d48db3da9f /sql/tztime.cc
parent1c75ad6eed744672fdce77b0752801b67edb69f8 (diff)
downloadmariadb-git-fa74088838c12210d782aa6c69faa5acebc1d3bc.tar.gz
MDEV-18778: mysql_tzinfo_to_sql does not work correctly in MariaDB Galera
There were two problems: (1) If user wanted same time zone information on all nodes in the Galera cluster all updates were not replicated as time zone information was stored on MyISAM tables. This is fixed on Galera by altering time zone tables to InnoDB while they are modified. (2) If user wanted different time zone information to nodes in the Galera cluster TRUNCATE TABLE for time zone tables was replicated by Galera destroying time zone information from other nodes. This is fixed on Galera by introducing new option for mysql_tzinfo_to_sql_symlink tool --skip-write-binlog to disable Galera replication while time zone tables are modified. Changes to be committed: modified: mysql-test/r/mysql_tzinfo_to_sql_symlink.result modified: mysql-test/suite/wsrep/r/mysql_tzinfo_to_sql_symlink.result new file: mysql-test/suite/wsrep/r/mysql_tzinfo_to_sql_symlink_skip.result new file: mysql-test/suite/wsrep/t/mysql_tzinfo_to_sql_symlink_skip.test modified: sql/tztime.cc
Diffstat (limited to 'sql/tztime.cc')
-rw-r--r--sql/tztime.cc64
1 files changed, 55 insertions, 9 deletions
diff --git a/sql/tztime.cc b/sql/tztime.cc
index 060f5611fdb..8f66dfa0c9e 100644
--- a/sql/tztime.cc
+++ b/sql/tztime.cc
@@ -148,6 +148,7 @@ typedef struct st_time_zone_info
static my_bool prepare_tz_info(TIME_ZONE_INFO *sp, MEM_ROOT *storage);
+my_bool opt_leap, opt_verbose, opt_skip_write_binlog;
#if defined(TZINFO2SQL) || defined(TESTTIME)
@@ -2439,6 +2440,14 @@ print_tz_leaps_as_sql(const TIME_ZONE_INFO *sp)
We are assuming that there are only one list of leap seconds
For all timezones.
*/
+ if (!opt_skip_write_binlog)
+ printf("\\d |\n"
+ "IF (select count(*) from information_schema.global_variables where\n"
+ "variable_name='wsrep_on') = 1 THEN\n"
+ "ALTER TABLE time_zone_leap_second ENGINE=InnoDB;\n"
+ "END IF|\n"
+ "\\d ;\n");
+
printf("TRUNCATE TABLE time_zone_leap_second;\n");
if (sp->leapcnt)
@@ -2451,6 +2460,14 @@ print_tz_leaps_as_sql(const TIME_ZONE_INFO *sp)
printf(";\n");
}
+ if (!opt_skip_write_binlog)
+ printf("\\d |\n"
+ "IF (select count(*) from information_schema.global_variables where\n"
+ "variable_name='wsrep_on') = 1 THEN\n"
+ "ALTER TABLE time_zone_leap_second ENGINE=MyISAM;\n"
+ "END IF|\n"
+ "\\d ;\n");
+
printf("ALTER TABLE time_zone_leap_second ORDER BY Transition_time;\n");
}
@@ -2607,8 +2624,6 @@ scan_tz_dir(char * name_end, uint symlink_recursion_level, uint verbose)
}
-my_bool opt_leap, opt_verbose;
-
static const char *load_default_groups[]=
{ "mysql_tzinfo_to_sql", 0};
@@ -2629,6 +2644,8 @@ static struct my_option my_long_options[] =
&opt_verbose, &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"version", 'V', "Output version information and exit.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
+ {"skip-write-binlog", 'S', "Do not replicate changes to time zone tables to other nodes in a Galera cluster",
+ &opt_skip_write_binlog,&opt_skip_write_binlog, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
};
@@ -2697,11 +2714,14 @@ main(int argc, char **argv)
return 1;
}
- // Replicate MyISAM DDL for this session, cf. lp:1161432
- // timezone info unfixable in XtraDB Cluster
- printf("set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');\n"
- "prepare set_wsrep_myisam from @prep;\n"
- "set @toggle=1; execute set_wsrep_myisam using @toggle;\n");
+ if (opt_skip_write_binlog)
+ /* If skip_write_binlog is set and wsrep is compiled in we disable
+ sql_log_bin and wsrep_on to avoid Galera replicating below
+ truncate table clauses. This will allow user to set different
+ time zones to nodes in Galera cluster. */
+ printf("set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET SESSION SQL_LOG_BIN=?, WSREP_ON=OFF;', 'do ?');\n"
+ "prepare set_wsrep_write_binlog from @prep1;\n"
+ "set @toggle=0; execute set_wsrep_write_binlog using @toggle;\n");
if (argc == 1 && !opt_leap)
{
@@ -2709,6 +2729,21 @@ main(int argc, char **argv)
root_name_end= strmake_buf(fullname, argv[0]);
+ if(!opt_skip_write_binlog)
+ {
+ // Alter time zone tables to InnoDB if wsrep_on is enabled
+ // to allow changes to them to replicate with Galera
+ printf("\\d |\n"
+ "IF (select count(*) from information_schema.global_variables where\n"
+ "variable_name='wsrep_on') = 1 THEN\n"
+ "ALTER TABLE time_zone ENGINE=InnoDB;\n"
+ "ALTER TABLE time_zone_name ENGINE=InnoDB;\n"
+ "ALTER TABLE time_zone_transition ENGINE=InnoDB;\n"
+ "ALTER TABLE time_zone_transition_type ENGINE=InnoDB;\n"
+ "END IF|\n"
+ "\\d ;\n");
+ }
+
printf("TRUNCATE TABLE time_zone;\n");
printf("TRUNCATE TABLE time_zone_name;\n");
printf("TRUNCATE TABLE time_zone_transition;\n");
@@ -2750,8 +2785,19 @@ main(int argc, char **argv)
free_root(&tz_storage, MYF(0));
}
- // Reset wsrep_replicate_myisam. lp:1161432
- printf("set @toggle=0; execute set_wsrep_myisam using @toggle;\n");
+ if(!opt_skip_write_binlog)
+ {
+ // Fall back to MyISAM
+ printf("\\d |\n"
+ "IF (select count(*) from information_schema.global_variables where\n"
+ "variable_name='wsrep_on') = 1 THEN\n"
+ "ALTER TABLE time_zone ENGINE=MyISAM;\n"
+ "ALTER TABLE time_zone_name ENGINE=MyISAM;\n"
+ "ALTER TABLE time_zone_transition ENGINE=MyISAM;\n"
+ "ALTER TABLE time_zone_transition_type ENGINE=MyISAM;\n"
+ "END IF|\n"
+ "\\d ;\n");
+ }
free_defaults(default_argv);
my_end(0);