Skip to content

Commit

Permalink
Made sql_log_slow a session variable
Browse files Browse the repository at this point in the history
mysqldump:
- Added --log-queries to allow one to disable logging for the dump

sql/log_event.cc:
- Removed setting of enable_slow_log as it's not required anymore.

sql/sql_parse.cc:
- Set enable_slow_log to value of thd->variables.sql_log_slow as this will speed up tests if slow log is disabled.
- opt_log_slow_admin_statements can now only disable slow log, not enable it.

sql/sql_explain.cc:
- Minor cleanup

Other things:
- Added sql_log_slow to system variables.
- Changed opt_slow_log to global_system_variables.sql_log_slow in all files
- Updated tests to reflect changes
  • Loading branch information
montywi committed Aug 9, 2014
1 parent 7375f02 commit e2b2bde
Show file tree
Hide file tree
Showing 21 changed files with 145 additions and 69 deletions.
10 changes: 8 additions & 2 deletions client/mysqldump.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
*/

#define DUMP_VERSION "10.15"
#define DUMP_VERSION "10.16"

#include <my_global.h>
#include <my_sys.h>
Expand Down Expand Up @@ -111,7 +111,7 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0,
opt_slave_apply= 0,
opt_include_master_host_port= 0,
opt_events= 0, opt_comments_used= 0,
opt_alltspcs=0, opt_notspcs= 0;
opt_alltspcs=0, opt_notspcs= 0, opt_logging;
static my_bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0;
static ulong opt_max_allowed_packet, opt_net_buffer_length;
static MYSQL mysql_connection,*mysql=0;
Expand Down Expand Up @@ -381,6 +381,8 @@ static struct my_option my_long_options[] =
{"log-error", OPT_ERROR_LOG_FILE, "Append warnings and errors to given file.",
&log_error_file, &log_error_file, 0, GET_STR,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"log-queries", 0, "When restoring the dump, the server will, if logging turned on, log the queries to the general and slow query log.",
&opt_logging, &opt_logging, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
{"master-data", OPT_MASTER_DATA,
"This causes the binary log position and filename to be appended to the "
"output. If equal to 1, will print it as a CHANGE MASTER command; if equal"
Expand Down Expand Up @@ -663,6 +665,10 @@ static void write_header(FILE *sql_file, char *db_name)
print_comment(sql_file, 0, "-- Server version\t%s\n",
mysql_get_server_info(&mysql_connection));

if (!opt_logging)
fprintf(sql_file,
"\n/*M!100101 SET LOCAL SQL_LOG_OFF=0, LOCAL SLOW_QUERY_LOG=0 */;");

if (opt_set_charset)
fprintf(sql_file,
"\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;"
Expand Down
13 changes: 12 additions & 1 deletion mysql-test/r/log_state.result
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,21 @@ select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text thread_id
# Switch to connection default
set global slow_query_log= ON;
set local slow_query_log= ON;
# Switch to connection con1
set session long_query_time = @long_query_time;
select sleep(@long_query_time + 1);
sleep(@long_query_time + 1)
0
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text thread_id
TIMESTAMP USER_HOST QUERY_TIME 00:00:00.000000 1 0 test 0 0 1 select sleep(@long_query_time + 1) THREAD_ID
set local slow_query_log= ON;
select sleep(@long_query_time + 2);
sleep(@long_query_time + 2)
0
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text thread_id
TIMESTAMP USER_HOST QUERY_TIME 00:00:00.000000 1 0 test 0 0 1 select sleep(@long_query_time + 2) THREAD_ID
# Switch to connection default
show global variables
where Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Expand All @@ -62,6 +69,7 @@ set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;
set local slow_query_log= ON;
set global general_log= ON;
truncate table mysql.general_log;
create table t1(f1 int);
Expand Down Expand Up @@ -124,6 +132,9 @@ Variable_name Value
general_log OFF
show variables like 'slow_query_log';
Variable_name Value
slow_query_log ON
show global variables like 'slow_query_log';
Variable_name Value
slow_query_log OFF
set global general_log=ON;
set global log_output=default;
Expand Down
10 changes: 10 additions & 0 deletions mysql-test/r/mysqldump.result
Original file line number Diff line number Diff line change
Expand Up @@ -5290,3 +5290,13 @@ Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
#
# Test mysqldump with --disable-query-logs
#
create table t1 (a int);
insert into t1 values (1);
drop table t1;
select * from t1;
a
1
drop table t1;
16 changes: 11 additions & 5 deletions mysql-test/suite/sys_vars/r/slow_query_log_basic.result
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,17 @@ ERROR 42000: Variable 'slow_query_log' can't be set to the value of ' '
SET @@global.slow_query_log = '';
ERROR 42000: Variable 'slow_query_log' can't be set to the value of ''
'#-------------------FN_DYNVARS_004_04----------------------------#'
SET @@global.slow_query_log = ON;
SET @@session.slow_query_log = ON;
SELECT @@session.slow_query_log;
@@session.slow_query_log
1
SET @@session.slow_query_log = OFF;
ERROR HY000: Variable 'slow_query_log' is a GLOBAL variable and should be set with SET GLOBAL
SELECT @@session.slow_query_log;
ERROR HY000: Variable 'slow_query_log' is a GLOBAL variable
@@session.slow_query_log
0
SET @@global.slow_query_log = OFF;
SET @@session.slow_query_log = ON;
'#----------------------FN_DYNVARS_004_05------------------------#'
SELECT IF(@@global.slow_query_log, "ON", "OFF") = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
Expand All @@ -72,12 +79,11 @@ SELECT @@global.slow_query_log;
0
'#---------------------FN_DYNVARS_004_08----------------------#'
SET @@global.slow_query_log = ON;
SET @@local.slow_query_log = OFF;
SELECT @@slow_query_log = @@global.slow_query_log;
@@slow_query_log = @@global.slow_query_log
1
0
'#---------------------FN_DYNVARS_004_09----------------------#'
SET slow_query_log = ON;
ERROR HY000: Variable 'slow_query_log' is a GLOBAL variable and should be set with SET GLOBAL
SET local.slow_query_log = OFF;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'slow_query_log = OFF' at line 1
SELECT local.slow_query_log;
Expand Down
14 changes: 12 additions & 2 deletions mysql-test/suite/sys_vars/r/slow_query_log_func.result
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ SET @global_slow_query_log = @@global.slow_query_log;
SET @global_log_output = @@global.log_output;
SET @@session.long_query_time=1;
SET @@global.log_output = 'TABLE';
'----When slow_query_log = OFF----'
'----When global.slow_query_log = OFF----'
SET @@global.slow_query_log = OFF;
TRUNCATE mysql.slow_log;
SELECT sleep(2);
Expand All @@ -11,7 +11,7 @@ sleep(2)
SELECT count(*) FROM mysql.slow_log;
count(*)
0
'----When slow_query_log = ON-----'
'----When global.slow_query_log = ON-----'
SET @@global.slow_query_log = ON;
TRUNCATE mysql.slow_log;
SELECT sleep(2);
Expand All @@ -20,6 +20,16 @@ sleep(2)
SELECT count(*) > 0 FROM mysql.slow_log;
count(*) > 0
1
'----When local.slow_query_log = OFF-----'
SET @@local.slow_query_log = OFF;
TRUNCATE mysql.slow_log;
SELECT sleep(2);
sleep(2)
0
SELECT count(*) FROM mysql.slow_log;
count(*)
0
SET @@local.slow_query_log = ON;
'Bug#47905 stored procedures not logged correctly to slow query log'
TRUNCATE mysql.slow_log;
CREATE PROCEDURE p_test()
Expand Down
15 changes: 8 additions & 7 deletions mysql-test/suite/sys_vars/t/slow_query_log_basic.test
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,16 @@ SET @@global.slow_query_log = '';

--echo '#-------------------FN_DYNVARS_004_04----------------------------#'
##################################################################
# Test if accessing session slow_query_log gives error #
# Test that accessing session slow_query_log dows not give #
##################################################################

--Error ER_GLOBAL_VARIABLE
SET @@global.slow_query_log = ON;
SET @@session.slow_query_log = ON;
SELECT @@session.slow_query_log;
SET @@session.slow_query_log = OFF;
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT @@session.slow_query_log;

SET @@global.slow_query_log = OFF;
SET @@session.slow_query_log = ON;

--echo '#----------------------FN_DYNVARS_004_05------------------------#'
##############################################################################
Expand Down Expand Up @@ -132,18 +134,17 @@ SELECT @@global.slow_query_log;
--echo '#---------------------FN_DYNVARS_004_08----------------------#'
##############################################################################
# Check if accessing variable with SESSION,LOCAL and without SCOPE points #
# to same session variable #
# to same session variable (doesn't) #
##############################################################################

SET @@global.slow_query_log = ON;
SET @@local.slow_query_log = OFF;
SELECT @@slow_query_log = @@global.slow_query_log;

--echo '#---------------------FN_DYNVARS_004_09----------------------#'
######################################################################
# Check if slow_query_log can be accessed with and without @@ sign #
######################################################################
--Error ER_GLOBAL_VARIABLE
SET slow_query_log = ON;
--Error ER_PARSE_ERROR
SET local.slow_query_log = OFF;
--Error ER_UNKNOWN_TABLE
Expand Down
15 changes: 13 additions & 2 deletions mysql-test/suite/sys_vars/t/slow_query_log_func.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ SET @@session.long_query_time=1;
SET @@global.log_output = 'TABLE';

#=========================================
--echo '----When slow_query_log = OFF----'
--echo '----When global.slow_query_log = OFF----'
#=========================================

SET @@global.slow_query_log = OFF;
Expand All @@ -21,7 +21,7 @@ SELECT sleep(2);
SELECT count(*) FROM mysql.slow_log;

#=========================================
--echo '----When slow_query_log = ON-----'
--echo '----When global.slow_query_log = ON-----'
#=========================================

SET @@global.slow_query_log = ON;
Expand All @@ -31,6 +31,17 @@ SELECT sleep(2);

SELECT count(*) > 0 FROM mysql.slow_log;

#=========================================
--echo '----When local.slow_query_log = OFF-----'
#=========================================

SET @@local.slow_query_log = OFF;
TRUNCATE mysql.slow_log;
# The sleep is the slow query
SELECT sleep(2);

SELECT count(*) FROM mysql.slow_log;
SET @@local.slow_query_log = ON;

#==========================================================================
--echo 'Bug#47905 stored procedures not logged correctly to slow query log'
Expand Down
8 changes: 8 additions & 0 deletions mysql-test/t/log_state.test
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,18 @@ select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
connection default;

set global slow_query_log= ON;
set local slow_query_log= ON;
--echo # Switch to connection con1
connection con1;
set session long_query_time = @long_query_time;
select sleep(@long_query_time + 1);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME 12 THREAD_ID
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
set local slow_query_log= ON;
select sleep(@long_query_time + 2);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME 12 THREAD_ID
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';

--echo # Switch to connection default
connection default;
show global variables
Expand All @@ -69,6 +75,7 @@ set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;
set local slow_query_log= ON;

set global general_log= ON;
truncate table mysql.general_log;
Expand Down Expand Up @@ -127,6 +134,7 @@ set global general_log_file= default;
set global slow_query_log_file= default;
show variables like 'general_log';
show variables like 'slow_query_log';
show global variables like 'slow_query_log';
set global general_log=ON;
set global log_output=default;
show variables like 'log_output';
Expand Down
15 changes: 15 additions & 0 deletions mysql-test/t/mysqldump.test
Original file line number Diff line number Diff line change
Expand Up @@ -2473,3 +2473,18 @@ drop table t1, t2;
--exec $MYSQL_DUMP --user=foo 2>&1 > $MYSQLTEST_VARDIR/tmp/bug6056.out
--exec $MYSQL_DUMP --help > $MYSQLTEST_VARDIR/tmp/bug6056.out

--echo #
--echo # Test mysqldump with --disable-query-logs
--echo #

create table t1 (a int);
insert into t1 values (1);

--exec $MYSQL_DUMP --hex-blob --character-sets-dir=$MYSQL_SHAREDIR/charsets --tab=$MYSQLTEST_VARDIR/tmp/ test t1
--exec $MYSQL_DUMP --disable-log-queries --skip-comments test t1 >$MYSQLTEST_VARDIR/tmp/mysqldump-test.out
drop table t1;

--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/mysqldump-test.out
select * from t1;
drop table t1;
--remove_file $MYSQLTEST_VARDIR/tmp/mysqldump-test.out
18 changes: 9 additions & 9 deletions sql/log.cc
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,7 @@ bool LOGGER::is_log_table_enabled(uint log_table_type)
{
switch (log_table_type) {
case QUERY_LOG_SLOW:
return (table_log_handler != NULL) && opt_slow_log;
return (table_log_handler != NULL) && global_system_variables.sql_log_slow;
case QUERY_LOG_GENERAL:
return (table_log_handler != NULL) && opt_log ;
default:
Expand Down Expand Up @@ -1048,7 +1048,7 @@ bool Log_to_file_event_handler::init()
{
if (!is_initialized)
{
if (opt_slow_log)
if (global_system_variables.sql_log_slow)
mysql_slow_log.open_slow_log(opt_slow_logname);

if (opt_log)
Expand All @@ -1072,7 +1072,7 @@ void Log_to_file_event_handler::flush()
/* reopen log files */
if (opt_log)
mysql_log.reopen_file();
if (opt_slow_log)
if (global_system_variables.sql_log_slow)
mysql_slow_log.reopen_file();
}

Expand Down Expand Up @@ -1200,7 +1200,7 @@ bool LOGGER::flush_slow_log()
logger.lock_exclusive();

/* Reopen slow log file */
if (opt_slow_log)
if (global_system_variables.sql_log_slow)
file_log_handler->get_mysql_slow_log()->reopen_file();

/* End of log flush */
Expand Down Expand Up @@ -1270,11 +1270,11 @@ bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
if (*slow_log_handler_list)
{
/* do not log slow queries from replication threads */
if (thd->slave_thread && !opt_log_slow_slave_statements)
if (!thd->variables.sql_log_slow)
return 0;

lock_shared();
if (!opt_slow_log)
if (!global_system_variables.sql_log_slow)
{
unlock();
return 0;
Expand Down Expand Up @@ -1448,7 +1448,7 @@ bool LOGGER::activate_log_handler(THD* thd, uint log_type)
lock_exclusive();
switch (log_type) {
case QUERY_LOG_SLOW:
if (!opt_slow_log)
if (!global_system_variables.sql_log_slow)
{
file_log= file_log_handler->get_mysql_slow_log();

Expand All @@ -1462,7 +1462,7 @@ bool LOGGER::activate_log_handler(THD* thd, uint log_type)
else
{
init_slow_log(log_output_options);
opt_slow_log= TRUE;
global_system_variables.sql_log_slow= TRUE;
}
}
break;
Expand Down Expand Up @@ -1501,7 +1501,7 @@ void LOGGER::deactivate_log_handler(THD *thd, uint log_type)

switch (log_type) {
case QUERY_LOG_SLOW:
tmp_opt= &opt_slow_log;
tmp_opt= &global_system_variables.sql_log_slow;
file_log= file_log_handler->get_mysql_slow_log();
break;
case QUERY_LOG_GENERAL:
Expand Down
13 changes: 1 addition & 12 deletions sql/log_event.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4280,25 +4280,14 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
THD_STAGE_INFO(thd, stage_init);
MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(), thd->query_length());

thd->enable_slow_log= thd->variables.sql_log_slow;
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state);
/* Finalize server status flags after executing a statement. */
thd->update_server_status();
log_slow_statement(thd);
}

thd->variables.option_bits&= ~OPTION_MASTER_SQL_ERROR;

/*
Resetting the enable_slow_log thd variable.
We need to reset it back to the opt_log_slow_slave_statements
value after the statement execution (and slow logging
is done). It might have changed if the statement was an
admin statement (in which case, down in mysql_parse execution
thd->enable_slow_log is set to the value of
opt_log_slow_admin_statements).
*/
thd->enable_slow_log= opt_log_slow_slave_statements;
}
else
{
Expand Down
Loading

0 comments on commit e2b2bde

Please sign in to comment.