Для просмотра логов MySQL вам потребуется доступ к серверу, на котором запущен MySQL. В зависимости от конфигурации MySQL и операционной системы сервера, логи могут храниться в различных местах и доступ к ним может осуществляться разными способами. Ниже приведены общие рекомендации по просмотру логов MySQL.
Шаг 1: Определение местоположения лог-файлов
Сначала вам нужно узнать, где MySQL хранит свои логи. Эту информацию можно найти в конфигурационном файле MySQL, который обычно называется my.cnf или my.ini. Расположение этого файла зависит от операционной системы и конкретной установки MySQL. Часто встречающиеся пути:
- /etc/mysql/my.cnf (Linux)
- /etc/my.cnf (Linux)
- C:\ProgramData\MySQL\MySQL Server X.X\my.ini (Windows, где X.X — версия MySQL)
В этом файле ищите директивы, связанные с логированием, такие как log_error, general_log_file, slow_query_log_file и т.д., чтобы определить, куда записываются логи.
Шаг 2: Просмотр логов
После того как вы определили местоположение лог-файлов, вы можете просмотреть их содержимое. Вот несколько видов логов, которые могут быть полезны:
- Ошибка логов (log_error): хранит информацию об ошибках, возникших во время работы сервера MySQL.
- Запрос логов (general_log_file): содержит каждый SQL-запрос к серверу, если включено логирование запросов.
- Медленных запросов лог (slow_query_log_file): записывает запросы, выполнение которых занимает больше времени, чем значение, указанное в long_query_time.
Linux
На Linux вы можете просмотреть эти файлы с помощью команды cat, more, less и т.д. Например:
sudo less /var/log/mysql/error.log
Windows
На Windows вы можете открыть файлы лога с помощью любого текстового редактора, например, Notepad. Просто перейдите к расположению файла лога через проводник Windows и дважды кликните по файлу лога, чтобы открыть его.
Шаг 3: Использование команд MySQL для просмотра логов
Также MySQL предоставляет некоторые команды для просмотра логов непосредственно через клиент MySQL:
SHOW VARIABLES LIKE '%log%';
Эта команда покажет вам пути ко всем лог-файлам, определенным в конфигурации MySQL.
Для просмотра содержимого некоторых типов логов (например, лога двоичных файлов или лога ошибок) могут быть доступны специальные команды, в зависимости от версии MySQL.
Важно помнить, что доступ к логам и их анализ может потребовать определенных привилегий. Убедитесь, что у вас есть необходимые права доступа для просмотра этих файлов.
MySQL query logging is a powerful feature that allows administrators to track and log all queries executed on the MySQL server. This is particularly useful for debugging, monitoring, and optimizing database performance. In this article, we will guide you through the steps to enable query logging in MySQL, along with examples and best practices.
Types of MySQL Query Logs
MySQL supports several types of logs, but for the purpose of query logging, we focus on:
- General Query Log: Logs all SQL queries received by the server.
- Slow Query Log: Logs queries that take longer than a specified duration to execute.
Enabling MySQL General Query Log
Enabling the MySQL General Query Log is a useful way to keep track of the SQL statements executed on your MySQL server. This query log can be instrumental in troubleshooting, performance optimization, and security analysis.
Syntax:
To enable or disable the general query log dynamically using the ‘SET GLOBAL
'
command:
— Enable Query Log
SET global general_log = 1;
— Disable Query Log (optional)
SET global general_log = 0;
To enable MySQL query log follow the given steps:
Step 1. Edit MySQL Configuration
- Open the MySQL server configuration file (my.cnf or my.ini).
- Locate the [mysqld] section.
- Add or modify the following directives:
[mysqld]
general_log = 1
general_log_file = /path/to/query_log.log
- Save and close the configuration file.
2. Restart MySQL Server
Restart the MySQL server to apply the changes.
- Example for Linux:
sudo service mysql restart
- Example for Windows:
Restart the MySQL service using the service management tools.
Example of Enabling MySQL General Query Log
Let’s look at some examples, where we will learn how to enable MySQL query log.
Enabling Query Log and Executing SQL Queries Example
-- Enable Query Log
SET global general_log = 1;-- Execute SQL Queries
SELECT * FROM your_table;
UPDATE your_table SET column1 = value1 WHERE condition;
-- ... add more queries ...-- Disable Query Log (optional)
SET global general_log = 0;
Expected Output in Log File:
2024-06-28T10:20:00.000000Z 2 Connect root@localhost on
2024-06-28T10:20:00.000000Z 2 Query SELECT * FROM your_table
2024-06-28T10:20:01.000000Z 2 Query UPDATE your_table SET column1 = value1 WHERE condition
2024-06-28T10:20:02.000000Z 2 Quit
Explanation: Enabling the query log will capture the executed SQL queries in the log file. After enabling, executing various SQL queries like SELECT and UPDATE will be logged. Disabling the query log stops logging further queries.
Enabling Query Log with a Specific Log File Example
-- Enable Query Log with Specific FileSET global general_log = 1;
SET global general_log_file = '/path/to/query_log.log';-- Execute SQL Queries
SELECT * FROM your_table;
INSERT INTO your_table (column1, column2) VALUES (value1, value2);
-- ... add more queries ...-- Disable Query Log (optional)
SET global general_log = 0;
Expected Output Specified in Log File:
2024-06-28T10:25:00.000000Z 3 Connect root@localhost on
2024-06-28T10:25:00.000000Z 3 Query SELECT * FROM your_table
2024-06-28T10:25:01.000000Z 3 Query INSERT INTO your_table (column1, column2) VALUES (value1, value2)
2024-06-28T10:25:02.000000Z 3 Quit
Explanation: In this example, the query log is not only enabled but also configured to write logs to a specific file. Executing SQL queries will be logged in the specified file. Disabling the query log stops further logging.
Enabling the Slow Query Log
The Slow Query Log helps identify queries that take longer than a specified duration to execute, which is useful for performance optimization.
Step 1: Edit MySQL Configuration
- Open the MySQL server configuration file (
my.cnf
ormy.ini
). - Locate the
[mysqld]
section. - Add or modify the following directives:
[mysqld]
slow_query_log = 1
slow_query_log_file = /path/to/slow_query_log.log
long_query_time = 2
slow_query_log
= 1
enables the slow query log.slow_query_log_file
specifies the path to the slow query log file.long_query_time
sets the threshold for query execution time (in seconds).
Step 2: Restart MySQL Server
Restart the MySQL server to apply the changes.
- Example for Linux:
sudo service mysql restart
- Example for Windows:
Restart the MySQL service using the service management tools.
Example of Enabling Slow Query Log
-- Enable Slow Query Log
SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = '/path/to/slow_query_log.log';
SET GLOBAL long_query_time = 2;-- Execute SQL Queries
SELECT SLEEP(3); -- This will be logged as it exceeds the long_query_time-- Disable Slow Query Log (optional)
SET GLOBAL slow_query_log = 0;
Expected Output in Slow Query Log File:
# Time: 2024-06-28T10:30:00.000000Z
# User@Host: root[root] @ localhost []
# Query_time: 3.000000 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1656405000;
SELECT SLEEP(3);
Explanation: Enabling the slow query log with a specific log file will capture any query that exceeds the long_query_time
threshold. The SELECT SLEEP(3)
query will be logged because it takes longer than 2 seconds.
Best Practices
- Log Rotation: Implement log rotation to manage log file sizes and prevent them from consuming too much disk space.
- Security: Ensure that log files are accessible only to authorized users to prevent sensitive information leakage.
- Monitoring: Regularly monitor and analyze the logs to identify performance bottlenecks and optimize queries.
Conclusion
Enabling the MySQL Query Log is an important practice for database administrators and developers. It provides a detailed record of executed queries, aiding in performance optimization, debugging, and auditing. By modifying the server configuration with the ‘general_log‘ and ‘slow_query_log‘ directives, users can easily enable or disable the query logs as needed. Utilizing the query logs effectively enhances the overall management and maintenance of MySQL databases, contributing to a more efficient and well-monitored database environment.
Логирование запросов
Логирование запросов помогает найти узкие места в работе СУБД 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;
Категория:
MySQL
Настройка логирования и отладка MySQL запросов.
Логирование MySQL запросов настраивается в 2 этапа:
- Включаем само логирование;
- Указываем куда логировать запросы.
Почему удобно включать логирование с помощью MySQL команд:
- Не нужно дергать файл конфига MySQL /etc/mysql/my.cnf;
- После рестарта сервера — лог выключается.
Посмотреть включено ли логирование:
SELECT @@GLOBAL.general_log
SHOW GLOBAL VARIABLES LIKE '%log%';
SHOW GLOBAL VARIABLES WHERE Variable_name in ('version', 'log', 'general_log', 'general_log_file', 'log_output');
Включить/выключить логирование (1 — включить, 0 — выключить):
SET GLOBAL general_log = 1;
Логировать запросы в таблицу mysql.general_log:
SET GLOBAL general_log = 1;
SET GLOBAL log_output = 'TABLE';
Посмотреть логи запросов в таблице:
SELECT * FROM mysql.general_log;
Логировать запросы в файл /var/log/mysql.log (этот тип логирования включён по умолчанию):
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log_file = '/var/log/mysql.log';
Примечание
Файл не нужно создавать предварительно, но нужно дать права на запись в этот каталог!
По умолчанию лог-файл запросов: /var/lib/mysql/%USERNAME%log.
Включаем логирование SQL запросов в файл:
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log_file='dev-sql.log';
Внимание!
Глобальная системная переменная general_log_file содержит имя файла, а не полный путь к нему. Этот файл будет создан в каталоге /var/lib/mysql/ и по умолчанию именуется как <hostname>.log.
Примечание
Для просмотра значения глобальной системной переменной general_log_file — выполните запрос:
SHOW VARIABLES LIKE 'general_log_file';
Можно включить логирование и в таблицу, и в файл:
SET GLOBAL log_output = 'TABLE,FILE';
Для отключения лога:
SET GLOBAL log_output = 'NONE';
Пример включения логирования из PHP-скрипта и просмотр логов:
mysql_query("SET GLOBAL log_output = 'FILE'");
mysql_query("SET GLOBAL general_log_file = '/home/stas/tmp/mysql.project.log'");
mysql_query("SET GLOBAL general_log = 1");
// здесь выполняем SQL запрос
mysql_query("SET GLOBAL general_log = 0");
mysql_query("SET GLOBAL log_output = 'TABLE'");
Включить постоянное логирование (требует рестарт сервера):
[mysqld]
log = /var/log/mysql/mysql.log
Подробнее о других системных переменных логирования: http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_log_output
#mysql query log
В MySQL на данный момент существуют 4 вида журнала (лога) и при достаточно серьёзной работе с базами на MySQL необходимо за ними следить. Например, бинарный лог у нас за сутки набирает около гигабайта, а размер жёсткого диска на сервере ограничен и за ними надо следить. Однако следить следует не только за бинарным логом, так как логи (журналы) в MySQL могут принести немалую пользу.
Итак, какие логи ведёт MySQL? Это:
1. бинарный лог (binary log)
2. лог ошибок (error log)
3. лог медленный запросов (slow query log)
4. лог запросов (general query log)
5. лог репликаций (relay log)
Каждый из них по-своему полезен.
Бинарный лог
В первую очередь полезен с точки зрения репликаций. Можно его бэкапить, можно использовать для восстановления данных на более точное время при использовании бэкапов. Лог содержит все команды изменений базы данных, выборки (select, show) не сохраняет, для таблиц, поддерживающих транзакции (BDB, InnoDB) запись в лог выполняется только после выполнения команды COMMIT
. Для лога можно указывать список баз данных, которые надо логировать и список баз данных, которые не надо логировать. В более ранних версиях вместо бинарного лога использовался лог обновлений. Использование бинарного лога снижает производительность базы данных, однако его польза настолько велика, что крайне не рекомендуется его отключать. Рекомендуется защищать бинарный лог паролем, так как он может данные также о паролях пользователей. При достижении максимально разрешённого размера (1 гиг по умолчанию) создаётся следующий файл. Каждый новый файл имеет порядковый номер после имени.
Содержание бинарного лога можно посмотреть с помощью утилиты mysqlbinlog.
Основные настройки в my.cnf
Местоположение лога:
log_bin = /var/log/mysql/mysql-bin.log
Максимальный размер, минимум 4096 байт, по умолчанию 1073741824 байт (1 гигабайт):
max_binlog_size= 500M
Сколько дней хранится:
expire_logs_days = 3
Наиболее часто использующиеся команды
Повторение действий после операции восстановления:
shell> mysqlbinlog log_file | mysql -h server_name
Удаление логов до определённого файла:
PURGE BINARY LOGS TO 'mysql-bin.000';
Удаление логов до определённой даты:
PURGE BINARY LOGS BEFORE 'YYYY-MM-DD hh:mm:ss';
Лог ошибок
Особенно полезен в случаях сбоев. Лог содержит информацию об остановках, запусках сервера, а также сообщения о критических ошибках. Может содержать сообщения с предупреждениями (warnings).
Основные настройки в my.cnf
Местоположение лога:
log_error = /var/log/mysql/mysql.err
Флаг, указывающий стоит ли записывать в лог в том числе предупреждения (записываются, если значение больше нуля):
log_warnings = 1
Наиболее часто использующиеся команды
Переход к новому файл лога:
shell> mysqladmin flush-logs
Копирование старой части лога (необходимо, так как в случае повторного выполнения fluch он будет удалён):
shell> mv host_name.err-old backup-directory
Лог медленных запросов
Если есть подозрение, что приложение работает медленно из-за неэффективных запросов к базе, то в первую очередь следует проверить лог медленных запросов. В случае оптимизации запросов этот лог поможет выяснить, что необходимо оптимизировать в первую очередь.
Основные настройки в my.cnf
Местоположение лога:
log_slow_queries = /var/log/mysql/mysql_slow.log
Со скольки секунд выполнения запрос считается медленным, минимальное значений — 1 секунда, по умолчанию 10 секунд:
long_query_time = 10
Если надо логировать запросы, которые не используют индексы, надо добавить строку:
log-queries-not-using-indexes
Если надо вести лог медленных команд, таких как OPTIMIZE TABLE
, ANALYZE TABLE
и ALTER TABLE
:
log-slow-admin-statements
Лог запросов
Лог содержит информацию о подключениях и отключениях клиентов, а также все SQL запросы, которые были получены. Фактически, это временный лог. Обычно лог удаляется автоматически сразу после выполнения всех команд (т.е. как только он стал ненужным). Лог ведётся в соответствии с очередность поступления запросов. Этот лог содержит все запросы к базе данных (независимо от приложений и пользователей). Так что если есть желание (или необходимость) проанализировать, какие необходимы индексы, какие запросы могли бы оптимизированы, то этот лог как раз может помочь в таких целях. Лог полезен не только для случаев, когда необходимо знать, какие запросы выполняются с базой данных, но и в случаях, когда ясно, что возникла ошибка с базой данных, но неизвестно, какой запрос был отправлен к базе данных (например, в случае генерации динамического SQL-а). Рекомендуется защищать лог запросов паролем, так как он может данные также о паролях пользователей.
Основные настройки в my.cnf
Местоположение лога:
log = /var/log/mysql/mysql.log
Наиболее часто использующиеся команды
В отличии от других логов, перезагрузка сервера и команда fluch не инициирует создание нового лога. Но это можно сделать вручную:
shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> mv host_name-old.log backup-directory
Лог репликаций
Здесь логируются изменения, выполненные по инициации сервера репликаций. Как и бинарный лог, состоит из файлов, каждый из которых пронумерован.
Основные настройки в my.cnf
Местоположение лога:
relay-log = /var/log/mysql/mysql-relay-bin.log
Максимальный размер:
max_relay_log_size = 500М
Наиболее часто использующиеся команды
Начать новый файл лога можно только при остановленном дополнительном (slave) сервере:
shell> cat new_relay_log_name.index >> old_relay_log_name.index
shell> mv old_relay_log_name.index new_relay_log_name.index
Команда fluch logs инициирует ротацию лога.