Введіть усі запити в mysql


279

Чи можна мені ввімкнути журнал аудиту в моїй базі даних mysql?

Я в основному хочу протягом години контролювати всі запити та скидати журнал у файл.


8
Повторне запитання stackoverflow.com/q/650238/684229
TMS

Для читачів вигода: Не пропустіть прочитати питання у вищевказаному коментарі.
кігті

Ви можете посилатися на мою існуючу відповідь, розміщену тут dba.stackexchange.com/a/62477/6037
Пітер Вендерберг,

Відповіді:


165

Запустіть mysql з опцією --log:

mysqld --log=log_file_name

або помістіть у своєму my.cnfфайлі таке:

log = log_file_name

Або кожен запише всі запити до log_file_name.

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


61
Це само собою зрозуміло, але залишаючи це увімкненим у виробничій коробці, це дуже швидко не забавляє. g
ceejayoz

6
Якщо у вас є проблеми з включенням журналу таким чином, переконайтесь, що користувач mysql може записати у відповідне розташування файлу.
Джон Топпер

3
Чи можливо вносити запити тільки на 1 дБ / таблицю?
Темуджин

2
@Temujin phpmyadmin тепер має опцію "відстеження" для таблиць, де ви вказуєте журнал ("версія"), і він буде вести облік запитів, що впливають на нього, з інформацією про час та весь запит.
gadget00

3
Цей прийнятий відповідь слід видалити або відредагувати, щоб відобразити той факт, що він не працює з MySQL 5.6. +.
іктоктоп

233

( Примітка . Для 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;

14
Я не впевнений, що це правда для кожної версії MySQL (я на 5.5), але мені не довелося створювати таблиці. Я дотримувався тієї ж поради мінус створення таблиць, про яку згадується тут: stackoverflow.com/a/678310/135101
Tyler Collier

Можливо, він уже створений з тієї чи іншої причини, @TylerCollier
Alexandre

3
Слід зазначити, що CREATE TABLEкоманди (якщо таблиць уже не існує) виконуватимуться на mysqlбазі даних, а не на будь-яких створених користувачем баз даних. Можливо, заяви SQL можуть бути оновлені, щоб відобразити це.
Роберт Россманн

2
Для перегляду журнал SELECT * FROM mysql.general_log order by (event_time) descзробить краще. просто кажу. :-)
vinrav

Не погоджуйтесь із зауваженням - серверна версія 5.6.37 працює повністю коректно. Дякую.
Дмитро Ольховський

215

Окрім того, що я тут натрапив, запустити наступне було найпростішим способом скидання запитів у файл журналу без перезавантаження

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;

6
Цілком подобається це, працює для існуючих та нових з'єднань на БД
Карлтон

1
Були деякі записи статистики - не впевнені, що це, але, інакше, це працює дуже добре.
Snowcrash

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

Я б схвалив це не раз, якби міг, у мене є закладка, що вказує тут :) Дякую!
резі

124

Топ відповіді не працює в mysql 5.6+. Використовуйте це замість:

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

у вашому файлі my.cnf / my.ini

Ubuntu / Debian : /etc/mysql/my.cnf
Windows : c: \ ProgramData \ MySQL \ MySQL Server 5.x
wamp : c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c: \ xampp \ mysql \ bin \ my.ini.


Якщо ви його використали, чи можете ви сказати мені на вплив на вищезазначене, і чи було б розумним увімкнути ведення журналу таким чином?
Рамеш Парік

1
Ефект від роботи Рамеша зменшився на 5-15%. Більше інформації тут percona.com/blog/2009/02/10/…
Firze

1
Я не розумію, чому Mysql 5.6 не дозволяє встановлювати файл записів із запитів? Як записати всі запити в MySQL 5.6 та пізніших версіях, коли у вас немає доступу до дерева каталогів сервера, а лише phpMyAdmin?
Вікі Дев

перезапустіть службу mysql з панелі керування xampp після цих змін.
Paramjeet

Це працювало для мене в моєму локальному середовищі Xampp Apache, але мені все одно довелося ввімкнути вхід через phpMyAdmin. Крім того, він не зміг знайти файл у папці / usr / log, а також не створив би його, але він працював чудово, якgeneral_log_file=filename.log
JoeP

36

Увімкніть журнал для таблиці

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

Перегляд журналу за допомогою вибору запиту

select * from mysql.general_log

чи є шаблон для реєстрації всіх таблиць? (їх досить багато: C)
RicardoE

Дякую, ця настройка була дуже корисною для мене, оскільки я не міг зняти mysql-сервер. Я також хочу, щоб журнал відображався в таблиці журналів
Gunnar Sigfusson,

14

Швидкий спосіб включити MySQL General Query Log без перезавантаження.

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

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


6

Для запису в 5.1.6 були введені General_log та slow_log:

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

5.2.1. Вибір пунктів призначення загального запиту та поточного журналу повільних запитів

Як і в MySQL 5.1.6, MySQL Server забезпечує гнучкий контроль над призначенням виводу до загального журналу запитів та журналу повільних запитів, якщо ці журнали включені. Можливими напрямками для записів журналу є файли журналів або таблиці general_log та slow_log в базі даних mysql


5

Ви повинні знати, що реєстрація в mysql дійсно впливає на продуктивність, але це може бути розумною справою.

Зазвичай я залишаю його на сервері розробок (за винятком випадків, коли він нас зводить з розуму :))


2

Версія OS / 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

1

У випадку використання AWS RDS MYSQL, покрокове керівництво тут.

Якщо встановлено як "файл", ви можете переглядати журнал безпосередньо з консолі AWS RDS "Log".

AWS RDS MYSQL Logging

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.