Назад | Перейти на главную страницу

MySQL: отдельный файл журнала для каждой базы данных

У меня есть сервер с несколькими базами данных. На самом деле это экземпляр на 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 и использовать.

Вот что вы можете сделать:

  • Сделайте копию оригинального медленного журнала CSV
  • Конвертируйте CSV в MyISAM
  • Добавьте два индекса
    • по start_time
    • по db, start_time
  • Активировать медленный журнал

Вот основные шаги:

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:

Это невозможно. Журнал запросов - это настройка на уровне сервера.

Если вам нужен журнал запросов для каждой базы данных, вам нужно будет использовать другой продукт. Возможные кандидаты Прокси 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 вы можете использовать функцию доступа к двоичному журналу для потоковой передачи двоичных журналов в другую среду и манипулировать ими по своему усмотрению.