2011-01-20 4 views
4

MySQLの大規模なログテーブルに関する統計情報を取得しようとしています。いくつかの選択クエリは、完了までに時間がかかりすぎて例外が発生しています。
原因:java.sql.SQLException:ロック待機タイムアウトを超過しました。トランザクションを再起動してみてください
これにより、アプリケーション全体が同じエラーで処理を停止しています。いくつかの研究の後で、私たちのMySQLサーバ設定の変数 'innodb_lock_wait_timeout'を変更することにしました。MySQLのinnodb_lock_wait_timeoutの値が高い

しかし、この設定変更の欠点は何ですか?

答えて

0

負荷が増加すると、さらに長いタイムアウトが必要になります。欠点は、他のクライアント照会の最大照会時間を増加させる危険があることである。これを調べる必要があります.Linuxツールmytopを使用して長時間実行されているクエリを見つけ、EXPLAINを実行してロックがどのように使用されているかを確認することをお勧めします。あなたのデータやクエリを再構成してロックを少なくします。

最後に、MariaDB(MySQLのフォーク)は、操作に必要なロックの量を減らすことに重点を置いています。

2

これはあなたの問題に当てはまるとは確信していませんが、あなたの質問はもう少し前に私が扱ったものです。私のシステムでは、ロックは不要で、CREATE TABLE AS SELECT * FROM table_x...のようなクエリに関連していて、明らかにInoDBでもtable_xのすべてのレコードをロックしていることがわかりました。

解決策は、グローバルパラメータinnodb_locks_unsafe_for_binlogをtrueに設定することでした(my.cnfの行にinnodb_locks_unsafe_for_binlog=1を追加)。 InnoDBがレコードをロックする方法が変わります。

Hereです。実際には予期せぬロックからアプリケーションが救われました。

+0

実際、私の質問はこの問題ではありませんでした。テーブルのロックケースも当てはまります。タイムアウトを増やすと、テーブルのロック時間も長くなります。私たちはミリ秒単位で実行するようにクエリをチューニングすることで問題を解決しました。この知識によって、いくつかのバグを予知できます。ありがとうございます。 – xarion

関連する問題