猫型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

mysqldumpでテーブル毎のダンプを圧縮して取得するスクリプト

mysqldumpではデータベースを指定して一括してダンプを取得できます。テーブル毎のダンプも取得できます。 しかし、一括して取得したダンプの1つのテーブルだけをインポートすることはできません。これは …

mysql

MySQLの時間の計算・比較

列同士を比較する datetime型をそのままプラス・マイナスしてはいけません!! 例えば、 mysql> select * from test; +———————+ …

mysql

MySQLのデータ構造

MySQLのインストールは簡単ですが、 ディレクトリ構造を知っておくことは障害対応にも必要ですのでまとめです。 MYSQLのデータ構成 /etc/my.cnfでメインディレクトリやソケット(mysql …

mysql

MySQLが起動できない

エラーログには下記ログが大量に出力されて起動できない・・・。 2013-08-22 17:32:10 30137 [ERROR] InnoDB: Unable to lock ./ibdata1, e …

sqlserver

SQLSERVER サービス起動用ユーザーを作成する

SQLサーバーのサービスを起動しているのは、デフォルトではおそらくAdministratorです。 ここに大きな落とし穴があります。 Administratroのパスワードを変更することはセキュリティ …