Логирование запросов
Логирование запросов помогает найти узкие места в работе СУБД MySQL и повысить ее производительность. Рассмотрены варианты включения как с перезагрузкой сервера, так и БЕЗ перезагрузки.
Логирование медленных запросов
Включение лога длительных запросов без перезагрузки MySQL-сервера производится из терминала mysql
:
mysql>SET global slow_launch_time = 1;
SET global slow_query_log_file = '/tmp/mysql_time.log';
SET global slow_query_log = 1;
FLUSH LOGS;
Установленные параметры означают следующее:
slow_query_log = 1
включает или выключает лог медленных запросов (1-включить; 0-выключить)slow_launch_time = 1
задает время (здесь, 1 секунда), при превышении которого запрос будет считаться медленнымslow_query_log_file = ...
путь до файла, в который будут записываться все медленные запросыFLUSH LOGS
- очищает log-файл
Путь до файла логов должен указывать на директорию, в которую пользователь mysql
имеет права на запись. В противном случае, при выполнении команды SET global general_log_file='...'
будет появляться ошибка: Variable 'general_log_file' can't be set to the value of ...
. По умолчанию эти директории имеют имена: /var/log/mysql/
и /var/lib/mysql/
. Имя файла может быть любым.
Просмотр медленных запросов в реальном времени можно осуществлять командой:
tail -f /var/log/mysql/query_slow.log
Через какое-то время, при накоплении запросов можно проанализировать файл при помощи утилиты mysqldumpslow
. Она покажет какой запрос сколько раз встречается в log-файле:
mysqldumpslow /var/log/mysql/query_slow.log
Логирование можно отключить в любое время с помощью:
mysql>SET global slow_query_log = 0;
После перезагрузки MySQL-сервера установленный параметры примут значение по умолчанию и логирование прекратиться. Что бы включить постоянное логирование запросов, то необходимо добавить вышеуказанные параметры в файл конфигурации MySQL-сервера, в секцию [mysqld]
:
my.cnf[mysqld]
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /tmp/mysql_time.log
Логирование всех запросов
В таблицу
Самым простым способом логирования всех запросов поступающих к БД MySQL это включения логирования в отдельную таблицу базы данных.
Проверим, существует ли таблица логов general_log
:
mysql>USE mysql;
SHOW TABLES LIKE 'general_log';
Если не существует то создадим ее:
mysql>CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
Включаем ведение журнала запросов в базе данных без перезагрузки MySQL-сервера:
mysql>SET global log_output = 'table';
SET global general_log = 1;
Логирование можно отключить в любое время командой:
mysql>SET global general_log = 0;
Просмотр журнала логов:
mysql>SELECT event_time, command_type, argument FROM mysql.general_log;
После перезагрузки MySQL-сервера установленный параметры примут значение по умолчанию и логирование прекратиться. Что бы включить постоянное логирование запросов, то необходимо добавить вышеуказанные параметры в файл конфигурации MySQL-сервера, в секцию mysqld
:
my.cnf[mysqld]
general_log = on
global log_output = 'TABLE'
В файл
Для включения логирования запросов в файл без перезапуска базы данных, необходимо выполнить следующие команды в mysql-консоли:
mysql>SET global log_output = 'FILE';
SET global general_log_file='/tmp/mysql_access.log';
SET global general_log = 1;
Файл логов должен указывать на директорию, в которую учетная запись (от которой работает MySQL-сервер) имеет права на запись. В противном случае, при выполнении команды SET global general_log_file='...'
будет появляться ошибка: Variable 'general_log_file' can't be set to the value of ...
. По умолчанию эти директории имеют имена: /var/log/mysql/
и '/var/lib/mysql/'. Имя файла может быть любым.
В принципе, для хранения логов запросов можно указать любую директорию, но при этом необходимо дать соответствующие разрешения командой chmod
.
Просмотр всех запросов, поступающих к БД в реальном времени можно осуществлять командой:
tail -f /tmp/mysql_access.log
Логирование можно отключить в любое время с помощью:
mysql>SET global general_log = 0;
Что бы включить логирование запросов на постоянной основе, необходимо добавить вышеуказанные параметры в файл конфигурации MySQL-сервера, в секцию [mysqld]
:
my.cnf[mysqld]
general_log = on
log_output = 'FILE'
general_log_file = /tmp/mysql_access.log
Логирование Error Log
Если необходимо понять, по какой причине не запускается MySql сервер error log
вам в помощь.
Посмотреть расположение файла по умолчанию куда пишется error log
, можно выполнив команду:
mysql>SHOW GLOBAL VARIABLES;
Бинарное логирование
В этот лог записываются все команды изменения БД, нужен он для репликации и восстановления. Включать его не рекомендуется, если никакой репликации не планируется, так как он требователен к ресурсам.
Посмотреть расположение файла по умолчанию куда пишется бинарный log
, можно выполнив команду:
mysql>SHOW GLOBAL VARIABLES;