summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-02-25 10:43:38 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2022-02-25 10:43:38 +0200
commit00b70bbb51b9f2a3646c1ceedc6a27eeb1bdd6ac (patch)
tree69d6515f2f36a7774e4b8b06c2173dffa0ec6e6d /extra
parent7ab3db142bffa733587f6788c13b7d057a1bc13e (diff)
parenta3da3c8a0b1113d941f837cce0615673b95fb9f2 (diff)
downloadmariadb-git-00b70bbb51b9f2a3646c1ceedc6a27eeb1bdd6ac.tar.gz
Merge 10.2 into 10.3
Diffstat (limited to 'extra')
-rw-r--r--extra/mariabackup/backup_copy.cc84
-rw-r--r--extra/mariabackup/backup_copy.h7
-rw-r--r--extra/mariabackup/backup_mysql.cc248
-rw-r--r--extra/mariabackup/backup_mysql.h6
-rw-r--r--extra/mariabackup/common.h10
-rw-r--r--extra/mariabackup/xtrabackup.cc80
-rw-r--r--extra/mariabackup/xtrabackup.h2
7 files changed, 339 insertions, 98 deletions
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc
index be41bffa744..c21f85d48b2 100644
--- a/extra/mariabackup/backup_copy.cc
+++ b/extra/mariabackup/backup_copy.cc
@@ -581,7 +581,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)
{
@@ -1544,13 +1543,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) {
@@ -1584,15 +1584,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")) {
@@ -1681,17 +1700,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);
}
}
@@ -1926,6 +1942,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",
@@ -1988,6 +2012,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()),
@@ -2010,23 +2039,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 5a2b2625c26..e721970f95e 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;
@@ -1334,27 +1333,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}
};
@@ -1364,21 +1365,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 */
@@ -1388,34 +1404,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);
}
@@ -1423,8 +1494,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;
@@ -1432,9 +1506,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},
@@ -1452,39 +1530,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
@@ -1812,7 +1957,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 8e2526d826e..70542a35514 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -238,7 +238,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: */
@@ -347,6 +348,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;
@@ -1047,7 +1049,8 @@ enum options_xtrabackup
OPT_BACKUP_ROCKSDB,
OPT_XTRA_CHECK_PRIVILEGES,
OPT_XB_IGNORE_INNODB_PAGE_CORRUPTION,
- OPT_INNODB_FORCE_RECOVERY
+ OPT_INNODB_FORCE_RECOVERY,
+ OPT_MAX_BINLOGS
};
struct my_option xb_client_options[]= {
@@ -1450,6 +1453,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
@@ -1499,14 +1513,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
@@ -1628,10 +1642,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",
@@ -1653,12 +1667,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 },
@@ -6208,6 +6222,44 @@ 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()
{
@@ -6272,11 +6324,15 @@ 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);
@@ -6570,6 +6626,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 061057a604f..89f34c3f292 100644
--- a/extra/mariabackup/xtrabackup.h
+++ b/extra/mariabackup/xtrabackup.h
@@ -70,6 +70,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;
@@ -165,6 +166,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;