diff options
author | Sergei Golubchik <serg@mariadb.org> | 2022-06-28 09:16:31 +0200 |
---|---|---|
committer | Julius Goryavsky <julius.goryavsky@mariadb.com> | 2022-08-01 15:53:13 +0200 |
commit | 5197519f4f7b31c61e3abccf75650e5356aecd4c (patch) | |
tree | 3efc3394683cff0d41b6faa3edc403fc3a0ae358 /extra | |
parent | 6a3fbfdb2d048a0a1b5762f8a56df35ba6986cf0 (diff) | |
download | mariadb-git-5197519f4f7b31c61e3abccf75650e5356aecd4c.tar.gz |
revert mariabackup part of MDEV-27524, fix the test
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 | 62 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.h | 2 |
7 files changed, 89 insertions, 330 deletions
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index c21f85d48b2..be41bffa744 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -581,6 +581,7 @@ 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) { @@ -1543,14 +1544,13 @@ bool backup_start(CorruptedPages &corrupted_pages) if (!write_galera_info(mysql_connection)) { return(false); } + write_current_binlog_file(mysql_connection); } - bool with_binlogs = opt_binlog_info == BINLOG_INFO_ON; + if (opt_binlog_info == BINLOG_INFO_ON) { - if (with_binlogs || opt_galera_info) { - if (!write_current_binlog_file(mysql_connection, with_binlogs)) { - return(false); - } + lock_binlog_maybe(mysql_connection); + write_binlog_info(mysql_connection); } if (have_flush_engine_logs && !opt_no_lock) { @@ -1584,34 +1584,15 @@ 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 = get_buffer_pool_filename(NULL); + const char *dst_name; + + dst_name = trim_dotslash(buffer_pool_filename); copy_file(ds_data, buffer_pool_filename, dst_name, 0); } if (file_exists("ib_lru_dump")) { @@ -1700,14 +1681,17 @@ ibx_copy_incremental_over_full() /* copy buffer pool dump */ if (innobase_buffer_pool_filename) { - const char *src_name = get_buffer_pool_filename(NULL); + const char *src_name; + + src_name = trim_dotslash(innobase_buffer_pool_filename); snprintf(path, sizeof(path), "%s/%s", xtrabackup_incremental_dir, src_name); if (file_exists(path)) { - copy_file(ds_data, path, src_name, 0); + copy_file(ds_data, path, + innobase_buffer_pool_filename, 0); } } @@ -1942,14 +1926,6 @@ 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", @@ -2012,11 +1988,6 @@ 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()), @@ -2039,18 +2010,23 @@ copy_back() /* copy buffer pool dump */ - 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; + 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); } } diff --git a/extra/mariabackup/backup_copy.h b/extra/mariabackup/backup_copy.h index 858182001ce..62b2b1bc232 100644 --- a/extra/mariabackup/backup_copy.h +++ b/extra/mariabackup/backup_copy.h @@ -32,13 +32,6 @@ 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 cf46ca51b7f..05fc01305b7 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -84,6 +84,7 @@ 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; @@ -1573,68 +1574,51 @@ 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, bool write_binlogs) +write_current_binlog_file(MYSQL *connection) { - 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 log_bin_var[] = { - {"@@GLOBAL.log_bin", &log_bin}, + mysql_variable status[] = { + {"Executed_Gtid_Set", &executed_gtid_set}, {NULL, NULL} }; - mysql_variable vars[] = { - {"gtid_binlog_state", >id_binlog_state}, - {"log_bin_basename", &log_bin_dir}, + mysql_variable status_after_flush[] = { + {"File", &log_bin_file}, {NULL, NULL} }; - mysql_variable status[] = { - {"File", &filename}, - {"Position", &position}, - {"Executed_Gtid_Set", &executed_gtid_set}, + mysql_variable vars[] = { + {"gtid_binlog_state", >id_binlog_state}, + {"log_bin_basename", &log_bin_dir}, {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 (write_binlogs || gtid_exists) { + 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 (opt_log_bin != NULL && strchr(opt_log_bin, FN_LIBCHAR)) { /* If log_bin is set, it has priority */ @@ -1644,88 +1628,33 @@ write_current_binlog_file(MYSQL *connection, bool write_binlogs) log_bin_dir = strdup(opt_log_bin); } else if (log_bin_dir == NULL) { /* Default location is MySQL datadir */ - 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; + log_bin_dir = strdup("./"); } - 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 */ - while (IS_TRAILING_SLASH(log_bin_dir, log_bin_dir_length)) { - log_bin_dir_length--; + 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; } - log_bin_dir[log_bin_dir_length] = 0; - if (log_bin_dir == NULL) { - msg("Failed to locate binary log files"); + if (log_bin_dir == NULL || log_bin_file == NULL) { + msg("Failed to get master binlog coordinates from " + "SHOW MASTER STATUS"); result = false; goto cleanup; } - 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); + 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); } cleanup: - free_mysql_variables(vars); - -no_replication: + free_mysql_variables(status_after_flush); free_mysql_variables(status); - -binlog_disabled: - free_mysql_variables(log_bin_var); + free_mysql_variables(vars); return(result); } @@ -1734,11 +1663,8 @@ binlog_disabled: /*********************************************************************//** Retrieves MySQL binlog position and saves it in a file. It also prints it to stdout. */ -static bool -write_binlog_info(MYSQL *connection, char *log_bin_dir, - MYSQL_RES *mysql_result, my_ulonglong n_rows, - my_ulonglong start) +write_binlog_info(MYSQL *connection) { char *filename = NULL; char *position = NULL; @@ -1746,13 +1672,9 @@ write_binlog_info(MYSQL *connection, char *log_bin_dir, char *gtid_current_pos = NULL; char *gtid_executed = NULL; char *gtid = NULL; - char *buffer; - char *buf; - size_t total; - bool result = true; + bool result; bool mysql_gtid; bool mariadb_gtid; - bool with_gtid; mysql_variable status[] = { {"File", &filename}, @@ -1770,106 +1692,39 @@ write_binlog_info(MYSQL *connection, char *log_bin_dir, read_mysql_variables(connection, "SHOW MASTER STATUS", status, false); read_mysql_variables(connection, "SHOW VARIABLES", vars, true); - mysql_gtid = gtid_mode && (strcmp(gtid_mode, "ON") == 0); - mariadb_gtid = gtid_current_pos && *gtid_current_pos; + 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); - gtid = (gtid_executed && *gtid_executed) ? gtid_executed : gtid_current_pos; + gtid = (gtid_executed != NULL ? gtid_executed : gtid_current_pos); - with_gtid = mariadb_gtid || mysql_gtid; - if (with_gtid) { + if (mariadb_gtid || mysql_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(vars); free_mysql_variables(status); + free_mysql_variables(vars); return(result); - -buffer_overflow: - msg("Internal error: buffer overflow in the write_binlog_info()"); - result = false; - goto cleanup2; } struct escape_and_quote @@ -2197,6 +2052,7 @@ 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 5e78281e1cb..b61fa2362c6 100644 --- a/extra/mariabackup/backup_mysql.h +++ b/extra/mariabackup/backup_mysql.h @@ -28,6 +28,7 @@ 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; @@ -61,7 +62,10 @@ void unlock_all(MYSQL *connection); bool -write_current_binlog_file(MYSQL *connection, bool write_binlogs); +write_current_binlog_file(MYSQL *connection); + +bool +write_binlog_info(MYSQL *connection); bool write_xtrabackup_info(MYSQL *connection, const char * filename, bool history, diff --git a/extra/mariabackup/common.h b/extra/mariabackup/common.h index beb49524608..1973512ad82 100644 --- a/extra/mariabackup/common.h +++ b/extra/mariabackup/common.h @@ -187,14 +187,4 @@ 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 4f6e48c1ee1..2b276856303 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -238,8 +238,7 @@ 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 *buffer_pool_filename = NULL; +char* innobase_buffer_pool_filename = NULL; /* The default values for the following char* start-up parameters are determined in innobase_init below: */ @@ -348,7 +347,6 @@ 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; @@ -1049,8 +1047,7 @@ enum options_xtrabackup OPT_BACKUP_ROCKSDB, OPT_XTRA_CHECK_PRIVILEGES, OPT_XB_IGNORE_INNODB_PAGE_CORRUPTION, - OPT_INNODB_FORCE_RECOVERY, - OPT_MAX_BINLOGS + OPT_INNODB_FORCE_RECOVERY }; struct my_option xb_client_options[]= { @@ -1453,17 +1450,6 @@ 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 @@ -6222,44 +6208,6 @@ check_all_privileges() } } -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() { @@ -6324,15 +6272,11 @@ xb_init() if (!get_mysql_vars(mysql_connection)) { return(false); } - xb_init_buffer_pool(buffer_pool_filename); if (opt_check_privileges) { check_all_privileges(); } history_start_time = time(NULL); - - } else { - xb_init_buffer_pool(innobase_buffer_pool_filename); } return(true); @@ -6626,8 +6570,6 @@ 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 89f34c3f292..061057a604f 100644 --- a/extra/mariabackup/xtrabackup.h +++ b/extra/mariabackup/xtrabackup.h @@ -70,7 +70,6 @@ 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,7 +165,6 @@ 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; |