How do I enable the MySQL function that logs each SQL query statement received from clients and the time that query statement has submitted? Can I do that in phpmyadmin or NaviCat? How do I analyse the log?
Answers
First, Remember that this logfile can grow very large on a busy server.
For mysql < 5.1.29:
To enable the query log, put this in
/etc/my.cnf
in the [mysqld]
sectionlog = /path/to/query.log #works for mysql < 5.1.29
Also, to enable it from MySQL console
SET general_log = 1;
For mysql 5.1.29+
With mysql 5.1.29+ , the
log
option is deprecated. To specify the logfile and enable logging, use this in my.cnf in the [mysqld]
section:general_log_file = /path/to/query.log
general_log = 1
Alternately, to turn on logging from MySQL console (must also specify log file location somehow, or find the default location):
SET global general_log = 1;
Also note that there are additional options to log only slow queries, or those which do not use indexes.
I use this method for logging when I want to quickly optimize different page loads. It's a little tip...
Logging to a TABLE
SET global general_log = 1;
SET global log_output = 'table';
You can then select from my
mysql.general_log
table to retrieve recent queries.
I can then do something similar to
tail -f
on the mysql.log, but with more refinements...select * from mysql.general_log
where event_time > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> ""
and argument <> "SET NAMES 'UTF8'" and argument <> "SHOW STATUS"
and command_type = "Query" and argument <> "SET PROFILING=1"
This makes it easy to see my queries that I can try and cut back. I use 8 seconds interval to only fetch queries executed within the last 8 seconds.
You can disable or enable the general query log (which logs all queries) with
SET GLOBAL general_log = 1 # (or 0 to disable)
I also wanted to enable the mysql log file to see the queries and i have resolved this with the below instructions
1 - Go to /etc/mysql/mysql.conf.d
2 - open the mysqld.cnf
and enable the below lines
2 - open the mysqld.cnf
and enable the below lines
general_log_file = /var/log/mysql/mysql.log
general_log = 1
general_log = 1
3 - restart the mysql with this command /etc/init.d/mysql restart
4 - go to /var/log/mysql/ and check the logs
4 - go to /var/log/mysql/ and check the logs
for mysql>=5.5 only for slow queries (1 second and more) my.cfg
[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
Not exactly an answer to the question because the question already has great answers. This is a side info. Enabling general_log really put a dent on MySQL performance. I left
general_log =1
accidentally on a production server and spent hours finding out why performance was not comparable to a similar setup on other servers. Then I found this which explains the impact of enabling general log.
Gist of the story, don't put
general_log=1
in the .cnf
file. Instead use set global general_log =1
for a brief duration just to log enough to find out what you are trying to find out and then turn it off.
I had to drop and recreate the general log at one point. During the recreation, character sets got messed up and I ended up having this error in the logs:
[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'
So if the standard answer of "check to make sure logging is on" doesn't work for you, check to make sure your fields have the right character set.
0 comments:
Post a Comment