mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Automerge: mysql-5.1-rep+2 (local backports) --> mysql-5.1-rep+2 (local latest)
This commit is contained in:
@ -22,7 +22,7 @@ eval $test_insert;
|
|||||||
|
|
||||||
connection slave;
|
connection slave;
|
||||||
START SLAVE;
|
START SLAVE;
|
||||||
wait_for_slave_to_stop;
|
--source include/wait_for_slave_sql_to_stop.inc
|
||||||
--replace_result $MASTER_MYPORT MASTER_PORT
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
||||||
--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
|
--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
|
||||||
--query_vertical SHOW SLAVE STATUS
|
--query_vertical SHOW SLAVE STATUS
|
||||||
|
8
mysql-test/suite/binlog/r/binlog_max_extension.result
Normal file
8
mysql-test/suite/binlog/r/binlog_max_extension.result
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
call mtr.add_suppression("Next log extension: 2147483647. Remaining log filename extensions: 0.");
|
||||||
|
call mtr.add_suppression("Log filename extension number exhausted:");
|
||||||
|
call mtr.add_suppression("Can't generate a unique log-filename");
|
||||||
|
RESET MASTER;
|
||||||
|
FLUSH LOGS;
|
||||||
|
Warnings:
|
||||||
|
Warning 1098 Can't generate a unique log-filename master-bin.(1-999)
|
||||||
|
|
92
mysql-test/suite/binlog/t/binlog_max_extension.test
Normal file
92
mysql-test/suite/binlog/t/binlog_max_extension.test
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# BUG#40611: MySQL cannot make a binary log after sequential number beyond
|
||||||
|
# unsigned long.
|
||||||
|
#
|
||||||
|
# Problem statement
|
||||||
|
# =================
|
||||||
|
#
|
||||||
|
# Extension for log file names might be created with negative
|
||||||
|
# numbers (when counter used would wrap around), causing server
|
||||||
|
# failure when incrementing -00001 (reaching number 000000
|
||||||
|
# extension).
|
||||||
|
#
|
||||||
|
# Test
|
||||||
|
# ====
|
||||||
|
# This tests aims at testing the a patch that removes negatives
|
||||||
|
# numbers from log name extensions and checks that the server
|
||||||
|
# reports gracefully that the limit has been reached.
|
||||||
|
#
|
||||||
|
# It instruments index file to point to a log file close to
|
||||||
|
# the new maximum and calls flush logs to get warning.
|
||||||
|
#
|
||||||
|
|
||||||
|
call mtr.add_suppression("Next log extension: 2147483647. Remaining log filename extensions: 0.");
|
||||||
|
call mtr.add_suppression("Log filename extension number exhausted:");
|
||||||
|
call mtr.add_suppression("Can't generate a unique log-filename");
|
||||||
|
|
||||||
|
|
||||||
|
-- source include/have_log_bin.inc
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
-- let $MYSQLD_DATADIR= `select @@datadir`
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# check hitting maximum file name extension:
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
##########
|
||||||
|
# Prepare
|
||||||
|
##########
|
||||||
|
|
||||||
|
# 1. Stop master server
|
||||||
|
-- write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
wait
|
||||||
|
EOF
|
||||||
|
-- shutdown_server 10
|
||||||
|
-- source include/wait_until_disconnected.inc
|
||||||
|
|
||||||
|
# 2. Prepare log and index file
|
||||||
|
-- copy_file $MYSQLD_DATADIR/master-bin.index $MYSQLD_DATADIR/master-bin.index.orig
|
||||||
|
-- copy_file $MYSQLD_DATADIR/master-bin.000001 $MYSQLD_DATADIR/master-bin.2147483646
|
||||||
|
-- append_file $MYSQLD_DATADIR/master-bin.index
|
||||||
|
master-bin.2147483646
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 3. Restart the server
|
||||||
|
-- append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
restart
|
||||||
|
EOF
|
||||||
|
-- enable_reconnect
|
||||||
|
-- source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
###########
|
||||||
|
# Assertion
|
||||||
|
###########
|
||||||
|
|
||||||
|
# assertion: should throw warning
|
||||||
|
FLUSH LOGS;
|
||||||
|
|
||||||
|
##############
|
||||||
|
# Clean up
|
||||||
|
##############
|
||||||
|
|
||||||
|
# 1. Stop the server
|
||||||
|
-- write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
wait
|
||||||
|
EOF
|
||||||
|
-- shutdown_server 10
|
||||||
|
-- source include/wait_until_disconnected.inc
|
||||||
|
|
||||||
|
# 2. Undo changes to index and log files
|
||||||
|
-- remove_file $MYSQLD_DATADIR/master-bin.index
|
||||||
|
-- copy_file $MYSQLD_DATADIR/master-bin.index.orig $MYSQLD_DATADIR/master-bin.index
|
||||||
|
-- remove_file $MYSQLD_DATADIR/master-bin.index.orig
|
||||||
|
|
||||||
|
-- remove_file $MYSQLD_DATADIR/master-bin.2147483646
|
||||||
|
-- remove_file $MYSQLD_DATADIR/master-bin.2147483647
|
||||||
|
|
||||||
|
# 3. Restart the server
|
||||||
|
-- append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
restart
|
||||||
|
EOF
|
||||||
|
-- enable_reconnect
|
||||||
|
-- source include/wait_until_connected_again.inc
|
16
mysql-test/suite/rpl/r/rpl_empty_master_host.result
Normal file
16
mysql-test/suite/rpl/r/rpl_empty_master_host.result
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
stop slave;
|
||||||
|
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;
|
||||||
|
start slave;
|
||||||
|
STOP SLAVE;
|
||||||
|
Master_Host = '127.0.0.1' (expected '127.0.0.1')
|
||||||
|
CHANGE MASTER TO MASTER_HOST="";
|
||||||
|
ERROR HY000: Incorrect arguments to MASTER_HOST
|
||||||
|
Master_Host = '127.0.0.1' (expected '127.0.0.1')
|
||||||
|
CHANGE MASTER TO MASTER_HOST="foo";
|
||||||
|
Master_Host = 'foo' (expected 'foo')
|
||||||
|
CHANGE MASTER TO MASTER_HOST="127.0.0.1";
|
||||||
|
Master_Host = '127.0.0.1' (expected '127.0.0.1')
|
||||||
|
START SLAVE;
|
47
mysql-test/suite/rpl/r/rpl_slow_query_log.result
Normal file
47
mysql-test/suite/rpl/r/rpl_slow_query_log.result
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
stop slave;
|
||||||
|
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;
|
||||||
|
start slave;
|
||||||
|
include/stop_slave.inc
|
||||||
|
SET @old_log_output= @@log_output;
|
||||||
|
SET GLOBAL log_output= 'TABLE';
|
||||||
|
SET @old_long_query_time= @@long_query_time;
|
||||||
|
SET GLOBAL long_query_time= 2;
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
include/start_slave.inc
|
||||||
|
CREATE TABLE t1 (a int, b int);
|
||||||
|
INSERT INTO t1 values(1, 1);
|
||||||
|
INSERT INTO t1 values(1, sleep(3));
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
SELECT 1, sleep(3);
|
||||||
|
1 sleep(3)
|
||||||
|
1 0
|
||||||
|
SELECT 1;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
SET TIMESTAMP= 1;
|
||||||
|
SELECT 2, sleep(3);
|
||||||
|
2 sleep(3)
|
||||||
|
2 0
|
||||||
|
SELECT 2;
|
||||||
|
2
|
||||||
|
2
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
SET @old_slow_query_log= @@slow_query_log;
|
||||||
|
SET GLOBAL slow_query_log= 'OFF';
|
||||||
|
SELECT 3, sleep(3);
|
||||||
|
3 sleep(3)
|
||||||
|
3 0
|
||||||
|
SELECT 3;
|
||||||
|
3
|
||||||
|
3
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
SET GLOBAL slow_query_log= @old_slow_query_log;
|
||||||
|
DROP TABLE t1;
|
||||||
|
include/stop_slave.inc
|
||||||
|
SET GLOBAL long_query_time= @old_long_query_time;
|
||||||
|
SET GLOBAL log_output= @old_log_output;
|
||||||
|
include/start_slave.inc
|
51
mysql-test/suite/rpl/t/rpl_empty_master_host.test
Normal file
51
mysql-test/suite/rpl/t/rpl_empty_master_host.test
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#
|
||||||
|
# BUG
|
||||||
|
# ---
|
||||||
|
# BUG#28796: CHANGE MASTER TO MASTER_HOST="" leads to invalid master.info
|
||||||
|
#
|
||||||
|
# Description
|
||||||
|
# -----------
|
||||||
|
#
|
||||||
|
# This test aims at:
|
||||||
|
# i) verifying that an error is thrown when setting MASTER_HOST=''
|
||||||
|
# ii) no error is thrown when setting non empty MASTER_HOST
|
||||||
|
# iii) replication works after setting a correct host name/ip
|
||||||
|
#
|
||||||
|
# Implementation is performed by feeding different values (according
|
||||||
|
# to i), ii) and iii) ) to CHANGE MASTER TO MASTER_HOST= x and checking
|
||||||
|
# along the way if error/no error is thrown and/or if replication starts
|
||||||
|
# working when expected.
|
||||||
|
|
||||||
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
STOP SLAVE;
|
||||||
|
--source include/wait_for_slave_to_stop.inc
|
||||||
|
|
||||||
|
let $master_host= query_get_value(SHOW SLAVE STATUS, Master_Host, 1);
|
||||||
|
--echo Master_Host = '$master_host' (expected '127.0.0.1')
|
||||||
|
|
||||||
|
# attempt to change to an empty master host should
|
||||||
|
# result in error ER_WRONG_ARGUMENTS: "Incorrect arguments to ..."
|
||||||
|
error ER_WRONG_ARGUMENTS;
|
||||||
|
CHANGE MASTER TO MASTER_HOST="";
|
||||||
|
|
||||||
|
# show slave status still holds previous information
|
||||||
|
let $master_host= query_get_value(SHOW SLAVE STATUS, Master_Host, 1);
|
||||||
|
--echo Master_Host = '$master_host' (expected '127.0.0.1')
|
||||||
|
|
||||||
|
# changing master to other than empty master host succeeds
|
||||||
|
CHANGE MASTER TO MASTER_HOST="foo";
|
||||||
|
|
||||||
|
# show slave status should hold "foo" as master host
|
||||||
|
let $master_host= query_get_value(SHOW SLAVE STATUS, Master_Host, 1);
|
||||||
|
--echo Master_Host = '$master_host' (expected 'foo')
|
||||||
|
|
||||||
|
# changing back to localhost
|
||||||
|
CHANGE MASTER TO MASTER_HOST="127.0.0.1";
|
||||||
|
let $master_host= query_get_value(SHOW SLAVE STATUS, Master_Host, 1);
|
||||||
|
--echo Master_Host = '$master_host' (expected '127.0.0.1')
|
||||||
|
|
||||||
|
# start slave must succeed.
|
||||||
|
START SLAVE;
|
||||||
|
--source include/wait_for_slave_to_start.inc
|
1
mysql-test/suite/rpl/t/rpl_slow_query_log-slave.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_slow_query_log-slave.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--force-restart --log-slow-slave-statements --log-slow-queries
|
187
mysql-test/suite/rpl/t/rpl_slow_query_log.test
Normal file
187
mysql-test/suite/rpl/t/rpl_slow_query_log.test
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
#
|
||||||
|
# BUG#23300: Slow query log on slave does not log slow replicated statements
|
||||||
|
#
|
||||||
|
# Description:
|
||||||
|
# The slave should log slow queries replicated from master when
|
||||||
|
# --log-slow-slave-statements is used.
|
||||||
|
#
|
||||||
|
# Test is implemented as follows:
|
||||||
|
# i) stop slave
|
||||||
|
# ii) On slave, set long_query_time to a small value.
|
||||||
|
# ii) start slave so that long_query_time variable is picked by sql thread
|
||||||
|
# iii) On master, do one short time query and one long time query, on slave
|
||||||
|
# and check that slow query is logged to slow query log but fast query
|
||||||
|
# is not.
|
||||||
|
# iv) On slave, check that slow queries go into the slow log and fast dont,
|
||||||
|
# when issued through a regular client connection
|
||||||
|
# v) On slave, check that slow queries go into the slow log and fast dont
|
||||||
|
# when we use SET TIMESTAMP= 1 on a regular client connection.
|
||||||
|
# vi) check that when setting slow_query_log= OFF in a connection 'extra2'
|
||||||
|
# prevents logging slow queries in a connection 'extra'
|
||||||
|
#
|
||||||
|
# OBS:
|
||||||
|
# This test only runs for statement and mixed binlogging firmat because on
|
||||||
|
# row format slow queries do not get slow query logged.
|
||||||
|
|
||||||
|
source include/master-slave.inc;
|
||||||
|
source include/have_binlog_format_mixed_or_statement.inc;
|
||||||
|
|
||||||
|
|
||||||
|
# Prepare slave for different long_query_time we need to stop the slave
|
||||||
|
# and restart it as long_query_time variable is dynamic and, after
|
||||||
|
# setting it, it only takes effect on new connections.
|
||||||
|
#
|
||||||
|
# Reference:
|
||||||
|
# http://dev.mysql.com/doc/refman/6.0/en/set-option.html
|
||||||
|
connection slave;
|
||||||
|
|
||||||
|
source include/stop_slave.inc;
|
||||||
|
|
||||||
|
SET @old_log_output= @@log_output;
|
||||||
|
SET GLOBAL log_output= 'TABLE';
|
||||||
|
SET @old_long_query_time= @@long_query_time;
|
||||||
|
SET GLOBAL long_query_time= 2;
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
|
||||||
|
source include/start_slave.inc;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
CREATE TABLE t1 (a int, b int);
|
||||||
|
|
||||||
|
# test:
|
||||||
|
# check that slave logs the slow query to the slow log, but not the fast one.
|
||||||
|
|
||||||
|
let $slow_query= INSERT INTO t1 values(1, sleep(3));
|
||||||
|
let $fast_query= INSERT INTO t1 values(1, 1);
|
||||||
|
|
||||||
|
eval $fast_query;
|
||||||
|
eval $slow_query;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
let $found_fast_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$fast_query'`;
|
||||||
|
let $found_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||||
|
|
||||||
|
if ($found_fast_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Fast query FOUND in slow query log. Bailing out!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$found_slow_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Slow query NOT FOUND in slow query log. Bailing out!";
|
||||||
|
}
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
|
||||||
|
# regular checks for slow query log (using a new connection - 'extra' - to slave)
|
||||||
|
|
||||||
|
# test:
|
||||||
|
# when using direct connections to the slave, check that slow query is logged
|
||||||
|
# but not the fast one.
|
||||||
|
|
||||||
|
connect(extra,127.0.0.1,root,,test,$SLAVE_MYPORT);
|
||||||
|
connection extra;
|
||||||
|
|
||||||
|
let $fast_query= SELECT 1;
|
||||||
|
let $slow_query= SELECT 1, sleep(3);
|
||||||
|
|
||||||
|
eval $slow_query;
|
||||||
|
eval $fast_query;
|
||||||
|
|
||||||
|
let $found_fast_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$fast_query'`;
|
||||||
|
let $found_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||||
|
|
||||||
|
if ($found_fast_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Fast query FOUND in slow query log. Bailing out!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$found_slow_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Slow query NOT FOUND in slow query log. Bailing out!";
|
||||||
|
}
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
|
||||||
|
# test:
|
||||||
|
# when using direct connections to the slave, check that when setting timestamp to 1 the
|
||||||
|
# slow query is logged but the fast one is not.
|
||||||
|
|
||||||
|
let $fast_query= SELECT 2;
|
||||||
|
let $slow_query= SELECT 2, sleep(3);
|
||||||
|
|
||||||
|
SET TIMESTAMP= 1;
|
||||||
|
eval $slow_query;
|
||||||
|
eval $fast_query;
|
||||||
|
|
||||||
|
let $found_fast_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$fast_query'`;
|
||||||
|
let $found_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||||
|
|
||||||
|
if ($found_fast_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Fast query FOUND in slow query log. Bailing out!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$found_slow_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Slow query NOT FOUND in slow query log. Bailing out!";
|
||||||
|
}
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
|
||||||
|
# test:
|
||||||
|
# check that when setting the slow_query_log= OFF on connection 'extra2'
|
||||||
|
# prevents connection 'extra' from logging to slow query log.
|
||||||
|
|
||||||
|
let $fast_query= SELECT 3;
|
||||||
|
let $slow_query= SELECT 3, sleep(3);
|
||||||
|
|
||||||
|
connect(extra2,127.0.0.1,root,,test,$SLAVE_MYPORT);
|
||||||
|
connection extra2;
|
||||||
|
|
||||||
|
SET @old_slow_query_log= @@slow_query_log;
|
||||||
|
SET GLOBAL slow_query_log= 'OFF';
|
||||||
|
|
||||||
|
connection extra;
|
||||||
|
|
||||||
|
eval $slow_query;
|
||||||
|
eval $fast_query;
|
||||||
|
|
||||||
|
let $found_fast_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$fast_query'`;
|
||||||
|
let $found_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||||
|
|
||||||
|
if ($found_fast_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Fast query FOUND in slow query log when slow_query_log= OFF. Bailing out!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($found_slow_query)
|
||||||
|
{
|
||||||
|
SELECT * FROM mysql.slow_log;
|
||||||
|
die "Assertion failed! Slow query FOUND in slow query log when slow_query_log= OFF. Bailing out!";
|
||||||
|
}
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
|
||||||
|
# clean up: drop tables, reset the variables back to the previous value,
|
||||||
|
# disconnect extra connections
|
||||||
|
connection extra2;
|
||||||
|
|
||||||
|
SET GLOBAL slow_query_log= @old_slow_query_log;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
DROP TABLE t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
source include/stop_slave.inc;
|
||||||
|
|
||||||
|
SET GLOBAL long_query_time= @old_long_query_time;
|
||||||
|
SET GLOBAL log_output= @old_log_output;
|
||||||
|
|
||||||
|
source include/start_slave.inc;
|
||||||
|
|
||||||
|
disconnect extra;
|
||||||
|
disconnect extra2;
|
76
sql/log.cc
76
sql/log.cc
@ -52,7 +52,7 @@ LOGGER logger;
|
|||||||
MYSQL_BIN_LOG mysql_bin_log(&sync_binlog_period);
|
MYSQL_BIN_LOG mysql_bin_log(&sync_binlog_period);
|
||||||
|
|
||||||
static bool test_if_number(const char *str,
|
static bool test_if_number(const char *str,
|
||||||
long *res, bool allow_wildcards);
|
ulong *res, bool allow_wildcards);
|
||||||
static int binlog_init(void *p);
|
static int binlog_init(void *p);
|
||||||
static int binlog_close_connection(handlerton *hton, THD *thd);
|
static int binlog_close_connection(handlerton *hton, THD *thd);
|
||||||
static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv);
|
static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv);
|
||||||
@ -960,6 +960,7 @@ bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
|
|||||||
uint user_host_len= 0;
|
uint user_host_len= 0;
|
||||||
ulonglong query_utime, lock_utime;
|
ulonglong query_utime, lock_utime;
|
||||||
|
|
||||||
|
DBUG_ASSERT(thd->enable_slow_log);
|
||||||
/*
|
/*
|
||||||
Print the message to the buffer if we have slow log enabled
|
Print the message to the buffer if we have slow log enabled
|
||||||
*/
|
*/
|
||||||
@ -1833,22 +1834,27 @@ static void setup_windows_event_source()
|
|||||||
/**
|
/**
|
||||||
Find a unique filename for 'filename.#'.
|
Find a unique filename for 'filename.#'.
|
||||||
|
|
||||||
Set '#' to a number as low as possible.
|
Set '#' to the number next to the maximum found in the most
|
||||||
|
recent log file extension.
|
||||||
|
|
||||||
|
This function will return nonzero if: (i) the generated name
|
||||||
|
exceeds FN_REFLEN; (ii) if the number of extensions is exhausted;
|
||||||
|
or (iii) some other error happened while examining the filesystem.
|
||||||
|
|
||||||
@return
|
@return
|
||||||
nonzero if not possible to get unique filename
|
nonzero if not possible to get unique filename.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int find_uniq_filename(char *name)
|
static int find_uniq_filename(char *name)
|
||||||
{
|
{
|
||||||
long number;
|
|
||||||
uint i;
|
uint i;
|
||||||
char buff[FN_REFLEN];
|
char buff[FN_REFLEN], ext_buf[FN_REFLEN];
|
||||||
struct st_my_dir *dir_info;
|
struct st_my_dir *dir_info;
|
||||||
reg1 struct fileinfo *file_info;
|
reg1 struct fileinfo *file_info;
|
||||||
ulong max_found=0;
|
ulong max_found= 0, next= 0, number= 0;
|
||||||
size_t buf_length, length;
|
size_t buf_length, length;
|
||||||
char *start, *end;
|
char *start, *end;
|
||||||
|
int error= 0;
|
||||||
DBUG_ENTER("find_uniq_filename");
|
DBUG_ENTER("find_uniq_filename");
|
||||||
|
|
||||||
length= dirname_part(buff, name, &buf_length);
|
length= dirname_part(buff, name, &buf_length);
|
||||||
@ -1856,15 +1862,15 @@ static int find_uniq_filename(char *name)
|
|||||||
end= strend(start);
|
end= strend(start);
|
||||||
|
|
||||||
*end='.';
|
*end='.';
|
||||||
length= (size_t) (end-start+1);
|
length= (size_t) (end - start + 1);
|
||||||
|
|
||||||
if (!(dir_info = my_dir(buff,MYF(MY_DONT_SORT))))
|
if (!(dir_info= my_dir(buff,MYF(MY_DONT_SORT))))
|
||||||
{ // This shouldn't happen
|
{ // This shouldn't happen
|
||||||
strmov(end,".1"); // use name+1
|
strmov(end,".1"); // use name+1
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
file_info= dir_info->dir_entry;
|
file_info= dir_info->dir_entry;
|
||||||
for (i=dir_info->number_off_files ; i-- ; file_info++)
|
for (i= dir_info->number_off_files ; i-- ; file_info++)
|
||||||
{
|
{
|
||||||
if (bcmp((uchar*) file_info->name, (uchar*) start, length) == 0 &&
|
if (bcmp((uchar*) file_info->name, (uchar*) start, length) == 0 &&
|
||||||
test_if_number(file_info->name+length, &number,0))
|
test_if_number(file_info->name+length, &number,0))
|
||||||
@ -1874,9 +1880,44 @@ static int find_uniq_filename(char *name)
|
|||||||
}
|
}
|
||||||
my_dirend(dir_info);
|
my_dirend(dir_info);
|
||||||
|
|
||||||
|
/* check if reached the maximum possible extension number */
|
||||||
|
if ((max_found == MAX_LOG_UNIQUE_FN_EXT))
|
||||||
|
{
|
||||||
|
sql_print_error("Log filename extension number exhausted: %06lu. \
|
||||||
|
Please fix this by archiving old logs and \
|
||||||
|
updating the index files.", max_found);
|
||||||
|
error= 1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
next= max_found + 1;
|
||||||
|
sprintf(ext_buf, "%06lu", next);
|
||||||
*end++='.';
|
*end++='.';
|
||||||
sprintf(end,"%06ld",max_found+1);
|
|
||||||
DBUG_RETURN(0);
|
/*
|
||||||
|
Check if the generated extension size + the file name exceeds the
|
||||||
|
buffer size used. If one did not check this, then the filename might be
|
||||||
|
truncated, resulting in error.
|
||||||
|
*/
|
||||||
|
if (((strlen(ext_buf) + (end - name)) >= FN_REFLEN))
|
||||||
|
{
|
||||||
|
sql_print_error("Log filename too large: %s%s (%d). \
|
||||||
|
Please fix this by archiving old logs and updating the \
|
||||||
|
index files.", name, ext_buf, (strlen(ext_buf) + (end - name)));
|
||||||
|
error= 1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(end, "%06lu", next);
|
||||||
|
|
||||||
|
/* print warning if reaching the end of available extensions. */
|
||||||
|
if ((next > (MAX_LOG_UNIQUE_FN_EXT - LOG_WARN_UNIQUE_FN_EXT_LEFT)))
|
||||||
|
sql_print_warning("Next log extension: %lu. \
|
||||||
|
Remaining log filename extensions: %lu. \
|
||||||
|
Please consider archiving some logs.", next, (MAX_LOG_UNIQUE_FN_EXT - next));
|
||||||
|
|
||||||
|
end:
|
||||||
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2075,6 +2116,13 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
|
|||||||
{
|
{
|
||||||
if (find_uniq_filename(new_name))
|
if (find_uniq_filename(new_name))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
This should be treated as error once propagation of error further
|
||||||
|
up in the stack gets proper handling.
|
||||||
|
*/
|
||||||
|
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
|
ER_NO_UNIQUE_LOGFILE, ER(ER_NO_UNIQUE_LOGFILE),
|
||||||
|
log_name);
|
||||||
sql_print_error(ER(ER_NO_UNIQUE_LOGFILE), log_name);
|
sql_print_error(ER(ER_NO_UNIQUE_LOGFILE), log_name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -4749,11 +4797,11 @@ void MYSQL_BIN_LOG::set_max_size(ulong max_size_arg)
|
|||||||
@retval
|
@retval
|
||||||
1 String is a number
|
1 String is a number
|
||||||
@retval
|
@retval
|
||||||
0 Error
|
0 String is not a number
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool test_if_number(register const char *str,
|
static bool test_if_number(register const char *str,
|
||||||
long *res, bool allow_wildcards)
|
ulong *res, bool allow_wildcards)
|
||||||
{
|
{
|
||||||
reg2 int flag;
|
reg2 int flag;
|
||||||
const char *start;
|
const char *start;
|
||||||
|
13
sql/log.h
13
sql/log.h
@ -121,6 +121,19 @@ extern TC_LOG_DUMMY tc_log_dummy;
|
|||||||
#define LOG_CLOSE_TO_BE_OPENED 2
|
#define LOG_CLOSE_TO_BE_OPENED 2
|
||||||
#define LOG_CLOSE_STOP_EVENT 4
|
#define LOG_CLOSE_STOP_EVENT 4
|
||||||
|
|
||||||
|
/*
|
||||||
|
Maximum unique log filename extension.
|
||||||
|
Note: setting to 0x7FFFFFFF due to atol windows
|
||||||
|
overflow/truncate.
|
||||||
|
*/
|
||||||
|
#define MAX_LOG_UNIQUE_FN_EXT 0x7FFFFFFF
|
||||||
|
|
||||||
|
/*
|
||||||
|
Number of warnings that will be printed to error log
|
||||||
|
before extension number is exhausted.
|
||||||
|
*/
|
||||||
|
#define LOG_WARN_UNIQUE_FN_EXT_LEFT 1000
|
||||||
|
|
||||||
class Relay_log_info;
|
class Relay_log_info;
|
||||||
|
|
||||||
typedef struct st_log_info
|
typedef struct st_log_info
|
||||||
|
@ -3829,9 +3829,10 @@ with --log-bin instead.");
|
|||||||
{
|
{
|
||||||
if (opt_binlog_format_id != BINLOG_FORMAT_UNSPEC)
|
if (opt_binlog_format_id != BINLOG_FORMAT_UNSPEC)
|
||||||
{
|
{
|
||||||
sql_print_error("You need to use --log-bin to make "
|
sql_print_warning("You need to use --log-bin to make "
|
||||||
"--binlog-format work.");
|
"--binlog-format work.");
|
||||||
unireg_abort(1);
|
|
||||||
|
global_system_variables.binlog_format= opt_binlog_format_id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -7077,7 +7078,8 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
|
|||||||
var->type= SHOW_MY_BOOL;
|
var->type= SHOW_MY_BOOL;
|
||||||
pthread_mutex_lock(&LOCK_active_mi);
|
pthread_mutex_lock(&LOCK_active_mi);
|
||||||
var->value= buff;
|
var->value= buff;
|
||||||
*((my_bool *)buff)= (my_bool) (active_mi && active_mi->slave_running &&
|
*((my_bool *)buff)= (my_bool) (active_mi &&
|
||||||
|
active_mi->slave_running == MYSQL_SLAVE_RUN_CONNECT &&
|
||||||
active_mi->rli.slave_running);
|
active_mi->rli.slave_running);
|
||||||
pthread_mutex_unlock(&LOCK_active_mi);
|
pthread_mutex_unlock(&LOCK_active_mi);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1615,9 +1615,9 @@ void log_slow_statement(THD *thd)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Do not log administrative statements unless the appropriate option is
|
Do not log administrative statements unless the appropriate option is
|
||||||
set; do not log into slow log if reading from backup.
|
set.
|
||||||
*/
|
*/
|
||||||
if (thd->enable_slow_log && !thd->user_time)
|
if (thd->enable_slow_log)
|
||||||
{
|
{
|
||||||
ulonglong end_utime_of_query= thd->current_utime();
|
ulonglong end_utime_of_query= thd->current_utime();
|
||||||
thd_proc_info(thd, "logging slow query");
|
thd_proc_info(thd, "logging slow query");
|
||||||
|
@ -1150,6 +1150,19 @@ bool change_master(THD* thd, Master_info* mi)
|
|||||||
|
|
||||||
thd_proc_info(thd, "Changing master");
|
thd_proc_info(thd, "Changing master");
|
||||||
LEX_MASTER_INFO* lex_mi= &thd->lex->mi;
|
LEX_MASTER_INFO* lex_mi= &thd->lex->mi;
|
||||||
|
/*
|
||||||
|
We need to check if there is an empty master_host. Otherwise
|
||||||
|
change master succeeds, a master.info file is created containing
|
||||||
|
empty master_host string and when issuing: start slave; an error
|
||||||
|
is thrown stating that the server is not configured as slave.
|
||||||
|
(See BUG#28796).
|
||||||
|
*/
|
||||||
|
if(lex_mi->host && !*lex_mi->host)
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_ARGUMENTS, MYF(0), "MASTER_HOST");
|
||||||
|
unlock_slave_threads(mi);
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
// TODO: see if needs re-write
|
// TODO: see if needs re-write
|
||||||
if (init_master_info(mi, master_info_file, relay_log_info_file, 0,
|
if (init_master_info(mi, master_info_file, relay_log_info_file, 0,
|
||||||
thread_mask))
|
thread_mask))
|
||||||
|
Reference in New Issue
Block a user