revert mariabackup part of MDEV-27524, fix the test
This commit is contained in:
parent
6a3fbfdb2d
commit
5197519f4f
@ -581,6 +581,7 @@ datafile_read(datafile_cur_t *cursor)
|
|||||||
Check to see if a file exists.
|
Check to see if a file exists.
|
||||||
Takes name of the file to check.
|
Takes name of the file to check.
|
||||||
@return true if file exists. */
|
@return true if file exists. */
|
||||||
|
static
|
||||||
bool
|
bool
|
||||||
file_exists(const char *filename)
|
file_exists(const char *filename)
|
||||||
{
|
{
|
||||||
@ -1543,14 +1544,13 @@ bool backup_start(CorruptedPages &corrupted_pages)
|
|||||||
if (!write_galera_info(mysql_connection)) {
|
if (!write_galera_info(mysql_connection)) {
|
||||||
return(false);
|
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) {
|
lock_binlog_maybe(mysql_connection);
|
||||||
if (!write_current_binlog_file(mysql_connection, with_binlogs)) {
|
write_binlog_info(mysql_connection);
|
||||||
return(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (have_flush_engine_logs && !opt_no_lock) {
|
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() */
|
/** Finish after backup_start() and backup_release() */
|
||||||
bool backup_finish()
|
bool backup_finish()
|
||||||
{
|
{
|
||||||
/* Copy buffer pool dump or LRU dump */
|
/* Copy buffer pool dump or LRU dump */
|
||||||
if (!opt_rsync) {
|
if (!opt_rsync) {
|
||||||
if (buffer_pool_filename && file_exists(buffer_pool_filename)) {
|
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);
|
copy_file(ds_data, buffer_pool_filename, dst_name, 0);
|
||||||
}
|
}
|
||||||
if (file_exists("ib_lru_dump")) {
|
if (file_exists("ib_lru_dump")) {
|
||||||
@ -1700,14 +1681,17 @@ ibx_copy_incremental_over_full()
|
|||||||
|
|
||||||
/* copy buffer pool dump */
|
/* copy buffer pool dump */
|
||||||
if (innobase_buffer_pool_filename) {
|
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",
|
snprintf(path, sizeof(path), "%s/%s",
|
||||||
xtrabackup_incremental_dir,
|
xtrabackup_incremental_dir,
|
||||||
src_name);
|
src_name);
|
||||||
|
|
||||||
if (file_exists(path)) {
|
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);
|
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)) {
|
while (datadir_iter_next(it, &node)) {
|
||||||
const char *ext_list[] = {"backup-my.cnf",
|
const char *ext_list[] = {"backup-my.cnf",
|
||||||
"xtrabackup_binary", "xtrabackup_binlog_info",
|
"xtrabackup_binary", "xtrabackup_binlog_info",
|
||||||
@ -2012,11 +1988,6 @@ copy_back()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip buffer pool dump */
|
|
||||||
if (!strcmp(filename, src_buffer_pool)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skip innodb data files */
|
/* skip innodb data files */
|
||||||
is_ibdata_file = false;
|
is_ibdata_file = false;
|
||||||
for (Tablespace::const_iterator iter(srv_sys_space.begin()),
|
for (Tablespace::const_iterator iter(srv_sys_space.begin()),
|
||||||
@ -2039,18 +2010,23 @@ copy_back()
|
|||||||
|
|
||||||
/* copy buffer pool dump */
|
/* copy buffer pool dump */
|
||||||
|
|
||||||
if (file_exists(src_buffer_pool)) {
|
if (innobase_buffer_pool_filename) {
|
||||||
char dst_dir[FN_REFLEN];
|
const char *src_name;
|
||||||
while (IS_TRAILING_SLASH(buffer_pool_filename, dir_length)) {
|
char path[FN_REFLEN];
|
||||||
dir_length--;
|
|
||||||
}
|
src_name = trim_dotslash(innobase_buffer_pool_filename);
|
||||||
memcpy(dst_dir, buffer_pool_filename, dir_length);
|
|
||||||
dst_dir[dir_length] = 0;
|
snprintf(path, sizeof(path), "%s/%s",
|
||||||
if (!(ret = copy_or_move_file(src_buffer_pool,
|
mysql_data_home,
|
||||||
src_buffer_pool,
|
src_name);
|
||||||
dst_dir, 1)))
|
|
||||||
{
|
/* could be already copied with other files
|
||||||
goto cleanup;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,13 +32,6 @@ copy_file(ds_ctxt_t *datasink,
|
|||||||
const char *dst_file_path,
|
const char *dst_file_path,
|
||||||
uint thread_n);
|
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 */
|
/** Start --backup */
|
||||||
bool backup_start(CorruptedPages &corrupted_pages);
|
bool backup_start(CorruptedPages &corrupted_pages);
|
||||||
/** Release resources after backup_start() */
|
/** Release resources after backup_start() */
|
||||||
|
@ -84,6 +84,7 @@ os_event_t kill_query_thread_stop;
|
|||||||
bool sql_thread_started = false;
|
bool sql_thread_started = false;
|
||||||
char *mysql_slave_position = NULL;
|
char *mysql_slave_position = NULL;
|
||||||
char *mysql_binlog_position = NULL;
|
char *mysql_binlog_position = NULL;
|
||||||
|
char *buffer_pool_filename = NULL;
|
||||||
|
|
||||||
/* History on server */
|
/* History on server */
|
||||||
time_t history_start_time;
|
time_t history_start_time;
|
||||||
@ -1573,29 +1574,27 @@ 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,
|
Flush and copy the current binary log file into the backup,
|
||||||
if GTID is enabled */
|
if GTID is enabled */
|
||||||
bool
|
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 *executed_gtid_set = NULL;
|
||||||
char *gtid_binlog_state = NULL;
|
char *gtid_binlog_state = NULL;
|
||||||
|
char *log_bin_file = NULL;
|
||||||
char *log_bin_dir = NULL;
|
char *log_bin_dir = NULL;
|
||||||
bool gtid_exists;
|
bool gtid_exists;
|
||||||
bool result = true;
|
bool result = true;
|
||||||
|
char filepath[FN_REFLEN];
|
||||||
|
|
||||||
mysql_variable log_bin_var[] = {
|
mysql_variable status[] = {
|
||||||
{"@@GLOBAL.log_bin", &log_bin},
|
{"Executed_Gtid_Set", &executed_gtid_set},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
mysql_variable status_after_flush[] = {
|
||||||
|
{"File", &log_bin_file},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1605,36 +1604,21 @@ write_current_binlog_file(MYSQL *connection, bool write_binlogs)
|
|||||||
{NULL, NULL}
|
{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);
|
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);
|
read_mysql_variables(connection, "SHOW VARIABLES", vars, true);
|
||||||
|
|
||||||
gtid_exists = (executed_gtid_set && *executed_gtid_set)
|
gtid_exists = (executed_gtid_set && *executed_gtid_set)
|
||||||
|| (gtid_binlog_state && *gtid_binlog_state);
|
|| (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 (opt_log_bin != NULL && strchr(opt_log_bin, FN_LIBCHAR)) {
|
||||||
/* If log_bin is set, it has priority */
|
/* 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);
|
log_bin_dir = strdup(opt_log_bin);
|
||||||
} else if (log_bin_dir == NULL) {
|
} else if (log_bin_dir == NULL) {
|
||||||
/* Default location is MySQL datadir */
|
/* Default location is MySQL datadir */
|
||||||
log_bin_dir = static_cast<char*>(malloc(3));
|
log_bin_dir = strdup("./");
|
||||||
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);
|
dirname_part(log_bin_dir, log_bin_dir, &log_bin_dir_length);
|
||||||
|
|
||||||
/* strip final slash if it is not the only path component */
|
/* strip final slash if it is not the only path component */
|
||||||
while (IS_TRAILING_SLASH(log_bin_dir, log_bin_dir_length)) {
|
if (log_bin_dir_length > 1 &&
|
||||||
log_bin_dir_length--;
|
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) {
|
if (log_bin_dir == NULL || log_bin_file == NULL) {
|
||||||
msg("Failed to locate binary log files");
|
msg("Failed to get master binlog coordinates from "
|
||||||
|
"SHOW MASTER STATUS");
|
||||||
result = false;
|
result = false;
|
||||||
goto cleanup;
|
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",
|
snprintf(filepath, sizeof(filepath), "%s%c%s",
|
||||||
log_bin_dir, FN_LIBCHAR, binlog_name);
|
log_bin_dir, FN_LIBCHAR, log_bin_file);
|
||||||
if (file_exists(filepath)) {
|
result = copy_file(ds_data, filepath, log_bin_file, 0);
|
||||||
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:
|
cleanup:
|
||||||
free_mysql_variables(vars);
|
free_mysql_variables(status_after_flush);
|
||||||
|
|
||||||
no_replication:
|
|
||||||
free_mysql_variables(status);
|
free_mysql_variables(status);
|
||||||
|
free_mysql_variables(vars);
|
||||||
binlog_disabled:
|
|
||||||
free_mysql_variables(log_bin_var);
|
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@ -1734,11 +1663,8 @@ binlog_disabled:
|
|||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
Retrieves MySQL binlog position and
|
Retrieves MySQL binlog position and
|
||||||
saves it in a file. It also prints it to stdout. */
|
saves it in a file. It also prints it to stdout. */
|
||||||
static
|
|
||||||
bool
|
bool
|
||||||
write_binlog_info(MYSQL *connection, char *log_bin_dir,
|
write_binlog_info(MYSQL *connection)
|
||||||
MYSQL_RES *mysql_result, my_ulonglong n_rows,
|
|
||||||
my_ulonglong start)
|
|
||||||
{
|
{
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
char *position = NULL;
|
char *position = NULL;
|
||||||
@ -1746,13 +1672,9 @@ write_binlog_info(MYSQL *connection, char *log_bin_dir,
|
|||||||
char *gtid_current_pos = NULL;
|
char *gtid_current_pos = NULL;
|
||||||
char *gtid_executed = NULL;
|
char *gtid_executed = NULL;
|
||||||
char *gtid = NULL;
|
char *gtid = NULL;
|
||||||
char *buffer;
|
bool result;
|
||||||
char *buf;
|
|
||||||
size_t total;
|
|
||||||
bool result = true;
|
|
||||||
bool mysql_gtid;
|
bool mysql_gtid;
|
||||||
bool mariadb_gtid;
|
bool mariadb_gtid;
|
||||||
bool with_gtid;
|
|
||||||
|
|
||||||
mysql_variable status[] = {
|
mysql_variable status[] = {
|
||||||
{"File", &filename},
|
{"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 MASTER STATUS", status, false);
|
||||||
read_mysql_variables(connection, "SHOW VARIABLES", vars, true);
|
read_mysql_variables(connection, "SHOW VARIABLES", vars, true);
|
||||||
|
|
||||||
mysql_gtid = gtid_mode && (strcmp(gtid_mode, "ON") == 0);
|
if (filename == NULL || position == NULL) {
|
||||||
mariadb_gtid = gtid_current_pos && *gtid_current_pos;
|
/* Do not create xtrabackup_binlog_info if binary
|
||||||
|
log is disabled */
|
||||||
|
result = true;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
gtid = (gtid_executed && *gtid_executed) ? gtid_executed : gtid_current_pos;
|
mysql_gtid = ((gtid_mode != NULL) && (strcmp(gtid_mode, "ON") == 0));
|
||||||
|
mariadb_gtid = (gtid_current_pos != NULL);
|
||||||
|
|
||||||
with_gtid = mariadb_gtid || mysql_gtid;
|
gtid = (gtid_executed != NULL ? gtid_executed : gtid_current_pos);
|
||||||
if (with_gtid) {
|
|
||||||
|
if (mariadb_gtid || mysql_gtid) {
|
||||||
ut_a(asprintf(&mysql_binlog_position,
|
ut_a(asprintf(&mysql_binlog_position,
|
||||||
"filename '%s', position '%s', "
|
"filename '%s', position '%s', "
|
||||||
"GTID of the last change '%s'",
|
"GTID of the last change '%s'",
|
||||||
filename, position, gtid) != -1);
|
filename, position, gtid) != -1);
|
||||||
|
result = backup_file_printf(XTRABACKUP_BINLOG_INFO,
|
||||||
|
"%s\t%s\t%s\n", filename, position,
|
||||||
|
gtid);
|
||||||
} else {
|
} else {
|
||||||
ut_a(asprintf(&mysql_binlog_position,
|
ut_a(asprintf(&mysql_binlog_position,
|
||||||
"filename '%s', position '%s'",
|
"filename '%s', position '%s'",
|
||||||
filename, position) != -1);
|
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:
|
cleanup:
|
||||||
free_mysql_variables(vars);
|
|
||||||
free_mysql_variables(status);
|
free_mysql_variables(status);
|
||||||
|
free_mysql_variables(vars);
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
|
|
||||||
buffer_overflow:
|
|
||||||
msg("Internal error: buffer overflow in the write_binlog_info()");
|
|
||||||
result = false;
|
|
||||||
goto cleanup2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct escape_and_quote
|
struct escape_and_quote
|
||||||
@ -2197,6 +2052,7 @@ backup_cleanup()
|
|||||||
{
|
{
|
||||||
free(mysql_slave_position);
|
free(mysql_slave_position);
|
||||||
free(mysql_binlog_position);
|
free(mysql_binlog_position);
|
||||||
|
free(buffer_pool_filename);
|
||||||
|
|
||||||
if (mysql_connection) {
|
if (mysql_connection) {
|
||||||
mysql_close(mysql_connection);
|
mysql_close(mysql_connection);
|
||||||
|
@ -28,6 +28,7 @@ extern time_t history_lock_time;
|
|||||||
extern bool sql_thread_started;
|
extern bool sql_thread_started;
|
||||||
extern char *mysql_slave_position;
|
extern char *mysql_slave_position;
|
||||||
extern char *mysql_binlog_position;
|
extern char *mysql_binlog_position;
|
||||||
|
extern char *buffer_pool_filename;
|
||||||
|
|
||||||
/** connection to mysql server */
|
/** connection to mysql server */
|
||||||
extern MYSQL *mysql_connection;
|
extern MYSQL *mysql_connection;
|
||||||
@ -61,7 +62,10 @@ void
|
|||||||
unlock_all(MYSQL *connection);
|
unlock_all(MYSQL *connection);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
write_current_binlog_file(MYSQL *connection, bool write_binlogs);
|
write_current_binlog_file(MYSQL *connection);
|
||||||
|
|
||||||
|
bool
|
||||||
|
write_binlog_info(MYSQL *connection);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
write_xtrabackup_info(MYSQL *connection, const char * filename, bool history,
|
write_xtrabackup_info(MYSQL *connection, const char * filename, bool history,
|
||||||
|
@ -187,14 +187,4 @@ xb_read_full(File fd, uchar *buf, size_t len)
|
|||||||
return tlen;
|
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
|
#endif
|
||||||
|
@ -238,8 +238,7 @@ long innobase_read_io_threads = 4;
|
|||||||
long innobase_write_io_threads = 4;
|
long innobase_write_io_threads = 4;
|
||||||
|
|
||||||
longlong innobase_page_size = (1LL << 14); /* 16KB */
|
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
|
/* The default values for the following char* start-up parameters
|
||||||
are determined in innobase_init below: */
|
are determined in innobase_init below: */
|
||||||
@ -348,7 +347,6 @@ uint opt_lock_wait_timeout = 0;
|
|||||||
uint opt_lock_wait_threshold = 0;
|
uint opt_lock_wait_threshold = 0;
|
||||||
uint opt_debug_sleep_before_unlock = 0;
|
uint opt_debug_sleep_before_unlock = 0;
|
||||||
uint opt_safe_slave_backup_timeout = 0;
|
uint opt_safe_slave_backup_timeout = 0;
|
||||||
uint opt_max_binlogs = UINT_MAX;
|
|
||||||
|
|
||||||
const char *opt_history = NULL;
|
const char *opt_history = NULL;
|
||||||
|
|
||||||
@ -1049,8 +1047,7 @@ enum options_xtrabackup
|
|||||||
OPT_BACKUP_ROCKSDB,
|
OPT_BACKUP_ROCKSDB,
|
||||||
OPT_XTRA_CHECK_PRIVILEGES,
|
OPT_XTRA_CHECK_PRIVILEGES,
|
||||||
OPT_XB_IGNORE_INNODB_PAGE_CORRUPTION,
|
OPT_XB_IGNORE_INNODB_PAGE_CORRUPTION,
|
||||||
OPT_INNODB_FORCE_RECOVERY,
|
OPT_INNODB_FORCE_RECOVERY
|
||||||
OPT_MAX_BINLOGS
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct my_option xb_client_options[]= {
|
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,
|
&opt_log_innodb_page_corruption, &opt_log_innodb_page_corruption, 0,
|
||||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 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
|
#define MYSQL_CLIENT
|
||||||
#include "sslopt-longopts.h"
|
#include "sslopt-longopts.h"
|
||||||
#undef MYSQL_CLIENT
|
#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
|
bool
|
||||||
xb_init()
|
xb_init()
|
||||||
{
|
{
|
||||||
@ -6324,15 +6272,11 @@ xb_init()
|
|||||||
if (!get_mysql_vars(mysql_connection)) {
|
if (!get_mysql_vars(mysql_connection)) {
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
xb_init_buffer_pool(buffer_pool_filename);
|
|
||||||
|
|
||||||
if (opt_check_privileges) {
|
if (opt_check_privileges) {
|
||||||
check_all_privileges();
|
check_all_privileges();
|
||||||
}
|
}
|
||||||
history_start_time = time(NULL);
|
history_start_time = time(NULL);
|
||||||
|
|
||||||
} else {
|
|
||||||
xb_init_buffer_pool(innobase_buffer_pool_filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
@ -6626,8 +6570,6 @@ int main(int argc, char **argv)
|
|||||||
free_error_messages();
|
free_error_messages();
|
||||||
mysql_mutex_destroy(&LOCK_error_log);
|
mysql_mutex_destroy(&LOCK_error_log);
|
||||||
|
|
||||||
free(buffer_pool_filename);
|
|
||||||
|
|
||||||
if (status == EXIT_SUCCESS) {
|
if (status == EXIT_SUCCESS) {
|
||||||
msg("completed OK!");
|
msg("completed OK!");
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,6 @@ extern char *xtrabackup_incremental_dir;
|
|||||||
extern char *xtrabackup_incremental_basedir;
|
extern char *xtrabackup_incremental_basedir;
|
||||||
extern char *innobase_data_home_dir;
|
extern char *innobase_data_home_dir;
|
||||||
extern char *innobase_buffer_pool_filename;
|
extern char *innobase_buffer_pool_filename;
|
||||||
extern char *buffer_pool_filename;
|
|
||||||
extern char *xb_plugin_dir;
|
extern char *xb_plugin_dir;
|
||||||
extern char *xb_rocksdb_datadir;
|
extern char *xb_rocksdb_datadir;
|
||||||
extern my_bool xb_backup_rocksdb;
|
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_lock_wait_threshold;
|
||||||
extern uint opt_debug_sleep_before_unlock;
|
extern uint opt_debug_sleep_before_unlock;
|
||||||
extern uint opt_safe_slave_backup_timeout;
|
extern uint opt_safe_slave_backup_timeout;
|
||||||
extern uint opt_max_binlogs;
|
|
||||||
|
|
||||||
extern const char *opt_history;
|
extern const char *opt_history;
|
||||||
|
|
||||||
|
@ -53,28 +53,7 @@ COUNT(*) = 2
|
|||||||
1
|
1
|
||||||
include/show_binlog_events.inc
|
include/show_binlog_events.inc
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
hostname1-bin.000001 # Gtid # # GTID #-#-#
|
hostname1-bin.000002 # Binlog_checkpoint # # hostname1-bin.000002
|
||||||
hostname1-bin.000001 # Query # # use `test`; CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB
|
|
||||||
hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
||||||
hostname1-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (1)
|
|
||||||
hostname1-bin.000001 # Table_map # # table_id: # (test.t1)
|
|
||||||
hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
||||||
hostname1-bin.000001 # Xid # # COMMIT /* XID */
|
|
||||||
hostname1-bin.000001 # Gtid # # GTID #-#-#
|
|
||||||
hostname1-bin.000001 # Query # # use `test`; CREATE TABLE t2 (id INT) ENGINE=InnoDB
|
|
||||||
hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
||||||
hostname1-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1)
|
|
||||||
hostname1-bin.000001 # Table_map # # table_id: # (test.t2)
|
|
||||||
hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
||||||
hostname1-bin.000001 # Xid # # COMMIT /* XID */
|
|
||||||
hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
||||||
hostname1-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1)
|
|
||||||
hostname1-bin.000001 # Table_map # # table_id: # (test.t2)
|
|
||||||
hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
|
||||||
hostname1-bin.000001 # Xid # # COMMIT /* XID */
|
|
||||||
hostname1-bin.000001 # Gtid # # GTID #-#-#
|
|
||||||
hostname1-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN f2 INTEGER
|
|
||||||
hostname1-bin.000001 # Rotate # # hostname1-bin.000002;pos=4
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
#cleanup
|
#cleanup
|
||||||
|
@ -30,7 +30,6 @@ ALTER TABLE t1 ADD COLUMN f2 INTEGER;
|
|||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
||||||
--let $MASTER_MYPORT=$NODE_MYPORT_2
|
|
||||||
--source include/show_binlog_events.inc
|
--source include/show_binlog_events.inc
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -70,7 +70,6 @@ let $restart_noprint=2;
|
|||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
||||||
--let $MASTER_MYPORT=$NODE_MYPORT_2
|
|
||||||
--source include/show_binlog_events.inc
|
--source include/show_binlog_events.inc
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user