Для включения логирования медленных запросов на сервере MySQL, не выполняя при этом его перезагрузку, нужно зайти в консоль и выполнить нижеописанные действия.
Смотрим текущее значение глобальных переменных:
mysql> SHOW VARIABLES LIKE '%slow%';
+-----------------------------------+-------------------------------+
| Variable_name | Value |
+-----------------------------------+-------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_filter | |
| log_slow_rate_limit | 1 |
| log_slow_rate_type | session |
| log_slow_slave_statements | OFF |
| log_slow_sp_statements | ON |
| log_slow_verbosity | |
| max_slowlog_files | 0 |
| max_slowlog_size | 0 |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_always_write_time | 10.000000 |
| slow_query_log_file | /var/lib/mysql/mysql-slow.log |
| slow_query_log_use_global_control | |
+-----------------------------------+-------------------------------+
14 rows in set (0.00 sec)
Меняем значение переменной slow_query_log для включения логироваия:
SET GLOBAL slow_query_log = 'ON';
Указываем время в секундах, по истечение которого запрос считается медленным :
SET GLOBAL long_query_time = 2;
SET @@SESSION.long_query_time = 2; //Установка для текущей сессии
Указываем путь к файлу, куда логировать:
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
Применим все изменения:
FLUSH SLOW LOGS;
Запустим запрос для проверки:
do sleep (1);
И видим, что в логе нет записи по этому запросу, а если значение установить большее или равное 2, то запись появится.
Теперь осталось вписать все параметры в конфигурационный файл, чтобы после рестарта все настройки не слетели:
slow_query_log = 1 # Без этого параметра после ребута не вкл. slow лог
slow_query_log_file = /var/log/mysql/mysql-slow.log # А без этого не менялся файл для логирования
long_query_time = 2
Также заметил, что во многих мануалах разные параметры, и повторить один в один конфиг, например, с этого сайта не получилось, хотя признаюсь, информация там весьма полезна и доступна.
Я же делал вышеописанное у себя последовательно и только после успешно отработанной команды вставлял уже её на сайт.
И лучше всего, конечно же, обращаться к официальной документации.
UPD
Заметил также, что при выводе slow лога в поле Time время отличается на несколько часов от того, которое стоит на сервере.
Смотрим:
mysql> SHOW VARIABLES LIKE '%time%';
+----------------------------------+-------------------+
| Variable_name | Value |
+----------------------------------+-------------------+
| binlog_max_flush_queue_time | 0 |
| connect_timeout | 10 |
| datetime_format | %Y-%m-%d %H:%i:%s |
| default_password_lifetime | 0 |
| delayed_insert_timeout | 300 |
| explicit_defaults_for_timestamp | ON |
| flush_time | 0 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_old_blocks_time | 1000 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lc_time_names | en_US |
| lock_wait_timeout | 31536000 |
| log_timestamps | UTC |
| long_query_time | 2.000000 |
| max_execution_time | 0 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| slow_launch_time | 2 |
| slow_query_log_always_write_time | 10.000000 |
| system_time_zone | MSK |
| thread_pool_idle_timeout | 60 |
| time_format | %H:%i:%s |
| time_zone | SYSTEM |
| timestamp | 1540989866.534160 |
| wait_timeout | 28800 |
+----------------------------------+-------------------+
Нас интересует параметр log_timestamps , который сейчас равен UTC.
Системная переменная log_timestamps управляет часовым поясом временных меток в сообщениях, записываемых в файл журнала медленных запросов (а также в общий файл журнала запросов и журнал ошибок). Её значение не влияет на часовой пояс общего журнала запросов и сообщений журнала медленных запросов, записанных в таблицы журнала, но строки, полученные из этих таблиц, могут быть преобразованы из локального системного часового пояса в любой желаемый часовой пояс с помощью CONVERT_TZ() или путем установки системной переменной session time_zone, т.е. изменив её значение, мы повлияем исключительно на выводимые логи, а не на данные в таблицах – то что надо!
Нужно лишь установить в значение SYSTEM :
SET GLOBAL log_timestamps = 'SYSTEM';
И добавить это в конфиг, чтобы после ребута всё сохранилось:
log_timestamps = 'SYSTEM'