MySQL Logs

By default, MySQL doesn't keep any logs.

All logs need to be properly secured, since they can contain sensitive data within queries.

Logs can quickly grow in size, especially slow queries if watching for rows that don't use indexes on lookups. Be sure to setup proper log rotation.

Slow Query Log

The default value for a query to take before being logged is 10 seconds. The minimum amount this can be set to is 1 second. The long_query_time value is measured in seconds.

Setup slow query logging in my.cnf:

log-slow-queries = /var/log/mysql/slow.log
long_query_time = 1

You can also log slow administrative statements:

log-slow-admin-statements

Include queries that do not use indexes for row lookups in the statements:

log-queries-not-using-indexes

Error Log

The error log contains information indicating when mysqld was started and stopped and also any critical errors that occur while the server is running. If mysqld notices a table that needs to be automatically checked or repaired, it writes a message to the error log.

You can specify where mysqld writes the error log with the –log-error[=file_name] option. If the option is given with no file_name value, mysqld uses the name host_name.err by default. The server creates the file in the data directory unless an absolute path name is given to specify a different directory.

Setup error logging in my.cnf:

log-error=/var/log/mysql/mysqld.log

General Query Log

Enable the general query log without restarting the database:

SHOW VARIABLES LIKE 'general_log%';
SET GLOBAL general_log_file = '/var/log/mysql/query.log';
SET GLOBAL general_log = 1;

Binary Log

Binary log is recommended for aiding to restore data.

You can remove all the binary logs if desired:

RESET MASTER;

Purging a range of binary logs is also possible. See the PURGE BINARY LOGS syntax.

Flushing Logs

Binary logs are flushed automatically, based on the max_binlog_size. Max out at 100 megs:

max_binlog_size = 100M

Use mysqladmin, either flush-logs or refresh:

mysqladmin flush-logs
mysqladmin refresh

Query:

FLUSH LOGS;

Log Rotation

Percona ships with a logrotate configuration file located at /etc/logrotate.d/percona-server-server-5.5. By default it:

  • Keeps 7 days worth of logs
  • Rotates daily
  • Compresses logs
General Configuration

Here's a sample file for /etc/logrotate.d/mysql:

/var/log/mysql/slow.log {
    daily
    rotate 30
    missingok
    ifempty
    sharedscripts
    create 660 mysql mysql
    postrotate
        /usr/bin/mysqladmin flush-logs
    endscript
}