У меня есть сервер с несколькими базами данных. На самом деле это экземпляр на AmazonRDS, поэтому у меня нет доступа к файлу my.cnf. Я пытаюсь создать журнал для каждой базы данных отдельно, в котором записываются ранее выполненные запросы и возможные ошибки, сгенерированные этими запросами. Возможно ли с mysql иметь отдельный файл журнала для каждой базы данных / схемы?
Обновить
Я ищу подобное решение, но не для ВСЕГО сервера. https://stackoverflow.com/questions/650238/how-to-show-the-last-queries-executed-on-mysql
Я не могу говорить об AmazonRDS, но вот что-то общее, чтобы попробовать
Знаете ли вы, что журнал медленной работы - это файл CSV, если вы его активируете?
Если вы посмотрите на mysql.slow_log, вы увидите следующее:
mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
Table: slow_log
Create Table: 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
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)
mysql>
В виде файла CSV он вам не годится. Вы можете преобразовать его в MyISAM и использовать.
Вот что вы можете сделать:
Вот основные шаги:
CREATE TABLE mysql.slow_log_original LIKE mysql.slow_log;
ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX starttime (start_time);
ALTER TABLE mysql.slow_log ADD INDEX db_starttime (db,start_time);
Затем включите ведение журнала в mysql.slow_log
добавив это в /etc/my.cnf
[mysqld]
slow-query-log
log-format=TABLE
Если вам по-прежнему нужен текстовый файл для медленных запросов в дополнение к таблице, используйте
[mysqld]
slow-query-log
slow-query-logfile=/var/log/mysql_slow.log
log-format=TABLE
Вы, наверное, задаетесь вопросом, почему я показываю mysql.slow_log
стол а не mysql.general_log
. Ну вот mysql.general_log
:
mysql> desc mysql.general_log;
+--------------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+-----------------------------+
| event_time | timestamp | NO | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_host | mediumtext | NO | | NULL | |
| thread_id | int(11) | NO | | NULL | |
| server_id | int(10) unsigned | NO | | NULL | |
| command_type | varchar(64) | NO | | NULL | |
| argument | mediumtext | NO | | NULL | |
+--------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.01 sec)
mysql>
Нет ничего, что указывает на запрос к базе данных в mysql.general_log
.
О, кстати, вы должны настроить другие вещи, чтобы получить mysql.slow_log
поймать все
[mysqld]
slow-query-log
log-format=TABLE
log-query-time=0
log-queries-not-using-indexes
Таким образом, каждый запрос и его бабушка записываются в mysql.slow_log
.
Все, что вам нужно сделать, это запустить запросы к mysql.slow_log
. Например, чтобы увидеть все запросы из mydb
базу данных на сегодня, вы должны запустить:
SELECT * FROM mysql.slow_log
WHERE db = 'mydb'
AND start_time >= DATE(NOW()) + INTERVAL 0 SECOND;
Поскольку вы используете Amazon RDS, вам нужно будет проверить документацию, чтобы узнать, можете ли вы управлять mysql.slow_log
на ваш вкус.
Вот мои прошлые сообщения в StackExchange об использовании mysql.slow_log
:
Nov 18, 2011
: Создайте настраиваемую таблицу журнала в MySQLDec 27, 2011
: Как вести учет пользователей MySQLMar 30, 2012
: Конфигурация медленного журнала MySQLNov 06, 2012
: AWS RDS MySQL / Журнал медленных запросовЭто невозможно. Журнал запросов - это настройка на уровне сервера.
Если вам нужен журнал запросов для каждой базы данных, вам нужно будет использовать другой продукт. Возможные кандидаты Прокси MySQL или заставить ваше приложение или платформу приложения регистрировать запросы.
Взгляни на pt-запрос-дайджест - он может принимать в качестве входного вывода tcpdump и кажется возможным создавать собственные фильтры для извлечения только запросов определенного типа [возможно, также запросов к определенной базе данных].
обратите внимание, что это может быть хорошим инструментом для устранения неполадок, но это не очень удобное решение для постоянного ведения журнала.
RDS поддерживает включение общего журнала через настройку группы параметров БД. По умолчанию он переходит в ТАБЛИЦА, но вы можете изменить log_output на FILE и перезагрузить экземпляр БД, затем вы можете загрузить и проанализировать файл через API доступа к журналу. (http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html)
С MySQL 5.6 в RDS вы можете использовать функцию доступа к двоичному журналу для потоковой передачи двоичных журналов в другую среду и манипулировать ими по своему усмотрению.