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.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.058 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.