Мы пытаемся диагностировать проблему тупика MySQL 5.0. В настоящее время все таблицы являются таблицами MyISAM, поэтому все блокировки - это блокировки таблиц. У нас есть хорошие table_locks_waited
к table_locks_immediate
соотношение (ниже 1: 1000), но через пару минут мы получаем пару тупиков. Это происходит только на Amazon EC2, но не на других наших серверах.
Есть ли способ записывать в журнал все запросы, которые не смогли сразу получить блокировку таблицы? Мы хотим видеть все запросы, которые способствовали table_locks_waited
число.
Попробуйте посмотреть запросы и блокировки в реальном времени с помощью этой команды:
watch -n 0.5 'mysqladmin -u root -ppassword "processlist"'
Если блокировка происходит на какое-то время, вы должны хорошо понимать, что происходит.
В медленном журнале одно из отображаемых полей - время блокировки.
Вот пример с двумя зарегистрированными запросами
# Time: 110726 1:00:09
# User@Host: mysql[mysql] @ [10.64.100.208]
# Query_time: 8 Lock_time: 0 Rows_sent: 0 Rows_examined: 852669
insert into rates_old select * from rates;
# Time: 110726 1:30:56
# User@Host: mysql[mysql] @ [10.64.100.208]
# Query_time: 50 Lock_time: 0 Rows_sent: 0 Rows_examined: 11015414
SET timestamp=1311661856;
delete a.*, b.* from zillowDump a, zillowHistory b where a.loanRequestId=b.loanRequestId and a.addDate < date_sub(now(), INTERVAL 2 week);
Обратите внимание на поле Lock_time :.
ПРЕДОСТЕРЕЖЕНИЕ
В MySQL 5.1+ это поле появляется в таблице 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)
В любом случае, вы можете получить время блокировки любого запроса.