diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-02-25 13:00:48 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-02-25 13:00:48 +0200 |
commit | f5ff7d09c73b5527cb6e0540cd470db9d8a82108 (patch) | |
tree | 23728ff9752891cb78060ed748a3fc8bb7381c40 /extra | |
parent | 0eabc285a3c0cf0285d569a29c549634238fbdae (diff) | |
parent | 9ba385a50d0cd611fce61462fc3e03e82b1ffee9 (diff) | |
download | mariadb-git-f5ff7d09c73b5527cb6e0540cd470db9d8a82108.tar.gz |
Merge 10.3 into 10.4
Diffstat (limited to 'extra')
-rw-r--r-- | extra/mariabackup/backup_copy.cc | 84 | ||||
-rw-r--r-- | extra/mariabackup/backup_copy.h | 7 | ||||
-rw-r--r-- | extra/mariabackup/backup_mysql.cc | 248 | ||||
-rw-r--r-- | extra/mariabackup/backup_mysql.h | 6 | ||||
-rw-r--r-- | extra/mariabackup/common.h | 10 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 85 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.h | 2 |
7 files changed, 342 insertions, 100 deletions
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index cea92f9dbfb..92f6b93dc95 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -578,7 +578,6 @@ datafile_read(datafile_cur_t *cursor) Check to see if a file exists. Takes name of the file to check. @return true if file exists. */ -static bool file_exists(const char *filename) { @@ -1540,13 +1539,14 @@ bool backup_start(CorruptedPages &corrupted_pages) if (!write_galera_info(mysql_connection)) { return(false); } - write_current_binlog_file(mysql_connection); } - if (opt_binlog_info == BINLOG_INFO_ON) { + bool with_binlogs = opt_binlog_info == BINLOG_INFO_ON; - lock_binlog_maybe(mysql_connection); - write_binlog_info(mysql_connection); + if (with_binlogs || opt_galera_info) { + if (!write_current_binlog_file(mysql_connection, with_binlogs)) { + return(false); + } } if (have_flush_engine_logs && !opt_no_lock) { @@ -1580,15 +1580,34 @@ void backup_release() } } +static const char *default_buffer_pool_file = "ib_buffer_pool"; + +static +const char * get_buffer_pool_filename(size_t *length) +{ + /* If mariabackup is run for Galera, then the file + name is changed to the default so that the receiving + node can find this file and rename it according to its + settings, otherwise we keep the original file name: */ + size_t dir_length = 0; + const char *dst_name = default_buffer_pool_file; + if (!opt_galera_info) { + dir_length = dirname_length(buffer_pool_filename); + dst_name = buffer_pool_filename + dir_length; + } + if (length) { + *length=dir_length; + } + return dst_name; +} + /** Finish after backup_start() and backup_release() */ bool backup_finish() { /* Copy buffer pool dump or LRU dump */ if (!opt_rsync) { if (buffer_pool_filename && file_exists(buffer_pool_filename)) { - const char *dst_name; - - dst_name = trim_dotslash(buffer_pool_filename); + const char *dst_name = get_buffer_pool_filename(NULL); copy_file(ds_data, buffer_pool_filename, dst_name, 0); } if (file_exists("ib_lru_dump")) { @@ -1677,17 +1696,14 @@ ibx_copy_incremental_over_full() /* copy buffer pool dump */ if (innobase_buffer_pool_filename) { - const char *src_name; - - src_name = trim_dotslash(innobase_buffer_pool_filename); + const char *src_name = get_buffer_pool_filename(NULL); snprintf(path, sizeof(path), "%s/%s", xtrabackup_incremental_dir, src_name); if (file_exists(path)) { - copy_file(ds_data, path, - innobase_buffer_pool_filename, 0); + copy_file(ds_data, path, src_name, 0); } } @@ -1922,6 +1938,14 @@ copy_back() datadir_node_init(&node); + /* If mariabackup is run for Galera, then the file + name is changed to the default so that the receiving + node can find this file and rename it according to its + settings, otherwise we keep the original file name: */ + size_t dir_length; + const char *src_buffer_pool; + src_buffer_pool = get_buffer_pool_filename(&dir_length); + while (datadir_iter_next(it, &node)) { const char *ext_list[] = {"backup-my.cnf", "xtrabackup_binary", "xtrabackup_binlog_info", @@ -1984,6 +2008,11 @@ copy_back() continue; } + /* skip buffer pool dump */ + if (!strcmp(filename, src_buffer_pool)) { + continue; + } + /* skip innodb data files */ is_ibdata_file = false; for (Tablespace::const_iterator iter(srv_sys_space.begin()), @@ -2006,23 +2035,18 @@ copy_back() /* copy buffer pool dump */ - if (innobase_buffer_pool_filename) { - const char *src_name; - char path[FN_REFLEN]; - - src_name = trim_dotslash(innobase_buffer_pool_filename); - - snprintf(path, sizeof(path), "%s/%s", - mysql_data_home, - src_name); - - /* could be already copied with other files - from data directory */ - if (file_exists(src_name) && - !file_exists(innobase_buffer_pool_filename)) { - copy_or_move_file(src_name, - innobase_buffer_pool_filename, - mysql_data_home, 0); + if (file_exists(src_buffer_pool)) { + char dst_dir[FN_REFLEN]; + while (IS_TRAILING_SLASH(buffer_pool_filename, dir_length)) { + dir_length--; + } + memcpy(dst_dir, buffer_pool_filename, dir_length); + dst_dir[dir_length] = 0; + if (!(ret = copy_or_move_file(src_buffer_pool, + src_buffer_pool, + dst_dir, 1))) + { + goto cleanup; } } diff --git a/extra/mariabackup/backup_copy.h b/extra/mariabackup/backup_copy.h index 62b2b1bc232..858182001ce 100644 --- a/extra/mariabackup/backup_copy.h +++ b/extra/mariabackup/backup_copy.h @@ -32,6 +32,13 @@ copy_file(ds_ctxt_t *datasink, const char *dst_file_path, uint thread_n); +/************************************************************************ +Check to see if a file exists. +Takes name of the file to check. +@return true if file exists. */ +bool +file_exists(const char *filename); + /** Start --backup */ bool backup_start(CorruptedPages &corrupted_pages); /** Release resources after backup_start() */ diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc index 1c8305580c7..475d438dca3 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -84,7 +84,6 @@ os_event_t kill_query_thread_stop; bool sql_thread_started = false; char *mysql_slave_position = NULL; char *mysql_binlog_position = NULL; -char *buffer_pool_filename = NULL; /* History on server */ time_t history_start_time; @@ -1224,27 +1223,29 @@ cleanup: } +static +bool +write_binlog_info(MYSQL *connection, char *log_bin_dir, + MYSQL_RES *mysql_result, my_ulonglong n_rows, + my_ulonglong start); + /*********************************************************************//** Flush and copy the current binary log file into the backup, if GTID is enabled */ bool -write_current_binlog_file(MYSQL *connection) +write_current_binlog_file(MYSQL *connection, bool write_binlogs) { + char *log_bin = NULL; + char *filename = NULL; + char *position = NULL; char *executed_gtid_set = NULL; char *gtid_binlog_state = NULL; - char *log_bin_file = NULL; char *log_bin_dir = NULL; bool gtid_exists; bool result = true; - char filepath[FN_REFLEN]; - mysql_variable status[] = { - {"Executed_Gtid_Set", &executed_gtid_set}, - {NULL, NULL} - }; - - mysql_variable status_after_flush[] = { - {"File", &log_bin_file}, + mysql_variable log_bin_var[] = { + {"@@GLOBAL.log_bin", &log_bin}, {NULL, NULL} }; @@ -1254,21 +1255,36 @@ write_current_binlog_file(MYSQL *connection) {NULL, NULL} }; + mysql_variable status[] = { + {"File", &filename}, + {"Position", &position}, + {"Executed_Gtid_Set", &executed_gtid_set}, + {NULL, NULL} + }; + + read_mysql_variables(connection, "SELECT @@GLOBAL.log_bin", log_bin_var, false); + + /* Do not create xtrabackup_binlog_info if binary log is disabled: */ + if (strncmp(log_bin, "1", 2) != 0) { + goto binlog_disabled; + } + + lock_binlog_maybe(connection); + read_mysql_variables(connection, "SHOW MASTER STATUS", status, false); + + /* Do not create xtrabackup_binlog_info if replication + has not started yet: */ + if (filename == NULL || position == NULL) { + goto no_replication; + } + read_mysql_variables(connection, "SHOW VARIABLES", vars, true); gtid_exists = (executed_gtid_set && *executed_gtid_set) || (gtid_binlog_state && *gtid_binlog_state); - if (gtid_exists) { - size_t log_bin_dir_length; - - lock_binlog_maybe(connection); - - xb_mysql_query(connection, "FLUSH BINARY LOGS", false); - - read_mysql_variables(connection, "SHOW MASTER STATUS", - status_after_flush, false); + if (write_binlogs || gtid_exists) { if (opt_log_bin != NULL && strchr(opt_log_bin, FN_LIBCHAR)) { /* If log_bin is set, it has priority */ @@ -1278,34 +1294,89 @@ write_current_binlog_file(MYSQL *connection) log_bin_dir = strdup(opt_log_bin); } else if (log_bin_dir == NULL) { /* Default location is MySQL datadir */ - log_bin_dir = strdup("./"); + log_bin_dir = static_cast<char*>(malloc(3)); + ut_a(log_bin_dir); + log_bin_dir[0] = '.'; + log_bin_dir[1] = FN_LIBCHAR; + log_bin_dir[2] = 0; } + size_t log_bin_dir_length; + dirname_part(log_bin_dir, log_bin_dir, &log_bin_dir_length); /* strip final slash if it is not the only path component */ - if (log_bin_dir_length > 1 && - log_bin_dir[log_bin_dir_length - 1] == FN_LIBCHAR) { - log_bin_dir[log_bin_dir_length - 1] = 0; + while (IS_TRAILING_SLASH(log_bin_dir, log_bin_dir_length)) { + log_bin_dir_length--; } + log_bin_dir[log_bin_dir_length] = 0; - if (log_bin_dir == NULL || log_bin_file == NULL) { - msg("Failed to get master binlog coordinates from " - "SHOW MASTER STATUS"); + if (log_bin_dir == NULL) { + msg("Failed to locate binary log files"); result = false; goto cleanup; } - snprintf(filepath, sizeof(filepath), "%s%c%s", - log_bin_dir, FN_LIBCHAR, log_bin_file); - result = copy_file(ds_data, filepath, log_bin_file, 0); + uint max_binlogs; + max_binlogs = opt_max_binlogs; + if (max_binlogs == 0) { + if (gtid_exists) { + max_binlogs = 1; + } else { + goto cleanup; + } + } + + xb_mysql_query(connection, "FLUSH BINARY LOGS", false); + + MYSQL_RES *mysql_result; + + mysql_result = xb_mysql_query(connection, "SHOW BINARY LOGS", true); + + ut_ad(mysql_num_fields(mysql_result) >= 2); + + my_ulonglong n_rows; + my_ulonglong start; + + n_rows = mysql_num_rows(mysql_result); + + start = 0; + if (max_binlogs < n_rows) { + start = n_rows - max_binlogs; + } + if (start) { + mysql_data_seek(mysql_result, start); + } + + MYSQL_ROW row; + while ((row = mysql_fetch_row(mysql_result))) { + const char *binlog_name = row[0]; + char filepath[FN_REFLEN]; + snprintf(filepath, sizeof(filepath), "%s%c%s", + log_bin_dir, FN_LIBCHAR, binlog_name); + if (file_exists(filepath)) { + result = copy_file(ds_data, filepath, binlog_name, 0); + if (!result) break; + } + } + + if (result) { + write_binlog_info(connection, log_bin_dir, + mysql_result, n_rows, start); + } + + mysql_free_result(mysql_result); } cleanup: - free_mysql_variables(status_after_flush); - free_mysql_variables(status); free_mysql_variables(vars); +no_replication: + free_mysql_variables(status); + +binlog_disabled: + free_mysql_variables(log_bin_var); + return(result); } @@ -1313,8 +1384,11 @@ cleanup: /*********************************************************************//** Retrieves MySQL binlog position and saves it in a file. It also prints it to stdout. */ +static bool -write_binlog_info(MYSQL *connection) +write_binlog_info(MYSQL *connection, char *log_bin_dir, + MYSQL_RES *mysql_result, my_ulonglong n_rows, + my_ulonglong start) { char *filename = NULL; char *position = NULL; @@ -1322,9 +1396,13 @@ write_binlog_info(MYSQL *connection) char *gtid_current_pos = NULL; char *gtid_executed = NULL; char *gtid = NULL; - bool result; + char *buffer; + char *buf; + size_t total; + bool result = true; bool mysql_gtid; bool mariadb_gtid; + bool with_gtid; mysql_variable status[] = { {"File", &filename}, @@ -1342,39 +1420,106 @@ write_binlog_info(MYSQL *connection) read_mysql_variables(connection, "SHOW MASTER STATUS", status, false); read_mysql_variables(connection, "SHOW VARIABLES", vars, true); - if (filename == NULL || position == NULL) { - /* Do not create xtrabackup_binlog_info if binary - log is disabled */ - result = true; - goto cleanup; - } - - mysql_gtid = ((gtid_mode != NULL) && (strcmp(gtid_mode, "ON") == 0)); - mariadb_gtid = (gtid_current_pos != NULL); + mysql_gtid = gtid_mode && (strcmp(gtid_mode, "ON") == 0); + mariadb_gtid = gtid_current_pos && *gtid_current_pos; - gtid = (gtid_executed != NULL ? gtid_executed : gtid_current_pos); + gtid = (gtid_executed && *gtid_executed) ? gtid_executed : gtid_current_pos; - if (mariadb_gtid || mysql_gtid) { + with_gtid = mariadb_gtid || mysql_gtid; + if (with_gtid) { ut_a(asprintf(&mysql_binlog_position, "filename '%s', position '%s', " "GTID of the last change '%s'", filename, position, gtid) != -1); - result = backup_file_printf(XTRABACKUP_BINLOG_INFO, - "%s\t%s\t%s\n", filename, position, - gtid); } else { ut_a(asprintf(&mysql_binlog_position, "filename '%s', position '%s'", filename, position) != -1); - result = backup_file_printf(XTRABACKUP_BINLOG_INFO, - "%s\t%s\n", filename, position); } + mysql_data_seek(mysql_result, start); + + MYSQL_ROW row; + my_ulonglong current; + + total = 1; + current = start; + while ((row = mysql_fetch_row(mysql_result))) { + const char *binlog_name = row[0]; + /* The position in the current binlog is taken from + the global variable, but for the previous ones it is + determined by their length: */ + const char *binlog_pos = + ++current == n_rows ? position : row[1]; + total += strlen(binlog_name) + strlen(binlog_pos) + 2; + if (with_gtid && current != n_rows) { + /* Add the "\t[]" length to the buffer size: */ + total += 3; + } + } + /* For the last of the binray log files, also add + the length of the GTID (+ one character for '\t'): */ + if (with_gtid) { + total += strlen(gtid) + 1; + } + + buffer = static_cast<char*>(malloc(total)); + if (!buffer) { + msg("Failed to allocate memory for temporary buffer"); + result = false; + goto cleanup; + } + + mysql_data_seek(mysql_result, start); + + buf = buffer; + current = start; + while ((row = mysql_fetch_row(mysql_result))) { + const char *binlog_name = row[0]; + char filepath[FN_REFLEN]; + snprintf(filepath, sizeof(filepath), "%s%c%s", + log_bin_dir, FN_LIBCHAR, binlog_name); + current++; + if (file_exists(filepath)) { + /* The position in the current binlog is taken from + the global variable, but for the previous ones it is + determined by their length: */ + char *binlog_pos = + current == n_rows ? position : row[1]; + int bytes; + if (with_gtid) { + bytes = snprintf(buf, total, "%s\t%s\t%s\n", + binlog_name, binlog_pos, + current == n_rows ? gtid : "[]"); + } else { + bytes = snprintf(buf, total, "%s\t%s\n", + binlog_name, binlog_pos); + } + if (bytes <= 0) { + goto buffer_overflow; + } + buf += bytes; + total -= bytes; + } + } + + if (buf != buffer) { + result = backup_file_printf(XTRABACKUP_BINLOG_INFO, "%s", buffer); + } + +cleanup2: + free(buffer); + cleanup: - free_mysql_variables(status); free_mysql_variables(vars); + free_mysql_variables(status); return(result); + +buffer_overflow: + msg("Internal error: buffer overflow in the write_binlog_info()"); + result = false; + goto cleanup2; } struct escape_and_quote @@ -1702,7 +1847,6 @@ backup_cleanup() { free(mysql_slave_position); free(mysql_binlog_position); - free(buffer_pool_filename); if (mysql_connection) { mysql_close(mysql_connection); diff --git a/extra/mariabackup/backup_mysql.h b/extra/mariabackup/backup_mysql.h index b61fa2362c6..5e78281e1cb 100644 --- a/extra/mariabackup/backup_mysql.h +++ b/extra/mariabackup/backup_mysql.h @@ -28,7 +28,6 @@ extern time_t history_lock_time; extern bool sql_thread_started; extern char *mysql_slave_position; extern char *mysql_binlog_position; -extern char *buffer_pool_filename; /** connection to mysql server */ extern MYSQL *mysql_connection; @@ -62,10 +61,7 @@ void unlock_all(MYSQL *connection); bool -write_current_binlog_file(MYSQL *connection); - -bool -write_binlog_info(MYSQL *connection); +write_current_binlog_file(MYSQL *connection, bool write_binlogs); bool write_xtrabackup_info(MYSQL *connection, const char * filename, bool history, diff --git a/extra/mariabackup/common.h b/extra/mariabackup/common.h index 1973512ad82..beb49524608 100644 --- a/extra/mariabackup/common.h +++ b/extra/mariabackup/common.h @@ -187,4 +187,14 @@ xb_read_full(File fd, uchar *buf, size_t len) return tlen; } +#ifdef _WIN32 +#define IS_TRAILING_SLASH(name, length) \ + ((length) > 1 && \ + (name[(length) - 1] == '/' || \ + name[(length) - 1] == '\\')) +#else +#define IS_TRAILING_SLASH(name, length) \ + ((length) > 1 && name[(length) - 1] == FN_LIBCHAR) +#endif + #endif diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 8e202a8cd24..b57dcc86ff2 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -4,7 +4,7 @@ MariaBackup: hot backup tool for InnoDB Originally Created 3/3/2009 Yasufumi Kinoshita Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. -(c) 2017, 2021, MariaDB Corporation. +(c) 2017, 2022, MariaDB Corporation. Portions written by Marko Mäkelä. This program is free software; you can redistribute it and/or modify @@ -245,7 +245,8 @@ long innobase_read_io_threads = 4; long innobase_write_io_threads = 4; longlong innobase_page_size = (1LL << 14); /* 16KB */ -char* innobase_buffer_pool_filename = NULL; +char *innobase_buffer_pool_filename = NULL; +char *buffer_pool_filename = NULL; /* The default values for the following char* start-up parameters are determined in innobase_init below: */ @@ -354,6 +355,7 @@ uint opt_lock_wait_timeout = 0; uint opt_lock_wait_threshold = 0; uint opt_debug_sleep_before_unlock = 0; uint opt_safe_slave_backup_timeout = 0; +uint opt_max_binlogs = UINT_MAX; const char *opt_history = NULL; @@ -1054,7 +1056,8 @@ enum options_xtrabackup OPT_XTRA_CHECK_PRIVILEGES, OPT_XTRA_MYSQLD_ARGS, OPT_XB_IGNORE_INNODB_PAGE_CORRUPTION, - OPT_INNODB_FORCE_RECOVERY + OPT_INNODB_FORCE_RECOVERY, + OPT_MAX_BINLOGS }; struct my_option xb_client_options[]= { @@ -1457,6 +1460,17 @@ struct my_option xb_client_options[]= { &opt_log_innodb_page_corruption, &opt_log_innodb_page_corruption, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sst_max_binlogs", OPT_MAX_BINLOGS, + "Number of recent binary logs to be included in the backup. " + "Setting this parameter to zero normally disables transmission " + "of binary logs to the joiner nodes during SST using Galera. " + "But sometimes a single current binlog can still be transmitted " + "to the joiner even with sst_max_binlogs=0, because it is " + "required for Galera to work properly with GTIDs support.", + (G_PTR *) &opt_max_binlogs, + (G_PTR *) &opt_max_binlogs, 0, GET_UINT, OPT_ARG, + UINT_MAX, 0, UINT_MAX, 0, 1, 0}, + #define MYSQL_CLIENT #include "sslopt-longopts.h" #undef MYSQL_CLIENT @@ -1505,14 +1519,14 @@ struct my_option xb_server_options[] = (G_PTR*)&opt_encrypted_backup, 0, GET_BOOL, NO_ARG, TRUE, 0, 0, 0, 0, 0}, - {"log", OPT_LOG, "Ignored option for MySQL option compatibility", + {"log", OPT_LOG, "Ignored option for MySQL option compatibility", (G_PTR*) &log_ignored_opt, (G_PTR*) &log_ignored_opt, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"log_bin", OPT_LOG, "Base name for the log sequence", + {"log_bin", OPT_LOG, "Base name for the log sequence", &opt_log_bin, &opt_log_bin, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"innodb", OPT_INNODB, "Ignored option for MySQL option compatibility", + {"innodb", OPT_INNODB, "Ignored option for MySQL option compatibility", (G_PTR*) &innobase_ignored_opt, (G_PTR*) &innobase_ignored_opt, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #ifdef BTR_CUR_HASH_ADAPT @@ -1634,10 +1648,10 @@ struct my_option xb_server_options[] = 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"plugin-dir", OPT_PLUGIN_DIR, - "Server plugin directory. Used to load encryption plugin during 'prepare' phase." - "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", - &xb_plugin_dir, &xb_plugin_dir, - 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + "Server plugin directory. Used to load encryption plugin during 'prepare' phase." + "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", + &xb_plugin_dir, &xb_plugin_dir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, {"innodb-log-checksums", OPT_INNODB_LOG_CHECKSUMS, "Whether to require checksums for InnoDB redo log blocks", @@ -1659,12 +1673,12 @@ struct my_option xb_server_options[] = &xb_rocksdb_datadir, &xb_rocksdb_datadir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - { "rocksdb-backup", OPT_BACKUP_ROCKSDB, "Backup rocksdb data, if rocksdb plugin is installed." + {"rocksdb-backup", OPT_BACKUP_ROCKSDB, "Backup rocksdb data, if rocksdb plugin is installed." "Used only with --backup option. Can be useful for partial backups, to exclude all rocksdb data", &xb_backup_rocksdb, &xb_backup_rocksdb, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 }, - {"check-privileges", OPT_XTRA_CHECK_PRIVILEGES, "Check database user " + {"check-privileges", OPT_XTRA_CHECK_PRIVILEGES, "Check database user " "privileges fro the backup user", &opt_check_privileges, &opt_check_privileges, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 }, @@ -6426,6 +6440,44 @@ static bool check_all_privileges() return true; } +static +void +xb_init_buffer_pool(const char * filename) +{ + if (filename && +#ifdef _WIN32 + (filename[0] == '/' || + filename[0] == '\\' || + strchr(filename, ':'))) +#else + filename[0] == FN_LIBCHAR) +#endif + { + buffer_pool_filename = strdup(filename); + } else { + char filepath[FN_REFLEN]; + char *dst_dir = + (innobase_data_home_dir && *innobase_data_home_dir) ? + innobase_data_home_dir : mysql_data_home; + size_t dir_length; + if (dst_dir && *dst_dir) { + dir_length = strlen(dst_dir); + while (IS_TRAILING_SLASH(dst_dir, dir_length)) { + dir_length--; + } + memcpy(filepath, dst_dir, dir_length); + } + else { + filepath[0] = '.'; + dir_length = 1; + } + snprintf(filepath + dir_length, + sizeof(filepath) - dir_length, "%c%s", FN_LIBCHAR, + filename ? filename : "ib_buffer_pool"); + buffer_pool_filename = strdup(filepath); + } +} + bool xb_init() { @@ -6490,11 +6542,16 @@ xb_init() if (!get_mysql_vars(mysql_connection)) { return(false); } + + xb_init_buffer_pool(buffer_pool_filename); + if (opt_check_privileges && !check_all_privileges()) { return(false); } - history_start_time = time(NULL); + history_start_time = time(NULL); + } else { + xb_init_buffer_pool(innobase_buffer_pool_filename); } return(true); @@ -6884,6 +6941,8 @@ int main(int argc, char **argv) free_error_messages(); mysql_mutex_destroy(&LOCK_error_log); + free(buffer_pool_filename); + if (status == EXIT_SUCCESS) { msg("completed OK!"); } diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h index 854456c3afd..d6e9f620424 100644 --- a/extra/mariabackup/xtrabackup.h +++ b/extra/mariabackup/xtrabackup.h @@ -71,6 +71,7 @@ extern char *xtrabackup_incremental_dir; extern char *xtrabackup_incremental_basedir; extern char *innobase_data_home_dir; extern char *innobase_buffer_pool_filename; +extern char *buffer_pool_filename; extern char *xb_plugin_dir; extern char *xb_rocksdb_datadir; extern my_bool xb_backup_rocksdb; @@ -166,6 +167,7 @@ extern uint opt_lock_wait_timeout; extern uint opt_lock_wait_threshold; extern uint opt_debug_sleep_before_unlock; extern uint opt_safe_slave_backup_timeout; +extern uint opt_max_binlogs; extern const char *opt_history; |