| Bug #50954 | start_time in slow query log is recording the query end time, not start time | ||
|---|---|---|---|
| Submitted: | 5 Feb 2010 19:46 | Modified: | 6 Feb 2010 10:19 |
| Reporter: | eric t | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Logging | Severity: | S3 (Non-critical) |
| Version: | MySQL 5.1.32, 5.1, 5.5.99 | OS: | Linux (Red Hat 4.1.2-44) |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | slow query log | ||
[5 Feb 2010 19:46]
eric t
[6 Feb 2010 8:45]
Sveta Smirnova
Thank you for the report. I see in slow query log following: Time Id Command Argument # Time: 100206 11:43:14 # User@Host: root[root] @ localhost [] # Query_time: 100.002342 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 use test; SET timestamp=1265445794; select sleep(100); Where did you see start_time?
[6 Feb 2010 9:55]
eric t
Hi, I choose to save the log to the table in mysql DB. The first column name is that start_time.
[6 Feb 2010 10:19]
Sveta Smirnova
Thank you for the feedback. Verified as described. Test case: select now(); select sleep(100); select now(); select * from mysql.slow_log; Option file: --log-slow-queries --log-output=table
[2 Mar 2010 5:13]
Ryan McElroy
Fortunately, this is not too hard to fix. I have a test and a patch to fix this issue in 5.1.44.
First, the patch to fix the issue:
diff --git a/sql/log.cc b/sql/log.cc
index 69f8fd0..167899e 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -2361,12 +2361,12 @@ bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time,
}
/*
- This info used to show up randomly, depending on whether the query
- checked the query start time or not. now we always write current
- timestamp to the slow log
+ The timestamp used to only be set when the query had checked the
+ start time. Now the slow log always logs the query start time.
+ This ensures logs can be used to replicate queries accurately.
*/
end= strmov(end, ",timestamp=");
- end= int10_to_str((long) current_time, end, 10);
+ end= int10_to_str((long) query_start_arg, end, 10);
if (end != buff)
{
A fast test to catch the problem and verify the fix (sleep 2 is much faster than sleep 100!):
diff --git a/mysql-test/t/slow_log-master.opt b/mysql-test/t/slow_log-master.opt
new file mode 100644
index 0000000..445da5d
--- /dev/null
+++ b/mysql-test/t/slow_log-master.opt
@@ -0,0 +1 @@
+--slow-query-log=1 --long-query-time=1
diff --git a/mysql-test/t/slow_log.test b/mysql-test/t/slow_log.test
new file mode 100644
index 0000000..d9b4250
--- /dev/null
+++ b/mysql-test/t/slow_log.test
@@ -0,0 +1,7 @@
+select @@datadir;
+set timestamp=10;
+select unix_timestamp(), sleep(2);
+
+--exec [ "1" == `grep "SET timestamp=10;" $MYSQL_TEST_DIR/var/mysqld.1/mysqld-slow.log | wc -l` ]
+
+--exit
[2 Mar 2010 5:15]
Ryan McElroy
My fix is only for the slow log file, but a similar fix for the table should be similarly straightforward.
