The MySQL General Query Log is a helpful tool for tracking and monitoring queries executed by the server. It logs every SQL query received from clients and server startup and shutdown events. This log can be an invaluable asset for database administrators and developers who need to debug issues, monitor performance, or understand the behavior of applications interacting with the database.

In this blog, we’ll dive into the general log, how to enable it, and most importantly, how to understand and analyze its output.

How to Enable the General Log

Enabling the general log can be done by modifying the MySQL configuration file (my.cnf or my.ini) or by dynamically running SQL commands.

Enable via Configuration File

To enable the general log in MySQL through the configuration file, follow these steps:

1. Locate your MySQL configuration file, typically located at /etc/mysql/my.cnf (Linux) or C:\ProgramData\MySQL\MySQL Server X.Y\my.ini (Windows).

2. Add or modify the following lines in the [mysqld] section:

[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql-general.log

3. Restart the MySQL service to apply the changes:

sudo systemctl restart mysql

Enable Dynamically via SQL

You can also enable the general log at runtime without restarting MySQL by using the following SQL commands:

SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/path/to/logfile.log';

To disable it:

SET GLOBAL general_log = 'OFF';

Understanding the General Log Output

Once enabled, the general log will begin recording every interaction between the client and the MySQL server. The output format is plain text and typically includes the following components:

  • Timestamp: The date and time when the query was executed.
  • Client Hostname or IP: The client making the request could be a hostname or an IP address.
  • User: The MySQL user running the query.
  • Thread ID: A unique identifier assigned by MySQL to each connection session (thread).
  • Command: The type of command being executed, such as Query, Connect, or Quit.

Query: The actual SQL statement or administrative command being executed.

Critical Elements to Focus On

1. Connect and Quit Events

  • These entries show when clients connect to and disconnect from the database. Seeing frequent connections from the same client could indicate improper connection handling (e.g., not using connection pooling).

2. Query Events

  • Queries logged in the general log provide insight into how the database is accessed. This can help identify inefficient queries or unexpected access patterns.
  • High Query Volume: If your general log shows many queries quickly, it might be worth investigating whether certain specificities or indexes need optimization.

3. Thread ID

  • Each connection is assigned a unique thread ID. Tracking the thread ID can help you correlate multiple actions (like connection, query, and disconnect) to a single session, making debugging issues related to a particular user or application easier.

Sample Output of the General Log

Connection Entry:

2024-09-26T10:00:45.123456Z      101 Connect    root@localhost on mydb using TCP/IP
  • Timestamp: The exact time the connection was initiated.
  • Thread ID (101): The identifier for this connection session.
  • Command (Connect): Indicates that a client connected to the database.
  • User (root@localhost): The user initiating the connection. In this case, it’s the root user connecting locally.
  • Database (mydb): The name database the user is connected to.

Query Execution:

2024-09-26T10:00:45.123789Z      101 Query      SELECT * FROM users WHERE id = 1;
  • Thread ID (101): The same connection is executing a query.
  • Command (Query): Indicates the type of operation being executed (in this case, an SQL query).
  • Query (SELECT): The exact SQL statement that was executed.

Connection Termination:

2024-09-26T10:00:45.124123Z      101 Quit
  • Command (Quit): This indicates that the client closed the connection

Some considerations:

  • Due to the performance impact and volume of data generated, it’s essential to use the general log judiciously and rotate logs frequently to prevent resource exhaustion.
  • Percona toolkit includes pt-query-digest that can summarize the general log. Visit their website for more information. 

Be sure to monitor disk space since the general log can grow quickly.  Logrotate is a system utility tool that automates rotation and is likely already installed on our Linux machine. More information on configuring logrotate can be found in this blog.

Read more or contact us for more information.