mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#11745230
Automerged approved bzr bundle into latest mysql-5.5.
This commit is contained in:
@ -48,6 +48,11 @@
|
|||||||
# must be provided both for begin_include_file.inc and
|
# must be provided both for begin_include_file.inc and
|
||||||
# end_include_file.inc.
|
# end_include_file.inc.
|
||||||
#
|
#
|
||||||
|
# $keep_include_silent
|
||||||
|
# This specifies whether it should be echoed to the result file
|
||||||
|
# the following string: include/$include_filename
|
||||||
|
# If not set, the string will be echoed.
|
||||||
|
#
|
||||||
# $rpl_debug
|
# $rpl_debug
|
||||||
# If set, this script will print the following text:
|
# If set, this script will print the following text:
|
||||||
# ==== BEGIN include/$include_filename.inc ====
|
# ==== BEGIN include/$include_filename.inc ====
|
||||||
@ -59,7 +64,10 @@
|
|||||||
# recursively.
|
# recursively.
|
||||||
if (!$_include_file_depth)
|
if (!$_include_file_depth)
|
||||||
{
|
{
|
||||||
--echo include/$include_filename
|
if (!$keep_include_silent)
|
||||||
|
{
|
||||||
|
--echo include/$include_filename
|
||||||
|
}
|
||||||
--let $_include_file_depth= 0
|
--let $_include_file_depth= 0
|
||||||
}
|
}
|
||||||
--inc $_include_file_depth
|
--inc $_include_file_depth
|
||||||
|
35
mysql-test/suite/rpl/r/rpl_binlog_index.result
Normal file
35
mysql-test/suite/rpl/r/rpl_binlog_index.result
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
FLUSH BINARY LOGS;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
# Shutdown master
|
||||||
|
include/rpl_stop_server.inc [server_number=1]
|
||||||
|
# Move the master binlog files and the index file to a new place
|
||||||
|
# Restart master with log-bin option set to the new path
|
||||||
|
# Master has restarted successfully
|
||||||
|
# Create the master-bin.index file with the old format
|
||||||
|
# Shutdown master
|
||||||
|
include/rpl_stop_server.inc [server_number=1]
|
||||||
|
# Move back the master binlog files
|
||||||
|
# Remove the unneeded master-bin.index file
|
||||||
|
# Restart master with log-bin option set to default
|
||||||
|
# Master has restarted successfully
|
||||||
|
include/stop_slave.inc
|
||||||
|
# Move the slave binlog and relay log files and index to the new place
|
||||||
|
# Shutdown slave
|
||||||
|
include/rpl_stop_server.inc [server_number=2]
|
||||||
|
# Restart slave with options log-bin, relay-log set to the new paths
|
||||||
|
# Slave has restarted successfully
|
||||||
|
include/start_slave.inc
|
||||||
|
include/stop_slave.inc
|
||||||
|
FLUSH LOGS;
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
FLUSH LOGS;
|
||||||
|
FLUSH LOGS;
|
||||||
|
include/start_slave.inc
|
||||||
|
include/diff_tables.inc [master:t1,slave:t1]
|
||||||
|
DROP TABLE t1;
|
160
mysql-test/suite/rpl/t/rpl_binlog_index.test
Normal file
160
mysql-test/suite/rpl/t/rpl_binlog_index.test
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
# ==== Purpose ====
|
||||||
|
#
|
||||||
|
# Test that server can work fine after moving binlog or relay log
|
||||||
|
# files to another directory and setting binlog or relay log paths to
|
||||||
|
# the new path.
|
||||||
|
#
|
||||||
|
# ==== Method ====
|
||||||
|
#
|
||||||
|
# Start replication, and then shutdown the master, move the binary
|
||||||
|
# logs and the log index file to a another directory and then restart
|
||||||
|
# the server with option to set the new binlog directory. After master
|
||||||
|
# restarted successfully, do the similar on slave to check the relay
|
||||||
|
# log of slave.
|
||||||
|
#
|
||||||
|
# ==== Reference ====
|
||||||
|
#
|
||||||
|
# BUG#12133 master.index file keeps mysqld from starting if bin log has been moved
|
||||||
|
# BUG#42576 Relay logs in relay-log.info&localhost-relay-bin.index not processed after move
|
||||||
|
|
||||||
|
source include/master-slave.inc;
|
||||||
|
# There is no need to run this test case on all binlog format
|
||||||
|
source include/have_binlog_format_row.inc;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
--let $master_datadir= `select @@datadir`
|
||||||
|
connection slave;
|
||||||
|
--let $slave_datadir= `select @@datadir`
|
||||||
|
connection master;
|
||||||
|
--let $tmpdir= $MYSQLTEST_VARDIR/tmp/rpl_binlog_index
|
||||||
|
--mkdir $tmpdir
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
# flush to generate one more binlog file.
|
||||||
|
FLUSH BINARY LOGS;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test on master
|
||||||
|
#
|
||||||
|
connection master;
|
||||||
|
--echo # Shutdown master
|
||||||
|
--let $rpl_server_number=1
|
||||||
|
source include/rpl_stop_server.inc;
|
||||||
|
|
||||||
|
--echo # Move the master binlog files and the index file to a new place
|
||||||
|
--move_file $master_datadir/master-bin.000001 $tmpdir/master-bin.000001
|
||||||
|
--move_file $master_datadir/master-bin.000002 $tmpdir/master-bin.000002
|
||||||
|
--move_file $master_datadir/master-bin.index $tmpdir/master-bin.index
|
||||||
|
|
||||||
|
--echo # Restart master with log-bin option set to the new path
|
||||||
|
--let $rpl_server_parameters=--log-bin=$tmpdir/master-bin
|
||||||
|
--let $keep_include_silent=1
|
||||||
|
source include/rpl_start_server.inc;
|
||||||
|
--let $keep_include_silent=0
|
||||||
|
|
||||||
|
--echo # Master has restarted successfully
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test master can handle old format with directory path in index file
|
||||||
|
#
|
||||||
|
--let $is_windows= `select convert(@@version_compile_os using latin1) in ('Win32', 'Win64', 'Windows')`
|
||||||
|
|
||||||
|
# write_var_to_file.inc will call SELECT INTO DUMPFILE, which has to be
|
||||||
|
# done before shutdown the server
|
||||||
|
--echo # Create the master-bin.index file with the old format
|
||||||
|
--let $write_to_file= $master_datadir/master-bin.index
|
||||||
|
if ($is_windows)
|
||||||
|
{
|
||||||
|
--let $write_var= .\\master-bin.000001\n.\\master-bin.000002\n
|
||||||
|
}
|
||||||
|
if (!$is_windows)
|
||||||
|
{
|
||||||
|
--let $write_var= ./master-bin.000001\n./master-bin.000002\n
|
||||||
|
}
|
||||||
|
--disable_query_log
|
||||||
|
source include/write_var_to_file.inc;
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
|
--echo # Shutdown master
|
||||||
|
--let $rpl_server_number=1
|
||||||
|
source include/rpl_stop_server.inc;
|
||||||
|
|
||||||
|
--echo # Move back the master binlog files
|
||||||
|
--move_file $tmpdir/master-bin.000001 $master_datadir/master-bin.000001
|
||||||
|
--move_file $tmpdir/master-bin.000002 $master_datadir/master-bin.000002
|
||||||
|
|
||||||
|
--echo # Remove the unneeded master-bin.index file
|
||||||
|
--remove_file $tmpdir/master-bin.index
|
||||||
|
|
||||||
|
--echo # Restart master with log-bin option set to default
|
||||||
|
--let $rpl_server_parameters=--log-bin=$master_datadir/master-bin
|
||||||
|
--let $keep_include_silent=1
|
||||||
|
source include/rpl_start_server.inc;
|
||||||
|
--let $keep_include_silent=0
|
||||||
|
|
||||||
|
--echo # Master has restarted successfully
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
source include/stop_slave.inc;
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
# slave-relay-bin.* files can vary, so read the slave-relay-bin.index
|
||||||
|
# to figure out the slave-relay-bin.* files
|
||||||
|
CREATE TEMPORARY TABLE tmp (id INT AUTO_INCREMENT PRIMARY KEY, filename VARCHAR(1024));
|
||||||
|
# chmod to allow the following LOAD DATA
|
||||||
|
--chmod 0666 $slave_datadir/slave-relay-bin.index
|
||||||
|
--eval LOAD DATA INFILE '$slave_datadir/slave-relay-bin.index' INTO TABLE tmp (filename)
|
||||||
|
--let $count= `SELECT count(*) FROM tmp`
|
||||||
|
--echo # Move the slave binlog and relay log files and index to the new place
|
||||||
|
--move_file $slave_datadir/slave-bin.index $tmpdir/slave-bin.index
|
||||||
|
--move_file $slave_datadir/slave-bin.000001 $tmpdir/slave-bin.000001
|
||||||
|
--move_file $slave_datadir/slave-relay-bin.index $tmpdir/slave-relay-bin.index
|
||||||
|
while ($count)
|
||||||
|
{
|
||||||
|
--let $filename= `select filename from tmp where id=$count`
|
||||||
|
--move_file $slave_datadir/$filename $tmpdir/$filename
|
||||||
|
--dec $count
|
||||||
|
}
|
||||||
|
DROP TEMPORARY TABLE tmp;
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
|
--echo # Shutdown slave
|
||||||
|
--let $rpl_server_number=2
|
||||||
|
source include/rpl_stop_server.inc;
|
||||||
|
|
||||||
|
--echo # Restart slave with options log-bin, relay-log set to the new paths
|
||||||
|
--let $rpl_server_parameters=--log-bin=$tmpdir/slave-bin --relay-log=$tmpdir/slave-relay-bin
|
||||||
|
--let $keep_include_silent=1
|
||||||
|
source include/rpl_start_server.inc;
|
||||||
|
--let $keep_include_silent=0
|
||||||
|
|
||||||
|
--echo # Slave has restarted successfully
|
||||||
|
source include/start_slave.inc;
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
FLUSH LOGS;
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
|
||||||
|
FLUSH LOGS;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
FLUSH LOGS;
|
||||||
|
--source include/start_slave.inc
|
||||||
|
connection master;
|
||||||
|
sync_slave_with_master;
|
||||||
|
--let $diff_tables= master:t1,slave:t1
|
||||||
|
source include/diff_tables.inc;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
DROP TABLE t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
--remove_files_wildcard $tmpdir *
|
||||||
|
--rmdir $tmpdir
|
56
sql/log.cc
56
sql/log.cc
@ -3242,10 +3242,11 @@ int MYSQL_BIN_LOG::find_log_pos(LOG_INFO *linfo, const char *log_name,
|
|||||||
bool need_lock)
|
bool need_lock)
|
||||||
{
|
{
|
||||||
int error= 0;
|
int error= 0;
|
||||||
char *fname= linfo->log_file_name;
|
char *full_fname= linfo->log_file_name;
|
||||||
uint log_name_len= log_name ? (uint) strlen(log_name) : 0;
|
char full_log_name[FN_REFLEN], fname[FN_REFLEN];
|
||||||
|
uint log_name_len= 0, fname_len= 0;
|
||||||
DBUG_ENTER("find_log_pos");
|
DBUG_ENTER("find_log_pos");
|
||||||
DBUG_PRINT("enter",("log_name: %s", log_name ? log_name : "NULL"));
|
full_log_name[0]= full_fname[0]= 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Mutex needed because we need to make sure the file pointer does not
|
Mutex needed because we need to make sure the file pointer does not
|
||||||
@ -3255,6 +3256,20 @@ int MYSQL_BIN_LOG::find_log_pos(LOG_INFO *linfo, const char *log_name,
|
|||||||
mysql_mutex_lock(&LOCK_index);
|
mysql_mutex_lock(&LOCK_index);
|
||||||
mysql_mutex_assert_owner(&LOCK_index);
|
mysql_mutex_assert_owner(&LOCK_index);
|
||||||
|
|
||||||
|
// extend relative paths for log_name to be searched
|
||||||
|
if (log_name)
|
||||||
|
{
|
||||||
|
if(normalize_binlog_name(full_log_name, log_name, is_relay_log))
|
||||||
|
{
|
||||||
|
error= LOG_INFO_EOF;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_name_len= log_name ? (uint) strlen(full_log_name) : 0;
|
||||||
|
DBUG_PRINT("enter", ("log_name: %s, full_log_name: %s",
|
||||||
|
log_name ? log_name : "NULL", full_log_name));
|
||||||
|
|
||||||
/* As the file is flushed, we can't get an error here */
|
/* As the file is flushed, we can't get an error here */
|
||||||
(void) reinit_io_cache(&index_file, READ_CACHE, (my_off_t) 0, 0, 0);
|
(void) reinit_io_cache(&index_file, READ_CACHE, (my_off_t) 0, 0, 0);
|
||||||
|
|
||||||
@ -3273,19 +3288,28 @@ int MYSQL_BIN_LOG::find_log_pos(LOG_INFO *linfo, const char *log_name,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extend relative paths and match against full path
|
||||||
|
if (normalize_binlog_name(full_fname, fname, is_relay_log))
|
||||||
|
{
|
||||||
|
error= LOG_INFO_EOF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fname_len= (uint) strlen(full_fname);
|
||||||
|
|
||||||
// if the log entry matches, null string matching anything
|
// if the log entry matches, null string matching anything
|
||||||
if (!log_name ||
|
if (!log_name ||
|
||||||
(log_name_len == length-1 && fname[log_name_len] == '\n' &&
|
(log_name_len == fname_len-1 && full_fname[log_name_len] == '\n' &&
|
||||||
!memcmp(fname, log_name, log_name_len)))
|
!memcmp(full_fname, full_log_name, log_name_len)))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info",("Found log file entry"));
|
DBUG_PRINT("info", ("Found log file entry"));
|
||||||
fname[length-1]=0; // remove last \n
|
full_fname[fname_len-1]= 0; // remove last \n
|
||||||
linfo->index_file_start_offset= offset;
|
linfo->index_file_start_offset= offset;
|
||||||
linfo->index_file_offset = my_b_tell(&index_file);
|
linfo->index_file_offset = my_b_tell(&index_file);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
if (need_lock)
|
if (need_lock)
|
||||||
mysql_mutex_unlock(&LOCK_index);
|
mysql_mutex_unlock(&LOCK_index);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
@ -3320,7 +3344,8 @@ int MYSQL_BIN_LOG::find_next_log(LOG_INFO* linfo, bool need_lock)
|
|||||||
{
|
{
|
||||||
int error= 0;
|
int error= 0;
|
||||||
uint length;
|
uint length;
|
||||||
char *fname= linfo->log_file_name;
|
char fname[FN_REFLEN];
|
||||||
|
char *full_fname= linfo->log_file_name;
|
||||||
|
|
||||||
if (need_lock)
|
if (need_lock)
|
||||||
mysql_mutex_lock(&LOCK_index);
|
mysql_mutex_lock(&LOCK_index);
|
||||||
@ -3336,8 +3361,19 @@ int MYSQL_BIN_LOG::find_next_log(LOG_INFO* linfo, bool need_lock)
|
|||||||
error = !index_file.error ? LOG_INFO_EOF : LOG_INFO_IO;
|
error = !index_file.error ? LOG_INFO_EOF : LOG_INFO_IO;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
fname[length-1]=0; // kill \n
|
|
||||||
linfo->index_file_offset = my_b_tell(&index_file);
|
if (fname[0] != 0)
|
||||||
|
{
|
||||||
|
if(normalize_binlog_name(full_fname, fname, is_relay_log))
|
||||||
|
{
|
||||||
|
error= LOG_INFO_EOF;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
length= strlen(full_fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
full_fname[length-1]= 0; // kill \n
|
||||||
|
linfo->index_file_offset= my_b_tell(&index_file);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (need_lock)
|
if (need_lock)
|
||||||
|
62
sql/log.h
62
sql/log.h
@ -715,4 +715,66 @@ char *make_log_name(char *buff, const char *name, const char* log_ext);
|
|||||||
extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
|
extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
|
||||||
extern LOGGER logger;
|
extern LOGGER logger;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Turns a relative log binary log path into a full path, based on the
|
||||||
|
opt_bin_logname or opt_relay_logname.
|
||||||
|
|
||||||
|
@param from The log name we want to make into an absolute path.
|
||||||
|
@param to The buffer where to put the results of the
|
||||||
|
normalization.
|
||||||
|
@param is_relay_log Switch that makes is used inside to choose which
|
||||||
|
option (opt_bin_logname or opt_relay_logname) to
|
||||||
|
use when calculating the base path.
|
||||||
|
|
||||||
|
@returns true if a problem occurs, false otherwise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
inline bool normalize_binlog_name(char *to, const char *from, bool is_relay_log)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("normalize_binlog_name");
|
||||||
|
bool error= false;
|
||||||
|
char buff[FN_REFLEN];
|
||||||
|
char *ptr= (char*) from;
|
||||||
|
char *opt_name= is_relay_log ? opt_relay_logname : opt_bin_logname;
|
||||||
|
|
||||||
|
DBUG_ASSERT(from);
|
||||||
|
|
||||||
|
/* opt_name is not null and not empty and from is a relative path */
|
||||||
|
if (opt_name && opt_name[0] && from && !test_if_hard_path(from))
|
||||||
|
{
|
||||||
|
// take the path from opt_name
|
||||||
|
// take the filename from from
|
||||||
|
char log_dirpart[FN_REFLEN], log_dirname[FN_REFLEN];
|
||||||
|
size_t log_dirpart_len, log_dirname_len;
|
||||||
|
dirname_part(log_dirpart, opt_name, &log_dirpart_len);
|
||||||
|
dirname_part(log_dirname, from, &log_dirname_len);
|
||||||
|
|
||||||
|
/* log may be empty => relay-log or log-bin did not
|
||||||
|
hold paths, just filename pattern */
|
||||||
|
if (log_dirpart_len > 0)
|
||||||
|
{
|
||||||
|
/* create the new path name */
|
||||||
|
if(fn_format(buff, from+log_dirname_len, log_dirpart, "",
|
||||||
|
MYF(MY_UNPACK_FILENAME | MY_SAFE_PATH)) == NULL)
|
||||||
|
{
|
||||||
|
error= true;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr= buff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DBUG_ASSERT(ptr);
|
||||||
|
|
||||||
|
if (ptr)
|
||||||
|
strmake(to, ptr, strlen(ptr));
|
||||||
|
|
||||||
|
end:
|
||||||
|
DBUG_RETURN(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* LOG_H */
|
#endif /* LOG_H */
|
||||||
|
@ -652,7 +652,7 @@ ulong master_retry_count=0;
|
|||||||
char *master_info_file;
|
char *master_info_file;
|
||||||
char *relay_log_info_file, *report_user, *report_password, *report_host;
|
char *relay_log_info_file, *report_user, *report_password, *report_host;
|
||||||
char *opt_relay_logname = 0, *opt_relaylog_index_name=0;
|
char *opt_relay_logname = 0, *opt_relaylog_index_name=0;
|
||||||
char *opt_logname, *opt_slow_logname;
|
char *opt_logname, *opt_slow_logname, *opt_bin_logname;
|
||||||
|
|
||||||
/* Static variables */
|
/* Static variables */
|
||||||
|
|
||||||
@ -677,7 +677,6 @@ static char **defaults_argv;
|
|||||||
static int remaining_argc;
|
static int remaining_argc;
|
||||||
/** Remaining command line arguments (arguments), filtered by handle_options().*/
|
/** Remaining command line arguments (arguments), filtered by handle_options().*/
|
||||||
static char **remaining_argv;
|
static char **remaining_argv;
|
||||||
static char *opt_bin_logname;
|
|
||||||
|
|
||||||
int orig_argc;
|
int orig_argc;
|
||||||
char **orig_argv;
|
char **orig_argv;
|
||||||
|
@ -139,7 +139,8 @@ extern my_bool relay_log_recovery;
|
|||||||
extern uint test_flags,select_errors,ha_open_options;
|
extern uint test_flags,select_errors,ha_open_options;
|
||||||
extern uint protocol_version, mysqld_port, dropping_tables;
|
extern uint protocol_version, mysqld_port, dropping_tables;
|
||||||
extern ulong delay_key_write_options;
|
extern ulong delay_key_write_options;
|
||||||
extern char *opt_logname, *opt_slow_logname;
|
extern char *opt_logname, *opt_slow_logname, *opt_bin_logname,
|
||||||
|
*opt_relay_logname;
|
||||||
extern char *opt_backup_history_logname, *opt_backup_progress_logname,
|
extern char *opt_backup_history_logname, *opt_backup_progress_logname,
|
||||||
*opt_backup_settings_name;
|
*opt_backup_settings_name;
|
||||||
extern const char *log_output_str;
|
extern const char *log_output_str;
|
||||||
|
Reference in New Issue
Block a user