Записывать все запросы в mysql

Могу ли я включить ведение журнала аудита в моей базе данных mysql?

Я в основном хочу отслеживать все запросы в течение часа и выгружать журнал в файл.

Повторяющийся вопрос stackoverflow.com/q/650238/684229

Innate Imunity is The Way 11.06.2013 12:31

Для читателей: не упустите возможность прочитать вопрос в вышеприведенном комментарии.

claws 09.02.2014 22:49

Вы можете сослаться на мой существующий ответ, размещенный здесь dba.stackexchange.com/a/62477/6037

Peter Venderberghe 19.05.2014 08:22

Чтобы включить / выключить регистрацию без перезапуска mysql, см. этот ответ.

ToolmakerSteve 24.10.2020 00:21
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
303
4
373 491
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

Запустите mysql с параметром --log:

mysqld --log=log_file_name

или поместите в файл my.cnf следующее:

log = log_file_name

Любой из них будет записывать все запросы в log_file_name.

Вы также можете регистрировать только медленные запросы, используя опцию --log-slow-queries вместо --log. По умолчанию запросы, которые занимают 10 секунд или больше, считаются медленными. Вы можете изменить это, установив для long_query_time количество секунд, которое требуется для выполнения запроса, прежде чем он будет записан в журнал.

Само собой разумеется, что если оставить это включенным в производственной коробке, это очень быстро окажется неинтересным. грамм

ceejayoz 20.11.2008 05:40

Если у вас возникли проблемы с включением ведения журнала таким образом, еще раз проверьте, может ли пользователь mysql писать в соответствующее расположение файла.

Jon Topper 20.11.2008 19:56

В Ubuntu mysqld меняется на /var/lib/mysql, поэтому, если вы не укажете абсолютный путь, файл окажется там.

bradley.ayers 28.06.2012 10:58

Можно ли регистрировать запросы только для одной конкретной базы данных / таблицы?

Temujin 04.08.2012 20:08

@Temujin phpmyadmin теперь имеет параметр «отслеживания» для таблиц, в которых вы указываете журнал («версию»), и он будет вести учет запросов, влияющих на него, с информацией о времени и запросе в целом.

gadget00 07.08.2013 18:57

Значит, вам нужно запустить / остановить, чтобы изменить этот параметр?

public static 02.10.2014 00:27

общий_лог = файл_общего_журнала = / путь / к / query.log

Kiren S 29.06.2015 14:26

Этот принятый ответ следует удалить или отредактировать, чтобы отразить тот факт, что он не работает с MySQL 5.6. +.

itoctopus 31.07.2016 20:29

Можно ли каким-то образом регистрировать только запросы, которые меняют данные, чтобы не выбирать, а обновлять, удалять и т. д.?

Tobi 07.02.2017 16:38

ни один из ответов на самом деле не работает для запросов -все-. единственное, что регистрируется, - это ПРАВИЛЬНЫЕ запросы (имеют ли они набор результатов или эффект или нет). запросы, вызывающие синтаксические ошибки, НЕ регистрируются. поэтому эти журналы подходят для оптимизации производительности кода, уже не имеющего ошибок, но не для выяснения того, что происходит, если результирующие запросы не соответствуют правильному синтаксису SQL. Кроме того, 2 таблицы, «созданные», уже, похоже, поставляются с установкой по умолчанию, по крайней мере, на любой машине, с которой я пробовал это делать. :П

HRH Sven Olaf von CyberBunker 18.02.2019 12:33

(Примечание: для mysql-5.6 + это не сработает. Есть решение, которое применимо к mysql-5.6 +, если вы используете прокрутить вниз или кликните сюда.)

Если вы не хотите или не можете перезапустить сервер MySQL, вы можете сделать это на своем работающем сервере:

  • Создайте свои таблицы журналов в базе данных mysql
  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  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'
  • Включить ведение журнала запросов в базе данных
SET global general_log = 1;
SET global log_output = 'table';
  • Посмотреть журнал
select * from mysql.general_log
  • Отключить ведение журнала запросов в базе данных
SET global general_log = 0;

Я не уверен, что это верно для каждой версии MySQL (я использую 5.5), но мне не нужно было создавать таблицы. Я последовал тому же совету без создания таблиц, о которых здесь говорится: stackoverflow.com/a/678310/135101

Tyler Collier 28.03.2014 03:18

Возможно, он уже был создан по той или иной причине, @TylerCollier

Alexandre Marcondes 28.03.2014 14:10

Следует отметить, что команды CREATE TABLE должны (если таблицы еще не существуют) выполняться в базе данных mysql, а не в каких-либо базах данных, созданных пользователем. Возможно, можно было бы обновить операторы SQL, чтобы отразить это.

Robert Rossmann 23.01.2015 16:12

Для просмотра журнала лучше подойдет SELECT * FROM mysql.general_log order by (event_time) desc. просто говорю.:-)

vinrav 08.12.2015 09:23

Не согласен с Примечание - с сервером версии 5.6.37 работает полностью корректно. Спасибо.

Dmitriy Olhovsky 05.11.2017 23:11

Чтобы узнать, включено ли ведение журнала: ПОКАЗАТЬ ПЕРЕМЕННЫЕ, КАК 'general_log';

Groco 17.12.2018 19:29

Для записи, general_log и slow_log были введены в 5.1.6:

http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

5.2.1. Selecting General Query and Slow Query Log Output Destinations

As of MySQL 5.1.6, MySQL Server provides flexible control over the destination of output to the general query log and the slow query log, if those logs are enabled. Possible destinations for log entries are log files or the general_log and slow_log tables in the mysql database

Помимо того, что я здесь обнаружил, выполнение следующего было самым простым способом выгрузки запросов в файл журнала без перезапуска.

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

можно выключить с помощью

SET global general_log = 0;

Абсолютно люблю это, работает для существующих и новых подключений к БД.

Carlton 19.02.2015 16:57

Были некоторые записи статистики - не уверен, что это, но в остальном работает очень хорошо.

Snowcrash 21.04.2015 18:04

Чтобы это работало, ваш пользователь должен иметь привилегию SUPER, которая является глобальной привилегией БД и поэтому не может быть ограничена конкретными схемами или таблицами: GRANT SUPER ON *.* TO user1@localhost

RobM 16.07.2018 23:55

Я бы проголосовал за это несколько раз, если бы мог, у меня есть закладка, указывающая здесь :) Большое спасибо!

resi 09.12.2019 14:50

лучше, чем принятый ответ, запуск mysql с mysqld во многих ситуациях немного неуклюж. Это полезно в наиболее частом случае, когда вы хотите выполнить быструю отладку, а затем отключить ее.

shelbypereira 26.07.2020 18:10

Главный ответ не работает в mysql 5.6+. Используйте вместо этого:

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

в вашем файле my.cnf / my.ini

Ubuntu / Debian: /etc/mysql/my.cnf
Окна: c: \ ProgramData \ MySQL \ Сервер MySQL 5.x
вамп: c: \ wamp \ bin \ mysql \ mysqlx.y.z \ my.ini
xampp: c: \ xampp \ mysql \ bin \ my.ini.

Если вы его использовали, можете ли вы сказать мне, как сказалось выше на производительность, и было бы разумно включить ведение журнала таким образом?

Ramesh Pareek 31.01.2016 09:10

Влияние на производительность Ramesh составляет примерно 5-15% снижения производительности. Подробнее здесь percona.com/blog/2009/02/10/…

Firze 08.03.2016 09:53

Я не понимаю, почему Mysql 5.6 не позволяет создавать файл журнала из запросов? Как регистрировать все запросы в MySQL 5.6 и более поздних версиях, когда у вас нет доступа к дереву каталогов сервера, а есть только phpMyAdmin?

Vicky Dev 17.06.2016 19:10

после этих изменений перезапустите службу mysql из панели управления xampp.

Paramjeet 01.09.2017 09:08

Это сработало для меня в моей локальной среде Xampp Apache, но мне все равно пришлось включить вход через phpMyAdmin. Кроме того, он не мог найти файл в папке / usr / log и не мог его создать, но он работал нормально, как general_log_file=filename.log.

JoeP 21.05.2019 14:31

Быстрый способ включить общий журнал запросов MySQL без перезапуска.

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

Я установил mysql через homebrew, версия mysql: mysql Ver 14.14 Distrib 5.7.15, для osx10.11 (x86_64) с использованием оболочки EditLine

Включить журнал для таблицы

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

Просмотр журнала по выбранному запросу

select * from mysql.general_log

есть ли подстановочный знак для регистрации всех таблиц? (их довольно много: C)

RicardoE 06.12.2017 20:37

Спасибо, этот параметр мне очень пригодился, так как я не мог отключить mysql-сервер. Я также хочу, чтобы журнал отображался в таблице журналов

Gunnar Sigfusson 21.08.2018 14:50

Версия ОС / MySQL:

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

Добавление ведения журнала (например, я не думаю, что /var/log/... - лучший путь для Mac OS, но это сработало:

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

Перезапустил Mysql

Результат:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

Другие вопросы по теме