Могу ли я включить журнал медленных запросов только для одной базы данных?
На данный момент я перевел весь журнал в 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 и нашел несколько интересных ссылок, которые могут помочь вам решить вашу проблему.
Надеюсь, это будет полезно: