キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< [勝手に補足]触って学べるOSS-DB試験第1回DBのセットアップから接続まで | main | どのMySQL Connector/Jを使いましょうか? >>
InnoDBロック競合の確認(MySQL 5.1+InnoDB Plugin, 5.5以降)
0
    JUGEMテーマ:コンピュータ
     MySQL 5.1+InnoDB Plugin, 5.5以降でサポートされた以下の三つの情報スキーマテーブルを使うとトランザクションとロックに関わる情報をInnoDBロックモニタよりも簡単でわかりやすく取得することが可能です。

    | INNODB_LOCK_WAITS                     |独自: ロック待ち情報
    | INNODB_LOCKS                          |独自: ロック競合情報
    | INNODB_TRX                            |独自: トランザクション情報
    
     通常一つの接続ではトランザクションのBEGIN; COMMIT;を何度か行います。つまり一つの接続はシリアルに複数のトランザクションを実行(そしてそれぞれに違うトランザクションid)、コマンド実行時はCOMMANDにQuery表示で、その実行時間がTIMEに出力され、コマンド実行が終わるとCOMMANDにSleep表示で、Sleepになってからの時間が表示されるということです。
     そのためブロックされているId 9やId 11を待たせているトランザクションは、実はid 5や8である場合以外にも、:で省略している接続のいずれかである可能性すらあることになります。間違いやすいのはTimeは現状のCommandになってからの時間であり、トランザクション開始の時間とは一致していない、ということです。

    mysql> show processlist;
    +----+------+-----------------+------+---------+------+----------+----------------------------------------------+
    | Id | User | Host            | db   | Command | Time | State    | Info                                         |
    +----+------+-----------------+------+---------+------+----------+----------------------------------------------+
    |  5 | root | localhost:52752 | test | Sleep   |  335 |          | NULL                                         |
    |  8 | root | localhost:62954 | test | Sleep   |  100 |          | NULL                                         |
    |  9 | root | localhost:62956 | test | Query   |   41 | Updating | update table1 set v2 = 'kimura' where i1 = 1 |
    | 11 | root | localhost:63349 | test | Query   |   28 | Updating | update table1 set v2 = 'kimura' where i1 = 1 |
    :
    |117 | root | localhost:52831 | NULL | Query   |    0 | NULL     | show processlist                             |
    +----+------+-----------------+------+---------+------+----------+----------------------------------------------+
    
     まず9,11の接続のトランザクションIDが何かを確認してみましょう。
    
    mysql> select trx_mysql_thread_id as Id, trx_id from information_schema.innodb_trx where trx_mysql_thread_id in (9,11);
    +----+--------+
    | Id | trx_id |
    +----+--------+
    | 11 | 60017  |
    |  9 | 60016  |
    +----+--------+
    2 rows in set (0.00 sec)
    
     トランザクションIDが分かるとinnodb_lock_waitsテーブルで、どのトランザクションIDに待たされているのか、がわかります。
    
    mysql> select * from information_schema.innodb_lock_waits where requesting_trx_id in (60016,60017);
    +-------------------+-------------------+-----------------+------------------+
    | requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id |
    +-------------------+-------------------+-----------------+------------------+
    | 60017             | 60017:38:3:6      | 60016           | 60016:38:3:6     |
    | 60017             | 60017:38:3:6      | 60015           | 60015:38:3:6     |
    | 60016             | 60016:38:3:6      | 60015           | 60015:38:3:6     |
    +-------------------+-------------------+-----------------+------------------+
    
     60017は60016,60015を待っていて、60016は60015を待っている、ということは60015が今回のロックの保持者のようです。再度innodb_trxで確認してみましょう。これを確認すると接続id(trx_mysql_thread_id)は8ということが分かります。
    mysql> select * from information_schema.innodb_trx where trx_id = 60015¥G
    *************************** 1. row ***************************
                        trx_id: 60015
                     trx_state: RUNNING
                   trx_started: 2011-10-16 14:06:27
         trx_requested_lock_id: NULL
              trx_wait_started: NULL
                    trx_weight: 3
           trx_mysql_thread_id: 8
                     trx_query: NULL
           trx_operation_state: NULL
             trx_tables_in_use: 0
             trx_tables_locked: 0
              trx_lock_structs: 2
         trx_lock_memory_bytes: 376
               trx_rows_locked: 1
             trx_rows_modified: 1
       trx_concurrency_tickets: 0
           trx_isolation_level: REPEATABLE READ
             trx_unique_checks: 1
        trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
     trx_adaptive_hash_latched: 0
     trx_adaptive_hash_timeout: 10000
    1 row in set (0.00 sec)
    
     運用上とりあえず当該ロック待ちを解消するには次のように接続id 8をkillすれば事足ります。
    
    mysql> kill 8;
    
     しかしながら、根本的な問題の解決には接続id 8が発行したどのクエリがロックを取得していて、それは問題ないか、また接続id 8はなぜトランザクションをホールドしたままだったのか、を調べる必要があります。残念ながら問題が起こってから、過去にさかのぼって接続id 8が発行したクエリを調べる方法はありません。そのため、再現環境をつくりだし、一般クエリログMEMのQUANなどで発行クエリを確認しながら、問題再現するか、 当該アプリケーションのクエリシーケンスを確認し、どのシーケンスが問題なのか、などを調べる必要があります。

     具体的にどのようなロックがかかっていたのかは、innodb_lockテーブルの内容を参考にしてください。 (これらの情報スキーマのテーブルを組み合わせてわかりやすく表示する例がSH2さんのブログエントリにあります)

     なお、ロック待ちを再現できる場合は、テストや今回のような原因究明の場合、InnoDBのロック待ちの長さを長くすると検出しやすくなります。MySQL 5.5からセッション単位で設定できるようになったので、以下のように設定すればロック待ちを長くして、その間にいろいろと調べることができます。(このように長くするのは開発時やQA時のみにしてください)

    mysql> set innodb_lock_wait_timeout = 28800; -- 8時間に設定

    | meijik | MySQL | 08:25 | comments(0) | trackbacks(0) | - | - |









    トラックバック機能は終了しました。
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
    << March 2020 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • たまたま「プリントヘッドの種類が違います」エラーから復活@MG6230
      meijik (11/20)
    • [ミュージシャンに聴かせたい・弾かせたい!] (4) 山田元気様
      meijik (07/27)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (03/03)
    • 2019年の木村明治
      田中尚 (01/08)
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE