web-dev-qa-db-ja.com

テーブルロックを待機したすべてのMySQLクエリをログに記録するにはどうすればよいですか?

MySQL5.0のデッドロックの問題を診断しようとしています。現在、すべてのテーブルはMyISAMテーブルであるため、すべてのロックはテーブルロックです。 table_locks_waitedtable_locks_immediateの比率は良好です(1:1000未満)が、数分以内に2つのデッドロックが発生します。これはAmazonEC2でのみ発生し、他のサーバーでは発生しません。

テーブルロックをすぐに取得できなかったすべてのクエリをログに記録する方法はありますか? table_locks_waited番号に貢献したすべてのクエリを確認したいと思います。

7
netvope

遅いログでは、表示されるフィールドの1つはロック時間です

これは、ログに記録された2つのクエリのサンプルです。

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

どちらの方法でも、任意のクエリのロック時間を取得できます

2
RolandoMySQLDBA

次のコマンドを使用して、クエリとロックをリアルタイムで監視してみてください。

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

ロックが長時間発生する場合は、何が起こっているのかをよく理解する必要があります。

5