summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-04-22 14:45:55 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-04-22 14:45:55 +0300
commit455cf6196c8c73f5a50004ac7f31a9be8ac14bbe (patch)
tree2d9d696bba2590c63278fee0047a046f58b51a31 /extra
parent42af2b1d8b8a8508c5aac5c2e0bcf4554c5200ce (diff)
parente52a36d37be2fa8a2da8a987cb38cb0bb65233f4 (diff)
downloadmariadb-git-455cf6196c8c73f5a50004ac7f31a9be8ac14bbe.tar.gz
Merge 10.2 into 10.3
Diffstat (limited to 'extra')
-rw-r--r--extra/mariabackup/backup_mysql.cc340
-rw-r--r--extra/mariabackup/xtrabackup.cc35
-rw-r--r--extra/mariabackup/xtrabackup.h10
-rw-r--r--extra/resolve_stack_dump.c45
4 files changed, 238 insertions, 192 deletions
diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc
index 236acce2483..ba950121548 100644
--- a/extra/mariabackup/backup_mysql.cc
+++ b/extra/mariabackup/backup_mysql.cc
@@ -327,194 +327,212 @@ check_server_version(unsigned long version_number,
/*********************************************************************//**
Receive options important for XtraBackup from MySQL server.
@return true on success. */
-bool
-get_mysql_vars(MYSQL *connection)
+bool get_mysql_vars(MYSQL *connection)
{
- char *gtid_mode_var = NULL;
- char *version_var = NULL;
- char *version_comment_var = NULL;
- char *innodb_version_var = NULL;
- char *have_backup_locks_var = NULL;
- char *log_bin_var = NULL;
- char *lock_wait_timeout_var= NULL;
- char *wsrep_on_var = NULL;
- char *slave_parallel_workers_var = NULL;
- char *gtid_slave_pos_var = NULL;
- char *innodb_buffer_pool_filename_var = NULL;
- char *datadir_var = NULL;
- char *innodb_log_group_home_dir_var = NULL;
- char *innodb_log_file_size_var = NULL;
- char *innodb_log_files_in_group_var = NULL;
- char *innodb_data_file_path_var = NULL;
- char *innodb_data_home_dir_var = NULL;
- char *innodb_undo_directory_var = NULL;
- char *innodb_page_size_var = NULL;
- char *innodb_undo_tablespaces_var = NULL;
- char *page_zip_level_var = NULL;
- char *endptr;
- unsigned long server_version = mysql_get_server_version(connection);
-
- bool ret = true;
-
- mysql_variable mysql_vars[] = {
- {"have_backup_locks", &have_backup_locks_var},
- {"log_bin", &log_bin_var},
- {"lock_wait_timeout", &lock_wait_timeout_var},
- {"gtid_mode", &gtid_mode_var},
- {"version", &version_var},
- {"version_comment", &version_comment_var},
- {"innodb_version", &innodb_version_var},
- {"wsrep_on", &wsrep_on_var},
- {"slave_parallel_workers", &slave_parallel_workers_var},
- {"gtid_slave_pos", &gtid_slave_pos_var},
- {"innodb_buffer_pool_filename",
- &innodb_buffer_pool_filename_var},
- {"datadir", &datadir_var},
- {"innodb_log_group_home_dir", &innodb_log_group_home_dir_var},
- {"innodb_log_file_size", &innodb_log_file_size_var},
- {"innodb_log_files_in_group", &innodb_log_files_in_group_var},
- {"innodb_data_file_path", &innodb_data_file_path_var},
- {"innodb_data_home_dir", &innodb_data_home_dir_var},
- {"innodb_undo_directory", &innodb_undo_directory_var},
- {"innodb_page_size", &innodb_page_size_var},
- {"innodb_undo_tablespaces", &innodb_undo_tablespaces_var},
- {"innodb_compression_level", &page_zip_level_var},
- {NULL, NULL}
- };
-
- read_mysql_variables(connection, "SHOW VARIABLES",
- mysql_vars, true);
+ char *gtid_mode_var= NULL;
+ char *version_var= NULL;
+ char *version_comment_var= NULL;
+ char *innodb_version_var= NULL;
+ char *have_backup_locks_var= NULL;
+ char *log_bin_var= NULL;
+ char *lock_wait_timeout_var= NULL;
+ char *wsrep_on_var= NULL;
+ char *slave_parallel_workers_var= NULL;
+ char *gtid_slave_pos_var= NULL;
+ char *innodb_buffer_pool_filename_var= NULL;
+ char *datadir_var= NULL;
+ char *innodb_log_group_home_dir_var= NULL;
+ char *innodb_log_file_size_var= NULL;
+ char *innodb_log_files_in_group_var= NULL;
+ char *innodb_data_file_path_var= NULL;
+ char *innodb_data_home_dir_var= NULL;
+ char *innodb_undo_directory_var= NULL;
+ char *innodb_page_size_var= NULL;
+ char *innodb_undo_tablespaces_var= NULL;
+ char *page_zip_level_var= NULL;
+ char *ignore_db_dirs= NULL;
+ char *endptr;
+ unsigned long server_version= mysql_get_server_version(connection);
+
+ bool ret= true;
+
+ mysql_variable mysql_vars[]= {
+ {"have_backup_locks", &have_backup_locks_var},
+ {"log_bin", &log_bin_var},
+ {"lock_wait_timeout", &lock_wait_timeout_var},
+ {"gtid_mode", &gtid_mode_var},
+ {"version", &version_var},
+ {"version_comment", &version_comment_var},
+ {"innodb_version", &innodb_version_var},
+ {"wsrep_on", &wsrep_on_var},
+ {"slave_parallel_workers", &slave_parallel_workers_var},
+ {"gtid_slave_pos", &gtid_slave_pos_var},
+ {"innodb_buffer_pool_filename", &innodb_buffer_pool_filename_var},
+ {"datadir", &datadir_var},
+ {"innodb_log_group_home_dir", &innodb_log_group_home_dir_var},
+ {"innodb_log_file_size", &innodb_log_file_size_var},
+ {"innodb_log_files_in_group", &innodb_log_files_in_group_var},
+ {"innodb_data_file_path", &innodb_data_file_path_var},
+ {"innodb_data_home_dir", &innodb_data_home_dir_var},
+ {"innodb_undo_directory", &innodb_undo_directory_var},
+ {"innodb_page_size", &innodb_page_size_var},
+ {"innodb_undo_tablespaces", &innodb_undo_tablespaces_var},
+ {"innodb_compression_level", &page_zip_level_var},
+ {"ignore_db_dirs", &ignore_db_dirs},
+ {NULL, NULL}};
+
+ read_mysql_variables(connection, "SHOW VARIABLES", mysql_vars, true);
+
+ if (have_backup_locks_var != NULL && !opt_no_backup_locks)
+ {
+ have_backup_locks= true;
+ }
- if (have_backup_locks_var != NULL && !opt_no_backup_locks) {
- have_backup_locks = true;
- }
+ if (opt_binlog_info == BINLOG_INFO_AUTO)
+ {
+ if (log_bin_var != NULL && !strcmp(log_bin_var, "ON"))
+ opt_binlog_info= BINLOG_INFO_ON;
+ else
+ opt_binlog_info= BINLOG_INFO_OFF;
+ }
- if (opt_binlog_info == BINLOG_INFO_AUTO) {
- if (log_bin_var != NULL && !strcmp(log_bin_var, "ON"))
- opt_binlog_info = BINLOG_INFO_ON;
- else
- opt_binlog_info = BINLOG_INFO_OFF;
- }
+ if (lock_wait_timeout_var != NULL)
+ {
+ have_lock_wait_timeout= true;
+ }
- if (lock_wait_timeout_var != NULL) {
- have_lock_wait_timeout = true;
- }
+ if (wsrep_on_var != NULL)
+ {
+ have_galera_enabled= true;
+ }
- if (wsrep_on_var != NULL) {
- have_galera_enabled = true;
- }
+ /* Check server version compatibility and detect server flavor */
- /* Check server version compatibility and detect server flavor */
+ if (!(ret= check_server_version(server_version, version_var,
+ version_comment_var, innodb_version_var)))
+ {
+ goto out;
+ }
- if (!(ret = check_server_version(server_version, version_var,
- version_comment_var,
- innodb_version_var))) {
- goto out;
- }
+ if (server_version > 50500)
+ {
+ have_flush_engine_logs= true;
+ }
- if (server_version > 50500) {
- have_flush_engine_logs = true;
- }
+ if (slave_parallel_workers_var != NULL &&
+ atoi(slave_parallel_workers_var) > 0)
+ {
+ have_multi_threaded_slave= true;
+ }
- if (slave_parallel_workers_var != NULL
- && atoi(slave_parallel_workers_var) > 0) {
- have_multi_threaded_slave = true;
- }
+ if (innodb_buffer_pool_filename_var != NULL)
+ {
+ buffer_pool_filename= strdup(innodb_buffer_pool_filename_var);
+ }
- if (innodb_buffer_pool_filename_var != NULL) {
- buffer_pool_filename = strdup(innodb_buffer_pool_filename_var);
- }
+ if ((gtid_mode_var && strcmp(gtid_mode_var, "ON") == 0) ||
+ (gtid_slave_pos_var && *gtid_slave_pos_var))
+ {
+ have_gtid_slave= true;
+ }
- if ((gtid_mode_var && strcmp(gtid_mode_var, "ON") == 0) ||
- (gtid_slave_pos_var && *gtid_slave_pos_var)) {
- have_gtid_slave = true;
- }
+ msg("Using server version %s", version_var);
- msg("Using server version %s", version_var);
+ if (!(ret= detect_mysql_capabilities_for_backup()))
+ {
+ goto out;
+ }
- if (!(ret = detect_mysql_capabilities_for_backup())) {
- goto out;
- }
+ /* make sure datadir value is the same in configuration file */
+ if (check_if_param_set("datadir"))
+ {
+ if (!directory_exists(mysql_data_home, false))
+ {
+ msg("Warning: option 'datadir' points to "
+ "nonexistent directory '%s'",
+ mysql_data_home);
+ }
+ if (!directory_exists(datadir_var, false))
+ {
+ msg("Warning: MySQL variable 'datadir' points to "
+ "nonexistent directory '%s'",
+ datadir_var);
+ }
+ if (!equal_paths(mysql_data_home, datadir_var))
+ {
+ msg("Warning: option 'datadir' has different "
+ "values:\n"
+ " '%s' in defaults file\n"
+ " '%s' in SHOW VARIABLES",
+ mysql_data_home, datadir_var);
+ }
+ }
- /* make sure datadir value is the same in configuration file */
- if (check_if_param_set("datadir")) {
- if (!directory_exists(mysql_data_home, false)) {
- msg("Warning: option 'datadir' points to "
- "nonexistent directory '%s'", mysql_data_home);
- }
- if (!directory_exists(datadir_var, false)) {
- msg("Warning: MySQL variable 'datadir' points to "
- "nonexistent directory '%s'", datadir_var);
- }
- if (!equal_paths(mysql_data_home, datadir_var)) {
- msg("Warning: option 'datadir' has different "
- "values:\n"
- " '%s' in defaults file\n"
- " '%s' in SHOW VARIABLES",
- mysql_data_home, datadir_var);
- }
- }
+ /* get some default values is they are missing from my.cnf */
+ if (datadir_var && *datadir_var)
+ {
+ strmake(mysql_real_data_home, datadir_var, FN_REFLEN - 1);
+ mysql_data_home= mysql_real_data_home;
+ }
- /* get some default values is they are missing from my.cnf */
- if (datadir_var && *datadir_var) {
- strmake(mysql_real_data_home, datadir_var, FN_REFLEN - 1);
- mysql_data_home= mysql_real_data_home;
- }
+ if (innodb_data_file_path_var && *innodb_data_file_path_var)
+ {
+ innobase_data_file_path= my_strdup(innodb_data_file_path_var, MYF(MY_FAE));
+ }
- if (innodb_data_file_path_var && *innodb_data_file_path_var) {
- innobase_data_file_path = my_strdup(
- innodb_data_file_path_var, MYF(MY_FAE));
- }
+ if (innodb_data_home_dir_var)
+ {
+ innobase_data_home_dir= my_strdup(innodb_data_home_dir_var, MYF(MY_FAE));
+ }
- if (innodb_data_home_dir_var) {
- innobase_data_home_dir = my_strdup(
- innodb_data_home_dir_var, MYF(MY_FAE));
- }
+ if (innodb_log_group_home_dir_var && *innodb_log_group_home_dir_var)
+ {
+ srv_log_group_home_dir=
+ my_strdup(innodb_log_group_home_dir_var, MYF(MY_FAE));
+ }
- if (innodb_log_group_home_dir_var
- && *innodb_log_group_home_dir_var) {
- srv_log_group_home_dir = my_strdup(
- innodb_log_group_home_dir_var, MYF(MY_FAE));
- }
+ if (innodb_undo_directory_var && *innodb_undo_directory_var)
+ {
+ srv_undo_dir= my_strdup(innodb_undo_directory_var, MYF(MY_FAE));
+ }
- if (innodb_undo_directory_var && *innodb_undo_directory_var) {
- srv_undo_dir = my_strdup(
- innodb_undo_directory_var, MYF(MY_FAE));
- }
+ if (innodb_log_files_in_group_var)
+ {
+ srv_n_log_files= strtol(innodb_log_files_in_group_var, &endptr, 10);
+ ut_ad(*endptr == 0);
+ }
- if (innodb_log_files_in_group_var) {
- srv_n_log_files = strtol(
- innodb_log_files_in_group_var, &endptr, 10);
- ut_ad(*endptr == 0);
- }
+ if (innodb_log_file_size_var)
+ {
+ srv_log_file_size= strtoll(innodb_log_file_size_var, &endptr, 10);
+ ut_ad(*endptr == 0);
+ }
- if (innodb_log_file_size_var) {
- srv_log_file_size = strtoll(
- innodb_log_file_size_var, &endptr, 10);
- ut_ad(*endptr == 0);
- }
+ if (innodb_page_size_var)
+ {
+ innobase_page_size= strtoll(innodb_page_size_var, &endptr, 10);
+ ut_ad(*endptr == 0);
+ }
- if (innodb_page_size_var) {
- innobase_page_size = strtoll(
- innodb_page_size_var, &endptr, 10);
- ut_ad(*endptr == 0);
- }
+ if (innodb_undo_tablespaces_var)
+ {
+ srv_undo_tablespaces= strtoul(innodb_undo_tablespaces_var, &endptr, 10);
+ ut_ad(*endptr == 0);
+ }
- if (innodb_undo_tablespaces_var) {
- srv_undo_tablespaces = strtoul(innodb_undo_tablespaces_var,
- &endptr, 10);
- ut_ad(*endptr == 0);
- }
+ if (page_zip_level_var != NULL)
+ {
+ page_zip_level= strtoul(page_zip_level_var, &endptr, 10);
+ ut_ad(*endptr == 0);
+ }
- if (page_zip_level_var != NULL) {
- page_zip_level = strtoul(page_zip_level_var, &endptr, 10);
- ut_ad(*endptr == 0);
- }
+ if (ignore_db_dirs)
+ xb_load_list_string(ignore_db_dirs, ",", register_ignore_db_dirs_filter);
out:
- free_mysql_variables(mysql_vars);
+ free_mysql_variables(mysql_vars);
- return(ret);
+ return (ret);
}
/*********************************************************************//**
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 875eab52f69..5246ffbda20 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -3628,6 +3628,11 @@ xb_register_exclude_filter_entry(
&tables_exclude_hash);
}
+void register_ignore_db_dirs_filter(const char *name)
+{
+ xb_add_filter(name, &databases_exclude_hash);
+}
+
/***********************************************************************
Register new table for the filter. */
static
@@ -3690,26 +3695,24 @@ xb_register_exclude_regex(
typedef void (*insert_entry_func_t)(const char*);
-/***********************************************************************
-Scan string and load filter entries from it. */
-static
-void
-xb_load_list_string(
-/*================*/
- char* list, /*!< in: string representing a list */
- const char* delimiters, /*!< in: delimiters of entries */
- insert_entry_func_t ins) /*!< in: callback to add entry */
+/* Scan string and load filter entries from it.
+@param[in] list string representing a list
+@param[in] delimiters delimiters of entries
+@param[in] ins callback to add entry */
+void xb_load_list_string(char *list, const char *delimiters,
+ insert_entry_func_t ins)
{
- char* p;
- char* saveptr;
+ char *p;
+ char *saveptr;
- p = strtok_r(list, delimiters, &saveptr);
- while (p) {
+ p= strtok_r(list, delimiters, &saveptr);
+ while (p)
+ {
- ins(p);
+ ins(p);
- p = strtok_r(NULL, delimiters, &saveptr);
- }
+ p= strtok_r(NULL, delimiters, &saveptr);
+ }
}
/***********************************************************************
diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h
index c56e83f7a32..2dbdd442f95 100644
--- a/extra/mariabackup/xtrabackup.h
+++ b/extra/mariabackup/xtrabackup.h
@@ -194,4 +194,14 @@ void mdl_lock_init();
void mdl_lock_table(ulint space_id);
void mdl_unlock_all();
bool ends_with(const char *str, const char *suffix);
+
+typedef void (*insert_entry_func_t)(const char*);
+
+/* Scan string and load filter entries from it.
+@param[in] list string representing a list
+@param[in] delimiters delimiters of entries
+@param[in] ins callback to add entry */
+void xb_load_list_string(char *list, const char *delimiters,
+ insert_entry_func_t ins);
+void register_ignore_db_dirs_filter(const char *name);
#endif /* XB_XTRABACKUP_H */
diff --git a/extra/resolve_stack_dump.c b/extra/resolve_stack_dump.c
index 92cd4c0de18..6d6adccfe32 100644
--- a/extra/resolve_stack_dump.c
+++ b/extra/resolve_stack_dump.c
@@ -53,7 +53,7 @@ static struct my_option my_long_options[] =
0, 0, 0, GET_NO_ARG, 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},
- {"symbols-file", 's', "Use specified symbols file.", &sym_fname,
+ {"symbols-file", 's', "Use specified symbols file", &sym_fname,
&sym_fname, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"numeric-dump-file", 'n', "Read the dump from specified file.",
&dump_fname, &dump_fname, 0, GET_STR, REQUIRED_ARG,
@@ -63,7 +63,7 @@ static struct my_option my_long_options[] =
static void verify_sort();
-
+static void clean_up();
static void print_version(void)
{
@@ -97,9 +97,18 @@ static void die(const char* fmt, ...)
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
+ clean_up();
+ my_end(0);
exit(1);
}
+void local_exit(int error)
+{
+ clean_up();
+ my_end(0);
+ exit(error);
+}
+
static my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
@@ -108,10 +117,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
switch(optid) {
case 'V':
print_version();
- exit(0);
+ local_exit(0);
+ break;
case '?':
usage();
- exit(0);
+ local_exit(0);
+ break;
}
return 0;
}
@@ -122,7 +133,7 @@ static int parse_args(int argc, char **argv)
int ho_error;
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
- exit(ho_error);
+ local_exit(ho_error);
/*
The following code is to make the command compatible with the old
@@ -143,13 +154,13 @@ static int parse_args(int argc, char **argv)
else
{
usage();
- exit(1);
+ local_exit(1);
}
}
else if (argc != 0 || !sym_fname)
{
usage();
- exit(1);
+ local_exit(1);
}
return 0;
}
@@ -242,6 +253,10 @@ static void init_sym_table()
static void clean_up()
{
delete_dynamic(&sym_table);
+ if (fp_dump && fp_dump != stdin)
+ my_fclose(fp_dump, MYF(0));
+ if (fp_sym)
+ my_fclose(fp_sym, MYF(0));
}
static void verify_sort()
@@ -283,7 +298,7 @@ static SYM_ENTRY* resolve_addr(uchar* addr, SYM_ENTRY* se)
/*
- Resolve anything that starts with [0x or (+0x or start of line and 0x
+ Resolve anything that starts with [0x or (+0x or 0x
Skip '_end' as this is an indication of a wrong symbol (stack?)
*/
@@ -299,9 +314,7 @@ static void do_resolve()
found= 3;
if (p[0] == '(' && p[1] == '+' && p[2] == '0' && p[3] == 'x')
found= 4;
-
- /* For stdin */
- if (p == buf && p[0] == '0' && p[1] == 'x')
+ if (p[0] == '0' && p[1] == 'x')
found= 2;
if (found)
@@ -312,14 +325,15 @@ static void do_resolve()
addr= (uchar*)read_addr(&tmp);
if (resolve_addr(addr, &se) && strcmp(se.symbol, "_end"))
{
- fprintf(fp_out, "%c%p %s + %d", *p, addr, se.symbol,
- (int) (addr - se.addr));
+ found-= 2; /* Don't print 0x as it's added by %p */
+ while (found--)
+ fputc(*p++, stdout);
+ fprintf(fp_out, "%p %s + %d", addr,
+ se.symbol, (int) (addr - se.addr));
p= tmp-1;
}
else
- {
fputc(*p, stdout);
- }
}
else
fputc(*p, stdout);
@@ -336,5 +350,6 @@ int main(int argc, char** argv)
init_sym_table();
do_resolve();
clean_up();
+ my_end(0);
return 0;
}