Wie protokolliere ich alle MySQL-Abfragen, die auf eine Tabellensperre gewartet haben?

7

Wir versuchen, ein Deadlock-Problem in MySQL 5.0 zu diagnostizieren. Derzeit sind alle Tabellen MyISAM-Tabellen und daher sind alle Sperren Tabellensperren. Wir haben ein gutes table_locks_waitedbis table_locks_immediateVerhältnis (kleiner als 1: 1000), aber innerhalb von ein paar Minuten haben wir ein paar Deadlocks bekommen. Dies geschieht nur auf Amazon EC2, jedoch nicht auf einem unserer anderen Server.

Gibt es eine Möglichkeit, alle Abfragen zu protokollieren, die nicht sofort eine Tabellensperre erhalten konnten? Wir möchten alle Abfragen sehen, die zur table_locks_waitedNummer beigetragen haben .

netvope
quelle
Hast du die SHOW FULL PROCESSLISTAusgabe überprüft ? Schauen Sie sich auch die Probleme beim Sperren von Tabellen auf der MySQL-Website an.
Quanten

Antworten:

2

Im langsamen Protokoll wird unter anderem die Sperrzeit angezeigt

Hier ist ein Beispiel mit zwei protokollierten Abfragen

# 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);

Bitte beachten Sie das Feld Lock_time :.

VORBEHALT

In MySQL 5.1+ wird das Feld in der Standardtabelle mysql.slow_log angezeigt

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)

In beiden Fällen können Sie die Sperrzeit jeder Abfrage abrufen

RolandoMySQLDBA
quelle
5

Versuchen Sie, die Abfragen und Sperren in Echtzeit mit diesem Befehl zu überwachen:

watch -n 0.5 'mysqladmin -u root -ppassword "processlist"'

Wenn die Sperrung längere Zeit erfolgt, sollten Sie eine gute Vorstellung davon bekommen, was los ist.

Andy Lee Robinson
quelle
sehr hilfreich .. danke
Sudip Bhandari