Включение Slow Log в MySQL 5.7 без перезагрузки

Для включения  логирования медленных запросов на сервере 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'


Ваш комментарий будет первым

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *