From: Luis Soares Date: June 8 2009 10:36am Subject: bzr commit into mysql-5.1-bugteam branch (luis.soares:2918) Bug#42851 List-Archive: http://lists.mysql.com/commits/75830 X-Bug: 42851 Message-Id: <0KKX00C391GMZO30@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_neN8gQJoRLmM1otxPlewHw)" --Boundary_(ID_neN8gQJoRLmM1otxPlewHw) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/lsoares/Workspace/mysql-server/bugfix/b42851/5.1-bt/ based on revid:luis.soares@stripped 2918 Luis Soares 2009-06-08 BUG#42851: Spurious "Statement is not safe to log in statement format." warnings Several warnings are printed when using statement based logging and unsafe operations are logged to the binlog. For example, this is the case for statements using LIMIT + ORDER BY PK. As a consequence, this would rapidly increase mysqld error log size, in some cases to several gigabytes, causing a maintenance nightmare. This patch addresses this issue by adding a variable that enables the user to choose whether the warnings should be issued or not. The variable has SESSION and GLOBAL scope and is dynamically changeable. NOTE: this is an incremental patch, that builds on top of previous fix for this bug, the one that handles spurious warnings for filtered out statements. @ mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result Renamed test file and added test results for new variable. @ mysql-test/suite/binlog/t/binlog_stm_unsafe_warning-master.opt Added CLI variable setting for suppressing statmenent unsafe warnings. @ mysql-test/suite/binlog/t/binlog_stm_unsafe_warning.test Added testing to assess that new variable is indeed working as expected. @ sql/mysqld.cc Added new option: binlog-stmt-suppress-unsafe-warnings. @ sql/set_var.cc Added binlog_stmt_suppress_unsafe_warnings variable. @ sql/sql_class.cc Added check to thd->variables.binlog_stmt_suppress_unsafe_warnings before printing out the warning. @ sql/sql_class.h Added binlog_stmt_suppress_unsafe_warnings to the system_variables structure. renamed: mysql-test/suite/binlog/r/limit_warning.result => mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result mysql-test/suite/binlog/t/limit_warning-master.opt => mysql-test/suite/binlog/t/binlog_stm_unsafe_warning-master.opt mysql-test/suite/binlog/t/limit_warning.test => mysql-test/suite/binlog/t/binlog_stm_unsafe_warning.test modified: sql/mysqld.cc sql/set_var.cc sql/sql_class.cc sql/sql_class.h mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result mysql-test/suite/binlog/t/binlog_stm_unsafe_warning-master.opt mysql-test/suite/binlog/t/binlog_stm_unsafe_warning.test === renamed file 'mysql-test/suite/binlog/r/limit_warning.result' => 'mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result' --- a/mysql-test/suite/binlog/r/limit_warning.result 2009-06-05 09:09:59 +0000 +++ b/mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result 2009-06-08 10:36:13 +0000 @@ -1,3 +1,50 @@ +SET @old_binlog_stmt_suppress_unsafe_warnings= @@global.binlog_stmt_suppress_unsafe_warnings; +###### PART I: basic variable testing +### assertion: show that the variable exists and is turned on +SHOW VARIABLES LIKE 'binlog_stmt%'; +Variable_name Value +binlog_stmt_suppress_unsafe_warnings ON +### assertion: show that setting global variable will affect new connections but not current one +SET GLOBAL binlog_stmt_suppress_unsafe_warnings= 0; +SHOW VARIABLES LIKE 'binlog_stmt%'; +Variable_name Value +binlog_stmt_suppress_unsafe_warnings OFF +SHOW VARIABLES LIKE 'binlog_stmt%'; +Variable_name Value +binlog_stmt_suppress_unsafe_warnings ON +###### PART II: check that warnings are/aren't printed when option to suppress is used +### assertion: no warnings because CLI option to suppress warnings was set +CREATE TABLE t1 (a int, b int, primary key (a)); +INSERT INTO t1 VALUES (1,2), (2,3); +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; +DROP TABLE t1; +### assertion: we get warnings again by reverting CLI option dynamically +SET SESSION binlog_stmt_suppress_unsafe_warnings= 0; +SHOW VARIABLES LIKE 'binlog_stmt%'; +Variable_name Value +binlog_stmt_suppress_unsafe_warnings OFF +CREATE TABLE t1 (a int, b int, primary key (a)); +INSERT INTO t1 VALUES (1,2), (2,3); +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; +Warnings: +Note 1592 Statement may not be safe to log in statement format. +DROP TABLE t1; +### assertion: warnings are turned off again by setting option dynamically +SET SESSION binlog_stmt_suppress_unsafe_warnings= 1; +SHOW VARIABLES LIKE 'binlog_stmt%'; +Variable_name Value +binlog_stmt_suppress_unsafe_warnings ON +CREATE TABLE t1 (a int, b int, primary key (a)); +INSERT INTO t1 VALUES (1,2), (2,3); +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; +DROP TABLE t1; +SET SESSION binlog_stmt_suppress_unsafe_warnings= 0; +###### PART III: check that warnings are not printed when statement is filtered out from binlog ### NOT filtered database => assertion: warnings ARE shown DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a int, b int, primary key (a)); @@ -28,3 +75,4 @@ UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; DROP TABLE t1; DROP DATABASE b42851; +SET @@global.binlog_stmt_suppress_unsafe_warnings= @old_binlog_stmt_suppress_unsafe_warnings; === renamed file 'mysql-test/suite/binlog/t/limit_warning-master.opt' => 'mysql-test/suite/binlog/t/binlog_stm_unsafe_warning-master.opt' --- a/mysql-test/suite/binlog/t/limit_warning-master.opt 2009-06-05 09:09:59 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_unsafe_warning-master.opt 2009-06-08 10:36:13 +0000 @@ -1 +1 @@ ---binlog-ignore-db=b42851 +--binlog-ignore-db=b42851 --binlog-stmt-suppress-unsafe-warnings=1 === renamed file 'mysql-test/suite/binlog/t/limit_warning.test' => 'mysql-test/suite/binlog/t/binlog_stm_unsafe_warning.test' --- a/mysql-test/suite/binlog/t/limit_warning.test 2009-06-05 09:09:59 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_unsafe_warning.test 2009-06-08 10:36:13 +0000 @@ -5,14 +5,29 @@ # === # # This test aims at checking that the fix that removes spurious -# entries in the error log when the statement is filtered out from -# binlog, is working. +# entries in the error log when: (i) option to suppresss warnings +# is used; or (ii) the statement is filtered out from binlog; is +# indeed working. # # HOW # === # -# The test case is split into three assertions when issuing statements -# containing LIMIT and ORDER BY: +# - PART I: basic variable testing +# +# i) Check that global and session variables are working properly +# +# - PART II: is split into three assertions: +# +# i) assert that warnings are suppressed when CLI option was used +# +# ii) assert that warnings are thrown when global variable is changed +# dynamically to not suppress warnings. +# +# iii) assert that warnings are suppressed when global variable is +# changed dynamically to suppress warnings. +# +# - Part III: of the test is split into three assertions when issuing +# statements containing LIMIT and ORDER BY: # # i) issue statements in database that is not filtered => check # that warnings ARE shown; @@ -26,6 +41,57 @@ -- source include/have_log_bin.inc -- source include/have_binlog_format_statement.inc +SET @old_binlog_stmt_suppress_unsafe_warnings= @@global.binlog_stmt_suppress_unsafe_warnings; + +-- echo ###### PART I: basic variable testing + +-- echo ### assertion: show that the variable exists and is turned on +SHOW VARIABLES LIKE 'binlog_stmt%'; + +-- echo ### assertion: show that setting global variable will affect new connections but not current one +SET GLOBAL binlog_stmt_suppress_unsafe_warnings= 0; +connect (conn2,localhost,root,,); +-- connection conn2 +SHOW VARIABLES LIKE 'binlog_stmt%'; +-- disconnect conn2 +-- connection default +SHOW VARIABLES LIKE 'binlog_stmt%'; + +-- echo ###### PART II: check that warnings are/aren't printed when option to suppress is used + +-- echo ### assertion: no warnings because CLI option to suppress warnings was set +CREATE TABLE t1 (a int, b int, primary key (a)); +INSERT INTO t1 VALUES (1,2), (2,3); +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; +DROP TABLE t1; + +-- echo ### assertion: we get warnings again by reverting CLI option dynamically +SET SESSION binlog_stmt_suppress_unsafe_warnings= 0; +SHOW VARIABLES LIKE 'binlog_stmt%'; + +CREATE TABLE t1 (a int, b int, primary key (a)); +INSERT INTO t1 VALUES (1,2), (2,3); +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; +DROP TABLE t1; + +-- echo ### assertion: warnings are turned off again by setting option dynamically +SET SESSION binlog_stmt_suppress_unsafe_warnings= 1; +SHOW VARIABLES LIKE 'binlog_stmt%'; + +CREATE TABLE t1 (a int, b int, primary key (a)); +INSERT INTO t1 VALUES (1,2), (2,3); +UPDATE t1 SET b='4' WHERE a=1 LIMIT 1; +UPDATE t1 SET b='5' WHERE a=2 ORDER BY a LIMIT 1; +DROP TABLE t1; + +# set to mysqld 5.1 default before moving to part II of the test +# (suppress OFF). +SET SESSION binlog_stmt_suppress_unsafe_warnings= 0; + +-- echo ###### PART III: check that warnings are not printed when statement is filtered out from binlog + -- echo ### NOT filtered database => assertion: warnings ARE shown -- disable_warnings @@ -71,3 +137,5 @@ DROP TABLE t1; # clean up DROP DATABASE b42851; +SET @@global.binlog_stmt_suppress_unsafe_warnings= @old_binlog_stmt_suppress_unsafe_warnings; +exit; === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2009-05-15 12:57:51 +0000 +++ b/sql/mysqld.cc 2009-06-08 10:36:13 +0000 @@ -5497,6 +5497,7 @@ enum options_mysqld OPT_BINLOG_SHOW_XID, #endif OPT_BINLOG_ROWS_EVENT_MAX_SIZE, + OPT_BINLOG_STMT_SUPPRESS_UNSAFE_WARNINGS, OPT_WANT_CORE, OPT_CONCURRENT_INSERT, OPT_MEMLOCK, OPT_MYISAM_RECOVER, OPT_REPLICATE_REWRITE_DB, OPT_SERVER_ID, @@ -5708,6 +5709,13 @@ struct my_option my_long_options[] = /* sub_size */ 0, /* block_size */ 256, /* app_type */ 0 }, + {"binlog-stmt-suppress-unsafe-warnings", + OPT_BINLOG_STMT_SUPPRESS_UNSAFE_WARNINGS, + "Suppress warnings when statement based logging is in use and unsafe " + "statements are logged to binary log.", + (uchar **) &global_system_variables.binlog_stmt_suppress_unsafe_warnings, + (uchar **) &max_system_variables.binlog_stmt_suppress_unsafe_warnings, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #ifndef DISABLE_GRANT_OPTIONS {"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, === modified file 'sql/set_var.cc' --- a/sql/set_var.cc 2009-05-15 12:57:51 +0000 +++ b/sql/set_var.cc 2009-06-08 10:36:13 +0000 @@ -336,6 +336,10 @@ static sys_var_const sys_log_error(&v static sys_var_bool_ptr sys_log_queries_not_using_indexes(&vars, "log_queries_not_using_indexes", &opt_log_queries_not_using_indexes); +static sys_var_thd_bool +sys_binlog_stmt_suppress_unsafe_warnings(&vars, + "binlog_stmt_suppress_unsafe_warnings", + &SV::binlog_stmt_suppress_unsafe_warnings); static sys_var_thd_ulong sys_log_warnings(&vars, "log_warnings", &SV::log_warnings); static sys_var_microseconds sys_var_long_query_time(&vars, "long_query_time", &SV::long_query_time); === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2009-06-05 09:09:59 +0000 +++ b/sql/sql_class.cc 2009-06-08 10:36:13 +0000 @@ -3685,7 +3685,8 @@ int THD::binlog_query(THD::enum_binlog_q */ if (sql_log_bin_toplevel && lex->is_stmt_unsafe() && variables.binlog_format == BINLOG_FORMAT_STMT && - binlog_filter->db_ok(this->db)) + binlog_filter->db_ok(this->db) && + !this->variables.binlog_stmt_suppress_unsafe_warnings) { /* A warning can be elevated a error when STRICT sql mode. === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2009-05-30 13:32:28 +0000 +++ b/sql/sql_class.h 2009-06-08 10:36:13 +0000 @@ -359,6 +359,7 @@ struct system_variables my_bool low_priority_updates; my_bool new_mode; + my_bool binlog_stmt_suppress_unsafe_warnings; /* compatibility option: - index usage hints (USE INDEX without a FOR clause) behave as in 5.0 --Boundary_(ID_neN8gQJoRLmM1otxPlewHw) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/luis.soares@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/luis.soares@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: luis.soares@stripped # target_branch: file:///home/lsoares/Workspace/mysql-\ # server/bugfix/b42851/5.1-bt/ # testament_sha1: c750107f1edeaf0dcdc301babc75912631a0705b # timestamp: 2009-06-08 11:36:22 +0100 # base_revision_id: luis.soares@stripped\ # x9ts8i0e3pcvtaiv # # Begin bundle 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 --Boundary_(ID_neN8gQJoRLmM1otxPlewHw)--