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

Журнал медленных запросов только для одной базы данных

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

На данный момент я перевел весь журнал в Excel, а затем запустил сводный отчет, чтобы определить, какая база данных самая медленная. Итак, я пошел и внес некоторые изменения в это приложение в надежде уменьшить количество медленных запросов. вместо того, чтобы снова запускать мой сводный отчет, который потребовал немного времени для очистки данных, я бы предпочел просто выводить медленные запросы из одной базы данных

возможно?

У меня есть кое-что немного неортодоксальное, если вы действительно хотите иметь медленный журнал запросов для конкретной базы данных. Имейте в виду, что то, что я собираюсь предложить, работает для MySQL 5.1.30 и выше:

Шаг 01) Начните с добавления их в /etc/my.cnf

[mysqld]
log-output=TABLE
slow-query-log
slow-query-log-file=slow-queries.log

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

Шаг 02) перезапуск службы mysql

В схеме mysql есть таблица с именем slow_log

В mysql запустите это

SHOW CREATE TABLE mysql.slow_log\G

Это должна быть таблица CSV.

Шаг 03) Преобразуйте его в MyISAM и проиндексируйте таблицу в столбце start_time.

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

Это должно выглядеть так

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,
  KEY `start_time` (`start_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

Обратите внимание, что один из столбцов db. Вы должны добавить дополнительный индекс следующим образом:

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ADD INDEX db (db,start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

Отсюда вы можете выполнить один из трех (3) вариантов

ВАРИАНТ 1: запросить mysql.slow_log по нужной базе данных

mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';

ВАРИАНТ 2: удалить все записи в mysql.slow_log, которые не поступают из любого dbiwant

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
DELETE FROM mysql.slow_log WHERE db <> 'whateverdbiwant';
SET GLOBAL slow_query_log = @old_log_state;

ВАРИАНТ 3: Скопируйте все записи в другую таблицу slow_log, из которой вы можете запросить

DROP TABLE IF EXISTS mysql.my_slow_log;
CREATE TABLE mysql.my_slow_log LIKE mysql.slow_log;
ALTER TABLE mysql.my_slow_log DROP INDEX db;
ALTER TABLE mysql.my_slow_log DISABLE KEYS;
INSERT INTO mysql.my_slow_log SELECT * FROM mysql.slow_log db='whateverdbiwant';
ALTER TABLE mysql.my_slow_log ENABLE KEYS;

Попробуйте !!!

ОБНОВЛЕНИЕ 2011-06-20 18:08 EDT

У меня есть еще одна неортодоксальная идея, которая может вам понравиться.

Попробуйте переместить .MYD и .MYI таблицы MyISAM для медленного журнала на другой том диска. Их символические ссылки /var/lib/mysql/mysql/slow_log.MYD и /var/lib/mysql/mysql/slow_log.MYI на новое местоположение реальных .MYD и .MYI.

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

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

Шаг 01) Настройте подчиненное устройство репликации с помощью этой опции

[mysqld]
replicate-do-db=mysql

Шаг 02) Активируйте медленный журнал на ведомом устройстве.

Шаг 03) Запустите эту команду на мастере

SET SQL_LOG_BIN=0;
ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;

Используя ЧЕРНАЯ ДЫРА механизм хранения. Это исключает дисковый ввод-вывод в медленный журнал на главном устройстве. Подчиненное устройство настроено так, что его единственная цель - собирать записи для mysql.slow_log.

Я не думаю, что у вас есть такие возможности в MySQL, но есть способы получить их. Я искал вас в Google и нашел несколько интересных ссылок, которые могут помочь вам решить вашу проблему.

Надеюсь, это будет полезно:

http://code.google.com/p/mysql-log-filter/

http://www.maatkit.org/doc/mk-query-digest.html