Я пытаюсь проанализировать медленные запросы в своей системе и прочитал, что мне следует включить «Журнал медленных запросов». Мне любопытно, как я могу просматривать этот журнал, когда я использую экземпляр MySQL, размещенный на RDS Amazon Web Service.
Вы знали, что есть таблица медленного журнала? Это называется 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.01 sec)
mysql>
Чтобы начать запись медленных запросов в mysql.slow_log, необходимо активировать две переменные:
Вот ситуация
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set (0.01 sec)
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.01 sec)
mysql>
log_output уже по умолчанию TABLE
. Вам нужно будет включить slow_query_log. Вот что вы должны сделать:
После перезапуска экземпляра войдите в mysql и запустите этот запрос.
mysql> SELECT SLEEP(15);
Поскольку по умолчанию для long_query_time составляет 10 секунд, запрос SELECT SLEEP(15);
должен появиться в mysql.slow_log
. Прочтите документацию RDS, чтобы узнать, есть ли какие-либо ограничения в таблице.
Вот справедливое предупреждение. Уведомление mysql.slow_log
это файл CSV. В таблице нет ключа. Хотя вы можете запросить таблицу, она выполнит полное сканирование таблицы. Было бы здорово, если бы вы могли сделать следующее:
ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
Затем вы можете очень быстро запрашивать диапазоны дат и времени. Я попытался запустить это и получил следующее:
mysql> ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ERROR 1044 (42000): Access denied for user 'lwdba'@'%' to database 'mysql'
mysql>
Проверьте документацию RDS, чтобы узнать, может ли Amazon сделать это за вас.
Попробуйте !!!
Вы также можете скопировать таблицу в новую в другом db и сделать новую MyISAM:
create table my_slow_logs as select * from mysql.slow_log;
alter table my_slow_logs engine=MyISAM;
(затем select from my_slow_logs...
)
Amazon RDS позволяет это делать, если вы делаете это вне базы данных MySQL.