猫型iPS細胞研究所

Windows、Linux、iOS、DB、Network

DataBase MySQL

MySQL:エラー:The total number of locks exceeds the lock table size

投稿日:2013年2月4日 更新日:

The total number of locks exceeds the lock table sizeは、大量にデータを削除する場合等に発生する可能性があります。

見ての通り、ロックするメモリー不足です。
なお、InooDBは行ロック、MyIsamはテーブルロックのようです。

メモリーの拡張

一般的にはinnodb_buffer_pool_sizeを拡張することで対応可能です。
しかしinnodb_buffer_pool_sizeは動的システム変数ではありません。
そのため一応再起動が必要です。

また、innodb_buffer_pool_sizeは、
グローバル変数であるため、
(セッション変数は接続数に応じて消費されるので大量の割り当てはさけるべきです)
データベースサーバーの場合、総メモリーの7~8割を当ててもよいとされています。
その割には、初期値が8M(8388608)しかありません・・・。

さらに、innodb_log_file_sizeも合わせて変更しなければ、パフォーマンスの向上が望めず、
別の問題を引き起こすかもしれません。
(innodb_log_file_size×innodb_log_files_in_group > innodb_buffer_pool_size)

こうした点を踏まえてinnodb_buffer_pool_sizeを変更する分には、これが直接的かつ唯一の対応策となるでしょう。

SQLの見直し

先程も述べたように、innoDBは行ロックを行います。
SQL Serverのようなロックエスカレーション(あまりに多い行ロックはメモリー効率が悪くなるのでテーブルロックになる)
もありません。

そのため、削除の場合は単純に条件を十分に絞り込むことや、削除を複数に分けることでこのエラーを回避することも可能です。
もちろん、こうした対応ができない場合はinnodb_buffer_pool_sizeの変更が必用となります。

削除や更新系のSQLの条件で、explainを先頭につければ実行計画をみて条件を検討できます。

delete from table where id < 100;
を
explain select * from table where id < 100;

検討してみてはいかがでしょうか。

Gooleアドセンス用336

Gooleアドセンス用336

-DataBase, MySQL

執筆者:

関連記事

mysql

MySQLのexists

exists自体はほとんどのSQL自体に実装されていると思われます。 しかし、使用方法を誤るとレスポンスに大きな影響を与えてしまします。 副問合せであるexists内部で、集問い合わせのキー列と結合し …

sqlserver

SQLSERVERのトランザクションログの切り捨て・圧縮

トランザクションログはデータの登録・更新記録です。 INDEX1 復旧モデル2 切り捨て3 圧縮 復旧モデル トランザクションログを扱うには、トランザクションログがどのように使用されるかを知る必要があ …

mysql

MySQLの文字コードを変更する

日本語を扱うにはutf8にするべきでしょう。 アプリケーション側で接続する際に文字コードを指定することもできます。 string constr = “userid=root;password=pass …

mysql

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

ダンプをインポートしようとすると下記エラーが表示されてインポートできませんでした。 [root@centos]# mysql -u root -p reset master; するとインポートできまし …

mysql

MySQLの連続INSERTを高速にする

もししらなければ確実に、そして恐ろしく効果を発揮できると思います。 INSERTを連続実行する際にボトルネックとなるのはコミットです。 オートコミットをオフにするという手もあるのですが、 INSERT …