web-dev-qa-db-ja.com

テーブルレベルのロックエラーの原因は何ですか?

データベースがすでに2回停止していて、原因を探そうとしました。

show processlist
Waiting for global read lock | INSERT INTO {myisam_table} ...

ここではディスク領域がいっぱいだったので、それをもう少し与えると問題は終わったと思いましたが、翌日の正午に再びハングしました。

show processlist
Waiting for table level lock | UPDATE {myisam_table} ... 

何が原因ですか?

Mysqlデフォルトエンジン:InnoDB。

データベースには、MyISAMエンジンとInnoDBエンジンの両方を備えたテーブルが混在しています。

ここに投稿されたログ:

http://arturito.net/2013/08/28/mysql-waiting-for-table-level-lock-errors/

8
Artur Kędzior

最初の観測

  • プロセスID 42686は、SELECTクエリを実行する準備をしています
  • いくつかのスリープ接続があります
  • 他のすべてのプロセスはテーブルロックを取得できません
  • ロックを実行するには、UPDATE、DELETE、またはINSERTが必要でした。問題のテーブルの所有権を主張することはありません。
  • プロセスID 42686で完全なクエリを表示できませんが、JOINGROUP BY、またはORDER BYが関係していると思います

作業理論

あなたが私に与えたプロセスリストでディスクスペースが足りなくなった場合、MyISAMストレージエンジンのせいにすることができます。どうして?

あなたの特定のケースでは、それはあなたのテーブルの1つではありません。 JOINGROUP BY、またはORDER BYが実行されていて、一時テーブルがディスクに書き込まれていた場合(ディスクの一時テーブルではMyISAMストレージエンジンを使用)、MySQLは単にアウト時にフリーズします。スペースの。どうやってそれを知るのですか?

MySQL 5.0 Certification Study Guide によると==

enter image description here ページ408,409セクション29.2 Bulletpoint 11によると、

MyISAMテーブルに行を追加しているときにディスク領域が不足しても、エラーは発生しません。サーバーは、スペースが使用可能になるまで操作を中断し、操作を完了します。

私は以前この状況について話しました

あなたはこれら2つの状況の1つを持っていると何かが教えてくれます

  • sELECTのディスクベースの一時テーブルと、通常のデータとのスペースの競合
  • 一時テーブルがルートパーティションの/tmpに着陸している場合は、スペースが不足しています

提案

提案#1: tmpdir を別のディスクにマップする

[mysqld]
tmpdir = /another/disk/besides/root/partition

提案#2:RAMディスクを作成する

このコードを実行して、Linuxの再起動時に使用できるRAMディスクをインストールします。

RAMDISK_SIZE=32g
service mysql stop
mkdir /var/tmpfs
echo "none   /var/tmpfs  tmpfs  defaults,size=${RAMDISK_SIZE} 1 2" >> /etc/fstab
mount -t tmpfs -o size=${RAMDISK_SIZE} none /var/tmpfs
cp -R /var/lib/mysql/* /var/tmpfs
mv /var/lib/mysql /var/lib/mysql_old
ln -s /var/tmpfs /var/lib/mysql
chown -R mysql:mysql /var/tmpfs
chown -R mysql:mysql /var/lib/mysql
service mysql start

次に、 tmpdir/var/tmpfsにマッピングします

試してみる !!!

8
RolandoMySQLDBA