Могу ли я включить ведение журнала аудита в моей базе данных mysql?
Я в основном хочу отслеживать все запросы в течение часа и выгружать журнал в файл.
Для читателей: не упустите возможность прочитать вопрос в вышеприведенном комментарии.
Вы можете сослаться на мой существующий ответ, размещенный здесь dba.stackexchange.com/a/62477/6037
Чтобы включить / выключить регистрацию без перезапуска mysql, см. этот ответ.






Запустите mysql с параметром --log:
mysqld --log=log_file_name
или поместите в файл my.cnf следующее:
log = log_file_name
Любой из них будет записывать все запросы в log_file_name.
Вы также можете регистрировать только медленные запросы, используя опцию --log-slow-queries вместо --log. По умолчанию запросы, которые занимают 10 секунд или больше, считаются медленными. Вы можете изменить это, установив для long_query_time количество секунд, которое требуется для выполнения запроса, прежде чем он будет записан в журнал.
Само собой разумеется, что если оставить это включенным в производственной коробке, это очень быстро окажется неинтересным. грамм
Если у вас возникли проблемы с включением ведения журнала таким образом, еще раз проверьте, может ли пользователь mysql писать в соответствующее расположение файла.
В Ubuntu mysqld меняется на /var/lib/mysql, поэтому, если вы не укажете абсолютный путь, файл окажется там.
Можно ли регистрировать запросы только для одной конкретной базы данных / таблицы?
@Temujin phpmyadmin теперь имеет параметр «отслеживания» для таблиц, в которых вы указываете журнал («версию»), и он будет вести учет запросов, влияющих на него, с информацией о времени и запросе в целом.
Значит, вам нужно запустить / остановить, чтобы изменить этот параметр?
общий_лог = файл_общего_журнала = / путь / к / query.log
Этот принятый ответ следует удалить или отредактировать, чтобы отразить тот факт, что он не работает с MySQL 5.6. +.
Можно ли каким-то образом регистрировать только запросы, которые меняют данные, чтобы не выбирать, а обновлять, удалять и т. д.?
ни один из ответов на самом деле не работает для запросов -все-. единственное, что регистрируется, - это ПРАВИЛЬНЫЕ запросы (имеют ли они набор результатов или эффект или нет). запросы, вызывающие синтаксические ошибки, НЕ регистрируются. поэтому эти журналы подходят для оптимизации производительности кода, уже не имеющего ошибок, но не для выяснения того, что происходит, если результирующие запросы не соответствуют правильному синтаксису SQL. Кроме того, 2 таблицы, «созданные», уже, похоже, поставляются с установкой по умолчанию, по крайней мере, на любой машине, с которой я пробовал это делать. :П
(Примечание: для 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
Возможно, он уже был создан по той или иной причине, @TylerCollier
Следует отметить, что команды CREATE TABLE должны (если таблицы еще не существуют) выполняться в базе данных mysql, а не в каких-либо базах данных, созданных пользователем. Возможно, можно было бы обновить операторы SQL, чтобы отразить это.
Для просмотра журнала лучше подойдет SELECT * FROM mysql.general_log order by (event_time) desc. просто говорю.:-)
Не согласен с Примечание - с сервером версии 5.6.37 работает полностью корректно. Спасибо.
Чтобы узнать, включено ли ведение журнала: ПОКАЗАТЬ ПЕРЕМЕННЫЕ, КАК 'general_log';
Для записи, 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;
Абсолютно люблю это, работает для существующих и новых подключений к БД.
Были некоторые записи статистики - не уверен, что это, но в остальном работает очень хорошо.
Чтобы это работало, ваш пользователь должен иметь привилегию SUPER, которая является глобальной привилегией БД и поэтому не может быть ограничена конкретными схемами или таблицами: GRANT SUPER ON *.* TO user1@localhost
Я бы проголосовал за это несколько раз, если бы мог, у меня есть закладка, указывающая здесь :) Большое спасибо!
лучше, чем принятый ответ, запуск mysql с mysqld во многих ситуациях немного неуклюж. Это полезно в наиболее частом случае, когда вы хотите выполнить быструю отладку, а затем отключить ее.
Главный ответ не работает в 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 составляет примерно 5-15% снижения производительности. Подробнее здесь percona.com/blog/2009/02/10/…
Я не понимаю, почему Mysql 5.6 не позволяет создавать файл журнала из запросов? Как регистрировать все запросы в MySQL 5.6 и более поздних версиях, когда у вас нет доступа к дереву каталогов сервера, а есть только phpMyAdmin?
после этих изменений перезапустите службу mysql из панели управления xampp.
Это сработало для меня в моей локальной среде Xampp Apache, но мне все равно пришлось включить вход через phpMyAdmin. Кроме того, он не мог найти файл в папке / usr / log и не мог его создать, но он работал нормально, как general_log_file=filename.log.
Быстрый способ включить общий журнал запросов 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)
Спасибо, этот параметр мне очень пригодился, так как я не мог отключить mysql-сервер. Я также хочу, чтобы журнал отображался в таблице журналов
Версия ОС / 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
Повторяющийся вопрос stackoverflow.com/q/650238/684229