Below is the list of changes that have just been committed into a local
5.1 repository of gluh. When gluh does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2362 06/04/25 10:24:31 gluh@stripped +12 -0
WL#3015: Logging Improvements - No Restarts
Added SLOW_QUERY_LOG & GENERAL_LOG global variables.
Added slow-query-log & general-log startup options.
Added log_output, log_path, log_slow_queries_path global variables
SLOW_QUERY_LOG & GENERAL_LOG can be set 'ON' or 'OFF'
and turn logs ON/OFF while server is running.
slow-query-log & general-log startup options
can be 0 or 1 and enable | disable logging
at startup. These options have sence
only if --log & --log-slow-queries are set.
log_output can be changed only if both(slow&general) logs is disabled.
log_path can be changed only if general is log disabled.
log_slow_queries_path can be changed only if slow log is disabled.
mysql-test/t/log_state.test
1.1 06/04/25 10:24:21 gluh@stripped +116 -0
mysql-test/t/log_state-master.opt
1.1 06/04/25 10:24:21 gluh@stripped +1 -0
mysql-test/t/log_state.test
1.0 06/04/25 10:24:21 gluh@stripped +0 -0
BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/t/log_state.test
mysql-test/t/log_state-master.opt
1.0 06/04/25 10:24:21 gluh@stripped +0 -0
BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/t/log_state-master.opt
mysql-test/r/log_state.result
1.1 06/04/25 10:24:20 gluh@stripped +149 -0
sql/sql_delete.cc
1.181 06/04/25 10:24:20 gluh@stripped +6 -4
WL#3015: Logging Improvements - No Restarts
'truncate table slow_log|general', keep status of logs
sql/share/errmsg.txt
1.93 06/04/25 10:24:20 gluh@stripped +2 -0
WL#3015: Logging Improvements - No Restarts
added error massage
sql/set_var.h
1.85 06/04/25 10:24:20 gluh@stripped +30 -2
WL#3015: Logging Improvements - No Restarts
new class sys_var_log_state
new class sys_var_log_output
sql/set_var.cc
1.182 06/04/25 10:24:20 gluh@stripped +244 -1
WL#3015: Logging Improvements - No Restarts
added 'slow_query_log' & 'general_log' updatable variables
added 'log_output', 'log_path', 'log_slow_queries' updatable variables
mysql-test/r/log_state.result
1.0 06/04/25 10:24:20 gluh@stripped +0 -0
BitKeeper file /home/gluh/MySQL/Devel/5.1.3015/mysql-test/r/log_state.result
sql/mysqld.cc
1.557 06/04/25 10:24:19 gluh@stripped +41 -6
WL#3015: Logging Improvements - No Restarts
added 'slow-query-log' & 'general-log' options
sql/mysql_priv.h
1.392 06/04/25 10:24:19 gluh@stripped +6 -0
WL#3015: Logging Improvements - No Restarts
sql/log.h
1.9 06/04/25 10:24:19 gluh@stripped +3 -0
WL#3015: Logging Improvements - No Restarts
added methods to LOGGER class
void deactivate_log_handlers(THD* thd, uint log_type);
void activate_log_handlers(THD* thd, uint log_type);
sql/log.cc
1.206 06/04/25 10:24:19 gluh@stripped +103 -34
WL#3015: Logging Improvements - No Restarts
added methods to LOGGER class
void deactivate_log_handlers(THD* thd, uint log_type);
void activate_log_handlers(THD* thd, uint log_type);
mysql-test/r/show_check.result
1.94 06/04/25 10:24:19 gluh@stripped +7 -13
WL#3015: Logging Improvements - No Restarts
result fix
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: gluh
# Host: eagle.intranet.mysql.r18.ru
# Root: /home/gluh/MySQL/Devel/5.1.3015
--- 1.205/sql/log.cc Tue Apr 18 09:43:01 2006
+++ 1.206/sql/log.cc Tue Apr 25 10:24:19 2006
@@ -35,9 +35,6 @@
#define MAX_USER_HOST_SIZE 512
#define MAX_TIME_SIZE 32
-/* we need this for log files intialization */
-extern char *opt_logname, *opt_slow_logname;
-
LOGGER logger;
MYSQL_LOG mysql_bin_log;
@@ -53,6 +50,13 @@ static int binlog_commit(THD *thd, bool
static int binlog_rollback(THD *thd, bool all);
static int binlog_prepare(THD *thd, bool all);
+char *make_log_name(char *buff,const char* log_ext)
+{
+ strmake(buff, glob_hostname, FN_REFLEN-5);
+ strmov(fn_ext(buff), log_ext);
+ return fn_format(buff, buff, mysql_data_home,"",MY_UNPACK_FILENAME);
+}
+
/*
This is a POD. Please keep it that way!
@@ -276,8 +280,10 @@ bool Log_to_csv_event_handler::reopen_lo
void Log_to_csv_event_handler::cleanup()
{
- close_log_table(QUERY_LOG_GENERAL, FALSE);
- close_log_table(QUERY_LOG_SLOW, FALSE);
+ if (opt_general_log)
+ close_log_table(QUERY_LOG_GENERAL, FALSE);
+ if (opt_slow_query_log)
+ close_log_table(QUERY_LOG_SLOW, FALSE);
logger.is_log_tables_initialized= FALSE;
}
@@ -530,11 +536,11 @@ bool Log_to_file_event_handler::init()
{
if (!is_initialized)
{
- if (opt_slow_log)
- mysql_slow_log.open_slow_log(opt_slow_logname);
+ if (opt_slow_query_log)
+ mysql_slow_log.open_slow_log(sys_var_slow_log_path.value);
- if (opt_log)
- mysql_log.open_query_log(opt_logname);
+ if (opt_general_log)
+ mysql_log.open_query_log(sys_var_general_log_path.value);
is_initialized= TRUE;
}
@@ -552,8 +558,10 @@ void Log_to_file_event_handler::cleanup(
void Log_to_file_event_handler::flush()
{
/* reopen log files */
- mysql_log.new_file(1);
- mysql_slow_log.new_file(1);
+ if (opt_general_log)
+ mysql_log.new_file(1);
+ if (opt_slow_query_log)
+ mysql_slow_log.new_file(1);
}
/*
@@ -673,6 +681,12 @@ bool LOGGER::flush_logs(THD *thd)
close_general_log.db= (char*) "mysql";
close_general_log.db_length= 5;
+ /*
+ Deny others from logging to general and slow log,
+ while reopening tables.
+ */
+ logger.lock();
+
/* reopen log files */
file_log_handler->flush();
@@ -689,23 +703,18 @@ bool LOGGER::flush_logs(THD *thd)
Here we use one of the logger handler THD's. Simply because it
seems appropriate.
*/
- lock_and_wait_for_table_name(table_log_handler->general_log_thd,
- &close_slow_log);
- lock_and_wait_for_table_name(table_log_handler->general_log_thd,
- &close_general_log);
-
- /*
- Deny others from logging to general and slow log,
- while reopening tables.
- */
- logger.lock();
+ if (opt_slow_query_log)
+ lock_and_wait_for_table_name(table_log_handler->general_log_thd,
+ &close_slow_log);
+ if (opt_general_log)
+ lock_and_wait_for_table_name(table_log_handler->general_log_thd,
+ &close_general_log);
table_log_handler->flush(table_log_handler->general_log_thd,
&close_slow_log, &close_general_log);
-
- /* end of log tables flush */
- logger.unlock();
}
+ /* end of log flush */
+ logger.unlock();
return FALSE;
}
@@ -753,6 +762,11 @@ bool LOGGER::slow_log_print(THD *thd, co
return 0;
lock();
+ if (!opt_slow_query_log)
+ {
+ unlock();
+ return 0;
+ }
/* fill in user_host value: the format is "%s[%s] @ %s [%s]" */
user_host_len= strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
@@ -827,6 +841,11 @@ bool LOGGER::general_log_print(THD *thd,
id=0; /* Log from connect handler */
lock();
+ if (!opt_general_log)
+ {
+ unlock();
+ return 0;
+ }
time_t current_time= time(NULL);
user_host_len= strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
@@ -930,26 +949,76 @@ void LOGGER::init_general_log(uint gener
}
+bool LOGGER::activate_log_handlers(THD* thd, uint log_type)
+{
+ bool res= 0;
+ reopen_log_table(log_type);
+ if (log_type == QUERY_LOG_GENERAL)
+ {
+ if ((res= file_log_handler->
+ mysql_log.open_query_log(sys_var_general_log_path.value)))
+ goto err;
+ }
+ else
+ res= file_log_handler->
+ mysql_slow_log.open_query_log(sys_var_slow_log_path.value);
+
+err:
+ return res;
+}
+
+
+void LOGGER::deactivate_log_handlers(THD* thd, uint log_type)
+{
+ TABLE_LIST *table_list;
+ if (log_type == QUERY_LOG_GENERAL)
+ table_list= &table_log_handler->general_log;
+ else
+ table_list= &table_log_handler->slow_log;
+ VOID(pthread_mutex_lock(&LOCK_open));
+ close_log_table(log_type, TRUE);
+ query_cache_invalidate3(thd, table_list, 0);
+ unlock_table_name(thd, table_list);
+ VOID(pthread_mutex_unlock(&LOCK_open));
+ if (log_type == QUERY_LOG_GENERAL)
+ file_log_handler->mysql_log.close(LOG_CLOSE_INDEX|LOG_CLOSE_STOP_EVENT);
+ else
+ file_log_handler->mysql_slow_log.close(LOG_CLOSE_INDEX|LOG_CLOSE_STOP_EVENT);
+}
+
+
bool Log_to_csv_event_handler::flush(THD *thd, TABLE_LIST *close_slow_log,
TABLE_LIST *close_general_log)
{
VOID(pthread_mutex_lock(&LOCK_open));
- close_log_table(QUERY_LOG_GENERAL, TRUE);
- close_log_table(QUERY_LOG_SLOW, TRUE);
- close_general_log->next_local= close_slow_log;
- query_cache_invalidate3(thd, close_general_log, 0);
- unlock_table_name(thd, close_slow_log);
- unlock_table_name(thd, close_general_log);
+ if (opt_general_log)
+ {
+ close_log_table(QUERY_LOG_GENERAL, TRUE);
+ query_cache_invalidate3(thd, close_general_log, 0);
+ unlock_table_name(thd, close_general_log);
+ }
+ if (opt_slow_query_log)
+ {
+ close_log_table(QUERY_LOG_SLOW, TRUE);
+ query_cache_invalidate3(thd, close_slow_log, 0);
+ unlock_table_name(thd, close_slow_log);
+ }
VOID(pthread_mutex_unlock(&LOCK_open));
- return reopen_log_table(QUERY_LOG_SLOW) ||
- reopen_log_table(QUERY_LOG_GENERAL);
+
+ if (opt_slow_query_log && reopen_log_table(QUERY_LOG_SLOW) ||
+ opt_general_log && reopen_log_table(QUERY_LOG_GENERAL))
+ return 1;
+ return 0;
}
/* the parameters are unused for the log tables */
bool Log_to_csv_event_handler::init()
{
- /* we always open log tables. even if the logging is disabled */
- return (open_log_table(QUERY_LOG_GENERAL) || open_log_table(QUERY_LOG_SLOW));
+ if (opt_general_log && open_log_table(QUERY_LOG_GENERAL))
+ return 1;
+ if (opt_slow_query_log && open_log_table(QUERY_LOG_SLOW))
+ return 1;
+ return 0;
}
int LOGGER::set_handlers(uint error_log_printer,
--- 1.391/sql/mysql_priv.h Sun Apr 16 06:17:25 2006
+++ 1.392/sql/mysql_priv.h Tue Apr 25 10:24:19 2006
@@ -1065,6 +1065,7 @@ bool rename_temporary_table(THD* thd, TA
void remove_db_from_cache(const char *db);
void flush_tables();
bool is_equal(const LEX_STRING *a, const LEX_STRING *b);
+char *make_log_name(char *buff,const char* log_ext);
#ifdef WITH_PARTITION_STORAGE_ENGINE
uint fast_alter_partition_table(THD *thd, TABLE *table,
@@ -1308,6 +1309,7 @@ extern ulong expire_logs_days, sync_binl
extern ulong opt_tc_log_size, tc_log_max_pages_used, tc_log_page_size;
extern ulong tc_log_page_waits;
extern my_bool relay_log_purge, opt_innodb_safe_binlog, opt_innodb;
+extern my_bool opt_general_log, opt_slow_query_log;
extern uint test_flags,select_errors,ha_open_options;
extern uint protocol_version, mysqld_port, dropping_tables;
extern uint delay_key_write_options, lower_case_table_names;
@@ -1316,6 +1318,7 @@ extern my_bool locked_in_memory;
extern bool opt_using_transactions, mysqld_embedded;
extern bool using_update_log, opt_large_files, server_id_supplied;
extern bool opt_log, opt_update_log, opt_bin_log, opt_slow_log, opt_error_log;
+extern uint log_output_options;
extern bool opt_disable_networking, opt_skip_show_db;
extern my_bool opt_character_set_client_handshake;
extern bool volatile abort_loop, shutdown_in_progress, grant_option;
@@ -1336,6 +1339,8 @@ extern my_bool opt_enable_shared_memory;
extern char *default_tz_name;
extern my_bool opt_large_pages;
extern uint opt_large_page_size;
+extern char *opt_logname, *opt_slow_logname;
+extern const char *log_output_str;
extern MYSQL_LOG mysql_bin_log;
extern LOGGER logger;
@@ -1380,6 +1385,7 @@ extern TABLE *unused_tables;
extern const char* any_db;
extern struct my_option my_long_options[];
extern const LEX_STRING view_type;
+extern TYPELIB log_output_typelib;
/* optional things, have_* variables */
--- 1.556/sql/mysqld.cc Mon Apr 17 22:06:12 2006
+++ 1.557/sql/mysqld.cc Tue Apr 25 10:24:19 2006
@@ -302,16 +302,15 @@ arg_cmp_func Arg_comparator::comparator_
{&Arg_comparator::compare_row, &Arg_comparator::compare_e_row},
{&Arg_comparator::compare_decimal, &Arg_comparator::compare_e_decimal}};
-const char *log_output_names[] =
-{ "NONE", "FILE", "TABLE", NullS};
+const char *log_output_names[] = { "NONE", "FILE", "TABLE", NullS};
+static const unsigned int log_output_names_len[]= { 4, 4, 5, 0 };
TYPELIB log_output_typelib= {array_elements(log_output_names)-1,"",
- log_output_names, NULL};
+ log_output_names,
+ (unsigned int *) log_output_names_len};
/* static variables */
/* the default log output is log tables */
-static const char *log_output_str= "TABLE";
-static ulong log_output_options= LOG_TABLE;
static bool lower_case_table_names_used= 0;
static bool volatile select_thread_in_use, signal_thread_in_use;
static bool volatile ready_to_exit;
@@ -344,6 +343,7 @@ static my_bool opt_sync_bdb_logs;
/* Global variables */
bool opt_log, opt_update_log, opt_bin_log, opt_slow_log;
+uint log_output_options;
bool opt_error_log= IF_WIN(1,0);
bool opt_disable_networking=0, opt_skip_show_db=0;
my_bool opt_character_set_client_handshake= 1;
@@ -362,6 +362,7 @@ my_bool opt_safe_user_create = 0, opt_no
my_bool opt_show_slave_auth_info, opt_sql_bin_update = 0;
my_bool opt_log_slave_updates= 0;
my_bool opt_innodb;
+my_bool opt_general_log, opt_slow_query_log;
#ifdef WITH_INNOBASE_STORAGE_ENGINE
extern SHOW_VAR innodb_status_variables[];
extern uint innobase_init_flags, innobase_lock_type;
@@ -504,6 +505,7 @@ ulong thread_id=1L,current_pid;
ulong slow_launch_threads = 0, sync_binlog_period;
ulong expire_logs_days = 0;
ulong rpl_recovery_rank=0;
+const char *log_output_str= "TABLE";
double log_10[32]; /* 10 potences */
time_t start_time;
@@ -1180,6 +1182,8 @@ void clean_up(bool print_message)
free_defaults(defaults_argv);
my_free(sys_init_connect.value, MYF(MY_ALLOW_ZERO_PTR));
my_free(sys_init_slave.value, MYF(MY_ALLOW_ZERO_PTR));
+ my_free(sys_var_general_log_path.value, MYF(MY_ALLOW_ZERO_PTR));
+ my_free(sys_var_slow_log_path.value, MYF(MY_ALLOW_ZERO_PTR));
free_tmpdir(&mysql_tmpdir_list);
#ifdef HAVE_REPLICATION
my_free(slave_load_tmpdir,MYF(MY_ALLOW_ZERO_PTR));
@@ -2568,6 +2572,7 @@ static bool init_global_datetime_format(
static int init_common_variables(const char *conf_file_name, int argc,
char **argv, const char **groups)
{
+ char buff[FN_REFLEN];
umask(((~my_umask) & 0666));
my_decimal_set_zero(&decimal_zero); // set decimal_zero constant;
tzset(); // Set tzname
@@ -2736,6 +2741,22 @@ static int init_common_variables(const c
else
sys_init_slave.value=my_strdup("",MYF(0));
+ if(opt_log)
+ {
+ if (!opt_logname)
+ opt_logname= make_log_name(buff, ".log");
+ sys_var_general_log_path.value= my_strdup(opt_logname, MYF(0));
+ sys_var_general_log_path.value_length= strlen(opt_logname);
+ }
+
+ if(opt_slow_log)
+ {
+ if (!opt_slow_logname)
+ opt_slow_logname= make_log_name(buff, "-slow.log");
+ sys_var_slow_log_path.value= my_strdup(opt_slow_logname, MYF(0));
+ sys_var_slow_log_path.value_length= strlen(opt_slow_logname);
+ }
+
if (use_temp_pool && bitmap_init(&temp_pool,0,1024,1))
return 1;
if (my_database_names_init())
@@ -4724,7 +4745,9 @@ enum options_mysqld
OPT_TABLE_LOCK_WAIT_TIMEOUT,
OPT_PLUGIN_DIR,
OPT_LOG_OUTPUT,
- OPT_PORT_OPEN_TIMEOUT
+ OPT_PORT_OPEN_TIMEOUT,
+ OPT_GENERAL_LOG,
+ OPT_SLOW_LOG
};
@@ -4960,6 +4983,9 @@ Disable with --skip-bdb (will save memor
"Set up signals usable for debugging",
(gptr*) &opt_debugging, (gptr*) &opt_debugging,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+ {"general-log", OPT_GENERAL_LOG,
+ "Enable|disable general log", (gptr*) &opt_general_log,
+ (gptr*) &opt_general_log, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0},
#ifdef HAVE_LARGE_PAGES
{"large-pages", OPT_ENABLE_LARGE_PAGES, "Enable support for large pages. \
Disable with --skip-large-pages.",
@@ -5529,6 +5555,9 @@ replicating a LOAD DATA INFILE command."
"Tells the slave thread to continue replication when a query returns an error from the
provided list.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
+ {"slow-query-log", OPT_SLOW_LOG,
+ "Enable|disable slow query log", (gptr*) &opt_slow_query_log,
+ (gptr*) &opt_slow_query_log, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0},
{"socket", OPT_SOCKET, "Socket file to use for connection.",
(gptr*) &mysqld_unix_port, (gptr*) &mysqld_unix_port, 0, GET_STR,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -6851,7 +6880,9 @@ static void mysql_init_variables(void)
/* Things reset to zero */
opt_skip_slave_start= opt_reckless_slave = 0;
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
+ opt_general_log= opt_slow_query_log= 1;
opt_log= opt_update_log= opt_slow_log= 0;
+ log_output_options= LOG_TABLE;
opt_bin_log= 0;
opt_disable_networking= opt_skip_show_db=0;
opt_logname= opt_update_logname= opt_binlog_index_name= opt_slow_logname= 0;
@@ -7797,6 +7828,10 @@ static void get_options(int argc,char **
&global_system_variables.datetime_format))
exit(1);
+ if (!opt_log && opt_general_log)
+ opt_general_log= 0;
+ if (!opt_slow_log && opt_slow_query_log)
+ opt_slow_query_log= 0;
}
--- 1.180/sql/sql_delete.cc Tue Apr 11 15:15:49 2006
+++ 1.181/sql/sql_delete.cc Tue Apr 25 10:24:20 2006
@@ -930,7 +930,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST
{
lock_logger= 1;
logger.lock();
- logger.close_log_table(QUERY_LOG_GENERAL, FALSE);
+ if (opt_general_log)
+ logger.close_log_table(QUERY_LOG_GENERAL, FALSE);
closed_log_tables= closed_log_tables | QUERY_LOG_GENERAL;
}
else
@@ -939,7 +940,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST
{
lock_logger= 1;
logger.lock();
- logger.close_log_table(QUERY_LOG_SLOW, FALSE);
+ if (opt_slow_query_log)
+ logger.close_log_table(QUERY_LOG_SLOW, FALSE);
closed_log_tables= closed_log_tables | QUERY_LOG_SLOW;
}
}
@@ -973,10 +975,10 @@ end:
unlock_table_name(thd, table_list);
VOID(pthread_mutex_unlock(&LOCK_open));
- if (closed_log_tables & QUERY_LOG_SLOW)
+ if (opt_slow_query_log && (closed_log_tables & QUERY_LOG_SLOW))
logger.reopen_log_table(QUERY_LOG_SLOW);
- if (closed_log_tables & QUERY_LOG_GENERAL)
+ if (opt_general_log && (closed_log_tables & QUERY_LOG_GENERAL))
logger.reopen_log_table(QUERY_LOG_GENERAL);
if (lock_logger)
logger.unlock();
--- 1.92/sql/share/errmsg.txt Sat Apr 15 02:48:23 2006
+++ 1.93/sql/share/errmsg.txt Tue Apr 25 10:24:20 2006
@@ -5832,3 +5832,5 @@ ER_NULL_IN_VALUES_LESS_THAN
ER_WRONG_PARTITION_NAME
eng "Incorrect partition name"
swe "Felaktigt partitionsnamn"
+ER_CANT_CHANGE_LOG_VAR
+ eng "'%-.64s' is disabled. Cannot change '%-.64s' variable."
--- New file ---
+++ mysql-test/r/log_state.result 06/04/25 10:24:20
truncate table mysql.general_log;
truncate table mysql.slow_log;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name Value
general_log OFF
log ON
log_slow_queries ON
slow_query_log OFF
flush logs;
set global general_log= ON;
create table t1(f1 int);
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
TIMESTAMP root[root] @ localhost [] 1 1 Query create table t1(f1 int)
TIMESTAMP root[root] @ localhost [] 1 1 Query select * from mysql.general_log
set global general_log= OFF;
drop table t1;
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
TIMESTAMP root[root] @ localhost [] 1 1 Query create table t1(f1 int)
TIMESTAMP root[root] @ localhost [] 1 1 Query select * from mysql.general_log
TIMESTAMP root[root] @ localhost [] 1 1 Query set global general_log= OFF
set global general_log= ON;
flush logs;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name Value
general_log ON
log ON
log_slow_queries ON
slow_query_log OFF
set session long_query_time=1;
select sleep(2);
sleep(2)
0
select * from mysql.slow_log;
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
set global slow_query_log= ON;
set session long_query_time=1;
select sleep(2);
sleep(2)
0
select * from mysql.slow_log;
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
TIMESTAMP, root[root] @ localhost [] USER_HOST, QUERY_TIME 1 0 test 0 0 1 select sleep(2)
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name Value
general_log ON
log ON
log_slow_queries ON
slow_query_log ON
set global general_log= ON;
set global general_log= OFF;
set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;
set global general_log= ON;
truncate table mysql.general_log;
create table t1(f1 int);
drop table t1;
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
TIMESTAMP root[root] @ localhost [] 1 1 Query create table t1(f1 int)
TIMESTAMP root[root] @ localhost [] 1 1 Query drop table t1
TIMESTAMP root[root] @ localhost [] 1 1 Query select * from mysql.general_log
set global general_log= OFF;
truncate table mysql.general_log;
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
set global general_log= ON;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
Variable_name Value
general_log ON
log ON
log_slow_queries ON
slow_query_log OFF
show variables like 'log_path';
Variable_name Value
log_path #
show variables like 'log_slow_queries_path';
Variable_name Value
log_slow_queries_path #
show variables like 'log_output';
Variable_name Value
log_output FILE,TABLE
set global log_path='/not exiting path/log.master';
ERROR 42000: Variable 'log_path' can't be set to the value of '/not exiting
path/log.master'
show variables like 'log_path';
Variable_name Value
log_path #
set global general_log= OFF;
set global log_path='/tmp/log.master';
set global general_log= ON;
create table t1(f1 int);
drop table t1;
set global general_log= OFF;
set global log_path=default;
set global general_log= ON;
create table t1(f1 int);
drop table t1;
show variables like 'log_path';
Variable_name Value
log_path #
show variables like 'log_slow_queries_path';
Variable_name Value
log_slow_queries_path #
set global general_log= default;
set global slow_query_log= default;
set global log_path=default;
set global log_slow_queries_path= default;
show variables like 'general_log';
Variable_name Value
general_log OFF
show variables like 'slow_query_log';
Variable_name Value
slow_query_log OFF
set global general_log=ON;
set global log_output=default;
Warnings:
Error 1231 Variable 'log_output' can't be set to the value of 'DEFAULT'
set global general_log=OFF;
set global log_output=FILE;
truncate table mysql.general_log;
show variables like 'log_output';
Variable_name Value
log_output FILE
set global general_log=ON;
create table t1(f1 int);
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
set global general_log=OFF;
set global log_output="FILE,TABLE";
show variables like 'log_output';
Variable_name Value
log_output FILE,TABLE
set global general_log=ON;
drop table t1;
select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument
TIMESTAMP root[root] @ localhost [] 1 1 Query drop table t1
TIMESTAMP root[root] @ localhost [] 1 1 Query select * from mysql.general_log
--- New file ---
+++ mysql-test/t/log_state-master.opt 06/04/25 10:24:21
--log-output=TABLE,FILE --log --general-log=0 --log-slow-queries --slow-query-log=0
--- New file ---
+++ mysql-test/t/log_state.test 06/04/25 10:24:21
-- source include/not_embedded.inc
--source include/have_csv.inc
--disable_ps_protocol
truncate table mysql.general_log;
truncate table mysql.slow_log;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
flush logs;
set global general_log= ON;
create table t1(f1 int);
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= OFF;
drop table t1;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= ON;
flush logs;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
connect (con1,localhost,root,,);
connection con1;
set session long_query_time=1;
select sleep(2);
--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
select * from mysql.slow_log;
connection default;
set global slow_query_log= ON;
connection con1;
set session long_query_time=1;
select sleep(2);
--replace_column 1 TIMESTAMP, 3 USER_HOST, 4 QUERY_TIME
select * from mysql.slow_log;
disconnect con1;
connection default;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
set global general_log= ON;
set global general_log= OFF;
set global general_log= OFF;
set global slow_query_log= ON;
set global slow_query_log= OFF;
set global slow_query_log= OFF;
set global general_log= ON;
truncate table mysql.general_log;
create table t1(f1 int);
drop table t1;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= OFF;
truncate table mysql.general_log;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log= ON;
show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log';
--replace_column 2 #
show variables like 'log_path';
--replace_column 2 #
show variables like 'log_slow_queries_path';
show variables like 'log_output';
--error 1231
set global log_path='/not exiting path/log.master';
--replace_column 2 #
show variables like 'log_path';
set global general_log= OFF;
set global log_path='/tmp/log.master';
set global general_log= ON;
create table t1(f1 int);
drop table t1;
set global general_log= OFF;
set global log_path=default;
set global general_log= ON;
create table t1(f1 int);
drop table t1;
--replace_column 2 #
show variables like 'log_path';
--replace_column 2 #
show variables like 'log_slow_queries_path';
set global general_log= default;
set global slow_query_log= default;
set global log_path=default;
set global log_slow_queries_path= default;
show variables like 'general_log';
show variables like 'slow_query_log';
set global general_log=ON;
set global log_output=default;
set global general_log=OFF;
set global log_output=FILE;
truncate table mysql.general_log;
show variables like 'log_output';
set global general_log=ON;
create table t1(f1 int);
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
set global general_log=OFF;
set global log_output="FILE,TABLE";
show variables like 'log_output';
set global general_log=ON;
drop table t1;
--replace_column 1 TIMESTAMP
select * from mysql.general_log;
--enable_ps_protocol
--- 1.8/sql/log.h Wed Mar 29 16:27:31 2006
+++ 1.9/sql/log.h Tue Apr 25 10:24:19 2006
@@ -416,6 +416,7 @@ public:
class Log_to_file_event_handler: public Log_event_handler
{
+ friend class LOGGER;
MYSQL_LOG mysql_log, mysql_slow_log;
bool is_initialized;
public:
@@ -510,6 +511,8 @@ public:
void init_error_log(uint error_log_printer);
void init_slow_log(uint slow_log_printer);
void init_general_log(uint general_log_printer);
+ void deactivate_log_handlers(THD* thd, uint log_type);
+ bool activate_log_handlers(THD* thd, uint log_type);
};
--- 1.93/mysql-test/r/show_check.result Mon Mar 6 14:35:33 2006
+++ 1.94/mysql-test/r/show_check.result Tue Apr 25 10:24:19 2006
@@ -148,14 +148,12 @@ flush tables;
show open tables;
Database Table In_use Name_locked
mysql general_log 1 0
-mysql slow_log 1 0
create table t1(n int);
insert into t1 values (1);
show open tables;
Database Table In_use Name_locked
-mysql general_log 1 0
-mysql slow_log 1 0
test t1 0 0
+mysql general_log 1 0
drop table t1;
create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1
COMMENT="test" ENGINE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1
ROW_FORMAT=fixed;
show create table t1;
@@ -568,23 +566,21 @@ SELECT 1 FROM mysql.db, mysql.proc, mysq
1
SHOW OPEN TABLES;
Database Table In_use Name_locked
-mysql proc 0 0
+mysql db 0 0
test urkunde 0 0
mysql time_zone 0 0
-mysql db 0 0
+mysql general_log 1 0
test txt1 0 0
-mysql slow_log 1 0
+mysql proc 0 0
test tyt2 0 0
-mysql general_log 1 0
mysql user 0 0
mysql time_zone_name 0 0
SHOW OPEN TABLES FROM mysql;
Database Table In_use Name_locked
-mysql proc 0 0
-mysql time_zone 0 0
mysql db 0 0
-mysql slow_log 1 0
+mysql time_zone 0 0
mysql general_log 1 0
+mysql proc 0 0
mysql user 0 0
mysql time_zone_name 0 0
SHOW OPEN TABLES FROM mysql LIKE 'u%';
@@ -598,16 +594,14 @@ test tyt2 0 0
mysql time_zone_name 0 0
SHOW OPEN TABLES LIKE '%o%';
Database Table In_use Name_locked
-mysql proc 0 0
mysql time_zone 0 0
-mysql slow_log 1 0
mysql general_log 1 0
+mysql proc 0 0
mysql time_zone_name 0 0
FLUSH TABLES;
SHOW OPEN TABLES;
Database Table In_use Name_locked
mysql general_log 1 0
-mysql slow_log 1 0
DROP TABLE txt1;
DROP TABLE tyt2;
DROP TABLE urkunde;
--- 1.181/sql/set_var.cc Wed Mar 29 16:27:31 2006
+++ 1.182/sql/set_var.cc Tue Apr 25 10:24:20 2006
@@ -161,7 +161,11 @@ static KEY_CACHE *create_key_cache(const
void fix_sql_mode_var(THD *thd, enum_var_type type);
static byte *get_error_count(THD *thd);
static byte *get_warning_count(THD *thd);
-
+static int sys_check_log_path(THD *thd, set_var *var);
+static bool sys_update_general_log_path(THD *thd, set_var * var);
+static void sys_default_general_log_path(THD *thd, enum_var_type type);
+static bool sys_update_slow_log_path(THD *thd, set_var * var);
+static void sys_default_slow_log_path(THD *thd, enum_var_type type);
/*
Variable definition list
@@ -649,6 +653,23 @@ sys_var_have_variable sys_have_row_based
/* Global read-only variable describing server license */
sys_var_const_str sys_license("license", STRINGIFY_ARG(LICENSE));
+/* Global variables which enable|disable logging */
+sys_var_log_state sys_var_general_log("general_log", &opt_general_log,
QUERY_LOG_GENERAL);
+sys_var_log_state sys_var_slow_query_log("slow_query_log", &opt_slow_query_log,
QUERY_LOG_SLOW);
+
+sys_var_str sys_var_general_log_path("log_path", sys_check_log_path,
+ sys_update_general_log_path,
+ sys_default_general_log_path,
+ opt_logname);
+sys_var_str sys_var_slow_log_path("log_slow_queries_path", sys_check_log_path,
+ sys_update_slow_log_path,
+ sys_default_slow_log_path,
+ opt_slow_logname);
+sys_var_log_output sys_var_log_output_state("log_output", &log_output_options,
+ &log_output_typelib, 0);
+
+
+
#ifdef HAVE_REPLICATION
static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff)
{
@@ -748,6 +769,7 @@ SHOW_VAR init_vars[]= {
{"ft_min_word_len", (char*) &ft_min_word_len, SHOW_LONG},
{"ft_query_expansion_limit",(char*) &ft_query_expansion_limit, SHOW_LONG},
{"ft_stopword_file", (char*) &ft_stopword_file, SHOW_CHAR_PTR},
+ {sys_var_general_log.name, (char*) &opt_general_log, SHOW_MY_BOOL},
{sys_group_concat_max_len.name, (char*) &sys_group_concat_max_len, SHOW_SYS},
{sys_have_archive_db.name, (char*) &have_archive_db, SHOW_HAVE},
{sys_have_berkeley_db.name, (char*) &have_berkeley_db, SHOW_HAVE},
@@ -825,10 +847,13 @@ SHOW_VAR init_vars[]= {
{"log_bin", (char*) &opt_bin_log, SHOW_BOOL},
{sys_trust_function_creators.name,(char*) &sys_trust_function_creators, SHOW_SYS},
{"log_error", (char*) log_error_file, SHOW_CHAR},
+ {sys_var_log_output_state.name, (char*) &sys_var_log_output_state, SHOW_SYS},
+ {sys_var_general_log_path.name, (char*) &sys_var_general_log_path, SHOW_SYS},
#ifdef HAVE_REPLICATION
{"log_slave_updates", (char*) &opt_log_slave_updates, SHOW_MY_BOOL},
#endif
{"log_slow_queries", (char*) &opt_slow_log, SHOW_BOOL},
+ {sys_var_slow_log_path.name, (char*) &sys_var_slow_log_path, SHOW_SYS},
{sys_log_warnings.name, (char*) &sys_log_warnings, SHOW_SYS},
{sys_long_query_time.name, (char*) &sys_long_query_time, SHOW_SYS},
{sys_low_priority_updates.name, (char*) &sys_low_priority_updates, SHOW_SYS},
@@ -943,6 +968,7 @@ SHOW_VAR init_vars[]= {
{sys_slave_trans_retries.name,(char*) &sys_slave_trans_retries, SHOW_SYS},
#endif
{sys_slow_launch_time.name, (char*) &sys_slow_launch_time, SHOW_SYS},
+ {sys_var_slow_query_log.name, (char*) &opt_slow_query_log, SHOW_MY_BOOL},
#ifdef HAVE_SYS_UN_H
{"socket", (char*) &mysqld_unix_port, SHOW_CHAR_PTR},
#endif
@@ -2455,6 +2481,223 @@ bool sys_var_key_cache_long::update(THD
end:
pthread_mutex_unlock(&LOCK_global_system_variables);
return error;
+}
+
+
+bool sys_var_log_state::check(THD *thd, set_var *var)
+{
+ if ((log_type == QUERY_LOG_SLOW && !opt_slow_log) ||
+ (log_type == QUERY_LOG_GENERAL && !opt_log))
+ {
+ my_error(ER_CANT_CHANGE_LOG_VAR, MYF(0),
+ log_type == QUERY_LOG_SLOW ? "SLOW QUERY LOG" : "GENERAL LOG",
+ name);
+ return 1; // log disabled, can not update variable
+ }
+ return check_enum(thd, var, &bool_typelib);
+}
+
+
+bool sys_var_log_state::update(THD *thd, set_var *var)
+{
+ bool res= 0;
+ my_bool tmp_val= (my_bool) var->save_result.ulong_value;
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ logger.lock();
+ if (*value == tmp_val)
+ goto end;
+ if (!tmp_val)
+ logger.deactivate_log_handlers(thd, log_type);
+ else
+ {
+ if ((res= logger.activate_log_handlers(thd, log_type)))
+ {
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
+ var->value->str_value.ptr());
+ goto end;
+ }
+ }
+ *value= (my_bool) tmp_val;
+
+end:
+ logger.unlock();
+ pthread_mutex_unlock(&LOCK_global_system_variables);
+ return res;
+}
+
+void sys_var_log_state::set_default(THD *thd, enum_var_type type)
+{
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ logger.lock();
+ if (*value)
+ logger.deactivate_log_handlers(thd, log_type);
+ *value= (my_bool) 0;
+ logger.unlock();
+ pthread_mutex_unlock(&LOCK_global_system_variables);
+}
+
+
+
+
+static int sys_check_log_path(THD *thd, set_var *var)
+{
+ char path[FN_REFLEN];
+ uint path_len= dirname_part(path, var->value->str_value.ptr());
+
+ if (path_len == var->value->str_value.length() ||
+ path_len && my_access(path, (F_OK|W_OK)))
+ return -1;
+ return 0;
+}
+
+
+bool update_sys_var_str_path(THD *thd, sys_var_str *var_str,
+ set_var *var, const char *log_ext,
+ bool log_type)
+{
+ char buff[FN_REFLEN];
+ char *res= 0, *old_value=(char *)(var ? var->value->str_value.ptr() : 0);
+ bool result= 0;
+ uint new_length= (var ? var->value->str_value.length() : 0);
+
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ logger.lock();
+ if (log_type)
+ {
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var_str->name,
+ old_value ? old_value : "DEFAULT");
+ result= 1;
+ goto err;
+ }
+
+ if (!old_value)
+ {
+ old_value= make_log_name(buff, log_ext);
+ new_length= strlen(old_value);
+ }
+
+ if (!(res= my_strndup((byte*)old_value, new_length, MYF(0))))
+ {
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var_str->name,
+ old_value ? old_value : "DEFAULT");;
+ result= 1;
+ goto err;
+ }
+
+ old_value= var_str->value;
+ var_str->value= res;
+ var_str->value_length= new_length;
+ my_free(old_value, MYF(MY_ALLOW_ZERO_PTR));
+err:
+ logger.unlock();
+ pthread_mutex_unlock(&LOCK_global_system_variables);
+ return result;
+}
+
+
+static bool sys_update_general_log_path(THD *thd, set_var * var)
+{
+ return update_sys_var_str_path(thd, &sys_var_general_log_path,
+ var, ".log", opt_general_log);
+}
+
+
+static void sys_default_general_log_path(THD *thd, enum_var_type type)
+{
+ (void) update_sys_var_str_path(thd, &sys_var_general_log_path,
+ 0, ".log", opt_general_log);
+}
+
+
+static bool sys_update_slow_log_path(THD *thd, set_var * var)
+{
+ return update_sys_var_str_path(thd, &sys_var_slow_log_path,
+ var, "-slow.log", opt_slow_query_log);
+}
+
+
+static void sys_default_slow_log_path(THD *thd, enum_var_type type)
+{
+ (void) update_sys_var_str_path(thd, &sys_var_slow_log_path,
+ 0, "-slow.log", opt_slow_query_log);
+}
+
+
+bool sys_var_log_output::check(THD *thd, set_var *var)
+{
+ if (!opt_slow_log && !opt_log)
+ {
+ my_error(ER_CANT_CHANGE_LOG_VAR, MYF(0),
+ "LOGGING", name);
+ return 1;
+ }
+ return check_set(thd, var, enum_names);
+}
+
+
+bool sys_var_log_output::update(THD *thd, set_var *var)
+{
+ bool res= 0;
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ logger.lock();
+ if (opt_general_log || opt_slow_query_log)
+ {
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
+ var->value->str_value.ptr());
+ res= 1;
+ goto err;
+ }
+
+ logger.init_slow_log(var->save_result.ulong_value);
+ logger.init_general_log(var->save_result.ulong_value);
+ *value= var->save_result.ulong_value;
+
+err:
+ logger.unlock();
+ pthread_mutex_unlock(&LOCK_global_system_variables);
+ return res;
+}
+
+
+void sys_var_log_output::set_default(THD *thd, enum_var_type type)
+{
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ logger.lock();
+ if (opt_general_log || opt_slow_query_log)
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
+ "DEFAULT");
+ else
+ {
+ logger.init_slow_log(LOG_TABLE);
+ logger.init_general_log(LOG_TABLE);
+ *value= LOG_TABLE;
+ }
+ logger.unlock();
+ pthread_mutex_unlock(&LOCK_global_system_variables);
+}
+
+
+byte *sys_var_log_output::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
+{
+ char buff[256];
+ String tmp(buff, sizeof(buff), &my_charset_latin1);
+ ulong length;
+ ulong val= *value;
+
+ tmp.length(0);
+ for (uint i= 0; val; val>>= 1, i++)
+ {
+ if (val & 1)
+ {
+ tmp.append(log_output_typelib.type_names[i],
+ log_output_typelib.type_lengths[i]);
+ tmp.append(',');
+ }
+ }
+
+ if ((length= tmp.length()))
+ length--;
+ return (byte*) thd->strmake(tmp.ptr(), length);
}
--- 1.84/sql/set_var.h Sun Feb 26 01:20:53 2006
+++ 1.85/sql/set_var.h Tue Apr 25 10:24:20 2006
@@ -205,9 +205,9 @@ public:
class sys_var_enum :public sys_var
{
- uint *value;
- TYPELIB *enum_names;
public:
+ TYPELIB *enum_names;
+ uint *value;
sys_var_enum(const char *name_arg, uint *value_arg,
TYPELIB *typelib, sys_after_update_func func)
:sys_var(name_arg,func), value(value_arg), enum_names(typelib)
@@ -718,6 +718,32 @@ public:
};
+class sys_var_log_state :public sys_var_bool_ptr
+{
+ uint log_type;
+public:
+ sys_var_log_state(const char *name_arg, my_bool *value_arg, uint log_type_arg)
+ :sys_var_bool_ptr(name_arg, value_arg), log_type(log_type_arg) {}
+ bool check(THD *thd, set_var *var);
+ bool update(THD *thd, set_var *var);
+ void set_default(THD *thd, enum_var_type type);
+};
+
+
+class sys_var_log_output :public sys_var_enum
+{
+public:
+ sys_var_log_output(const char *name_arg, uint *value_arg,
+ TYPELIB *typelib, sys_after_update_func func)
+ :sys_var_enum(name_arg, value_arg, typelib, func)
+ {}
+ bool check(THD *thd, set_var *var);
+ bool update(THD *thd, set_var *var);
+ byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
+ void set_default(THD *thd, enum_var_type type);
+};
+
+
/* Variable that you can only read from */
class sys_var_readonly: public sys_var
@@ -1012,6 +1038,8 @@ extern sys_var_thd_bit sys_autocommit;
CHARSET_INFO *get_old_charset_by_name(const char *old_name);
gptr find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
NAMED_LIST **found);
+
+extern sys_var_str sys_var_general_log_path, sys_var_slow_log_path;
/* key_cache functions */
KEY_CACHE *get_key_cache(LEX_STRING *cache_name);
| Thread |
|---|
| • bk commit into 5.1 tree (gluh:1.2362) | gluh | 25 Apr |