SHOW OPEN TABLESのまとめ

テーブルロックの状況確認に付いて。

構文

SHOW OPEN TABLES [FROM db_name] [LIKE 'tbl_name_pattern'];

カラムの意味

[test] > show open tables from test;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | t1    |      0 |           0 | 
+----------+-------+--------+-------------+
1 row in set (0.00 sec)
  • Database ... データベース名
  • Table ... テーブル名
  • In_use ... 現在のテーブルロックの要求数。0だと誰もlockしていない。1以上の数値のときはN人がロックしている状態。
  • Name_locked ... DROP TABLEとかALTER TABLEとかのDDL文によりテーブルがロックされている場合は1。そうでなければ0。

つまり上記のt1テーブルはロックされていない。

ロックされている例(1人がロック獲得)

[test] > show open tables from test;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | t1    |      1 |           0 | 
+----------+-------+--------+-------------+
1 row in set (0.00 sec)

ロックされている例(1人がロック獲得、1人がブロック待ち)

[test] > show open tables from test;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | t1    |      2 |           0 | 
+----------+-------+--------+-------------+
1 row in set (0.00 sec)

補足

LOCK TABLES t1 READを複数セッションから発行すると、ロックされずにREADロックを取得でき、In_useはカウントアップされていく。

従って、In_useの値からREAD/READ LOCAL/WRITEのロックの種別を判別したり、ブロック待ちの人数を推定することはできない。