mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
WL#912 (more user control on relay logs):
FLUSH LOGS now rotates relay logs, and a new variable max_relay_log_size. Plus a very small bit of code cleaning.
This commit is contained in:
@ -511,17 +511,17 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
|
|||||||
/* Setup log files */
|
/* Setup log files */
|
||||||
if (opt_log)
|
if (opt_log)
|
||||||
open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS,
|
open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS,
|
||||||
LOG_NORMAL);
|
LOG_NORMAL, 0, 0, 0);
|
||||||
if (opt_update_log)
|
if (opt_update_log)
|
||||||
{
|
{
|
||||||
open_log(&mysql_update_log, glob_hostname, opt_update_logname, "",
|
open_log(&mysql_update_log, glob_hostname, opt_update_logname, "",
|
||||||
NullS, LOG_NEW);
|
NullS, LOG_NEW, 0, 0, 0);
|
||||||
using_update_log=1;
|
using_update_log=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_slow_log)
|
if (opt_slow_log)
|
||||||
open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log",
|
open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log",
|
||||||
NullS, LOG_NORMAL);
|
NullS, LOG_NORMAL, 0, 0, 0);
|
||||||
if (ha_init())
|
if (ha_init())
|
||||||
{
|
{
|
||||||
sql_print_error("Can't init databases");
|
sql_print_error("Can't init databases");
|
||||||
@ -586,7 +586,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
|
|||||||
opt_bin_logname=my_strdup(tmp,MYF(MY_WME));
|
opt_bin_logname=my_strdup(tmp,MYF(MY_WME));
|
||||||
}
|
}
|
||||||
open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin",
|
open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin",
|
||||||
opt_binlog_index_name, LOG_BIN);
|
opt_binlog_index_name, LOG_BIN, 0, 0, max_binlog_size);
|
||||||
using_update_log=1;
|
using_update_log=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,4 +14,4 @@ slave start;
|
|||||||
flush logs;
|
flush logs;
|
||||||
show slave status;
|
show slave status;
|
||||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
127.0.0.1 root SLAVE_PORT 60 slave-bin.001 79 relay-log.001 119 slave-bin.001 Yes Yes 0 0 79 119
|
127.0.0.1 root SLAVE_PORT 60 slave-bin.001 79 relay-log.002 119 slave-bin.001 Yes Yes 0 0 79 119
|
||||||
|
@ -93,6 +93,6 @@ slave-bin.002 62 Query 1 168 use test; insert into t1 values (1)
|
|||||||
slave-bin.002 122 Query 1 228 use test; drop table t1
|
slave-bin.002 122 Query 1 228 use test; drop table t1
|
||||||
show slave status;
|
show slave status;
|
||||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
127.0.0.1 root MASTER_PORT 1 master-bin.002 276 slave-relay-bin.002 1563 master-bin.002 Yes Yes 0 0 276 1563
|
127.0.0.1 root MASTER_PORT 1 master-bin.002 276 slave-relay-bin.003 211 master-bin.002 Yes Yes 0 0 276 211
|
||||||
show binlog events in 'slave-bin.005' from 4;
|
show binlog events in 'slave-bin.005' from 4;
|
||||||
Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
||||||
|
61
mysql-test/r/rpl_max_relay_size.result
Normal file
61
mysql-test/r/rpl_max_relay_size.result
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
slave stop;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
slave start;
|
||||||
|
stop slave;
|
||||||
|
create table t1 (a int);
|
||||||
|
drop table t1;
|
||||||
|
reset slave;
|
||||||
|
set global max_binlog_size=8192;
|
||||||
|
set global max_relay_log_size=8192-1;
|
||||||
|
select @@global.max_relay_log_size;
|
||||||
|
@@global.max_relay_log_size
|
||||||
|
4096
|
||||||
|
start slave;
|
||||||
|
show slave status;
|
||||||
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
|
127.0.0.1 root 9306 1 master-bin.001 50477 slave-relay-bin.014 1221 master-bin.001 Yes Yes 0 0 50477 1221
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
set global max_relay_log_size=(5*4096);
|
||||||
|
select @@global.max_relay_log_size;
|
||||||
|
@@global.max_relay_log_size
|
||||||
|
20480
|
||||||
|
start slave;
|
||||||
|
show slave status;
|
||||||
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
|
127.0.0.1 root 9306 1 master-bin.001 50477 slave-relay-bin.004 9457 master-bin.001 Yes Yes 0 0 50477 9457
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
set global max_relay_log_size=0;
|
||||||
|
select @@global.max_relay_log_size;
|
||||||
|
@@global.max_relay_log_size
|
||||||
|
0
|
||||||
|
start slave;
|
||||||
|
show slave status;
|
||||||
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
|
127.0.0.1 root 9306 1 master-bin.001 50477 slave-relay-bin.008 1283 master-bin.001 Yes Yes 0 0 50477 1283
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
flush logs;
|
||||||
|
show slave status;
|
||||||
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
|
127.0.0.1 root 9306 1 4 slave-relay-bin.001 4 No No 0 0 0 4
|
||||||
|
reset slave;
|
||||||
|
start slave;
|
||||||
|
flush logs;
|
||||||
|
create table t1 (a int);
|
||||||
|
show slave status;
|
||||||
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
|
127.0.0.1 root 9306 1 master-bin.001 50535 slave-relay-bin.009 62 master-bin.001 Yes Yes 0 0 50535 62
|
||||||
|
flush logs;
|
||||||
|
drop table t1;
|
||||||
|
show slave status;
|
||||||
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
|
127.0.0.1 root 9306 1 master-bin.001 50583 slave-relay-bin.010 52 master-bin.001 Yes Yes 0 0 50583 52
|
||||||
|
flush logs;
|
||||||
|
show master status;
|
||||||
|
File Position Binlog_do_db Binlog_ignore_db
|
||||||
|
master-bin.002 4
|
@ -65,17 +65,15 @@ show master logs;
|
|||||||
Log_name
|
Log_name
|
||||||
master-bin.003
|
master-bin.003
|
||||||
master-bin.004
|
master-bin.004
|
||||||
master-bin.005
|
|
||||||
master-bin.006
|
|
||||||
show master status;
|
show master status;
|
||||||
File Position Binlog_do_db Binlog_ignore_db
|
File Position Binlog_do_db Binlog_ignore_db
|
||||||
master-bin.006 838
|
master-bin.004 2886
|
||||||
select * from t4;
|
select * from t4;
|
||||||
a
|
a
|
||||||
testing temporary tables part 2
|
testing temporary tables part 2
|
||||||
show slave status;
|
show slave status;
|
||||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||||
127.0.0.1 root MASTER_PORT 60 master-bin.006 838 slave-relay-bin.001 8034 master-bin.006 Yes Yes 0 0 838 8034
|
127.0.0.1 root MASTER_PORT 60 master-bin.004 2886 slave-relay-bin.001 7870 master-bin.004 Yes Yes 0 0 2886 7870
|
||||||
lock tables t3 read;
|
lock tables t3 read;
|
||||||
select count(*) from t3 where n >= 4;
|
select count(*) from t3 where n >= 4;
|
||||||
count(*)
|
count(*)
|
||||||
|
81
mysql-test/t/rpl_max_relay_size.test
Normal file
81
mysql-test/t/rpl_max_relay_size.test
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
# Test of options max_binlog_size and max_relay_log_size and
|
||||||
|
# how they act (if max_relay_log_size == 0, use max_binlog_size
|
||||||
|
# for relay logs too).
|
||||||
|
# Test of manual relay log rotation with FLUSH LOGS.
|
||||||
|
|
||||||
|
source include/master-slave.inc;
|
||||||
|
connection slave;
|
||||||
|
stop slave;
|
||||||
|
connection master;
|
||||||
|
# Generate a big enough master's binlog to cause relay log rotations
|
||||||
|
create table t1 (a int);
|
||||||
|
let $1=800;
|
||||||
|
disable_query_log;
|
||||||
|
begin;
|
||||||
|
while ($1)
|
||||||
|
{
|
||||||
|
# eval means expand $ expressions
|
||||||
|
eval insert into t1 values( $1 );
|
||||||
|
dec $1;
|
||||||
|
}
|
||||||
|
enable_query_log;
|
||||||
|
drop table t1;
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
reset slave;
|
||||||
|
set global max_binlog_size=8192;
|
||||||
|
set global max_relay_log_size=8192-1; # mapped to 4096
|
||||||
|
select @@global.max_relay_log_size;
|
||||||
|
start slave;
|
||||||
|
sync_with_master;
|
||||||
|
show slave status;
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
set global max_relay_log_size=(5*4096);
|
||||||
|
select @@global.max_relay_log_size;
|
||||||
|
start slave;
|
||||||
|
sync_with_master;
|
||||||
|
show slave status;
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
set global max_relay_log_size=0;
|
||||||
|
select @@global.max_relay_log_size;
|
||||||
|
start slave;
|
||||||
|
sync_with_master;
|
||||||
|
show slave status;
|
||||||
|
|
||||||
|
# Tests below are mainly to ensure that we have not coded with wrong assumptions
|
||||||
|
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
# test of relay log rotation when the slave is stopped
|
||||||
|
# (to make sure it does not crash).
|
||||||
|
flush logs;
|
||||||
|
show slave status;
|
||||||
|
|
||||||
|
reset slave;
|
||||||
|
start slave;
|
||||||
|
sync_with_master;
|
||||||
|
# test of relay log rotation when the slave is started
|
||||||
|
flush logs;
|
||||||
|
# We have now easy way to be sure that the SQL thread has now deleted the
|
||||||
|
# log we just closed. But a trick to achieve this is do an update on the master.
|
||||||
|
connection master;
|
||||||
|
create table t1 (a int);
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
sync_with_master;
|
||||||
|
show slave status;
|
||||||
|
# one more rotation, to be sure Relay_log_space is correctly updated
|
||||||
|
flush logs;
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
sync_with_master;
|
||||||
|
show slave status;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
# test that the absence of relay logs does not make a master crash
|
||||||
|
flush logs;
|
||||||
|
show master status;
|
@ -1 +1 @@
|
|||||||
-O max_binlog_size=2048
|
-O max_binlog_size=4096
|
||||||
|
72
sql/log.cc
72
sql/log.cc
@ -133,11 +133,15 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
|
|||||||
|
|
||||||
void MYSQL_LOG::init(enum_log_type log_type_arg,
|
void MYSQL_LOG::init(enum_log_type log_type_arg,
|
||||||
enum cache_type io_cache_type_arg,
|
enum cache_type io_cache_type_arg,
|
||||||
bool no_auto_events_arg)
|
bool no_auto_events_arg,
|
||||||
|
ulong max_size_arg)
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("MYSQL_LOG::init");
|
||||||
log_type = log_type_arg;
|
log_type = log_type_arg;
|
||||||
io_cache_type = io_cache_type_arg;
|
io_cache_type = io_cache_type_arg;
|
||||||
no_auto_events = no_auto_events_arg;
|
no_auto_events = no_auto_events_arg;
|
||||||
|
max_size=max_size_arg;
|
||||||
|
DBUG_PRINT("info",("log_type=%d max_size=%lu", log_type, max_size));
|
||||||
if (!inited)
|
if (!inited)
|
||||||
{
|
{
|
||||||
inited= 1;
|
inited= 1;
|
||||||
@ -145,6 +149,7 @@ void MYSQL_LOG::init(enum_log_type log_type_arg,
|
|||||||
(void) pthread_mutex_init(&LOCK_index, MY_MUTEX_INIT_SLOW);
|
(void) pthread_mutex_init(&LOCK_index, MY_MUTEX_INIT_SLOW);
|
||||||
(void) pthread_cond_init(&update_cond, 0);
|
(void) pthread_cond_init(&update_cond, 0);
|
||||||
}
|
}
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -165,7 +170,8 @@ void MYSQL_LOG::init(enum_log_type log_type_arg,
|
|||||||
bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
|
bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
|
||||||
const char *new_name, const char *index_file_name_arg,
|
const char *new_name, const char *index_file_name_arg,
|
||||||
enum cache_type io_cache_type_arg,
|
enum cache_type io_cache_type_arg,
|
||||||
bool no_auto_events_arg)
|
bool no_auto_events_arg,
|
||||||
|
ulong max_size)
|
||||||
{
|
{
|
||||||
char buff[512];
|
char buff[512];
|
||||||
File file= -1, index_file_nr= -1;
|
File file= -1, index_file_nr= -1;
|
||||||
@ -178,7 +184,7 @@ bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
|
|||||||
|
|
||||||
if (!inited && log_type_arg == LOG_BIN && *fn_ext(log_name))
|
if (!inited && log_type_arg == LOG_BIN && *fn_ext(log_name))
|
||||||
no_rotate = 1;
|
no_rotate = 1;
|
||||||
init(log_type_arg,io_cache_type_arg,no_auto_events_arg);
|
init(log_type_arg,io_cache_type_arg,no_auto_events_arg,max_size);
|
||||||
|
|
||||||
if (!(name=my_strdup(log_name,MYF(MY_WME))))
|
if (!(name=my_strdup(log_name,MYF(MY_WME))))
|
||||||
goto err;
|
goto err;
|
||||||
@ -577,7 +583,7 @@ bool MYSQL_LOG::reset_logs(THD* thd)
|
|||||||
if (!thd->slave_thread)
|
if (!thd->slave_thread)
|
||||||
need_start_event=1;
|
need_start_event=1;
|
||||||
open(save_name, save_log_type, 0, index_file_name,
|
open(save_name, save_log_type, 0, index_file_name,
|
||||||
io_cache_type, no_auto_events);
|
io_cache_type, no_auto_events, max_size);
|
||||||
my_free((gptr) save_name, MYF(0));
|
my_free((gptr) save_name, MYF(0));
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -802,8 +808,12 @@ void MYSQL_LOG::new_file(bool need_lock)
|
|||||||
char new_name[FN_REFLEN], *new_name_ptr, *old_name;
|
char new_name[FN_REFLEN], *new_name_ptr, *old_name;
|
||||||
enum_log_type save_log_type;
|
enum_log_type save_log_type;
|
||||||
|
|
||||||
|
DBUG_ENTER("MYSQL_LOG::new_file");
|
||||||
if (!is_open())
|
if (!is_open())
|
||||||
return; // Should never happen
|
{
|
||||||
|
DBUG_PRINT("info",("log is closed"));
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
if (need_lock)
|
if (need_lock)
|
||||||
{
|
{
|
||||||
@ -865,8 +875,16 @@ void MYSQL_LOG::new_file(bool need_lock)
|
|||||||
save_log_type=log_type;
|
save_log_type=log_type;
|
||||||
name=0; // Don't free name
|
name=0; // Don't free name
|
||||||
close();
|
close();
|
||||||
|
/*
|
||||||
|
if (save_log_type == LOG_BIN)
|
||||||
|
{
|
||||||
|
printf("after close, before open; I wait for 20 seconds\n");
|
||||||
|
sleep(20);
|
||||||
|
printf("sleep finished, opening\n");
|
||||||
|
}
|
||||||
|
*/
|
||||||
open(old_name, save_log_type, new_name_ptr, index_file_name, io_cache_type,
|
open(old_name, save_log_type, new_name_ptr, index_file_name, io_cache_type,
|
||||||
no_auto_events);
|
no_auto_events, max_size);
|
||||||
my_free(old_name,MYF(0));
|
my_free(old_name,MYF(0));
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@ -875,6 +893,7 @@ end:
|
|||||||
pthread_mutex_unlock(&LOCK_index);
|
pthread_mutex_unlock(&LOCK_index);
|
||||||
pthread_mutex_unlock(&LOCK_log);
|
pthread_mutex_unlock(&LOCK_log);
|
||||||
}
|
}
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -882,7 +901,8 @@ bool MYSQL_LOG::append(Log_event* ev)
|
|||||||
{
|
{
|
||||||
bool error = 0;
|
bool error = 0;
|
||||||
pthread_mutex_lock(&LOCK_log);
|
pthread_mutex_lock(&LOCK_log);
|
||||||
|
DBUG_ENTER("MYSQL_LOG::append");
|
||||||
|
|
||||||
DBUG_ASSERT(log_file.type == SEQ_READ_APPEND);
|
DBUG_ASSERT(log_file.type == SEQ_READ_APPEND);
|
||||||
/*
|
/*
|
||||||
Log_event::write() is smart enough to use my_b_write() or
|
Log_event::write() is smart enough to use my_b_write() or
|
||||||
@ -894,7 +914,8 @@ bool MYSQL_LOG::append(Log_event* ev)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
bytes_written += ev->get_event_len();
|
bytes_written += ev->get_event_len();
|
||||||
if ((uint) my_b_append_tell(&log_file) > max_binlog_size)
|
DBUG_PRINT("info",("max_size=%lu",max_size));
|
||||||
|
if ((uint) my_b_append_tell(&log_file) > max_size)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_index);
|
pthread_mutex_lock(&LOCK_index);
|
||||||
new_file(0);
|
new_file(0);
|
||||||
@ -904,13 +925,14 @@ bool MYSQL_LOG::append(Log_event* ev)
|
|||||||
err:
|
err:
|
||||||
pthread_mutex_unlock(&LOCK_log);
|
pthread_mutex_unlock(&LOCK_log);
|
||||||
signal_update(); // Safe as we don't call close
|
signal_update(); // Safe as we don't call close
|
||||||
return error;
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MYSQL_LOG::appendv(const char* buf, uint len,...)
|
bool MYSQL_LOG::appendv(const char* buf, uint len,...)
|
||||||
{
|
{
|
||||||
bool error= 0;
|
bool error= 0;
|
||||||
|
DBUG_ENTER("MYSQL_LOG::appendv");
|
||||||
va_list(args);
|
va_list(args);
|
||||||
va_start(args,len);
|
va_start(args,len);
|
||||||
|
|
||||||
@ -926,8 +948,8 @@ bool MYSQL_LOG::appendv(const char* buf, uint len,...)
|
|||||||
}
|
}
|
||||||
bytes_written += len;
|
bytes_written += len;
|
||||||
} while ((buf=va_arg(args,const char*)) && (len=va_arg(args,uint)));
|
} while ((buf=va_arg(args,const char*)) && (len=va_arg(args,uint)));
|
||||||
|
DBUG_PRINT("info",("max_size=%lu",max_size));
|
||||||
if ((uint) my_b_append_tell(&log_file) > max_binlog_size)
|
if ((uint) my_b_append_tell(&log_file) > max_size)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_index);
|
pthread_mutex_lock(&LOCK_index);
|
||||||
new_file(0);
|
new_file(0);
|
||||||
@ -938,7 +960,7 @@ err:
|
|||||||
pthread_mutex_unlock(&LOCK_log);
|
pthread_mutex_unlock(&LOCK_log);
|
||||||
if (!error)
|
if (!error)
|
||||||
signal_update();
|
signal_update();
|
||||||
return error;
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1188,8 +1210,9 @@ bool MYSQL_LOG::write(Log_event* event_info)
|
|||||||
called_handler_commit=1;
|
called_handler_commit=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* we wrote to the real log, check automatic rotation */
|
/* We wrote to the real log, check automatic rotation; */
|
||||||
should_rotate= (my_b_tell(file) >= (my_off_t) max_binlog_size);
|
DBUG_PRINT("info",("max_size=%lu",max_size));
|
||||||
|
should_rotate= (my_b_tell(file) >= (my_off_t) max_size);
|
||||||
}
|
}
|
||||||
error=0;
|
error=0;
|
||||||
|
|
||||||
@ -1319,7 +1342,8 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache)
|
|||||||
log_file.pos_in_file)))
|
log_file.pos_in_file)))
|
||||||
goto err;
|
goto err;
|
||||||
signal_update();
|
signal_update();
|
||||||
if (my_b_tell(&log_file) >= (my_off_t) max_binlog_size)
|
DBUG_PRINT("info",("max_size=%lu",max_size));
|
||||||
|
if (my_b_tell(&log_file) >= (my_off_t) max_size)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_index);
|
pthread_mutex_lock(&LOCK_index);
|
||||||
new_file(0); // inside mutex
|
new_file(0); // inside mutex
|
||||||
@ -1563,6 +1587,24 @@ void MYSQL_LOG::close(bool exiting)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MYSQL_LOG::set_max_size(ulong max_size_arg)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
We need to take locks, otherwise this may happen:
|
||||||
|
new_file() is called, calls open(old_max_size), then before open() starts,
|
||||||
|
set_max_size() sets max_size to max_size_arg, then open() starts and
|
||||||
|
uses the old_max_size argument, so max_size_arg has been overwritten and
|
||||||
|
it's like if the SET command was never run.
|
||||||
|
*/
|
||||||
|
if (is_open())
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&LOCK_log);
|
||||||
|
pthread_mutex_lock(&LOCK_index);
|
||||||
|
max_size= max_size_arg;
|
||||||
|
pthread_mutex_unlock(&LOCK_index);
|
||||||
|
pthread_mutex_unlock(&LOCK_log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check if a string is a valid number
|
Check if a string is a valid number
|
||||||
|
@ -606,8 +606,8 @@ bool fn_format_relative_to_data_home(my_string to, const char *name,
|
|||||||
bool open_log(MYSQL_LOG *log, const char *hostname,
|
bool open_log(MYSQL_LOG *log, const char *hostname,
|
||||||
const char *opt_name, const char *extension,
|
const char *opt_name, const char *extension,
|
||||||
const char *index_file_name,
|
const char *index_file_name,
|
||||||
enum_log_type type, bool read_append = 0,
|
enum_log_type type, bool read_append,
|
||||||
bool no_auto_events = 0);
|
bool no_auto_events, ulong max_size);
|
||||||
/* mysqld.cc */
|
/* mysqld.cc */
|
||||||
void clear_error_message(THD *thd);
|
void clear_error_message(THD *thd);
|
||||||
|
|
||||||
@ -654,7 +654,8 @@ extern ulong max_insert_delayed_threads, max_user_connections;
|
|||||||
extern ulong long_query_count, what_to_log,flush_time,opt_sql_mode;
|
extern ulong long_query_count, what_to_log,flush_time,opt_sql_mode;
|
||||||
extern ulong query_buff_size, thread_stack,thread_stack_min;
|
extern ulong query_buff_size, thread_stack,thread_stack_min;
|
||||||
extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit;
|
extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit;
|
||||||
extern ulong max_binlog_size, rpl_recovery_rank, thread_cache_size;
|
extern ulong max_binlog_size, max_relay_log_size;
|
||||||
|
extern ulong rpl_recovery_rank, thread_cache_size;
|
||||||
extern ulong com_stat[(uint) SQLCOM_END], com_other, back_log;
|
extern ulong com_stat[(uint) SQLCOM_END], com_other, back_log;
|
||||||
extern ulong specialflag, current_pid;
|
extern ulong specialflag, current_pid;
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ ulong table_cache_size,
|
|||||||
query_buff_size,
|
query_buff_size,
|
||||||
slow_launch_time = 2L,
|
slow_launch_time = 2L,
|
||||||
slave_open_temp_tables=0,
|
slave_open_temp_tables=0,
|
||||||
open_files_limit=0, max_binlog_size;
|
open_files_limit=0, max_binlog_size, max_relay_log_size;
|
||||||
ulong com_stat[(uint) SQLCOM_END], com_other;
|
ulong com_stat[(uint) SQLCOM_END], com_other;
|
||||||
ulong slave_net_timeout;
|
ulong slave_net_timeout;
|
||||||
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
|
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
|
||||||
@ -1950,7 +1950,7 @@ bool open_log(MYSQL_LOG *log, const char *hostname,
|
|||||||
const char *opt_name, const char *extension,
|
const char *opt_name, const char *extension,
|
||||||
const char *index_file_name,
|
const char *index_file_name,
|
||||||
enum_log_type type, bool read_append,
|
enum_log_type type, bool read_append,
|
||||||
bool no_auto_events)
|
bool no_auto_events, ulong max_size)
|
||||||
{
|
{
|
||||||
char tmp[FN_REFLEN];
|
char tmp[FN_REFLEN];
|
||||||
if (!opt_name || !opt_name[0])
|
if (!opt_name || !opt_name[0])
|
||||||
@ -1976,7 +1976,7 @@ bool open_log(MYSQL_LOG *log, const char *hostname,
|
|||||||
}
|
}
|
||||||
return log->open(opt_name, type, 0, index_file_name,
|
return log->open(opt_name, type, 0, index_file_name,
|
||||||
(read_append) ? SEQ_READ_APPEND : WRITE_CACHE,
|
(read_append) ? SEQ_READ_APPEND : WRITE_CACHE,
|
||||||
no_auto_events);
|
no_auto_events, max_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2196,17 +2196,17 @@ int main(int argc, char **argv)
|
|||||||
/* Setup log files */
|
/* Setup log files */
|
||||||
if (opt_log)
|
if (opt_log)
|
||||||
open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS,
|
open_log(&mysql_log, glob_hostname, opt_logname, ".log", NullS,
|
||||||
LOG_NORMAL);
|
LOG_NORMAL, 0, 0, 0);
|
||||||
if (opt_update_log)
|
if (opt_update_log)
|
||||||
{
|
{
|
||||||
open_log(&mysql_update_log, glob_hostname, opt_update_logname, "",
|
open_log(&mysql_update_log, glob_hostname, opt_update_logname, "",
|
||||||
NullS, LOG_NEW);
|
NullS, LOG_NEW, 0, 0, 0);
|
||||||
using_update_log=1;
|
using_update_log=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_slow_log)
|
if (opt_slow_log)
|
||||||
open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log",
|
open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log",
|
||||||
NullS, LOG_NORMAL);
|
NullS, LOG_NORMAL, 0, 0, 0);
|
||||||
|
|
||||||
if (opt_error_log)
|
if (opt_error_log)
|
||||||
{
|
{
|
||||||
@ -2321,7 +2321,7 @@ The server will not act as a slave.");
|
|||||||
if (opt_bin_log)
|
if (opt_bin_log)
|
||||||
{
|
{
|
||||||
open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin",
|
open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin",
|
||||||
opt_binlog_index_name,LOG_BIN);
|
opt_binlog_index_name, LOG_BIN, 0, 0, max_binlog_size);
|
||||||
using_update_log=1;
|
using_update_log=1;
|
||||||
}
|
}
|
||||||
else if (opt_log_slave_updates)
|
else if (opt_log_slave_updates)
|
||||||
@ -3156,8 +3156,8 @@ enum options {
|
|||||||
OPT_MAX_BINLOG_CACHE_SIZE, OPT_MAX_BINLOG_SIZE,
|
OPT_MAX_BINLOG_CACHE_SIZE, OPT_MAX_BINLOG_SIZE,
|
||||||
OPT_MAX_CONNECTIONS, OPT_MAX_CONNECT_ERRORS,
|
OPT_MAX_CONNECTIONS, OPT_MAX_CONNECT_ERRORS,
|
||||||
OPT_MAX_DELAYED_THREADS, OPT_MAX_HEP_TABLE_SIZE,
|
OPT_MAX_DELAYED_THREADS, OPT_MAX_HEP_TABLE_SIZE,
|
||||||
OPT_MAX_JOIN_SIZE, OPT_MAX_SORT_LENGTH, OPT_MAX_SEEKS_FOR_KEY,
|
OPT_MAX_JOIN_SIZE, OPT_MAX_RELAY_LOG_SIZE, OPT_MAX_SORT_LENGTH,
|
||||||
OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS,
|
OPT_MAX_SEEKS_FOR_KEY, OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS,
|
||||||
OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE,
|
OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE,
|
||||||
OPT_MYISAM_BLOCK_SIZE, OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE,
|
OPT_MYISAM_BLOCK_SIZE, OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE,
|
||||||
OPT_MYISAM_MAX_SORT_FILE_SIZE, OPT_MYISAM_SORT_BUFFER_SIZE,
|
OPT_MYISAM_MAX_SORT_FILE_SIZE, OPT_MYISAM_SORT_BUFFER_SIZE,
|
||||||
@ -3809,9 +3809,11 @@ replicating a LOAD DATA INFILE command",
|
|||||||
(gptr*) &max_binlog_cache_size, (gptr*) &max_binlog_cache_size, 0,
|
(gptr*) &max_binlog_cache_size, (gptr*) &max_binlog_cache_size, 0,
|
||||||
GET_ULONG, REQUIRED_ARG, ~0L, IO_SIZE, ~0L, 0, IO_SIZE, 0},
|
GET_ULONG, REQUIRED_ARG, ~0L, IO_SIZE, ~0L, 0, IO_SIZE, 0},
|
||||||
{"max_binlog_size", OPT_MAX_BINLOG_SIZE,
|
{"max_binlog_size", OPT_MAX_BINLOG_SIZE,
|
||||||
"Binary log will be rotated automatically when the size crosses the limit.",
|
"Binary log will be rotated automatically when the size exceeds this \
|
||||||
|
value. Will also apply to relay logs if max_relay_log_size is 0. \
|
||||||
|
The minimum value for this variable is 4096.",
|
||||||
(gptr*) &max_binlog_size, (gptr*) &max_binlog_size, 0, GET_ULONG,
|
(gptr*) &max_binlog_size, (gptr*) &max_binlog_size, 0, GET_ULONG,
|
||||||
REQUIRED_ARG, 1024*1024L*1024L, 1024, 1024*1024L*1024L, 0, 1, 0},
|
REQUIRED_ARG, 1024*1024L*1024L, IO_SIZE, 1024*1024L*1024L, 0, IO_SIZE, 0},
|
||||||
{"max_connections", OPT_MAX_CONNECTIONS,
|
{"max_connections", OPT_MAX_CONNECTIONS,
|
||||||
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
|
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
|
||||||
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
|
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
|
||||||
@ -3834,6 +3836,12 @@ replicating a LOAD DATA INFILE command",
|
|||||||
(gptr*) &global_system_variables.max_join_size,
|
(gptr*) &global_system_variables.max_join_size,
|
||||||
(gptr*) &max_system_variables.max_join_size, 0, GET_HA_ROWS, REQUIRED_ARG,
|
(gptr*) &max_system_variables.max_join_size, 0, GET_HA_ROWS, REQUIRED_ARG,
|
||||||
~0L, 1, ~0L, 0, 1, 0},
|
~0L, 1, ~0L, 0, 1, 0},
|
||||||
|
{"max_relay_log_size", OPT_MAX_RELAY_LOG_SIZE,
|
||||||
|
"If non-zero: relay log will be rotated automatically when the size exceeds \
|
||||||
|
this value; if zero (the default): when the size exceeds max_binlog_size. \
|
||||||
|
0 expected, the minimum value for this variable is 4096.",
|
||||||
|
(gptr*) &max_relay_log_size, (gptr*) &max_relay_log_size, 0, GET_ULONG,
|
||||||
|
REQUIRED_ARG, 0L, 0L, 1024*1024L*1024L, 0, IO_SIZE, 0},
|
||||||
{ "max_seeks_for_key", OPT_MAX_SEEKS_FOR_KEY,
|
{ "max_seeks_for_key", OPT_MAX_SEEKS_FOR_KEY,
|
||||||
"Limit assumed max number of seeks when looking up rows based on a key",
|
"Limit assumed max number of seeks when looking up rows based on a key",
|
||||||
(gptr*) &global_system_variables.max_seeks_for_key,
|
(gptr*) &global_system_variables.max_seeks_for_key,
|
||||||
|
@ -84,6 +84,8 @@ static void fix_query_cache_size(THD *thd, enum_var_type type);
|
|||||||
static void fix_key_buffer_size(THD *thd, enum_var_type type);
|
static void fix_key_buffer_size(THD *thd, enum_var_type type);
|
||||||
static void fix_myisam_max_extra_sort_file_size(THD *thd, enum_var_type type);
|
static void fix_myisam_max_extra_sort_file_size(THD *thd, enum_var_type type);
|
||||||
static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type);
|
static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type);
|
||||||
|
static void fix_max_binlog_size(THD *thd, enum_var_type type);
|
||||||
|
static void fix_max_relay_log_size(THD *thd, enum_var_type type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Variable definition list
|
Variable definition list
|
||||||
@ -142,7 +144,8 @@ sys_var_thd_ulong sys_max_allowed_packet("max_allowed_packet",
|
|||||||
sys_var_long_ptr sys_max_binlog_cache_size("max_binlog_cache_size",
|
sys_var_long_ptr sys_max_binlog_cache_size("max_binlog_cache_size",
|
||||||
&max_binlog_cache_size);
|
&max_binlog_cache_size);
|
||||||
sys_var_long_ptr sys_max_binlog_size("max_binlog_size",
|
sys_var_long_ptr sys_max_binlog_size("max_binlog_size",
|
||||||
&max_binlog_size);
|
&max_binlog_size,
|
||||||
|
fix_max_binlog_size);
|
||||||
sys_var_long_ptr sys_max_connections("max_connections",
|
sys_var_long_ptr sys_max_connections("max_connections",
|
||||||
&max_connections);
|
&max_connections);
|
||||||
sys_var_long_ptr sys_max_connect_errors("max_connect_errors",
|
sys_var_long_ptr sys_max_connect_errors("max_connect_errors",
|
||||||
@ -161,6 +164,9 @@ sys_var_thd_ha_rows sys_sql_max_join_size("sql_max_join_size",
|
|||||||
&SV::max_join_size,
|
&SV::max_join_size,
|
||||||
fix_max_join_size);
|
fix_max_join_size);
|
||||||
#endif
|
#endif
|
||||||
|
sys_var_long_ptr sys_max_relay_log_size("max_relay_log_size",
|
||||||
|
&max_relay_log_size,
|
||||||
|
fix_max_relay_log_size);
|
||||||
sys_var_thd_ulong sys_max_sort_length("max_sort_length",
|
sys_var_thd_ulong sys_max_sort_length("max_sort_length",
|
||||||
&SV::max_sort_length);
|
&SV::max_sort_length);
|
||||||
sys_var_long_ptr sys_max_user_connections("max_user_connections",
|
sys_var_long_ptr sys_max_user_connections("max_user_connections",
|
||||||
@ -350,6 +356,7 @@ sys_var *sys_variables[]=
|
|||||||
&sys_max_delayed_threads,
|
&sys_max_delayed_threads,
|
||||||
&sys_max_heap_table_size,
|
&sys_max_heap_table_size,
|
||||||
&sys_max_join_size,
|
&sys_max_join_size,
|
||||||
|
&sys_max_relay_log_size,
|
||||||
&sys_max_seeks_for_key,
|
&sys_max_seeks_for_key,
|
||||||
&sys_max_sort_length,
|
&sys_max_sort_length,
|
||||||
&sys_max_tmp_tables,
|
&sys_max_tmp_tables,
|
||||||
@ -495,6 +502,7 @@ struct show_var_st init_vars[]= {
|
|||||||
{sys_max_delayed_threads.name,(char*) &sys_max_delayed_threads, SHOW_SYS},
|
{sys_max_delayed_threads.name,(char*) &sys_max_delayed_threads, SHOW_SYS},
|
||||||
{sys_max_heap_table_size.name,(char*) &sys_max_heap_table_size, SHOW_SYS},
|
{sys_max_heap_table_size.name,(char*) &sys_max_heap_table_size, SHOW_SYS},
|
||||||
{sys_max_join_size.name, (char*) &sys_max_join_size, SHOW_SYS},
|
{sys_max_join_size.name, (char*) &sys_max_join_size, SHOW_SYS},
|
||||||
|
{sys_max_relay_log_size.name, (char*) &sys_max_relay_log_size, SHOW_SYS},
|
||||||
{sys_max_seeks_for_key.name, (char*) &sys_max_seeks_for_key, SHOW_SYS},
|
{sys_max_seeks_for_key.name, (char*) &sys_max_seeks_for_key, SHOW_SYS},
|
||||||
{sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS},
|
{sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS},
|
||||||
{sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS},
|
{sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS},
|
||||||
@ -697,6 +705,26 @@ void fix_delay_key_write(THD *thd, enum_var_type type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fix_max_binlog_size(THD *thd, enum_var_type type)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("fix_max_binlog_size");
|
||||||
|
DBUG_PRINT("info",("max_binlog_size=%lu max_relay_log_size=%lu",
|
||||||
|
max_binlog_size, max_relay_log_size));
|
||||||
|
mysql_bin_log.set_max_size(max_binlog_size);
|
||||||
|
if (!max_relay_log_size)
|
||||||
|
active_mi->rli.relay_log.set_max_size(max_binlog_size);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fix_max_relay_log_size(THD *thd, enum_var_type type)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("fix_max_relay_log_size");
|
||||||
|
DBUG_PRINT("info",("max_binlog_size=%lu max_relay_log_size=%lu",
|
||||||
|
max_binlog_size, max_relay_log_size));
|
||||||
|
active_mi->rli.relay_log.set_max_size(max_relay_log_size ?
|
||||||
|
max_relay_log_size: max_binlog_size);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
bool sys_var_long_ptr::update(THD *thd, set_var *var)
|
bool sys_var_long_ptr::update(THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
|
52
sql/slave.cc
52
sql/slave.cc
@ -1235,7 +1235,17 @@ int init_relay_log_info(RELAY_LOG_INFO* rli, const char* info_fname)
|
|||||||
if (open_log(&rli->relay_log, glob_hostname, opt_relay_logname,
|
if (open_log(&rli->relay_log, glob_hostname, opt_relay_logname,
|
||||||
"-relay-bin", opt_relaylog_index_name,
|
"-relay-bin", opt_relaylog_index_name,
|
||||||
LOG_BIN, 1 /* read_append cache */,
|
LOG_BIN, 1 /* read_append cache */,
|
||||||
1 /* no auto events */))
|
1 /* no auto events */,
|
||||||
|
/*
|
||||||
|
For the maximum size, we choose max_relay_log_size if it is
|
||||||
|
non-zero, max_binlog_size otherwise. If later the user does SET
|
||||||
|
GLOBAL on one of these variables, fix_max_binlog_size and
|
||||||
|
fix_max_relay_log_size will reconsider the choice (for example
|
||||||
|
if the user changes max_relay_log_size to zero, we have to
|
||||||
|
switch to using max_binlog_size for the relay log) and update
|
||||||
|
rli->relay_log.max_size (and mysql_bin_log.max_size).
|
||||||
|
*/
|
||||||
|
max_relay_log_size ? max_relay_log_size : max_binlog_size))
|
||||||
{
|
{
|
||||||
sql_print_error("Failed in open_log() called from init_relay_log_info()");
|
sql_print_error("Failed in open_log() called from init_relay_log_info()");
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -3421,6 +3431,46 @@ err:
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Rotate a relay log (this is used only by FLUSH LOGS; the automatic rotation
|
||||||
|
because of size is simpler because when we do it we already have all relevant
|
||||||
|
locks; here we don't, so this function is mainly taking locks).
|
||||||
|
Returns nothing as we cannot catch any error (MYSQL_LOG::new_file() is void).
|
||||||
|
*/
|
||||||
|
|
||||||
|
void rotate_relay_log(MASTER_INFO* mi)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("rotate_relay_log");
|
||||||
|
RELAY_LOG_INFO* rli= &mi->rli;
|
||||||
|
/* If this server is not a slave (or RESET SLAVE has just been run) */
|
||||||
|
if (!rli->inited)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("rli->inited=0"));
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
lock_slave_threads(mi);
|
||||||
|
pthread_mutex_lock(&rli->data_lock);
|
||||||
|
/* If the relay log is closed, new_file() will do nothing. */
|
||||||
|
rli->relay_log.new_file(1);
|
||||||
|
/*
|
||||||
|
We harvest now, because otherwise BIN_LOG_HEADER_SIZE will not immediately
|
||||||
|
be counted, so imagine a succession of FLUSH LOGS and assume the slave
|
||||||
|
threads are started:
|
||||||
|
relay_log_space decreases by the size of the deleted relay log, but does not
|
||||||
|
increase, so flush-after-flush we may become negative, which is wrong.
|
||||||
|
Even if this will be corrected as soon as a query is replicated on the slave
|
||||||
|
(because the I/O thread will then call harvest_bytes_written() which will
|
||||||
|
harvest all these BIN_LOG_HEADER_SIZE we forgot), it may give strange output
|
||||||
|
in SHOW SLAVE STATUS meanwhile. So we harvest now.
|
||||||
|
If the log is closed, then this will just harvest the last writes, probably
|
||||||
|
0 as they probably have been harvested.
|
||||||
|
*/
|
||||||
|
rli->relay_log.harvest_bytes_written(&rli->log_space_total);
|
||||||
|
pthread_mutex_unlock(&rli->data_lock);
|
||||||
|
unlock_slave_threads(mi);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
template class I_List_iterator<i_string>;
|
template class I_List_iterator<i_string>;
|
||||||
|
@ -403,6 +403,7 @@ int init_relay_log_pos(RELAY_LOG_INFO* rli,const char* log,ulonglong pos,
|
|||||||
|
|
||||||
int purge_relay_logs(RELAY_LOG_INFO* rli, THD *thd, bool just_reset,
|
int purge_relay_logs(RELAY_LOG_INFO* rli, THD *thd, bool just_reset,
|
||||||
const char** errmsg);
|
const char** errmsg);
|
||||||
|
void rotate_relay_log(MASTER_INFO* mi);
|
||||||
|
|
||||||
extern "C" pthread_handler_decl(handle_slave_io,arg);
|
extern "C" pthread_handler_decl(handle_slave_io,arg);
|
||||||
extern "C" pthread_handler_decl(handle_slave_sql,arg);
|
extern "C" pthread_handler_decl(handle_slave_sql,arg);
|
||||||
|
@ -84,6 +84,17 @@ class MYSQL_LOG {
|
|||||||
bool no_rotate;
|
bool no_rotate;
|
||||||
bool need_start_event;
|
bool need_start_event;
|
||||||
bool no_auto_events; // for relay binlog
|
bool no_auto_events; // for relay binlog
|
||||||
|
/*
|
||||||
|
The max size before rotation (usable only if log_type == LOG_BIN: binary
|
||||||
|
logs and relay logs).
|
||||||
|
For a binlog, max_size should be max_binlog_size.
|
||||||
|
For a relay log, it should be max_relay_log_size if this is non-zero,
|
||||||
|
max_binlog_size otherwise.
|
||||||
|
max_size is set in init(), and dynamically changed (when one does SET
|
||||||
|
GLOBAL MAX_BINLOG_SIZE|MAX_RELAY_LOG_SIZE) by fix_max_binlog_size and
|
||||||
|
fix_max_relay_log_size).
|
||||||
|
*/
|
||||||
|
ulong max_size;
|
||||||
friend class Log_event;
|
friend class Log_event;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -105,17 +116,18 @@ public:
|
|||||||
bytes_written=0;
|
bytes_written=0;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
void set_max_size(ulong max_size_arg);
|
||||||
void signal_update() { pthread_cond_broadcast(&update_cond);}
|
void signal_update() { pthread_cond_broadcast(&update_cond);}
|
||||||
void wait_for_update(THD* thd);
|
void wait_for_update(THD* thd);
|
||||||
void set_need_start_event() { need_start_event = 1; }
|
void set_need_start_event() { need_start_event = 1; }
|
||||||
void init(enum_log_type log_type_arg,
|
void init(enum_log_type log_type_arg,
|
||||||
enum cache_type io_cache_type_arg = WRITE_CACHE,
|
enum cache_type io_cache_type_arg,
|
||||||
bool no_auto_events_arg = 0);
|
bool no_auto_events_arg, ulong max_size);
|
||||||
void cleanup();
|
void cleanup();
|
||||||
bool open(const char *log_name,enum_log_type log_type,
|
bool open(const char *log_name,enum_log_type log_type,
|
||||||
const char *new_name, const char *index_file_name_arg,
|
const char *new_name, const char *index_file_name_arg,
|
||||||
enum cache_type io_cache_type_arg,
|
enum cache_type io_cache_type_arg,
|
||||||
bool no_auto_events_arg);
|
bool no_auto_events_arg, ulong max_size);
|
||||||
void new_file(bool need_lock= 1);
|
void new_file(bool need_lock= 1);
|
||||||
bool write(THD *thd, enum enum_server_command command,
|
bool write(THD *thd, enum enum_server_command command,
|
||||||
const char *format,...);
|
const char *format,...);
|
||||||
|
@ -3571,10 +3571,18 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
|
|||||||
}
|
}
|
||||||
if (options & REFRESH_LOG)
|
if (options & REFRESH_LOG)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Flush the normal query log, the update log, the binary log, the slow query
|
||||||
|
log, and the relay log (if it exists).
|
||||||
|
*/
|
||||||
mysql_log.new_file(1);
|
mysql_log.new_file(1);
|
||||||
mysql_update_log.new_file(1);
|
mysql_update_log.new_file(1);
|
||||||
mysql_bin_log.new_file(1);
|
mysql_bin_log.new_file(1);
|
||||||
mysql_slow_log.new_file(1);
|
mysql_slow_log.new_file(1);
|
||||||
|
LOCK_ACTIVE_MI;
|
||||||
|
rotate_relay_log(active_mi);
|
||||||
|
UNLOCK_ACTIVE_MI;
|
||||||
|
|
||||||
if (ha_flush_logs())
|
if (ha_flush_logs())
|
||||||
result=1;
|
result=1;
|
||||||
if (flush_error_log())
|
if (flush_error_log())
|
||||||
|
Reference in New Issue
Block a user